SSE2指令将8x16寄存器转换为具有偶数和奇数索引元素的两个4x32寄存器

时间:2013-05-24 10:20:20

标签: c x86 intrinsics sse2

是否有任何SSE2指令将8x16寄存器转换为两个4x32寄存器,一个4x32寄存器具有8x16寄存器中的奇数索引元素,另一个具有偶数索引元素?请建议。

2 个答案:

答案 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