/*
 * Copyright (C) 2004-2007 Atmel Corporation
 *
 * This file is subject to the terms and conditions of the GNU Lesser General
 * Public License.  See the file "COPYING.LIB" in the main directory of this
 * archive for more details.
 */
#include <features.h>

       .text

       /*
        * long int syscall(long int sysno, ...)
        */
       .global syscall
       .type   syscall, @function
       .align  2
syscall:
       stm     --sp, r3,r5,r6,lr
       sub     lr, sp, -16
       mov     r8, r12
       ldm     lr, r3,r5,r9-r12
       scall
       cp.w    r12, -4095
       brlo    .Ldone

#ifdef __PIC__
       lddpc   r6, .Lgot
.Lgotcalc:
       rsub    r6, pc
# ifdef __UCLIBC_HAS_THREADS__
       rsub    r3, r12, 0
       mcall   r6[__errno_location@got]
       st.w    r12[0], r3
# else
       ld.w    r3, r6[errno@got]
       neg     r12
       st.w    r3[0], r12
# endif
#else
# ifdef __UCLIBC_HAS_THREADS__
       rsub    r3, r12, 0
       mcall   .Lerrno_location
       st.w    r12[0], r3
# else
       lddpc   r3, .Lerrno
       neg     r12
       st.w    r3[0], r12
# endif
#endif
       mov     r12, -1

.Ldone:
       ldm     sp++, r3,r5,r6,pc

       .align  2
#ifdef __PIC__
.Lgot:
       .long   .Lgotcalc - _GLOBAL_OFFSET_TABLE_
#else
# ifdef __UCLIBC_HAS_THREADS__
.Lerrno_location:
       .long   __errno_location
# else
.Lerrno:
       .long   errno
# endif
#endif


       .size   syscall, . - syscall