1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: 2025 The Ebitengine Authors
3
4//go:build !cgo && linux
5
6#include "textflag.h"
7#include "go_asm.h"
8#include "abi_loong64.h"
9
10// these trampolines map the gcc ABI to Go ABI and then calls into the Go equivalent functions.
11// R23 is used as temporary register.
12
13TEXT x_cgo_init_trampoline(SB), NOSPLIT, $16
14 MOVV R4, 8(R3)
15 MOVV R5, 16(R3)
16 MOVV ·x_cgo_init_call(SB), R23
17 MOVV (R23), R23
18 CALL (R23)
19 RET
20
21TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $8
22 MOVV R4, 8(R3)
23 MOVV ·x_cgo_thread_start_call(SB), R23
24 MOVV (R23), R23
25 CALL (R23)
26 RET
27
28TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $8
29 MOVV R4, 8(R3)
30 MOVV ·x_cgo_setenv_call(SB), R23
31 MOVV (R23), R23
32 CALL (R23)
33 RET
34
35TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $8
36 MOVV R4, 8(R3)
37 MOVV ·x_cgo_unsetenv_call(SB), R23
38 MOVV (R23), R23
39 CALL (R23)
40 RET
41
42TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $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
52 MOVV G+8(FP), R4
53 MOVV setg+0(FP), R23
54 CALL (R23)
55 RET
56
57TEXT threadentry_trampoline(SB), NOSPLIT, $0
58 // See crosscall2.
59 ADDV $(-23*8), R3
60 MOVV R4, (1*8)(R3) // fn unsafe.Pointer
61 MOVV R5, (2*8)(R3) // a unsafe.Pointer
62 MOVV R7, (3*8)(R3) // ctxt uintptr
63
64 SAVE_R22_TO_R31((4*8))
65 SAVE_F24_TO_F31((14*8))
66 MOVV R1, (22*8)(R3)
67
68 MOVV ·threadentry_call(SB), R23
69 MOVV (R23), R23
70 CALL (R23)
71
72 RESTORE_R22_TO_R31((4*8))
73 RESTORE_F24_TO_F31((14*8))
74 MOVV (22*8)(R3), R1
75
76 ADDV $(23*8), R3
77 RET
78
79TEXT ·call5(SB), NOSPLIT, $0-0
80 MOVV fn+0(FP), R23
81 MOVV a1+8(FP), R4
82 MOVV a2+16(FP), R5
83 MOVV a3+24(FP), R6
84 MOVV a4+32(FP), R7
85 MOVV a5+40(FP), R8
86 CALL (R23)
87 MOVV R4, ret+48(FP)
88 RET