blob: b9322e0c53e2ac8ff1808b69627e6d3fae668706 [file] [edit]
// Copyright 2026 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Macros for transitioning from the host ABI to Go ABI0.
//
// These macros save and restore the callee-saved registers
// from the stack, but they don't adjust stack pointer, so
// the user should prepare stack space in advance.
// SAVE_GPR(offset) saves X8, X9, X18-X27 to the stack space
// of ((offset)+0*8)(X2) ~ ((offset)+11*8)(X2).
//
// SAVE_FPR(offset) saves F8, F9, F18-F27 to the stack space
// of ((offset)+0*8)(X2) ~ ((offset)+11*8)(X2).
//
// Note: g is X27
#define SAVE_GPR(offset) \
MOV X8, ((offset)+0*8)(X2) \
MOV X9, ((offset)+1*8)(X2) \
MOV X18, ((offset)+2*8)(X2) \
MOV X19, ((offset)+3*8)(X2) \
MOV X20, ((offset)+4*8)(X2) \
MOV X21, ((offset)+5*8)(X2) \
MOV X22, ((offset)+6*8)(X2) \
MOV X23, ((offset)+7*8)(X2) \
MOV X24, ((offset)+8*8)(X2) \
MOV X25, ((offset)+9*8)(X2) \
MOV X26, ((offset)+10*8)(X2) \
MOV g, ((offset)+11*8)(X2)
#define RESTORE_GPR(offset) \
MOV ((offset)+0*8)(X2), X8 \
MOV ((offset)+1*8)(X2), X9 \
MOV ((offset)+2*8)(X2), X18 \
MOV ((offset)+3*8)(X2), X19 \
MOV ((offset)+4*8)(X2), X20 \
MOV ((offset)+5*8)(X2), X21 \
MOV ((offset)+6*8)(X2), X22 \
MOV ((offset)+7*8)(X2), X23 \
MOV ((offset)+8*8)(X2), X24 \
MOV ((offset)+9*8)(X2), X25 \
MOV ((offset)+10*8)(X2), X26 \
MOV ((offset)+11*8)(X2), g
#define SAVE_FPR(offset) \
MOVD F8, ((offset)+0*8)(X2) \
MOVD F9, ((offset)+1*8)(X2) \
MOVD F18, ((offset)+2*8)(X2) \
MOVD F19, ((offset)+3*8)(X2) \
MOVD F20, ((offset)+4*8)(X2) \
MOVD F21, ((offset)+5*8)(X2) \
MOVD F22, ((offset)+6*8)(X2) \
MOVD F23, ((offset)+7*8)(X2) \
MOVD F24, ((offset)+8*8)(X2) \
MOVD F25, ((offset)+9*8)(X2) \
MOVD F26, ((offset)+10*8)(X2) \
MOVD F27, ((offset)+11*8)(X2)
#define RESTORE_FPR(offset) \
MOVD ((offset)+0*8)(X2), F8 \
MOVD ((offset)+1*8)(X2), F9 \
MOVD ((offset)+2*8)(X2), F18 \
MOVD ((offset)+3*8)(X2), F19 \
MOVD ((offset)+4*8)(X2), F20 \
MOVD ((offset)+5*8)(X2), F21 \
MOVD ((offset)+6*8)(X2), F22 \
MOVD ((offset)+7*8)(X2), F23 \
MOVD ((offset)+8*8)(X2), F24 \
MOVD ((offset)+9*8)(X2), F25 \
MOVD ((offset)+10*8)(X2), F26 \
MOVD ((offset)+11*8)(X2), F27