为什么GCC使用无关的寄存器?

时间:2019-06-22 19:17:30

标签: gcc assembly riscv

我正在学习函数序言,并试图理解GCC为什么要做它。

这是我简单的C函数:

#include <stdint.h>

int add(uint8_t num) {
    return num + num;
}

将此代码放入riscv64 gcc 7.2.0的编译器浏览器(例如此https://cx.rv8.io/)中,而未应用优化标志将导致以下汇编:

add(unsigned char):
  addi sp,sp,-32
  sd s0,24(sp)
  addi s0,sp,32
  mv a5,a0
  sb a5,-17(s0)
  ; end function prologue
  lbu a5,-17(s0)
  sext.w a5,a5
  slliw a5,a5,1
  sext.w a5,a5
  ; start function epilogue
  mv a0,a5
  ld s0,24(sp)
  addi sp,sp,32
  jr ra
  1. 为什么GCC会将寄存器a0中的第一个输入arg复制到a5中?为什么不简单地在整个函数中对寄存器a0进行操作?
  2. 为什么要使用sb将arg存储在堆栈中,然后立即使用a5将arg从堆栈中加载到lbu中呢? a5已具有此值。

我知道这没有应用任何优化,但是即使对于“无优化”方案,我也觉得对于编译器而言这很奇怪。

以下是寄存器列表及其对不熟悉RISC-V的人员的用途:https://github.com/riscv/riscv-asm-manual/blob/master/riscv-asm.md#general-registers

0 个答案:

没有答案