1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: 2026 The Ebitengine Authors
3
4//go:build !cgo && linux
5
6#include "textflag.h"
7#include "go_asm.h"
8
9// these trampolines map the gcc ABI to Go ABI and then calls into the Go equivalent functions.
10// X5 is used as temporary register.
11
12TEXT x_cgo_init_trampoline(SB), NOSPLIT, $16
13 MOV X10, 8(SP)
14 MOV X11, 16(SP)
15 MOV ·x_cgo_init_call(SB), X5
16 MOV (X5), X5
17 CALL X5
18 RET
19
20TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $8
21 MOV X10, 8(SP)
22 MOV ·x_cgo_thread_start_call(SB), X5
23 MOV (X5), X5
24 CALL X5
25 RET
26
27TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $8
28 MOV X10, 8(SP)
29 MOV ·x_cgo_setenv_call(SB), X5
30 MOV (X5), X5
31 CALL X5
32 RET
33
34TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $8
35 MOV X10, 8(SP)
36 MOV ·x_cgo_unsetenv_call(SB), X5
37 MOV (X5), X5
38 CALL X5
39 RET
40
41TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0
42 CALL ·x_cgo_notify_runtime_init_done(SB)
43 RET
44
45TEXT x_cgo_bindm_trampoline(SB), NOSPLIT, $0
46 CALL ·x_cgo_bindm(SB)
47 RET
48
49// func setg_trampoline(setg uintptr, g uintptr)
50TEXT ·setg_trampoline(SB), NOSPLIT, $0
51 MOV gp+8(FP), X10
52 MOV setg+0(FP), X5
53 CALL X5
54 RET
55
56TEXT threadentry_trampoline(SB), NOSPLIT, $16
57 MOV X10, 8(SP)
58 MOV ·threadentry_call(SB), X5
59 MOV (X5), X5
60 CALL X5
61 RET
62
63TEXT ·call5(SB), NOSPLIT, $0-48
64 MOV fn+0(FP), X5
65 MOV a1+8(FP), X10
66 MOV a2+16(FP), X11
67 MOV a3+24(FP), X12
68 MOV a4+32(FP), X13
69 MOV a5+40(FP), X14
70 CALL X5
71 MOV X10, ret+48(FP)
72 RET