2 つの x86 32 ビット レジスタを 1 つの 128 ビット xmm レジスタに格納するより高速な方法はありますか?
movd xmm0, edx
movd xmm1, eax
pshufd xmm0, xmm0, $1
por xmm0, xmm1
したがって、EAX が0x12345678
で EDX が0x87654321
の場合、xmm0 の結果は でなければなりません0x8765432112345678
。
SSE 4.1では、 movd xmm0, eax
/pinsrd xmm0, edx, 1
を使用して 2 つの命令で実行できます。
古い CPU の場合、2 xmovd
を使用punpckldq
して、合計 3 つの命令を使用できます。
movd xmm0, edx
movd xmm1, eax
punpckldq xmm0, xmm1
MMX についてはよくわかりませんが、おそらく PACKSSDW 命令が必要でしょう。
PACKSSDW 命令は、ソース オペランドの 2 つのダブル ワードとデスティネーション オペランドの 2 つのダブル ワードを取得し、これらをサチュレーションによって 4 つの符号付きワードに変換します。命令は、これらの 4 つのワードをまとめてパックし、結果をデスティネーション MMX レジスタに格納します。
( http://webster.cs.ucr.edu/AoA/Windows/HTML/TheMMXInstructionSeta2.htmlから)
編集:それらがSSEレジスタであることに気付きました。しかたがない。