在一个 xmm 寄存器中,我有 3 个值小于 256 的整数。我想将它们转换为字节,并将它们保存到内存中。我不知道如何处理它。
我正在考虑从中获取这些数字xmm1
并将它们保存到eax
,然后将最低字节移动到内存中,但我不确定如何从 xmm 寄存器中获取整数。我只能在第 0 个位置获取元素,但如何移动其余元素?
有一个完美的指令对我VPMOVDB
有用,但我不能在我的处理器上使用它。有其他选择吗?
问问题
76 次
1 回答
6
最简单的方法可能是使用pshufb
置换字节,然后movd
存储数据:
; convert dwords in xmm0 into bytes and store into dest
pshufb xmm0, xmmword ptr mask
movd dword ptr dest, xmm0
...
align 16
mask db 0, 4, 8, 12, 12 dup (-1)
这存储 4 个字节而不是 3 个字节,因此请确保您的代码可以处理它。也可以只存储 3 个字节,但需要更多的工作:
; convert dwords in xmm0 into bytes and store into dest
pshufb xmm0, xmmword ptr mask
movd eax, xmm0
mov word ptr dest, ax
bswap eax
mov byte ptr dest+2, ah
...
align 16
mask db 0, 4, 8, 12, 12 dup (-1)
如果这种情况不止一次发生,您可以提前加载遮罩以避免重复加载它的惩罚。
于 2022-01-15T12:42:32.433 回答