首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >_mm_shuffle_epi8内部函数的用法

_mm_shuffle_epi8内部函数的用法
EN

Stack Overflow用户
提问于 2012-10-08 17:13:49
回答 2查看 8.8K关注 0票数 5

有人能解释一下_mm_shuffle_epi8 SSSE3的内在机制吗?我知道它可以在__m128i中处理16个8位整数,但我不确定如何使用它。

我基本上是想使用_mm_shuffle_epi8来修改下面的函数,以获得更好的性能。

代码语言:javascript
复制
while(not done)
    dest[i+0] = (src+j).a;
    dest[i+1] = (src+j).b;
    dest[i+2] = (src+j).c;
    dest[i+3] = (src+j+1).a;
    dest[i+4] = (src+j+1).b;
    dest[i+5] = (src+j+1).c;
    i+=6;
    j+=2;
EN

回答 2

Stack Overflow用户

发布于 2012-10-08 17:25:04

_mm_shuffle_epi8 (更广为人知的名称是pshufb)本质上是这样做的:

代码语言:javascript
复制
temp = dst;
for (int i = 0; i < 16; i++)
    dst[i] = (src[i] & 0x80) == 0 ? temp[src[i] & 15] : 0;

至于你是否可以在这里使用它,在不知道涉及的类型的情况下是不可能判断的。因为目的地是一个6字节的块(或字?或者dword?)。你可以通过展开和做大量的移位或操作来实现这一点。

票数 11
EN

Stack Overflow用户

发布于 2013-07-07 13:32:00

下面是使用内部函数的一个示例;您必须了解如何将其应用于您的特定情况。这段代码一次交换4个32位整数:

代码语言:javascript
复制
unsigned int *bswap(unsigned int *destination, unsigned int *source, int length) {
    int i;
    __m128i mask = _mm_set_epi8(12, 13, 14, 15, 8, 9, 10, 11, 4, 5, 6, 7, 0, 1, 2, 3);
    for (i = 0; i < length; i += 4) {
        _mm_storeu_si128((__m128i *)&destination[i],
        _mm_shuffle_epi8(_mm_loadu_si128((__m128i *)&source[i]), mask));
    }
    return destination;
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12778620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档