X86 如何复制每个双字的最后一个字节?
我使用SSE,我想将每个双字的最后一个字节复制4次XMM0,但我不知道怎么做!(可能有(联合国)包?) 为了举例说明,我想这样做X86 如何复制每个双字的最后一个字节?,x86,sse,simd,X86,Sse,Simd,我使用SSE,我想将每个双字的最后一个字节复制4次XMM0,但我不知道怎么做!(可能有(联合国)包?) 为了举例说明,我想这样做 谢谢你的帮助 您可以像这样使用SSSE3命令(MASM 32位汇编)来完成此操作 输出似乎与掩码匹配是一致的。 我目前无法测试,掩码字节的顺序可能会颠倒。但是你应该明白 无论如何:注意对齐,因为 当源操作数是128位内存操作数时,操作数必须在16字节边界上对齐,否则将生成一般保护异常(#GP) 您可以像这样使用SSSE3命令(MASM 32位汇编)来完成此操作 输出
谢谢你的帮助 您可以像这样使用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数组初始值设定项和asmdb
)。有关大与小“endian”向量表示法的更多讨论,请参阅。您通常会在.rdata
(Windows上的只读数据)中放置向量常量,而不是.data
。(或非Windows上的.rodata
)您的掩码是向后的(在我编辑之前)。该顺序对于\u mm\u set\u epi8
来说是正确的,它以高..低顺序接受参数。但是low元素(索引0)是从内存中最低的地址加载/存储的,因此这也颠倒了寄存器中DWORD的顺序。注释中的符号是英特尔的正常顺序,与内存顺序相反(C数组初始值设定项和asmdb
)。有关大与小“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