这是一个非常简单的阶乘函数。
int factorial(int num) {
if (num == 0)
return 1;
return num*factorial(num-1);
}
Run Code Online (Sandbox Code Playgroud)
GCC在-O2上为此功能进行的组装是合理的。
factorial(int):
mov eax, 1
test edi, edi
je .L1
.L2:
imul eax, edi
sub edi, 1
jne .L2
.L1:
ret
Run Code Online (Sandbox Code Playgroud)
但是,在-O3或-Ofast上,它决定使事情变得更复杂(几乎100行!):
factorial(int):
test edi, edi
je .L28
lea edx, [rdi-1]
mov ecx, edi
cmp edx, 6
jbe .L8
mov DWORD PTR [rsp-12], edi
movd xmm5, DWORD PTR [rsp-12]
mov edx, edi
xor eax, eax
movdqa xmm0, XMMWORD PTR .LC0[rip]
movdqa xmm4, XMMWORD PTR .LC2[rip]
shr …Run Code Online (Sandbox Code Playgroud)