我正在运行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 */
不要对伪代码看得太深,它纯粹是为了阐明这两种方法背后的数学逻辑。
我实际比较的是以下两个指令序列:
方法一: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
通常比大多数处理器上的分支方法更快,因为它需要更少的总指令?