1 // Copyright 2026 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 // Macros for transitioning from the host ABI to Go ABI0.
6 //
7 // These macros save and restore the callee-saved registers
8 // from the stack, but they don't adjust stack pointer, so
9 // the user should prepare stack space in advance.
10 // SAVE_GPR(offset) saves X8, X9, X18-X27 to the stack space
11 // of ((offset)+0*8)(X2) ~ ((offset)+11*8)(X2).
12 //
13 // SAVE_FPR(offset) saves F8, F9, F18-F27 to the stack space
14 // of ((offset)+0*8)(X2) ~ ((offset)+11*8)(X2).
15 //
16 // Note: g is X27
17
18 #define SAVE_GPR(offset) \
19 MOV X8, ((offset)+0*8)(X2) \
20 MOV X9, ((offset)+1*8)(X2) \
21 MOV X18, ((offset)+2*8)(X2) \
22 MOV X19, ((offset)+3*8)(X2) \
23 MOV X20, ((offset)+4*8)(X2) \
24 MOV X21, ((offset)+5*8)(X2) \
25 MOV X22, ((offset)+6*8)(X2) \
26 MOV X23, ((offset)+7*8)(X2) \
27 MOV X24, ((offset)+8*8)(X2) \
28 MOV X25, ((offset)+9*8)(X2) \
29 MOV X26, ((offset)+10*8)(X2) \
30 MOV g, ((offset)+11*8)(X2)
31
32 #define RESTORE_GPR(offset) \
33 MOV ((offset)+0*8)(X2), X8 \
34 MOV ((offset)+1*8)(X2), X9 \
35 MOV ((offset)+2*8)(X2), X18 \
36 MOV ((offset)+3*8)(X2), X19 \
37 MOV ((offset)+4*8)(X2), X20 \
38 MOV ((offset)+5*8)(X2), X21 \
39 MOV ((offset)+6*8)(X2), X22 \
40 MOV ((offset)+7*8)(X2), X23 \
41 MOV ((offset)+8*8)(X2), X24 \
42 MOV ((offset)+9*8)(X2), X25 \
43 MOV ((offset)+10*8)(X2), X26 \
44 MOV ((offset)+11*8)(X2), g
45
46 #define SAVE_FPR(offset) \
47 MOVD F8, ((offset)+0*8)(X2) \
48 MOVD F9, ((offset)+1*8)(X2) \
49 MOVD F18, ((offset)+2*8)(X2) \
50 MOVD F19, ((offset)+3*8)(X2) \
51 MOVD F20, ((offset)+4*8)(X2) \
52 MOVD F21, ((offset)+5*8)(X2) \
53 MOVD F22, ((offset)+6*8)(X2) \
54 MOVD F23, ((offset)+7*8)(X2) \
55 MOVD F24, ((offset)+8*8)(X2) \
56 MOVD F25, ((offset)+9*8)(X2) \
57 MOVD F26, ((offset)+10*8)(X2) \
58 MOVD F27, ((offset)+11*8)(X2)
59
60 #define RESTORE_FPR(offset) \
61 MOVD ((offset)+0*8)(X2), F8 \
62 MOVD ((offset)+1*8)(X2), F9 \
63 MOVD ((offset)+2*8)(X2), F18 \
64 MOVD ((offset)+3*8)(X2), F19 \
65 MOVD ((offset)+4*8)(X2), F20 \
66 MOVD ((offset)+5*8)(X2), F21 \
67 MOVD ((offset)+6*8)(X2), F22 \
68 MOVD ((offset)+7*8)(X2), F23 \
69 MOVD ((offset)+8*8)(X2), F24 \
70 MOVD ((offset)+9*8)(X2), F25 \
71 MOVD ((offset)+10*8)(X2), F26 \
72 MOVD ((offset)+11*8)(X2), F27
73
View as plain text