128ビットXMMレジスタの上位と下位64ビットを追加
-
19-09-2019 - |
質問
私はxmm0
に2つのパックド・クワッドワード整数を持っていると私は一緒にそれらを追加し、メモリ位置に結果を格納する必要があります。私は、各整数の値は2 ^ 15の を未満であることを保証することができます。今、私は次のことをやってます:
int temp;
....
movdq2q mm0, xmm0
psrldq xmm0, 8
movdq2q mm1, xmm0
paddq mm0,mm1
movd temp, mm0
これを行うには良い方法はありますか?
解決
まず最初に、なぜあなたは16ビット形式で収まるように値を表すためにクワッドワードを使用していますか?カップル・ソリューション、それを脇に残します:
pshufd xmm1, xmm0, EEh
paddq xmm0, xmm1
movd temp, xmm0
または
movdqa xmm1, xmm0
psrldq xmm1, 8
paddq xmm0, xmm1
movd temp, xmm0
または
movhlps xmm1, xmm0
paddq xmm0, xmm1
movd temp, xmm0
あなたが実際にpaddq
を使用する必要はありませんが、あなたは、のいずれかで逃げることができ、あなたが好む場合は狭く追加します。
編集 4つのダブルクワッドワードを合計する - あなたが持っていることは、かなり細かいです。あなたがそれらのすべてのデータが各スロットの低ダブルワードに収まることを知っていることを考えると、あなたのような何かを試すことができます:
shufps xmm0, xmm2, 88h
shufps xmm4, xmm6, 88h
paddd xmm0, xmm4
psrlq xmm1, xmm0, 32
paddd xmm0, xmm1
movhlps xmm1, xmm0
paddd xmm0, xmm0
movd temp, xmm0
またはより高速であることを証明しないかもしれない可能性がある。
EMMSとしては、それだけで別の命令です。あなたはemms
を持っている必要がありますのx87浮動小数点命令を使用して任意のコードの前に、MMXレジスタに触れる任意のコードの後。
所属していません StackOverflow