2016-10-24 23 views
0

すべてのLLVM IR 'fcmp'命令に互換性のあるX86 cmpps命令がありますか? そして、その逆はどうですか?単一のLLVM 'fcmp'命令を使って、すべてのX86 cmpps命令(レジスタオペランドのみを記述する)を記述できますか? 問題の難しい部分は、NaN、Inf's、-0.0などのコーナーケースがどのように扱われるかです。X86 'cmpps'命令とLLVM IR 'fcmp'命令は入れ替え可能ですか?

答えて

1

私はLLVM IRについてよく知らないので、完全な答えではありませんが、これはコメントには長すぎます。

すべてのLLVM IR 'fcmp'命令に互換性のあるX86 cmpps命令がありますか?

間違いなく正確です。ベクトルの上位要素に大きなゴミがある場合、C抽象マシンがそうしなかったMXCSRステータスビットにInvalidまたはDenormal例外を発生させることができます。

スカラーオペランドのCMPSSでは、おそらくすべてを実行できます。スカラ比較の場合は、宛先XMMレジスタに0または-1を生成するためにCMPSSを使用する代わりに、UCOMISSを使用してフラグを設定する方がよい場合がよくあります。

x86 XMM CMPp/s命令の最良のドキュメントは、CMPPD entry(アルファベット順、他はその表を参照)の下にあります。そのHTML抽出は完璧ではありません。より良いフォーマットの表についてはインテルのPDFを参照してください。あなたがNaNであってもよいオペランドを比較するときに例外を避けるために必要がある場合(タグのwikiのリンク。)


、あなたは少なくともない効率的、AVXなしCMPSSを使用することはできません。 SSEバージョンでは、最初の8つの述語(imm8 = 0..7)のみが許可され、その多くはS(シグナリング)のバラエティであるため、どちらかのオペランドがQNANの場合は#IAになります。 AVXは、UCOMISSのように、シグナルを出さないすべての述語のQ(Quiet)バージョンを追加します。


もちろん、32ビットCPUをターゲットにしており、SSEのサポートを受けることができない場合は、x87を使用する必要があります。 (FCOMI、またはあなたがP6以上を想定していない場合でも、FCOM)。