// Copyright 2009 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"

TEXT _rt0_386_darwin(SB),NOSPLIT,$8
	MOVL	8(SP), AX
	LEAL	12(SP), BX
	MOVL	AX, 0(SP)
	MOVL	BX, 4(SP)
	CALL	main(SB)
	INT	$3

// With -buildmode=c-archive, this symbol is called from a global constructor.
TEXT _rt0_386_darwin_lib(SB),NOSPLIT,$0
	PUSHL	BP
	MOVL	SP, BP
	PUSHL	BX
	PUSHL	SI
	PUSHL	DI

	MOVL	8(BP), AX
	MOVL	AX, _rt0_386_darwin_lib_argc<>(SB)
	MOVL	12(BP), AX
	MOVL	AX, _rt0_386_darwin_lib_argv<>(SB)

	// Synchronous initialization.
	MOVL	$runtime·libpreinit(SB), AX
	CALL	AX

	SUBL	$12, SP

	// Create a new thread to do the runtime initialization and return.
	MOVL	_cgo_sys_thread_create(SB), AX
	TESTL	AX, AX
	JZ	nocgo
	MOVL	$_rt0_386_darwin_lib_go(SB), BX
	MOVL	BX, 0(SP)
	MOVL	$0, 4(SP)
	CALL	AX
	JMP     restore

nocgo:
	MOVL	$0x800000, 0(SP)               // stacksize = 8192KB
	MOVL	$_rt0_386_darwin_lib_go(SB), AX
	MOVL	AX, 4(SP)                      // fn
	MOVL	$0, 8(SP)                      // fnarg
	MOVL	$runtime·newosproc0(SB), AX
	CALL	AX

restore:
	ADDL	$12, SP
	POPL	DI
	POPL	SI
	POPL	BX
	POPL	BP
	RET

TEXT _rt0_386_darwin_lib_go(SB),NOSPLIT,$12
	MOVL	_rt0_386_darwin_lib_argc<>(SB), AX
	MOVL	AX, 0(SP)
	MOVL	_rt0_386_darwin_lib_argv<>(SB), AX
	MOVL	AX, 4(SP)
	MOVL	$runtime·rt0_go(SB), AX
	CALL	AX
	RET

DATA _rt0_386_darwin_lib_argc<>(SB)/4, $0
GLOBL _rt0_386_darwin_lib_argc<>(SB),NOPTR, $4
DATA _rt0_386_darwin_lib_argv<>(SB)/4, $0
GLOBL _rt0_386_darwin_lib_argv<>(SB),NOPTR, $4

TEXT main(SB),NOSPLIT,$0
	JMP	runtime·rt0_go(SB)
