2012-02-11 11 views
1

古典的な積和演算はa = a + b * cです。 (をaとbは、64ビット整数、符号なしです:符号なしlong int型長い)しかし、私は現在、1つのクロックサイクルで整数に対して次の操作を行うことができASM命令が存在するかどうか疑問 C/C++/ASM:Multiply CPUにa = a * 2 + bを追加しますか?

a = a*2-1 
a = a*2+b 

現在、私が使用します。

a *= 2 
--a 

最初のものと

a *= 2 
a += b 

のために1秒間。そして、私はそれぞれがASMの2つの命令に変換されると思います。しかし、代わりに1 ASM命令を使用する方法があります(また、インテルCPU上の命令セット拡張もあります)。

(私はこの動作億回を行うので、私はそれを検索してください)インテルのCPUの場合

+3

コンパイラが生成する命令の数が重要な理由は何ですか?これは、計算に必要なクロックサイクルの数に緩やかに関連するだけですか? –

+0

たぶん 'lea'はそれを行うことができます... –

+0

@KerrekSB、あなたはそうです - ' lea'は 'b'が0から4096の間であれば' a * 2 + b'を行うことができます。 – ugoren

答えて

6
  1. LEA命令を参照してください。 1つの命令で両方のタスクを実行することができます(サイクルについてはわかりませんが)。 (例えば、LEA EAX, [EAX*2+EBX])。これは実際に乗算 - 加算という意味ではなく、面白​​い名前(実効アドレスをロードする)であることに注意してください。

  2. CおよびC++では、気にする必要はありません。コンパイラは、それが最良だと思うことを行い、恐らくその努力を妨げることができます。私は良い古いa = a*2-1と一緒にいたい。

PS:あなたは何かが2つの命令として翻訳だと思う場合は、アセンブリに見ているよりも簡単には何もありません。その後、を知っています。

+0

同意します。以前は、LEAはCPUが使用されていないときにアイドル状態になった専用のアドレス計算ユニットを持っていたため、無料でした。現在の世代では、おそらく別々のシフトや追加として同じマイクロオペレーションを生成します。 –

関連する問題