summaryrefslogtreecommitdiff
path: root/newlib/libc/sys/sysnecv850/crt0.S
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/sys/sysnecv850/crt0.S')
-rw-r--r--newlib/libc/sys/sysnecv850/crt0.S77
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 00000000000..15d94dc3cea
--- /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