why 8-byte Spill happens?

发布于 2022-09-01 17:30:33 字数 1281 浏览 14 评论 0

我有一段求阶乘的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是什么意思呢,如果我这么改汇编代码会给最终生成的可执行文件带来什么隐患吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文