trampolines_loong64.s raw
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
13 TEXT 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
21 TEXT 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
28 TEXT 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
35 TEXT 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
42 TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $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
52 MOVV G+8(FP), R4
53 MOVV setg+0(FP), R23
54 CALL (R23)
55 RET
56
57 TEXT 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
79 TEXT ·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
89