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

X86 如何复制每个双字的最后一个字节?,x86,sse,simd,X86,Sse,Simd,我使用SSE,我想将每个双字的最后一个字节复制4次XMM0,但我不知道怎么做!(可能有(联合国)包?) 为了举例说明,我想这样做 谢谢你的帮助 您可以像这样使用SSSE3命令(MASM 32位汇编)来完成此操作 输出似乎与掩码匹配是一致的。 我目前无法测试,掩码字节的顺序可能会颠倒。但是你应该明白 无论如何:注意对齐,因为 当源操作数是128位内存操作数时,操作数必须在16字节边界上对齐,否则将生成一般保护异常(#GP) 您可以像这样使用SSSE3命令(MASM 32位汇编)来完成此操作 输出

我使用SSE,我想将每个双字的最后一个字节复制4次XMM0,但我不知道怎么做!(可能有(联合国)包?)

为了举例说明,我想这样做


谢谢你的帮助

您可以像这样使用SSSE3命令(MASM 32位汇编)来完成此操作

输出似乎与掩码匹配是一致的。
我目前无法测试,掩码字节的顺序可能会颠倒。但是你应该明白

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

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


您可以像这样使用SSSE3命令(MASM 32位汇编)来完成此操作

输出似乎与掩码匹配是一致的。
我目前无法测试,掩码字节的顺序可能会颠倒。但是你应该明白

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

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


SSE的哪些版本可用?SSSE3将使这变得容易,而无需使用
pshufb
,您可以使用
set1\u epi32(0x000000ff)
进行屏蔽,然后按住shift键或。然后
pshuflw
/
pshufhw
广播字节。这可能比屏蔽+
packusdw
/
wb
到字和字节,然后
punpcklbw
/
wd
备份到dwords更有效。SSE有哪些版本?SSSE3将使这变得容易,而无需使用
pshufb
,您可以使用
set1\u epi32(0x000000ff)
进行屏蔽,然后按住shift键或。然后
pshuflw
/
pshufhw
广播字节。这可能比掩蔽+
packusdw
/
wb
到单词和字节,然后
punpcklbw
/
wd
返回到dwords更有效。你的掩蔽是向后的(在我编辑之前)。该顺序对于
\u mm\u set\u epi8
来说是正确的,它以高..低顺序接受参数。但是low元素(索引0)是从内存中最低的地址加载/存储的,因此这也颠倒了寄存器中DWORD的顺序。注释中的符号是英特尔的正常顺序,与内存顺序相反(C数组初始值设定项和asm
db
)。有关大与小“endian”向量表示法的更多讨论,请参阅。您通常会在
.rdata
(Windows上的只读数据)中放置向量常量,而不是
.data
。(或非Windows上的
.rodata
)您的掩码是向后的(在我编辑之前)。该顺序对于
\u mm\u set\u epi8
来说是正确的,它以高..低顺序接受参数。但是low元素(索引0)是从内存中最低的地址加载/存储的,因此这也颠倒了寄存器中DWORD的顺序。注释中的符号是英特尔的正常顺序,与内存顺序相反(C数组初始值设定项和asm
db
)。有关大与小“endian”向量表示法的更多讨论,请参阅。您通常会在
.rdata
(Windows上的只读数据)中放置向量常量,而不是
.data
。(或非Windows上的
.rodata
.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