使用_mm_slli_epi64移动__m128i

时间:2013-11-08 13:05:22

标签: c sse

我正在尝试使用_mm_slli_epi64_m128i移动一个位置。我不明白的是,下面的代码没有像我预期的那样给我一个全零输出,而是打印0x00010000000000000000000000000000。什么可能是错的?

__m128i z = _mm_setr_epi8(0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
printblock("z = ", z);
z = _mm_slli_epi64(z, 1);
printblock("z = ", z);
return;

2 个答案:

答案 0 :(得分:4)

_mm_slli_epi64将每个64位整数移位给定的位数。您的__m128i中有两个64位整数:

0x0000000000000000 0x0000000000000080

所以当你把每一个左移一位时,你得到:

0x0000000000000000 0x0000000000000100

答案 1 :(得分:3)

首先,它不应该给你一个全零结果,因为你没有像你想象的那样将寄存器设置为0x80...0,而是设置0x0...080,因为_mm_setr_epi8将第一个(最左边)操作数放入寄存器的最低有效字节。

然后在班次之后,结果为0x0...0100。那么你的输出例程也可能会破坏字节顺序,这会导致你的奇怪输出。