转移__m128i的最佳方法是什么?

use*_*er0 5 c sse bit-shift bitwise-operators sse2

我需要将一个__m128i变量(比如说v)移位m位,这样位就会移动所有变量(因此,结果变量代表v*2 ^ m).做这个的最好方式是什么?!

请注意_mm_slli_epi64单独移动v0和v1:

r0 := v0 << count
r1 := v1 << count
Run Code Online (Sandbox Code Playgroud)

所以v0的最后几位错过了,但我想将这些位移到r1.

编辑:我正在寻找一个比这更快的代码(m <64):

r0 = v0 << m;
r1 = v0 >> (64-m);
r1 ^= v1 << m;
r2 = v1 >> (64-m);
Run Code Online (Sandbox Code Playgroud)

Aki*_*nen 1

在 SSE4.A 中,指令insrqextrq可用于一次移位(和旋转)__mm128i 1-64 位。与 8/16/32/64 位对应项 pextrN/pinsrX 不同,这些指令在 0 到 127 的任意位偏移处选择或插入 m 位(1 到 64 之间)。需要注意的是,长度和偏移量之和不得超过128.

  • 最大的警告似乎是它仅限于 AMD。 (3认同)