是否有任何SSE2指令将8x16寄存器转换为两个4x32寄存器,一个4x32寄存器具有8x16寄存器中的奇数索引元素,另一个具有偶数索引元素?请建议。
答案 0 :(得分:4)
未测试:
movdqa xmm1, xmm0
pslld xmm0, 16
psrad xmm1, 16 ; odd words
psrad xmm0, 16 ; even words
应该很容易转换为内在函数。
没有单一指令,即使在更高版本的SSE中也没有。多输出非常罕见,主要用于旧指令。
来自SSE4.1的 pmovsxwd
使用(对于这个问题)错误的元素子集,即底部4。
答案 1 :(得分:0)
请注意确定是否有单一指令,但这样的事情应该有效(未经测试):
; Assume that the 8 16-bit values are in xmm0
PSHUFLW xmm1,xmm0,0D8h ; Change word order to 3120 in the low qword
PSHUFHW xmm1,xmm1,0D8h ; Change word order to 3120 in the high qword
PSHUFD xmm1,xmm1,0D8h ; Change dword order to 3120
MOVAPD xmm0,xmm1 ; Copy to xmm0
PUNPCKLWD xmm0,xmm0 ; Expand even words to dwords
PUNPCKHWD xmm1,xmm1 ; Expand odd words to dwords
PSLLD xmm0,16 ; Sign-extend
PSRAD xmm0,16 ; ...
PSLLD xmm1,16
PSRAD xmm1,16
xmm0
现在应包含符号扩展为32位的4个偶数字,xmm1
应包含奇数字。
如果您可以使用SSE4.1指令,可以稍微简化符号扩展部分。对于偶数单词(xmm0
),您可以用以下内容替换unpack和两个班次:
PMOVSXWD xmm0,xmm0