2011-03-15 4 views
1

私は、Windows上でLLVMを使いこなしていますが、サンプルプログラムをいくつか構築するだけで、少し上手く理解しようとしています。現在、私はHowToUseJITを見ています。私は64ビットを実行すると、非常にクレイジーなコードのように見えるエントリポイントを取得することに気付きました。 rsi、rdi、xmm6-xmm15をスタックに保存します。 raxとrcxを設定します。呼び出しチェーン内の次の関数を最後に呼び出す前に、以前に保存した値をすべて復元します。LLVM JITが生成したエントリポイントが64ビットWindows上で言葉に変わるのはなぜですか?

これには正当な理由はありますか?それとも、Windows x64上のLLVMがプライムタイムの準備が整っていないことを示唆していますか?

編集:これはLLVM 2.8で行われました。私はちょうど2.9ブランチにあるものをダウンロードしましたが、それは同じ動作を示していません。

答えて

2

です。すべてのレジスタセーブは、Win64 ABIによるものです。これは、呼び出し先が保存されているため、適切に保存/復元する必要があります。

JITにデフォルトで使用される高速命令セレクタが原因で、noopのロード/ストアが排除されない理由があります。それはバイナリコードを本当に速くしますが、品質を犠牲にします。

通常のcodegenに切り替えて、問題がまだ存在するかどうかを確認してください。

関連する問題