たとえば、%edi
はxであり、kは定数の正数です。 %eax<-k*x
をimul
よりも速くしたいのですが、私はlealを使っていますか?だから私の質問は、スケーリング係数が1、2、4、8であり、単一のleal
命令を使用している場合、どのようなkの値が可能ですか?私はそれが2^kであると思っていますが、私はそれについてはわかりません、誰かが私にそれを説明することができますか?リーガルで可能な値
そして、私が一対の致命的命令を次々と使用する場合、どのような値のkが可能ですか?
たとえば、%edi
はxであり、kは定数の正数です。 %eax<-k*x
をimul
よりも速くしたいのですが、私はlealを使っていますか?だから私の質問は、スケーリング係数が1、2、4、8であり、単一のleal
命令を使用している場合、どのようなkの値が可能ですか?私はそれが2^kであると思っていますが、私はそれについてはわかりません、誰かが私にそれを説明することができますか?リーガルで可能な値
そして、私が一対の致命的命令を次々と使用する場合、どのような値のkが可能ですか?
Leaは、レジスタを0,1,2または3ビットだけシフトし、同じレジスタを再び追加できます。
これは、LEAは、以下の乗算を行うことができます意味:lea
の魔法は無料来ない
latency
LEA ALTERNATIVE (only if faster) LEA ALT
--------------------------------------------------------------------------
1: lea eax,[eax] nop 1 0
2: lea eax,[eax+eax] add eax,eax 1 1
3: lea eax,[eax*2+eax] - 2 -
4: lea eax,[eax*4] shl eax,2 2 1
5: lea eax,[eax*4+eax] - 2 -
6: - imul eax,6 - 3
7: - imul eax,7 - 3
8: lea eax,[eax*8] shl eax,3 2 1
9: lea eax,[eax*8+eax] - 2 -
注こと。
最新のプロセッサを除くすべてのプロセッサでは、「複雑な」レアが解決するために余分なCPUサイクルを要します。
複合語はスケーリングファクタまたは3つのオペランドを持つものです。
もしあなたが2リラに頼っていると感じたら、 10を掛けると、imulはしばしばより高速になります。
lea
の大きな点は、ほとんどの代替案とは異なり、フラグレジスタが変更されないことです。
そして、私は、(i)MULのみを解決するために、3サイクルの最小値をとることがLEA命令のペア次々....
注意を使用している場合。複雑なleaは2サイクルかかります。だから、あなたは2つのleaを組み合わせることで(i)mulを打ち負かすことはできません。 2の
平原電力が最高のシンプルなshl
を使用して行われ、私は読者の演習として、PDP11の構文への変換を残します。
レイテンシは、典型的なインテルCore2タイミングです。これは多くの最新のレジスタに当てはまります。
Skylake以降は高速です。
ADDとSHLの代替は破壊的ですが、IMUL-immediateは実際には3オペランド命令です: 'imul dest、src、imm32'(/ rフィールドを盗むほとんどの即時命令とは異なり、追加のオペコードビットとしてのModRMバイト)。 –
実際にCore2のタイミングをリストしている場合は、Agner Fogのテーブル(Merom/ConroeとWolfdale/Penryn、Nehalemの場合)によると、複雑なアドレッシングモードでもLEAは常に1サイクルのレイテンシです。 SnBは、複雑なまたはRIP相対的なLEAを遅くする(3サイクル)ための最初のマイクロカーであり、Skylakeではまだ1または3サイクルです。 SnBは標準化されたuopの待ち時間(同じサイクルで結果を生成する複数のuopからの競合を減らすため)であるため、2サイクルの待ち時間はありません。これにより、out-of-orderスケジューラは、各サイクルで実行ポートに送信するuopsを簡単に決定できます。 –
また、Agner Fogの表によると、LEAは3つのコンポーネントを持つ場合には遅くなります。 (ベース+インデックス+変位)。あなたの例はすべて変位がないので、すべて1サイクルのLEAでなければなりません。 –
注目する定数でレジスタを掛けた後、結果を単一のLEA命令で別のレジスタに追加するだけで、kの値を単一命令の場合に簡単に列挙できます。唯一の難しい部分は、他のレジスタが同じレジスタである可能性があることです。 –