如何复制每个双字的最后一个字节?

时间:2019-01-03 22:25:40

标签: x86 sse simd

我使用SSE,我想将每个双字的最后一个字节复制XMM0的4倍,但我不知道该怎么做! (也许带(未包装)包?)

为了说明,我想做 this

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您可以使用SSSE3命令PSHUFB这样(MASM 32位程序集)来完成此操作

.data 
  align 16
  mask  db 0,0,0,0, 4,4,4,4, 8,8,8,8, 12,12,12,12
.code
  ; value in XMM0                  ; 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
  pshufb xmm0, xmmword ptr [mask]  ; 12 12 12 12 08 08 08 08 04 04 04 04 00 00 00 00

输出似乎与掩码匹配是偶然的。
我目前无法测试,掩码字节的顺序可能相反。但是你应该明白这个主意。

无论如何:请注意对齐,因为

  

当源操作数是128位内存操作数时,该操作数必须在16字节边界上对齐,否则将生成通用保护异常(#GP)。