Function Prolog / Epilog
Source: pb_cg_emit_function_prolog (pb_codegen.c:1272), pb_cg_emit_routine epilogue (pb_codegen.c:1400)
Standard Prolog (frame <= 4096 bytes)
push rbp
mov rbp, rsp
sub rsp, <frame_size>
Large Frame Prolog (with stack probing)
; Required when frame > 4096 to touch each guard page
push rbp
mov rbp, rsp
mov r11, <frame_size>
__pb_stack_probe_loop_N:
cmp r11, 4096
jle __pb_stack_probe_last_N
sub rsp, 4096
mov r10, [rsp] ; touch page
sub r11, 4096
jmp __pb_stack_probe_loop_N
__pb_stack_probe_last_N:
sub rsp, r11
mov r10, [rsp] ; touch final page
Parameter Capture (Win64 ABI)
; First 4 integer/pointer args:
mov [rbp - param0_offset], rcx ; arg 1
mov [rbp - param1_offset], rdx ; arg 2
mov [rbp - param2_offset], r8 ; arg 3
mov [rbp - param3_offset], r9 ; arg 4
; Args 5+ from caller's stack frame:
mov rax, [rbp + 48] ; arg 5 (above shadow space + return addr)
mov [rbp - param4_offset], rax
mov rax, [rbp + 56] ; arg 6
mov [rbp - param5_offset], rax
; First 4 float args:
movsd [rbp - fparam0_offset], xmm0 ; FP arg 1
movsd [rbp - fparam1_offset], xmm1 ; FP arg 2
movsd [rbp - fparam2_offset], xmm2 ; FP arg 3
movsd [rbp - fparam3_offset], xmm3 ; FP arg 4
Standard Epilogue
; Load return value from [rbp - return_offset]
mov rax, [rbp - return_offset] ; integer return
; or: movsd xmm0, [rbp - return_offset] ; float return
add rsp, <frame_size>
pop rbp
ret
PBMAIN Epilogue
mov rcx, [rbp - return_offset] ; exit code
call [__imp_ExitProcess]
xor rax, rax ; unreachable
add rsp, <frame_size>
pop rbp
ret
Stack Frame Layout
; RBP-based frame (grows downward):
[rbp + 16] ; return address (from CALL)
[rbp + 8] ; saved RBP
[rbp] ; <- RBP points here
[rbp - 8] ; return value slot
[rbp - 16] ; GOSUB depth counter
[rbp - 24] ; GOSUB stack base (32 entries * 8 bytes)
[rbp - N] ; local variables and temporaries
; ... variable offsets ...
[rbp - frame_size] ; <- RSP after prolog