diff options
Diffstat (limited to 'gcc/config/sparc/sol2-c1.asm')
-rw-r--r-- | gcc/config/sparc/sol2-c1.asm | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/gcc/config/sparc/sol2-c1.asm b/gcc/config/sparc/sol2-c1.asm index 618d698e900..894a8c34c08 100644 --- a/gcc/config/sparc/sol2-c1.asm +++ b/gcc/config/sparc/sol2-c1.asm @@ -1,4 +1,4 @@ -! crt1.s for solaris 2.0. +! crt1.s for sparc & sparcv9 (SunOS 5) ! Copyright (C) 1992 Free Software Foundation, Inc. ! Written By David Vinayak Henkel-Wallace, June 1992 @@ -37,43 +37,67 @@ ! in section 3 of the SVr4 ABI. ! This file is the first thing linked into any executable. +#ifdef __sparcv9 +#define CPTRSIZE 8 +#define CPTRSHIFT 3 +#define STACK_BIAS 2047 +#define ldn ldx +#define stn stx +#define setn(s, scratch, dst) setx s, scratch, dst +#else +#define CPTRSIZE 4 +#define CPTRSHIFT 2 +#define STACK_BIAS 0 +#define ldn ld +#define stn st +#define setn(s, scratch, dst) set s, dst +#endif + .section ".text" .proc 022 .global _start _start: mov 0, %fp ! Mark bottom frame pointer - ld [%sp + 64], %l0 ! argc - add %sp, 68, %l1 ! argv + ldn [%sp + (16 * CPTRSIZE) + STACK_BIAS], %l0 ! argc + add %sp, (17 * CPTRSIZE) + STACK_BIAS, %l1 ! argv ! Leave some room for a call. Sun leaves 32 octets (to sit on ! a cache line?) so we do too. +#ifdef __sparcv9 + sub %sp, 48, %sp +#else sub %sp, 32, %sp +#endif ! %g1 may contain a function to be registered w/atexit orcc %g0, %g1, %g0 +#ifdef __sparcv9 + be %xcc, .nope +#else be .nope +#endif mov %g1, %o0 call atexit nop .nope: ! Now make sure constructors and destructors are handled. - set _fini, %o0 + setn(_fini, %o1, %o0) call atexit, 1 nop call _init, 0 nop - ! We ignore the auxiliary vector; there's no defined way to + ! We ignore the auxiliary vector; there is no defined way to ! access those data anyway. Instead, go straight to main: mov %l0, %o0 ! argc mov %l1, %o1 ! argv ! Skip argc words past argv, to env: - sll %l0, 2, %o2 - add %o2, 4, %o2 + sll %l0, CPTRSHIFT, %o2 + add %o2, CPTRSIZE, %o2 add %l1, %o2, %o2 ! env - set _environ, %o3 - st %o2, [%o3] ! *_environ + setn(_environ, %o4, %o3) + stn %o2, [%o3] ! *_environ call main, 4 nop call exit, 0 |