|  | #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) |