2013-05-07 12 views
5

x86比較命令:cmp x, yが減算を行い、結果に基づいてさまざまなフラグが設定されていると聞いたことがあります。x86減算の代わりにXORを使用する比較命令

ここで、2つのオペランドが等しいかどうかをテストするだけですか?減算の代わりに排他的論理和演算をするのははるかに高速ですか?私の質問は、2つのオペランドが等しいかどうかを知るためにXORとの比較を行う命令があるかどうかです。おそらく、次のようになります:cmpeq x, yまたはcmpxor x, y

cmpxorを使用すると、減算を行うcmpよりも高速であることがわかります。 cmpxorのようなスピードアップを与えるような指示はありますか?

私はxorzero flagに設定されていることを認識しています。しかし、xor x, yを実行すると、xが変更されます。私はそれを望んでいない。両方のオペランドだけを残す比較命令が必要です。

+3

XORが「はるかに高速」であると思われるのはなぜですか? – jalf

+0

'cmp'は他の命令(' xor'を含む)と同じくらい速いので、 "はるかに高速"にはなりません。いくつかのμarchでは、 'cmp'命令をフロントエンドによって単一のμopに依存する分岐命令と融合させて、事実上さらに速くすることができます。これはすべて、インテルの最適化マニュアルに記載されています。 –

+1

Ira Baxterは非常にうまくいっています:*技術的には、SUBはXORよりも時間がかかるはずです。なぜなら、XORはビット単位で並列しているのに対し、キャリーはすべてのビットを "リップル"させなければならないからです。 – Aaron

答えて

11

XOR、SUB、CMP、TESTなどの基本的な機械操作はすべて簡単に操作できるので、すべてが非常に高速に動作します。また、同じ条件コードビットを設定します。 compare-for-equalの観点から、これらはすべてZビットを同じ方法で設定します。これらの演算が異なる結果を計算するため、他のビットは異なるように設定されます。

x86 CPUの場合、チップ全体で同一の経路を使用するため、x86 CPUの場合、実行時間に差はありません。その結果、あなたが望む答えを計算するところで、パフォーマンスペナルティなしでそれらのどれかを使うことができます。 (技術的には、SUBはXORよりも時間がかかるはずです。なぜなら、キャリーはすべてのビットを「リップル」させる必要がありますが、XORはビットごとに並列です.CPUの設計者は、非常に高速なキャリー・コンピューティング・ロジックを構築し、時差は重要ではありません。コンピュータの大半は「追加」されているため、大きな動機があります)。

2つの(機械語サイズの)値を比較していると思われる場合は、考えていることをコードの読者に伝えるため、おそらくCMP命令を使用するべきです。そして、それはオペランドの1つを破壊しないという利点があります。あなたが十分なコードを書いたならば、XORの代わりにそれを使用するための究極的に説得力のある議論を見つけるでしょう。 (TESTにはこの素敵なプロパティがあり、ビットをチェックするのにも便利です)。

浮動小数点比較、文字列比較、ベクトルレジスタ比較など他のx86命令の方が優れている他の種類の値の比較があります。これらの命令は基本的な演算とは異なる時間を要します。複数のデータワードを比較する)。

+0

実行時間を調べることができるテーブルがありますか?私はこれを探していたが、見つけられなかった。 – Devolus

+5

インテルのパフォーマンス最適化マニュアルにはそのようなテーブルがあります – jalf

+0

とにかく、 'cmp'と' cmpxor'の間には速度に違いはありません。それは私の質問に感謝します、ありがとう。 – Aaron

関連する問題