##==============================================================================
##
##	crt0.S
##
##	IQ2000 startup code
##
##==============================================================================
##
## Copyright (c) 2000, Cygnus Solutions, A Red Hat Company
## 
## The authors hereby grant permission to use, copy, modify, distribute,
## and license this software and its documentation for any purpose, provided
## that existing copyright notices are retained in all copies and that this
## notice is included verbatim in any distributions. No written agreement,
## license, or royalty fee is required for any of the authorized uses.
## Modifications to this software may be copyrighted by their authors
## and need not follow the licensing terms described here, provided that
## the new terms are clearly indicated on the first page of each file where
## they apply.
##
	
##------------------------------------------------------------------------------
	
	.file	"crt0.S"

##------------------------------------------------------------------------------
## Startup code
	.section .text
	.global	_start
_start:
	lui %29,%hi(__stack)
	ori %29,%29,%lo(__stack)

	lui %24,%hi(_edata)	# get start of bss
	ori %24,%24,%lo(_edata)

	lui %25,%hi(_end)	# get end of bss
	ori %25,%25,%lo(_end)

	beq	%24,%25,.L0	# check if end and start are the same
				# do nothing if no bss
	
.L1:
	sb %0,0(%24)		#  clear a byte and bump pointer
	addi %24,%24,1
	bne %24,%25,.L1
	nop
	
.L0:
	jal  _main		# call _main to run ctors/dtors
	nop
	xor %4,%4,%4
	jal main		# call main program
	xor %5,%5,%5
	jal exit		# all done, no need to return or
	or %4,%0,%2		# exit with main's return value

	.section .data
	.global __dso_handle
	.weak __dso_handle
__dso_handle:
	.long	0
