私はx86プロセッサを実行していますが、私の質問はかなり一般的だと思います。CMP + JE
シーケンスと単一の操作で消費されるクロックサイクルの理論的な違いに興味がありMUL
ます。
C 疑似コードでは:
unsigned foo = 1; /* must be 0 or 1 */
unsigned num = 0;
/* Method 1: CMP + JE*/
if(foo == 1){
num = 5;
}
/* Method 2: MUL */
num = foo*5; /* num = 0 if foo = 0 */
疑似コードはあまり深く調べないでください。純粋に、2 つのメソッドの背後にある数学的論理を明らかにするためのものです。
私が実際に比較しているのは、次の 2 つの一連の命令です。
方法 1: CMP + JE
MOV EAX, 1 ; FOO = 1 here, but can be set to 0
MOV EBX, 0 ; NUM = 0
CMP EAX, 1 ; if(foo == 1)
JE SUCCESS ; enter branch
JMP FINISH ; end program
SUCCESS:
MOV EBX, 5 ; num = 5
FINISH:
方法 2: MUL
MOV EAX, 1 ; FOO = 1 here, but can be set to 0
MOV ECX, EAX ; save copy of FOO to ECX
MUL ECX, 5 ; result = foo*5
MOV EBX, ECX ; num = result = foo*5
単一MUL
(合計 4 命令) は (合計 6 命令) よりも効率的であるように見えますが、クロック サイクルは命令に対して同じようCMP + JE
に消費されます。つまり、命令を完了するのにかかるクロック サイクル数は、他の命令と同じです。 ?
消費される実際のクロック サイクルがマシンに依存する場合、MUL
ほとんどのプロセッサでは、必要な合計命令数が少ないため、通常、単一の分岐アプローチは分岐アプローチよりも高速ですか?