Emit `RET` directly for leaf functions

e5645fc3055df9b82d64ca7d38c29907fb450df30b53ed699363b957c8583b38
Alexis Sellier committed ago 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.