8x16 レジスタを 2 つの 4x32 レジスタに変換する SSE2 命令はありますか? 提案してください。
質問する
485 次
2 に答える
4
未テスト:
movdqa xmm1, xmm0
pslld xmm0, 16
psrad xmm1, 16 ; odd words
psrad xmm0, 16 ; even words
組み込み関数に変換するのは簡単なはずです。
SSE の新しいバージョンでさえ、これに対する単一の命令はありません。複数の出力は非常にまれで、ほとんどが古い命令用に予約されています。
pmovsxwd
from 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
) については、展開と 2 つのシフトを次のように置き換えることができます。
PMOVSXWD xmm0,xmm0
于 2013-05-24T11:35:44.253 に答える