Emit `RET` directly for leaf functions
e5645fc3055df9b82d64ca7d38c29907fb450df30b53ed699363b957c8583b38
1 parent
d84d2c73
lib/std/arch/rv64/emit.rad
+6 -1
| 612 | 612 | let sr = frame.savedRegs[i]; |
|
| 613 | 613 | emitSd(e, sr.reg, super::SP, sr.offset); |
|
| 614 | 614 | } |
|
| 615 | 615 | } |
|
| 616 | 616 | ||
| 617 | - | /// Emit a return: jump to epilogue. |
|
| 617 | + | /// Emit a return: jump to epilogue, or emit `ret` directly for leaf functions. |
|
| 618 | 618 | pub fn emitReturn(e: *mut Emitter, frame: *Frame) { |
|
| 619 | + | if frame.totalSize == 0 { |
|
| 620 | + | // Leaf function: no frame to tear down, emit ret directly. |
|
| 621 | + | emit(e, encode::ret()); |
|
| 622 | + | return; |
|
| 623 | + | } |
|
| 619 | 624 | recordBranch(e, frame.epilogueBlock, BranchKind::Jump); |
|
| 620 | 625 | } |
|
| 621 | 626 | ||
| 622 | 627 | /// Emit function epilogue. |
|
| 623 | 628 | /// Restores callee-saved registers, `RA/FP`, deallocates frame, returns. |