// Copyright 2018 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.

#include "textflag.h"

// _rt0_ppc64_aix is a function descriptor of the entrypoint function
// __start. This name is needed by cmd/link.
DATA	_rt0_ppc64_aix+0(SB)/8, $__start<>(SB)
DATA	_rt0_ppc64_aix+8(SB)/8, $TOC(SB)
GLOBL	_rt0_ppc64_aix(SB), NOPTR, $16


// The starting function must return in the loader to
// initialise some librairies, especially libthread which
// creates the main thread and adds the TLS in R13
// R19 contains a function descriptor to the loader function
// which needs to be called.
// This code is similar to the __start function in C
TEXT __start<>(SB),NOSPLIT,$-8
	XOR R0, R0
	MOVD $libc___n_pthreads(SB), R4
	MOVD 0(R4), R4
	MOVD $libc___mod_init(SB), R5
	MOVD 0(R5), R5
	MOVD 0(R19), R0
	MOVD R2, 40(R1)
	MOVD 8(R19), R2
	MOVD R18, R3
	MOVD R0, CTR
	BL (CTR) // Return to AIX loader

	// Launch rt0_go
	MOVD 40(R1), R2
	MOVD R14, R3 // argc
	MOVD R15, R4 // argv
	BL _main(SB)


DATA	main+0(SB)/8, $_main(SB)
DATA	main+8(SB)/8, $TOC(SB)
DATA	main+16(SB)/8, $0
GLOBL	main(SB), NOPTR, $24

TEXT _main(SB),NOSPLIT,$-8
	MOVD $runtime·rt0_go(SB), R12
	MOVD R12, CTR
	BR (CTR)


TEXT _rt0_ppc64_aix_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, -344(R1) // Allocate frame.

	// Preserve callee-save registers.
	MOVD	R14, 48(R1)
	MOVD	R15, 56(R1)
	MOVD	R16, 64(R1)
	MOVD	R17, 72(R1)
	MOVD	R18, 80(R1)
	MOVD	R19, 88(R1)
	MOVD	R20, 96(R1)
	MOVD	R21,104(R1)
	MOVD	R22, 112(R1)
	MOVD	R23, 120(R1)
	MOVD	R24, 128(R1)
	MOVD	R25, 136(R1)
	MOVD	R26, 144(R1)
	MOVD	R27, 152(R1)
	MOVD	R28, 160(R1)
	MOVD	R29, 168(R1)
	MOVD	g, 176(R1) // R30
	MOVD	R31, 184(R1)
	FMOVD	F14, 192(R1)
	FMOVD	F15, 200(R1)
	FMOVD	F16, 208(R1)
	FMOVD	F17, 216(R1)
	FMOVD	F18, 224(R1)
	FMOVD	F19, 232(R1)
	FMOVD	F20, 240(R1)
	FMOVD	F21, 248(R1)
	FMOVD	F22, 256(R1)
	FMOVD	F23, 264(R1)
	FMOVD	F24, 272(R1)
	FMOVD	F25, 280(R1)
	FMOVD	F26, 288(R1)
	FMOVD	F27, 296(R1)
	FMOVD	F28, 304(R1)
	FMOVD	F29, 312(R1)
	FMOVD	F30, 320(R1)
	FMOVD	F31, 328(R1)

	// Synchronous initialization.
	MOVD	$runtime·reginit(SB), R12
	MOVD	R12, CTR
	BL	(CTR)

	MOVBZ	runtime·isarchive(SB), R3	// Check buildmode = c-archive
	CMP		$0, R3
	BEQ		done

	MOVD	R14, _rt0_ppc64_aix_lib_argc<>(SB)
	MOVD	R15, _rt0_ppc64_aix_lib_argv<>(SB)

	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_ppc64_aix_lib_go(SB), R3
	MOVD	$0, R4
	MOVD	R2, 40(R1)
	MOVD	8(R12), R2
	MOVD	(R12), R12
	MOVD	R12, CTR
	BL	(CTR)
	MOVD	40(R1), R2
	BR	done

nocgo:
	MOVD	$0x800000, R12					   // stacksize = 8192KB
	MOVD	R12, 8(R1)
	MOVD	$_rt0_ppc64_aix_lib_go(SB), R12
	MOVD	R12, 16(R1)
	MOVD	$runtime·newosproc0(SB),R12
	MOVD	R12, CTR
	BL	(CTR)

done:
	// Restore saved registers.
	MOVD	48(R1), R14
	MOVD	56(R1), R15
	MOVD	64(R1), R16
	MOVD	72(R1), R17
	MOVD	80(R1), R18
	MOVD	88(R1), R19
	MOVD	96(R1), R20
	MOVD	104(R1), R21
	MOVD	112(R1), R22
	MOVD	120(R1), R23
	MOVD	128(R1), R24
	MOVD	136(R1), R25
	MOVD	144(R1), R26
	MOVD	152(R1), R27
	MOVD	160(R1), R28
	MOVD	168(R1), R29
	MOVD	176(R1), g // R30
	MOVD	184(R1), R31
	FMOVD	196(R1), F14
	FMOVD	200(R1), F15
	FMOVD	208(R1), F16
	FMOVD	216(R1), F17
	FMOVD	224(R1), F18
	FMOVD	232(R1), F19
	FMOVD	240(R1), F20
	FMOVD	248(R1), F21
	FMOVD	256(R1), F22
	FMOVD	264(R1), F23
	FMOVD	272(R1), F24
	FMOVD	280(R1), F25
	FMOVD	288(R1), F26
	FMOVD	296(R1), F27
	FMOVD	304(R1), F28
	FMOVD	312(R1), F29
	FMOVD	320(R1), F30
	FMOVD	328(R1), F31

	ADD	$344, R1

	MOVD	8(R1), R0
	MOVFL	R0, $0xff
	MOVD	16(R1), R0
	MOVD	R0, LR
	RET

DATA	_rt0_ppc64_aix_lib_go+0(SB)/8, $__rt0_ppc64_aix_lib_go(SB)
DATA	_rt0_ppc64_aix_lib_go+8(SB)/8, $TOC(SB)
DATA	_rt0_ppc64_aix_lib_go+16(SB)/8, $0
GLOBL	_rt0_ppc64_aix_lib_go(SB), NOPTR, $24

TEXT __rt0_ppc64_aix_lib_go(SB),NOSPLIT,$0
	MOVD	_rt0_ppc64_aix_lib_argc<>(SB), R3
	MOVD	_rt0_ppc64_aix_lib_argv<>(SB), R4
	MOVD	$runtime·rt0_go(SB), R12
	MOVD	R12, CTR
	BR	(CTR)

DATA _rt0_ppc64_aix_lib_argc<>(SB)/8, $0
GLOBL _rt0_ppc64_aix_lib_argc<>(SB),NOPTR, $8
DATA _rt0_ppc64_aix_lib_argv<>(SB)/8, $0
GLOBL _rt0_ppc64_aix_lib_argv<>(SB),NOPTR, $8
