#include "textflag.h"
#include "asm_ppc64x.h"
+#include "abi_ppc64x.h"
#ifdef GO_PPC64X_HAS_FUNCDESC
// crosscall2 is marked with go:cgo_export_static. On AIX, this creates and exports
// The value of R2 is saved on the new stack frame, and not
// the caller's frame due to issue #43228.
TEXT crosscall2(SB),NOSPLIT|NOFRAME,$0
- // Start with standard C stack frame layout and linkage
- MOVD LR, R0
- MOVD R0, 16(R1) // Save LR in caller's frame
- MOVW CR, R0 // Save CR in caller's frame
- MOVW R0, 8(R1)
-
- BL saveregs2<>(SB)
-
- MOVDU R1, (-288-3*8-FIXED_FRAME)(R1)
- // Save the caller's R2
+ // Start with standard C stack frame layout and linkage, allocate
+ // 32 bytes of argument space, save callee-save regs, and set R0 to $0.
+ STACK_AND_SAVE_HOST_TO_GO_ABI(32)
+ // The above will not preserve R2 (TOC). Save it in case Go is
+ // compiled without a TOC pointer (e.g -buildmode=default).
MOVD R2, 24(R1)
- // Initialize Go ABI environment
- BL runtime·reginit(SB)
+ // Load the current g.
BL runtime·load_g(SB)
#ifdef GO_PPC64X_HAS_FUNCDESC
MOVD R6, FIXED_FRAME+16(R1) // ctxt uintptr
BL runtime·cgocallback(SB)
- // Restore the caller's R2
+ // Restore the old frame, and R2.
MOVD 24(R1), R2
- ADD $(288+3*8+FIXED_FRAME), R1
-
- BL restoreregs2<>(SB)
-
- MOVW 8(R1), R0
- MOVFL R0, $0xff
- MOVD 16(R1), R0
- MOVD R0, LR
- RET
-
-TEXT saveregs2<>(SB),NOSPLIT|NOFRAME,$0
- // O=-288; for R in R{14..31}; do echo "\tMOVD\t$R, $O(R1)"|sed s/R30/g/; ((O+=8)); done; for F in F{14..31}; do echo "\tFMOVD\t$F, $O(R1)"; ((O+=8)); done
- MOVD R14, -288(R1)
- MOVD R15, -280(R1)
- MOVD R16, -272(R1)
- MOVD R17, -264(R1)
- MOVD R18, -256(R1)
- MOVD R19, -248(R1)
- MOVD R20, -240(R1)
- MOVD R21, -232(R1)
- MOVD R22, -224(R1)
- MOVD R23, -216(R1)
- MOVD R24, -208(R1)
- MOVD R25, -200(R1)
- MOVD R26, -192(R1)
- MOVD R27, -184(R1)
- MOVD R28, -176(R1)
- MOVD R29, -168(R1)
- MOVD g, -160(R1)
- MOVD R31, -152(R1)
- FMOVD F14, -144(R1)
- FMOVD F15, -136(R1)
- FMOVD F16, -128(R1)
- FMOVD F17, -120(R1)
- FMOVD F18, -112(R1)
- FMOVD F19, -104(R1)
- FMOVD F20, -96(R1)
- FMOVD F21, -88(R1)
- FMOVD F22, -80(R1)
- FMOVD F23, -72(R1)
- FMOVD F24, -64(R1)
- FMOVD F25, -56(R1)
- FMOVD F26, -48(R1)
- FMOVD F27, -40(R1)
- FMOVD F28, -32(R1)
- FMOVD F29, -24(R1)
- FMOVD F30, -16(R1)
- FMOVD F31, -8(R1)
-
- RET
-
-TEXT restoreregs2<>(SB),NOSPLIT|NOFRAME,$0
- // O=-288; for R in R{14..31}; do echo "\tMOVD\t$O(R1), $R"|sed s/R30/g/; ((O+=8)); done; for F in F{14..31}; do echo "\tFMOVD\t$O(R1), $F"; ((O+=8)); done
- MOVD -288(R1), R14
- MOVD -280(R1), R15
- MOVD -272(R1), R16
- MOVD -264(R1), R17
- MOVD -256(R1), R18
- MOVD -248(R1), R19
- MOVD -240(R1), R20
- MOVD -232(R1), R21
- MOVD -224(R1), R22
- MOVD -216(R1), R23
- MOVD -208(R1), R24
- MOVD -200(R1), R25
- MOVD -192(R1), R26
- MOVD -184(R1), R27
- MOVD -176(R1), R28
- MOVD -168(R1), R29
- MOVD -160(R1), g
- MOVD -152(R1), R31
- FMOVD -144(R1), F14
- FMOVD -136(R1), F15
- FMOVD -128(R1), F16
- FMOVD -120(R1), F17
- FMOVD -112(R1), F18
- FMOVD -104(R1), F19
- FMOVD -96(R1), F20
- FMOVD -88(R1), F21
- FMOVD -80(R1), F22
- FMOVD -72(R1), F23
- FMOVD -64(R1), F24
- FMOVD -56(R1), F25
- FMOVD -48(R1), F26
- FMOVD -40(R1), F27
- FMOVD -32(R1), F28
- FMOVD -24(R1), F29
- FMOVD -16(R1), F30
- FMOVD -8(R1), F31
-
+ UNSTACK_AND_RESTORE_GO_TO_HOST_ABI(32)
RET