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