// Copyright (c) 2026 Petr Balvín (https://petrbalvin.org) // SPDX-License-Identifier: BSD-3-Clause #include "textflag.h" // ABI0 JIT trampoline. enterJIT switches from the Go stack to a prepared // stack and jumps to the assembled function; when the function RETs, control // lands in leaveJIT, which restores the Go stack and returns to the Go caller. // // The prepared stack must begin with the address of leaveJIT (the return // address the JIT function will pop), followed by the function's ABI0 // argument area. // // Single-threaded: savedSP is a package global, so only one JIT call may be // in flight at a time. gasm verify runs sequentially. // func enterJIT(fn uintptr, stack uintptr) // Switches to the prepared stack and jumps to fn. Does not return normally; // the JIT function's RET transfers control to leaveJIT. TEXT ·enterJIT(SB), NOSPLIT, $0-16 MOVQ fn+0(FP), AX // target function address (before SP switch) MOVQ SP, ·savedSP(SB) // preserve the Go stack pointer MOVQ stack+8(FP), SP // switch to the prepared stack JMP AX // func leaveJIT() // Restores the Go stack pointer and returns to enterJIT's caller. TEXT ·leaveJIT(SB), NOSPLIT, $0-0 MOVQ ·savedSP(SB), SP RET