# NEC V850 startup code

	.section .text
	.global	_start

_start:

#if defined __v850e__ || defined __v850ea__
	
	movea   255,		r0,	r20
	mov     65535,		r21
	mov     hilo(_stack),	sp
	mov     hilo(__ep),	ep
	mov     hilo(__gp),	gp
	mov     hilo(__ctbp),	r6
	ldsr    r6,             ctbp
	mov     hilo(_edata),	r6
	mov     hilo(_end),	r7
.L0:
	st.w    r0,		0[r6]
	addi    4,		r6,	r6
	cmp     r7,		r6
	bl      .L0
.L1:
	jarl    ___main,	r31
	addi    -12,		sp,	sp
	mov     0,		r6
	mov     0,		r7
	mov     0,		r8
	jarl    _main,		r31
	mov     r10,		r6
	jarl    _exit,		r31

# else
	movea   255,		r0,	r20
	mov     r0,		r21
	ori     65535,		r0,	r21
	movhi   hi(_stack),	r0,	sp
	movea   lo(_stack),	sp,	sp
	movhi   hi(__ep),	r0,	ep
	movea   lo(__ep),	ep,	ep
	movhi   hi(__gp),	r0,	gp
	movea   lo(__gp),	gp,	gp

	/* Initialise the call table base pointer.
	We do this even though we are supposedly 
	assembling this file for the v850 as this
	allows us to use the same binary for all
	versions of the v850 architecture.  */
	
	movhi   hi(__ctbp),	r0,     r6
	movea   lo(__ctbp),	r6,     r6
	ldsr    r6,             ctbp

	movhi   hi(_edata),	r0,	r6
	movea   lo(_edata),	r6,	r6
	movhi   hi(_end),	r0,	r7
	movea   lo(_end),	r7,	r7
.L0:
	st.b    r0,		0[r6]
	addi    1,		r6,	r6
	cmp     r7,		r6
	bl      .L0
.L1:
	jarl    ___main,	r31
	addi    -12,		sp,	sp
	mov     0,		r6
	mov     0,		r7
	mov     0,		r8
	jarl    _main,		r31
	mov     r10,		r6
	jarl    _exit,		r31

# endif

	.section .stack
_stack:	.long 	1
