trampolines_arm64.s raw
1 // SPDX-License-Identifier: Apache-2.0
2 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors
3
4 //go:build !cgo && (darwin || freebsd || linux)
5
6 #include "textflag.h"
7 #include "go_asm.h"
8 #include "abi_arm64.h"
9
10 // These trampolines map the gcc ABI to Go ABIInternal and then calls into the Go equivalent functions.
11 // Note that C arguments are passed in R0-R7, which matches Go ABIInternal for the first eight arguments.
12 // R9 is used as a temporary register.
13
14 TEXT x_cgo_init_trampoline(SB), NOSPLIT, $0-0
15 MOVD ·x_cgo_init_call(SB), R9
16 MOVD (R9), R9
17 CALL R9
18 RET
19
20 TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $0-0
21 MOVD ·x_cgo_thread_start_call(SB), R9
22 MOVD (R9), R9
23 CALL R9
24 RET
25
26 TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $0-0
27 MOVD ·x_cgo_setenv_call(SB), R9
28 MOVD (R9), R9
29 CALL R9
30 RET
31
32 TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $0-0
33 MOVD ·x_cgo_unsetenv_call(SB), R9
34 MOVD (R9), R9
35 CALL R9
36 RET
37
38 TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0-0
39 CALL ·x_cgo_notify_runtime_init_done(SB)
40 RET
41
42 TEXT x_cgo_bindm_trampoline(SB), NOSPLIT, $0
43 CALL ·x_cgo_bindm(SB)
44 RET
45
46 // func setg_trampoline(setg uintptr, g uintptr)
47 TEXT ·setg_trampoline(SB), NOSPLIT, $0-16
48 MOVD G+8(FP), R0
49 MOVD setg+0(FP), R9
50 CALL R9
51 RET
52
53 TEXT threadentry_trampoline(SB), NOSPLIT, $0-0
54 // See crosscall2.
55 SUB $(8*24), RSP
56 STP (R0, R1), (8*1)(RSP)
57 MOVD R3, (8*3)(RSP)
58
59 SAVE_R19_TO_R28(8*4)
60 SAVE_F8_TO_F15(8*14)
61 STP (R29, R30), (8*22)(RSP)
62
63 MOVD ·threadentry_call(SB), R9
64 MOVD (R9), R9
65 CALL R9
66 MOVD $0, R0 // TODO: get the return value from threadentry
67
68 RESTORE_R19_TO_R28(8*4)
69 RESTORE_F8_TO_F15(8*14)
70 LDP (8*22)(RSP), (R29, R30)
71
72 ADD $(8*24), RSP
73 RET
74
75 TEXT ·call5(SB), NOSPLIT, $0-0
76 MOVD fn+0(FP), R9
77 MOVD a1+8(FP), R0
78 MOVD a2+16(FP), R1
79 MOVD a3+24(FP), R2
80 MOVD a4+32(FP), R3
81 MOVD a5+40(FP), R4
82 CALL R9
83 MOVD R0, ret+48(FP)
84 RET
85