14

xmm32ビットモードでSSE2レジスタに64ビット整数値をロードするための最良/最速の方法は何ですか?

64ビットモードでcvtsi2sdは使用できますが、32ビットモードでは32ビット整数のみをサポートします。

これまでのところ、私はそれ以上のものを見つけていません。

  • を使用fildfstpてスタックし、次に登録movsdしますxmm
  • 上位32ビット部分をロードし、2 ^ 32を掛けて、下位32ビットを追加します

最初の解決策は遅く、2番目の解決策は精度の低下をもたらす可能性があります(編集:そして、下位32ビットを符号なしとして変換する必要があるため、とにかく遅いです...)

より良いアプローチはありますか?

4

1 に答える 1

9

少し扱いに​​くいですが、2番目のオプションを機能させることができます。あなたの 64 ビット番号は、最初は edx:eax にあると仮定します。

cvtsi2sd xmm0, edx              // high part * 2**-32
mulsd    xmm0, [2**32 from mem] // high part
movsd    xmm2, [2**52 from mem]
movd     xmm1, eax
orpd     xmm1, xmm2             // (double)(2*52 + low part as unsigned)
subsd    xmm1, xmm2             // (double)(low part as unsigned)
addsd    xmm0, xmm1             // (double)(high part + low part as unsigned)

おそらく最後のものを除くすべての操作は正確であるため、これは正しく丸められます。-0.0この変換は、入力が0で、mxcsrが負の無限大への丸めに設定されている場合に生成されることに注意してください。これは、IEEE-754 準拠を提供することを目的としたコンパイラのランタイム ライブラリで使用されている場合は対処する必要がありますが、ほとんどの使用では問題になりません。

于 2013-03-24T13:08:20.193 に答える