compilium
compilium copied to clipboard
Restore registers appropriately in early returns
$ ./compilium
int main() {
int a = 1;
return a + 2;
}
Preprocess begin
Parse begin
[
FuncDef <main> : function<returns: int, args: []>{
[
(op=<> R=(op= R=(op=<a>))),
(op=<return> R=(op=<+> L=(op=<a>) R=(op=<2>)))
]
}
]
Analyze begin
`a` has a type: int
[
FuncDef <main> : function<returns: int, args: []>{
[
(op=<> R=(op= R=(op=<a>))),
(op=<return> R=(op=<+>:int reg: 1 L=(op=<a>:lvalue<int> reg: 1) R=(op=<2>:int reg: 2)))
]
}
]
.intel_syntax noprefix
.text
.global _main
_main:
push rbp
mov rbp, rsp
push r12
push r13
push r14
push r15
lea rdi, [rbp - 4]
mov rsi, 1
mov [rdi], esi # 4 byte store
lea rdi, [rbp - 4]
movsxd rdi, dword ptr[rdi]
mov rsi, 2
add rdi, rsi
mov rax, rdi
mov rsp, rbp
pop rbp
ret
pop r15
pop r14
pop r13
pop r12
mov rsp, rbp
pop rbp
ret
.data
pop r15
pop r14
pop r13
pop r12
should also be done in early returns.