14f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen// Copyright 2015 The Go Authors. All rights reserved.
24f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen// Use of this source code is governed by a BSD-style
34f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen// license that can be found in the LICENSE file.
44f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
54f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen#include "textflag.h"
64f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
74f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen// No need for _rt0_arm64_darwin as darwin/arm64 only
84f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen// supports external linking.
94f7f559a4b744258a796dd591b11bd88e4a6dc7Dan WillemsenTEXT _rt0_arm64_darwin(SB),NOSPLIT,$-8
104f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD	$42, R0
114f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD	$1, R16	// SYS_exit
124f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	SVC	$0x80
134f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
144f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen// When linking with -buildmode=c-archive or -buildmode=c-shared,
154f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen// this symbol is called from a global initialization function.
164f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen//
174f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen// Note that all currently shipping darwin/arm64 platforms require
184f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen// cgo and do not support c-shared.
194f7f559a4b744258a796dd591b11bd88e4a6dc7Dan WillemsenTEXT _rt0_arm64_darwin_lib(SB),NOSPLIT,$168
204f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	// Preserve callee-save registers.
214f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD R19, 24(RSP)
224f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD R20, 32(RSP)
234f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD R21, 40(RSP)
244f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD R22, 48(RSP)
254f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD R23, 56(RSP)
264f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD R24, 64(RSP)
274f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD R25, 72(RSP)
284f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD R26, 80(RSP)
294f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD R27, 88(RSP)
304f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	FMOVD F8, 96(RSP)
314f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	FMOVD F9, 104(RSP)
324f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	FMOVD F10, 112(RSP)
334f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	FMOVD F11, 120(RSP)
344f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	FMOVD F12, 128(RSP)
354f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	FMOVD F13, 136(RSP)
364f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	FMOVD F14, 144(RSP)
374f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	FMOVD F15, 152(RSP)
384f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
394f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD  R0, _rt0_arm64_darwin_lib_argc<>(SB)
404f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD  R1, _rt0_arm64_darwin_lib_argv<>(SB)
414f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
424f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	// Synchronous initialization.
434f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD	$runtime·libpreinit(SB), R4
444f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	BL	(R4)
454f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
464f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	// Create a new thread to do the runtime initialization and return.
474f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD  _cgo_sys_thread_create(SB), R4
484f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD  $_rt0_arm64_darwin_lib_go(SB), R0
494f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD  $0, R1
504f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	BL    (R4)
514f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
524f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	// Restore callee-save registers.
534f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD 24(RSP), R19
544f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD 32(RSP), R20
554f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD 40(RSP), R21
564f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD 48(RSP), R22
574f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD 56(RSP), R23
584f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD 64(RSP), R24
594f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD 72(RSP), R25
604f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD 80(RSP), R26
614f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD 88(RSP), R27
624f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	FMOVD 96(RSP), F8
634f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	FMOVD 104(RSP), F9
644f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	FMOVD 112(RSP), F10
654f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	FMOVD 120(RSP), F11
664f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	FMOVD 128(RSP), F12
674f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	FMOVD 136(RSP), F13
684f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	FMOVD 144(RSP), F14
694f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	FMOVD 152(RSP), F15
704f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	RET
714f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
724f7f559a4b744258a796dd591b11bd88e4a6dc7Dan WillemsenTEXT _rt0_arm64_darwin_lib_go(SB),NOSPLIT,$0
734f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD  _rt0_arm64_darwin_lib_argc<>(SB), R0
744f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD  _rt0_arm64_darwin_lib_argv<>(SB), R1
754f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD  $runtime·rt0_go(SB), R4
764f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	B     (R4)
774f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
784f7f559a4b744258a796dd591b11bd88e4a6dc7Dan WillemsenDATA  _rt0_arm64_darwin_lib_argc<>(SB)/8, $0
794f7f559a4b744258a796dd591b11bd88e4a6dc7Dan WillemsenGLOBL _rt0_arm64_darwin_lib_argc<>(SB),NOPTR, $8
804f7f559a4b744258a796dd591b11bd88e4a6dc7Dan WillemsenDATA  _rt0_arm64_darwin_lib_argv<>(SB)/8, $0
814f7f559a4b744258a796dd591b11bd88e4a6dc7Dan WillemsenGLOBL _rt0_arm64_darwin_lib_argv<>(SB),NOPTR, $8
824f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
834f7f559a4b744258a796dd591b11bd88e4a6dc7Dan WillemsenTEXT main(SB),NOSPLIT,$-8
844f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD	$runtime·rt0_go(SB), R2
854f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	BL	(R2)
864f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenexit:
874f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD	$0, R0
884f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	MOVD	$1, R16	// sys_exit
894f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	SVC	$0x80
904f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	B	exit
91