why 8-byte Spill happens?
我有一段求阶乘的C代码如下:
long int rfact(long int x)
{
if(x <= 1)
{
return 1;
}
long int temp = x-1;
return x * rfact(temp);
}
temp变量只是为了看gcc怎么分配栈的
然后我
gcc -S rfact.c
得到的汇编代码部分如下
subq $32, %rsp
movq %rdi, -16(%rbp)
cmpq $1, -16(%rbp)
jg LBB0_2
## BB#1:
movq $1, -8(%rbp)
jmp LBB0_3
LBB0_2:
movq -16(%rbp), %rax
subq $1, %rax
movq %rax, -24(%rbp)
movq -16(%rbp), %rax
movq -24(%rbp), %rdi
movq %rax, -32(%rbp) ## 8-byte Spill
callq _rfact
movq -32(%rbp), %rdi ## 8-byte Reload
imulq %rax, %rdi
movq %rdi, -8(%rbp)
LBB0_3:
movq -8(%rbp), %rax
addq $32, %rsp
popq %rbp
retq
可以看到gcc自己在两行代码后面加了注释
## 8-byte Spill
不太明白它为什么要这么做,因为有几句代码是冗余的,对于下面几行
movq -16(%rbp), %rax
...
movq %rax, -32(%rbp) ## 8-byte Spill
callq _rfact
moveq -32(%rbp), %rdi ## 8-byte Reload
上面代码其实就是又存了一个参数x的副本,删掉前面两句movq改成以下似乎也没有问题,代码运行后结果正常
...
callq _rfact
movq -16(%rbp), %rdi
那么,请问下gcc自己给的那个8-byte Spill是什么意思呢,如果我这么改汇编代码会给最终生成的可执行文件带来什么隐患吗?
hwbest
9 years, 2 months ago