【问题标题】:SSE2 instruction to load integers in reverse orderSSE2 指令以相反的顺序加载整数
【发布时间】:2013-05-11 04:11:00
【问题描述】:

是否有任何 SSE2 指令以相反的顺序从 int 缓冲区加载 128 位 int 向量寄存器?

【问题讨论】:

    标签: x86 sse simd sse2


    【解决方案1】:

    编辑:(以下是单精度浮点标量,以防万一)

    最近似(且方便)的是_mm_loadr_ps 内在函数。请注意,地址必须是 16 字节对齐的。

    虽然这种内在转化为不仅仅是指令MOVAPS + shuffle)。

    【讨论】:

    • 感谢您的回复,但此指令以相反的顺序加载四个单精度浮点值。我正在寻找整数的相同操作,但我想不支持。跨度>
    • 是的,我没有注意到您在谈论整数值(应该重新阅读您的标题)。 Paul R 的答案就是你所需要的。
    • 是的。只是好奇,短值可以做同样的操作吗?
    【解决方案2】:

    在正常加载后很容易反转 32 位 int 元素:

    __m128i v = _mm_load_si128(buff);                    // MOVDQA
    v = _mm_shuffle_epi32(v, _MM_SHUFFLE(0, 1, 2, 3));   // PSHUFD  - mask = 00 01 10 11 = 0x1b
    

    您可以对 16 位 short 元素执行相同的操作,但需要更多指令:

    __m128i v = _mm_load_si128(buff);                    // MOVDQA
    v = _mm_shuffle_epi32(v, _MM_SHUFFLE(0, 1, 2, 3));   // PSHUFD  - mask = 00 01 10 11 = 0x1b
    v = _mm_shufflelo_epi16(v, _MM_SHUFFLE(2, 3, 0, 1)); // PSHUFLW - mask = 10 11 00 01 = 0xb1
    v = _mm_shufflehi_epi16(v, _MM_SHUFFLE(2, 3, 0, 1)); // PSHUFHW - mask = 10 11 00 01 = 0xb1
    

    请注意,如果 SSSE3 可用,您可以使用更少的指令使用 _mm_shuffle_epi8 (PSHUFB) 执行此操作:

    const __m128i vm = _mm_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1);
                                         // initialise vector mask for use with PSHUFB
                                         // NB: do this once, outside any processing loop
    ...
    __m128i v = _mm_load_si128(buff);    // MOVDQA
    v = _mm_shuffle_epi8(v, vm);         // PSHUFB
    

    【讨论】:

    • 谢谢保罗。你的逻辑工作正常。但我不明白第二个参数“0x1B”的用法。是某种面具吗?另一个疑问是..是否可以在短裤上做同样的操作?
    • 我添加了第二个加载和翻转短裤的示例。该掩码在英特尔文档中有所介绍,但我添加了 cmets 以显示它是如何构造的。
    • 我会使用 PSHUFB 来反转短裤向量,除非 SSSE3 不可用。
    • 好的 - 我在上面添加了一个 PSHUFB 示例,用于反转向量中 16 位整数的顺序。
    • 谢谢。_mm_shuffle_epi8 现在对我来说似乎很有意义。我是英特尔内在编程的新手(尽管我曾使用过 NEON 内在函数),最初在我看来,SSE 中没有直接的指令来完成某些功能。但现在看起来大多数操作都可以结合提供的指令集用正确的逻辑:-)
    猜你喜欢
    • 2023-04-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多