4

我正在尝试使用_mm_slli_epi64将 a 移动_m128i一个位置。我不明白的是,下面的代码并没有像我预期的那样给我一个全零输出,而是 prints 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;
4

2 回答 2

4

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

0x0000000000000000 0x0000000000000080

因此,当您将每个左移一位时,您会得到:

0x0000000000000000 0x0000000000000100
于 2013-11-08T14:29:41.513 回答
3

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

然后在移位之后,结果是0x0...0100。然后,您的输出例程也可能会弄乱字节顺序,从而导致奇怪的输出。

于 2013-11-08T14:30:36.997 回答