| // Copyright 2014 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. | 
 |  | 
 | // +build ppc64 ppc64le | 
 |  | 
 | #include "textflag.h" | 
 |  | 
 | /* | 
 |  * void crosscall2(void (*fn)(void*, int32), void*, int32) | 
 |  * Save registers and call fn with two arguments. | 
 |  * crosscall2 obeys the C ABI; fn obeys the Go ABI. | 
 |  */ | 
 | TEXT crosscall2(SB),NOSPLIT,$-8 | 
 | 	// TODO(austin): ABI v1 (fn is probably a function descriptor) | 
 |  | 
 | 	// Start with standard C stack frame layout and linkage | 
 | 	MOVD	LR, R0 | 
 | 	MOVD	R0, 16(R1)	// Save LR in caller's frame | 
 | 	MOVD	R2, 24(R1)	// Save TOC in caller's frame | 
 |  | 
 | 	BL	saveregs2<>(SB) | 
 |  | 
 | 	MOVDU	R1, (-288-3*8)(R1) | 
 |  | 
 | 	// Initialize Go ABI environment | 
 | 	BL	runtimeĀ·reginit(SB) | 
 | 	BL	runtimeĀ·load_g(SB) | 
 |  | 
 | 	MOVD	R3, CTR | 
 | 	MOVD	R4, 8(R1) | 
 | 	MOVD	R5, 16(R1) | 
 | 	BL	(CTR) | 
 |  | 
 | 	ADD	$(288+3*8), R1 | 
 |  | 
 | 	BL	restoreregs2<>(SB) | 
 |  | 
 | 	MOVD	24(R1), R2 | 
 | 	MOVD	16(R1), R0 | 
 | 	MOVD	R0, LR | 
 | 	RET | 
 |  | 
 | TEXT saveregs2<>(SB),NOSPLIT,$-8 | 
 | 	// 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,$-8 | 
 | 	// 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 | 
 |  | 
 | 	RET |