是否有任何 SSE2 指令将 8x16 寄存器转换为两个 4x32 寄存器,一个 4x32 寄存器具有来自 8x16 寄存器的奇数索引元素,另一个具有偶数索引元素?请建议。
问问题
485 次
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 回答