我正在尝试使用_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;
答案 0 :(得分:4)
_mm_slli_epi64
将每个64位整数移位给定的位数。您的__m128i
中有两个64位整数:
0x0000000000000000 0x0000000000000080
所以当你把每一个左移一位时,你得到:
0x0000000000000000 0x0000000000000100
答案 1 :(得分:3)
首先,它不应该给你一个全零结果,因为你没有像你想象的那样将寄存器设置为0x80...0
,而是设置0x0...080
,因为_mm_setr_epi8
将第一个(最左边)操作数放入寄存器的最低有效字节。
然后在班次之后,结果为0x0...0100
。那么你的输出例程也可能会破坏字节顺序,这会导致你的奇怪输出。