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レジスタであることに気付きました。しかたがない。