ARM ISA 中的 Spill 是什么意思

rea*_*xie 6 arm64

我写了一些测试代码,just for testing the stack overflow.

int MyFunc(long c)
{
    char buffer[12];
    return sprintf(buffer, "xxxxxxxxxxx%ld", c);
}
Run Code Online (Sandbox Code Playgroud)

当我将其编译为 ARM64 程序集时,我得到了结果

MyFunc(long): // @MyFunc(long)
  sub sp, sp, #32 // =32
  stp x29, x30, [sp, #16] // 16-byte Folded Spill
  add x29, sp, #16 // =16
  adrp x1, .L.str
  mov x2, x0
  add x1, x1, :lo12:.L.str
  add x0, sp, #4 // =4
  bl sprintf
  ldp x29, x30, [sp, #16] // 16-byte Folded Reload
  add sp, sp, #32 // =32
  ret
Run Code Online (Sandbox Code Playgroud)

那么,什么16-byte Folded Spill意思呢?为什么?

Sun*_*est 9

Stackoverflow.com 是解决堆栈溢出问题的最佳场所。=)

\n

16-byte是因为我们将两个 8 字节寄存器保存到堆栈中。

\n

Folded对于这个,我将不得不猜测。折叠是数学运算的简化组合。我一时兴起说它不适用于此处,并且 it\xe2\x80\x99 只是一条仅有时适用的通用编译器消息。如果我们连续有几个这样的寄存器来将许多寄存器保存到堆栈中并仅递增堆栈指针(sp)一次,那么它将被组合起来,因为我们将使用 -32+16=-16 并且这不会导致任何额外的数学。

\n
sub sp, sp, #32 \nstp x27, x28, [sp] \nstp x29, x30, [sp, #16] <--- folded because we decrement sp once on 1st row\n
Run Code Online (Sandbox Code Playgroud)\n

Spill是将寄存器保存到内存的过程,因为我们需要额外的寄存器。这通常称为将寄存器溢出到内存。

\n