どうすればいいですか?結果がe * xレジスタに入るのが最善でしょう。Intel x86_64アセンブリ、xmmレジスタからintに倍増する方法は?
答えて
あなたは、Cコンパイラのしくみを見るだけで答えることができるいくつかの簡単な質問をしました。そこから、使用した指示を調べて、実際に使用する指示を決定することができます。 (libmには何百もの異なる丸め関数があるので、最初は正しいものを選ぶことが必ずしも簡単ではない)。
-O3 -ffast-math
を使用すると、潜在的にNaNにerrno
を設定する必要がないため、ほとんどの単純なlibm関数がインライン展開されます。
とにかく、コンパイラの入力と出力、gcc 5.3 on the Godbolt Compiler Explorerからは:
#include <math.h>
int floor_double(double x) { return (int) floor(x); }
roundsd xmm0, xmm0, 9
cvttsd2si eax, xmm0
ret
int truncate_double(double x) { return (int)x; }
cvttsd2si eax, xmm0
ret
は、Intelの命令セット・リファレンスマニュアルPDFへのリンクがx86タグのwikiを参照してください。 PDFから生成されるunofficial HTML versionもあります。 floor()
functionのように-Infinityに丸めるのではなく、trunc()
のように、
cvttsd2si
truncates towards zeroのようになります。
その理由は、floor()
がその命令セットが利用可能なときにSSE4.1 roundsd
にコンパイルする理由です。 (それ以外の場合は、ゴールドボトルの-march
オプションを削除または変更して表示されるように、丸めモードを実行する必要があります)。 CVTTPD2DQ`のような変換命令の
もパックされたバージョンは、一度に2を行います。 (またはAVXの場合は4)。
フロアダブルにはCVTTPD2DQ—Convert with Truncation Packed Double-Precision FP Values to Packed Dword Integersを使用してください。
CVTTPD2DQ
するXMMレジスタに2つのdouble
から2つのint
にフロア/トランケートします。
対応インテルC/C++コンパイラ組み込みがEAX
ようGPR(汎用レジスタ)に結果を置くために
____m128i _mm_cvttpd_epi32(__m128d a)
で、次の手順を使用することができます。
CVTTPD2DQ xmm0, xmm1 ; XMM1 is the source of doubles
movd eax, xmm0 ; extracts int(0) from XMM0 to EAX
pextrd ecx, xmm0, 1 ; extracts int(1) from XMM0 to ECX
- 1. アドレス位置からのXMMレジスタのロード
- 2. xmmレジスタの乗算
- 3. XMMレジスタをスタックにプッシュ
- 4. 16バイトをXMMレジスタに移動する方法(最大)
- 5. Int対アセンブリの倍数
- 6. xmmレジスタの値を保存
- 7. 浮動小数点定数の値をxmmレジスタに移動する方法は?
- 8. 2組の4つのショートパンツをXMMレジスタにロードする方法は?
- 9. XMM 128ビットレジスタを2つの64ビット整数レジスタに分割する方法は?
- 10. ガスマスクにxmmレジスタ名を自動的に生成しますか?
- 11. x86_64アセンブリのSTDINからの入力を読み取る方法は?
- 12. x86_64アセンブリLinuxシステムコールコンフュージョン
- 13. x86_64アセンブラのRBPレジスタの目的は何ですか?
- 14. getView()intはすべての負荷を倍増させます
- 15. SSEをサポートするx86プロセッサで利用できるXMMレジスタの数はいくつですか?
- 16. intelアセンブリからガス/ at&tに変換する
- 17. SSE命令によるクローン作成 - XMMレジスタの拡張
- 18. mipsアセンブリのレジスタを "NOT"にする方法
- 19. 倍増するためのJava> int型(スキャナ>のSystem.out)
- 20. アセンブリとレジスタ
- 21. PIC /アセンブリ、アセンブリ内のレジスタ
- 22. xmm/ymmレジスタがゼロであるかどうかをテストする高速な方法?
- 23. XMMレジスタの合計またはコア単位
- 24. YMMレジスタからIntel x86-64命令付きRAXへのMOV
- 25. iPadピクセル倍増ですか?
- 26. Intel Vs. xmmと浮動命令に対処するときのAT&T構文
- 27. アセンブリの倍数
- 28. XMMレジスタ間で128ビット値をどのように移動させますか?
- 29. 倍増ドメイン
- 30. x86の角括弧Intelアセンブリ
どのようにxmmからf.eに結果を移動できますか? eax登録? – formateu
@formateu:私は自分の答えを更新しました。 – zx485
zx485:そのintがeaxレジスタに収まる場合、movd eax、xmm0はその仕事をしますか? – formateu