【问题标题】:what does Spill mean in ARM ISAARM ISA 中的溢出是什么意思
【发布时间】:2020-07-07 02:23:45
【问题描述】:

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

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

当我将它编译为 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

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

【问题讨论】:

    标签: arm64


    【解决方案1】:

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

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

    Folded 对于这个我将不得不猜测。折叠是简化数学运算的组合。我会心血来潮地说它不适用于这里,它只是一个通用的编译器消息,仅在某些时候适用。如果我们将其中的几个连续保存到堆栈中并增加堆栈指针(sp)一次,那么它将被合并,因为我们将使用 -32+16=-16,这不会导致任何额外的数学。

    sub sp, sp, #32 
    stp x27, x28, [sp] 
    stp x29, x30, [sp, #16] <--- folded because we decrement sp once on 1st row
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      • 2022-12-13
      • 2011-05-30
      • 1970-01-01
      • 2018-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多