1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: 2026 The Ebitengine Authors
3
4//go:build !cgo && (freebsd || linux)
5
6#include "textflag.h"
7#include "go_asm.h"
8
9// These trampolines map the gcc ABI to Go ABI0 and then call into the Go equivalent functions.
10// On ARM32, Go ABI0 uses stack-based calling convention.
11// Arguments are placed on the stack starting at 4(SP) after the prologue.
12
13TEXT x_cgo_init_trampoline(SB), NOSPLIT, $8-0
14 MOVW R0, 4(R13)
15 MOVW R1, 8(R13)
16 MOVW ·x_cgo_init_call(SB), R12
17 MOVW (R12), R12
18 CALL (R12)
19 RET
20
21TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $8-0
22 MOVW R0, 4(R13)
23 MOVW ·x_cgo_thread_start_call(SB), R12
24 MOVW (R12), R12
25 CALL (R12)
26 RET
27
28TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $8-0
29 MOVW R0, 4(R13)
30 MOVW ·x_cgo_setenv_call(SB), R12
31 MOVW (R12), R12
32 CALL (R12)
33 RET
34
35TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $8-0
36 MOVW R0, 4(R13)
37 MOVW ·x_cgo_unsetenv_call(SB), R12
38 MOVW (R12), R12
39 CALL (R12)
40 RET
41
42TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0-0
43 CALL ·x_cgo_notify_runtime_init_done(SB)
44 RET
45
46TEXT x_cgo_bindm_trampoline(SB), NOSPLIT, $0
47 CALL ·x_cgo_bindm(SB)
48 RET
49
50// func setg_trampoline(setg uintptr, g uintptr)
51TEXT ·setg_trampoline(SB), NOSPLIT, $0-8
52 MOVW G+4(FP), R0
53 MOVW setg+0(FP), R12
54 BL (R12)
55 RET
56
57TEXT threadentry_trampoline(SB), NOSPLIT, $8-0
58 // See crosscall2.
59 MOVW R0, 4(R13)
60 MOVW ·threadentry_call(SB), R12
61 MOVW (R12), R12
62 CALL (R12)
63 RET
64
65TEXT ·call5(SB), NOSPLIT, $8-28
66 MOVW fn+0(FP), R12
67 MOVW a1+4(FP), R0
68 MOVW a2+8(FP), R1
69 MOVW a3+12(FP), R2
70 MOVW a4+16(FP), R3
71 MOVW a5+20(FP), R4
72
73 // Store 5th arg below SP (in local frame area)
74 MOVW R4, arg5-8(SP)
75
76 // Align SP to 8 bytes for call (required by ARM AAPCS)
77 SUB $8, R13
78 CALL (R12)
79 ADD $8, R13
80 MOVW R0, r1+24(FP)
81 RET