Esta fonte C:
typedef struct {
unsigned long one;
unsigned long two;
} twin;
twin function( twin t ) {
return (twin){ 0,0 };
}
gera esta montagem:
.file "p.c"
.option nopic
.attribute arch, "rv64i2p1_m2p0_a2p1_f2p2_d2p2_c2p0_zicsr2p0_zifencei2p0"
.attribute unaligned_access, 0
.attribute stack_align, 16
.text
.align 1
.globl function
.type function, @function
function:
addi sp,sp,-32 # <<< WHY?
li a0,0
li a1,0
addi sp,sp,32 # <<< WHY?
jr ra
.size function, .-function
.ident "GCC: (g04696df09) 14.2.0"
.section .note.GNU-stack,"",@progbits
quando executado riscv64-unknown-elf-gcc (g04696df09) 14.2.0
com ou -O3
ou -O2
ou -O1
mesmo -Os
.
Então por que o código está criando espaço na pilha para coisas (32 bytes) que são e serão mantidas em registradores a0
e a1
?
Isso é um bug ou estou esquecendo de alguma coisa?