2016-09-28 3 views
1

たとえば、%ediはxであり、kは定数の正数です。 %eax<-k*ximulよりも速くしたいのですが、私はlealを使っていますか?だから私の質問は、スケーリング係数が1、2、4、8であり、単一のleal命令を使用している場合、どのようなkの値が可能ですか?私はそれが2^kであると思っていますが、私はそれについてはわかりません、誰かが私にそれを説明することができますか?リーガルで可能な値

そして、私が一対の致命的命令を次々と使用する場合、どのような値のkが可能ですか?

+0

注目する定数でレジスタを掛けた後、結果を単一のLEA命令で別のレジスタに追加するだけで、kの値を単一命令の場合に簡単に列挙できます。唯一の難しい部分は、他のレジスタが同じレジスタである可能性があることです。 –

答えて

1

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以降は高速です。

+0

ADDとSHLの代替は破壊的ですが、IMUL-immediateは実際には3オペランド命令です: 'imul dest、src、imm32'(/ rフィールドを盗むほとんどの即時命令とは異なり、追加のオペコードビットとしてのModRMバイト)。 –

+0

実際に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を簡単に決定できます。 –

+0

また、Agner Fogの表によると、LEAは3つのコンポーネントを持つ場合には遅くなります。 (ベース+インデックス+変位)。あなたの例はすべて変位がないので、すべて1サイクルのLEAでなければなりません。 –

関連する問題