diff options
Diffstat (limited to 'newlib/libc/sys/sysnecv850/crt0.S')
-rw-r--r-- | newlib/libc/sys/sysnecv850/crt0.S | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/newlib/libc/sys/sysnecv850/crt0.S b/newlib/libc/sys/sysnecv850/crt0.S new file mode 100644 index 0000000..15d94dc --- /dev/null +++ b/newlib/libc/sys/sysnecv850/crt0.S @@ -0,0 +1,77 @@ +# 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 |