trampolines_arm.s raw
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
13 TEXT 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
21 TEXT 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
28 TEXT 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
35 TEXT 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
42 TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0-0
43 CALL ·x_cgo_notify_runtime_init_done(SB)
44 RET
45
46 TEXT x_cgo_bindm_trampoline(SB), NOSPLIT, $0
47 CALL ·x_cgo_bindm(SB)
48 RET
49
50 // func setg_trampoline(setg uintptr, g uintptr)
51 TEXT ·setg_trampoline(SB), NOSPLIT, $0-8
52 MOVW G+4(FP), R0
53 MOVW setg+0(FP), R12
54 BL (R12)
55 RET
56
57 TEXT 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
65 TEXT ·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
82