1

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

4

2 回答 2

4

未经测试:

movdqa xmm1, xmm0
pslld xmm0, 16
psrad xmm1, 16  ; odd words
psrad xmm0, 16  ; even words

应该很容易转换为内在函数。

没有针对此的单一指令,即使在更高版本的 SSE 中也是如此。多输出非常少见,主要是为旧指令保留的。

pmovsxwd从 SSE4.1 开始使用(对于这个问题)错误的元素子集,即底部 4。

于 2013-05-24T11:41:28.683 回答
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
于 2013-05-24T11:35:44.253 回答