1

8x16 レジスタを 2 つの 4x32 レジスタに変換する SSE2 命令はありますか? 提案してください。

4

2 に答える 2

4

未テスト:

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

組み込み関数に変換するのは簡単なはずです。

SSE の新しいバージョンでさえ、これに対する単一の命令はありません。複数の出力は非常にまれで、ほとんどが古い命令用に予約されています。

pmovsxwdfrom 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

xmm032 ビットに符号拡張された 4 つの偶数ワードとxmm1、奇数ワードを含む必要があります。

SSE4.1 命令を使用できる場合は、符号拡張部分を少し単純化することができます。偶数語 ( xmm0) については、展開と 2 つのシフトを次のように置き換えることができます。

PMOVSXWD xmm0,xmm0
于 2013-05-24T11:35:44.253 に答える