| #include "go_asm.h" | 
 | #include "textflag.h" | 
 |  | 
 | TEXT _rt0_ppc64le_linux(SB),NOSPLIT,$0 | 
 | 	XOR R0, R0	  // Make sure R0 is zero before _main | 
 | 	BR _main<>(SB) | 
 |  | 
 | TEXT _rt0_ppc64le_linux_lib(SB),NOSPLIT,$-8 | 
 | 	// 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 | 
 | 	MOVD	R0, 8(R1) | 
 | 	MOVDU	R1, -320(R1) // Allocate frame. | 
 |  | 
 | 	// Preserve callee-save registers. | 
 | 	MOVD	R14, 24(R1) | 
 | 	MOVD	R15, 32(R1) | 
 | 	MOVD	R16, 40(R1) | 
 | 	MOVD	R17, 48(R1) | 
 | 	MOVD	R18, 56(R1) | 
 | 	MOVD	R19, 64(R1) | 
 | 	MOVD	R20, 72(R1) | 
 | 	MOVD	R21, 80(R1) | 
 | 	MOVD	R22, 88(R1) | 
 | 	MOVD	R23, 96(R1) | 
 | 	MOVD	R24, 104(R1) | 
 | 	MOVD	R25, 112(R1) | 
 | 	MOVD	R26, 120(R1) | 
 | 	MOVD	R27, 128(R1) | 
 | 	MOVD	R28, 136(R1) | 
 | 	MOVD	R29, 144(R1) | 
 | 	MOVD	g, 152(R1) // R30 | 
 | 	MOVD	R31, 160(R1) | 
 | 	FMOVD	F14, 168(R1) | 
 | 	FMOVD	F15, 176(R1) | 
 | 	FMOVD	F16, 184(R1) | 
 | 	FMOVD	F17, 192(R1) | 
 | 	FMOVD	F18, 200(R1) | 
 | 	FMOVD	F19, 208(R1) | 
 | 	FMOVD	F20, 216(R1) | 
 | 	FMOVD	F21, 224(R1) | 
 | 	FMOVD	F22, 232(R1) | 
 | 	FMOVD	F23, 240(R1) | 
 | 	FMOVD	F24, 248(R1) | 
 | 	FMOVD	F25, 256(R1) | 
 | 	FMOVD	F26, 264(R1) | 
 | 	FMOVD	F27, 272(R1) | 
 | 	FMOVD	F28, 280(R1) | 
 | 	FMOVD	F29, 288(R1) | 
 | 	FMOVD	F30, 296(R1) | 
 | 	FMOVD	F31, 304(R1) | 
 |  | 
 | 	MOVD	R3, _rt0_ppc64le_linux_lib_argc<>(SB) | 
 | 	MOVD	R4, _rt0_ppc64le_linux_lib_argv<>(SB) | 
 |  | 
 | 	// Synchronous initialization. | 
 | 	MOVD	$runtime·reginit(SB), R12 | 
 | 	MOVD	R12, CTR | 
 | 	BL	(CTR) | 
 | 	MOVD	$runtime·libpreinit(SB), R12 | 
 | 	MOVD	R12, CTR | 
 | 	BL	(CTR) | 
 |  | 
 | 	// Create a new thread to do the runtime initialization and return. | 
 | 	MOVD	_cgo_sys_thread_create(SB), R12 | 
 | 	CMP	$0, R12 | 
 | 	BEQ	nocgo | 
 | 	MOVD	$_rt0_ppc64le_linux_lib_go(SB), R3 | 
 | 	MOVD	$0, R4 | 
 | 	MOVD	R12, CTR | 
 | 	BL	(CTR) | 
 | 	BR	done | 
 |  | 
 | nocgo: | 
 | 	MOVD	$0x800000, R12                     // stacksize = 8192KB | 
 | 	MOVD	R12, 8(R1) | 
 | 	MOVD	$_rt0_ppc64le_linux_lib_go(SB), R12 | 
 | 	MOVD	R12, 16(R1) | 
 | 	MOVD	$runtime·newosproc0(SB),R12 | 
 | 	MOVD	R12, CTR | 
 | 	BL	(CTR) | 
 |  | 
 | done: | 
 | 	// Restore saved registers. | 
 | 	MOVD	24(R1), R14 | 
 | 	MOVD	32(R1), R15 | 
 | 	MOVD	40(R1), R16 | 
 | 	MOVD	48(R1), R17 | 
 | 	MOVD	56(R1), R18 | 
 | 	MOVD	64(R1), R19 | 
 | 	MOVD	72(R1), R20 | 
 | 	MOVD	80(R1), R21 | 
 | 	MOVD	88(R1), R22 | 
 | 	MOVD	96(R1), R23 | 
 | 	MOVD	104(R1), R24 | 
 | 	MOVD	112(R1), R25 | 
 | 	MOVD	120(R1), R26 | 
 | 	MOVD	128(R1), R27 | 
 | 	MOVD	136(R1), R28 | 
 | 	MOVD	144(R1), R29 | 
 | 	MOVD	152(R1), g // R30 | 
 | 	MOVD	160(R1), R31 | 
 | 	FMOVD	168(R1), F14 | 
 | 	FMOVD	176(R1), F15 | 
 | 	FMOVD	184(R1), F16 | 
 | 	FMOVD	192(R1), F17 | 
 | 	FMOVD	200(R1), F18 | 
 | 	FMOVD	208(R1), F19 | 
 | 	FMOVD	216(R1), F20 | 
 | 	FMOVD	224(R1), F21 | 
 | 	FMOVD	232(R1), F22 | 
 | 	FMOVD	240(R1), F23 | 
 | 	FMOVD	248(R1), F24 | 
 | 	FMOVD	256(R1), F25 | 
 | 	FMOVD	264(R1), F26 | 
 | 	FMOVD	272(R1), F27 | 
 | 	FMOVD	280(R1), F28 | 
 | 	FMOVD	288(R1), F29 | 
 | 	FMOVD	296(R1), F30 | 
 | 	FMOVD	304(R1), F31 | 
 |  | 
 | 	ADD	$320, R1 | 
 | 	MOVD	8(R1), R0 | 
 | 	MOVFL	R0, $0xff | 
 | 	MOVD	16(R1), R0 | 
 | 	MOVD	R0, LR | 
 | 	RET | 
 |  | 
 | TEXT _rt0_ppc64le_linux_lib_go(SB),NOSPLIT,$0 | 
 | 	MOVD	_rt0_ppc64le_linux_lib_argc<>(SB), R3 | 
 | 	MOVD	_rt0_ppc64le_linux_lib_argv<>(SB), R4 | 
 | 	MOVD	$runtime·rt0_go(SB), R12 | 
 | 	MOVD	R12, CTR | 
 | 	BR	(CTR) | 
 |  | 
 | DATA _rt0_ppc64le_linux_lib_argc<>(SB)/8, $0 | 
 | GLOBL _rt0_ppc64le_linux_lib_argc<>(SB),NOPTR, $8 | 
 | DATA _rt0_ppc64le_linux_lib_argv<>(SB)/8, $0 | 
 | GLOBL _rt0_ppc64le_linux_lib_argv<>(SB),NOPTR, $8 | 
 |  | 
 | TEXT _main<>(SB),NOSPLIT,$-8 | 
 | 	// In a statically linked binary, the stack contains argc, | 
 | 	// argv as argc string pointers followed by a NULL, envv as a | 
 | 	// sequence of string pointers followed by a NULL, and auxv. | 
 | 	// There is no TLS base pointer. | 
 | 	// | 
 | 	// In a dynamically linked binary, r3 contains argc, r4 | 
 | 	// contains argv, r5 contains envp, r6 contains auxv, and r13 | 
 | 	// contains the TLS pointer. | 
 | 	// | 
 | 	// Figure out which case this is by looking at r4: if it's 0, | 
 | 	// we're statically linked; otherwise we're dynamically | 
 | 	// linked. | 
 | 	CMP	R0, R4 | 
 | 	BNE	dlink | 
 |  | 
 | 	// Statically linked | 
 | 	MOVD	0(R1), R3 // argc | 
 | 	ADD	$8, R1, R4 // argv | 
 | 	MOVD	$runtime·m0+m_tls(SB), R13 // TLS | 
 | 	ADD	$0x7000, R13 | 
 |  | 
 | dlink: | 
 | 	BR	main(SB) | 
 |  | 
 | TEXT main(SB),NOSPLIT,$-8 | 
 | 	MOVD	$runtime·rt0_go(SB), R12 | 
 | 	MOVD	R12, CTR | 
 | 	BR	(CTR) |