Blame sysdeps/microblaze/setjmp.S

Packit 6c4009
/* Copyright (C) 1997-2018 Free Software Foundation, Inc.
Packit 6c4009
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public License as
Packit 6c4009
   published by the Free Software Foundation; either version 2.1 of the
Packit 6c4009
   License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library.  If not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#include <sysdep.h>
Packit 6c4009
Packit 6c4009
/* This source produces 3 functions:
Packit 6c4009
   __sigsetjmp (jmpbuf,savemask)
Packit 6c4009
   setjmp (jmpbuf) - equivalent to __sigsetjump (jmpbuf, 1)
Packit 6c4009
   _setjmp (jmpbuf) - equivalent to __sigsetjump (jmpbuf, 0)
Packit 6c4009
*/
Packit 6c4009
Packit 6c4009
#ifndef setjmp_name
Packit 6c4009
# define setjmp_name __sigsetjmp
Packit 6c4009
# define SET_MASK_ARG
Packit 6c4009
#else
Packit 6c4009
# define SET_MASK_ARG    addik r6,r0,SAVEMASK
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
ENTRY (setjmp_name)
Packit 6c4009
    swi   r1,r5,0
Packit 6c4009
    swi   r2,r5,4
Packit 6c4009
    swi   r13,r5,8
Packit 6c4009
    swi   r14,r5,12
Packit 6c4009
    swi   r15,r5,16
Packit 6c4009
    swi   r16,r5,20
Packit 6c4009
    swi   r17,r5,24
Packit 6c4009
    swi   r18,r5,28
Packit 6c4009
    swi   r19,r5,32
Packit 6c4009
    swi   r20,r5,36
Packit 6c4009
    swi   r21,r5,40
Packit 6c4009
    swi   r22,r5,44
Packit 6c4009
    swi   r23,r5,48
Packit 6c4009
    swi   r24,r5,52
Packit 6c4009
    swi   r25,r5,56
Packit 6c4009
    swi   r26,r5,60
Packit 6c4009
    swi   r27,r5,64
Packit 6c4009
    swi   r28,r5,68
Packit 6c4009
    swi   r29,r5,72
Packit 6c4009
    swi   r30,r5,76
Packit 6c4009
    swi   r31,r5,80
Packit 6c4009
Packit 6c4009
    SET_MASK_ARG
Packit 6c4009
Packit 6c4009
    /* Make a tail call to __sigjmp_save; it takes the same args.  */
Packit 6c4009
#ifdef	PIC
Packit 6c4009
    /* We cannot use the PLT, because it requires that r20 be set, but
Packit 6c4009
       we can't save and restore our caller's value.  Instead, we do an
Packit 6c4009
       indirect jump through the GOT, using the temporary register
Packit 6c4009
       %ecx, which is call-clobbered.  */
Packit 6c4009
    mfs   r12,rpc
Packit 6c4009
    addik r12,r12,_GLOBAL_OFFSET_TABLE_+8
Packit 6c4009
    lwi   r12,r12,__sigjmp_save@GOT
Packit 6c4009
    brad  r12
Packit 6c4009
#else
Packit 6c4009
    brid  __sigjmp_save
Packit 6c4009
#endif
Packit 6c4009
    nop
Packit 6c4009
END (setjmp_name)
Packit 6c4009
Packit 6c4009
libc_hidden_def (setjmp_name)