1/* setjmp for i386, ELF version.
2   Copyright (C) 1995, 1996, 1997, 2000, 2001 Free Software Foundation, Inc.
3   This file is part of the GNU C Library.
4
5   The GNU C Library is free software; you can redistribute it and/or
6   modify it under the terms of the GNU Lesser General Public
7   License as published by the Free Software Foundation; either
8   version 2.1 of the License, or (at your option) any later version.
9
10   The GNU C Library is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13   Lesser General Public License for more details.
14
15   You should have received a copy of the GNU Lesser General Public
16   License along with the GNU C Library; if not, see
17   <http://www.gnu.org/licenses/>.  */
18
19.global __sigsetjmp
20.type   __sigsetjmp,%function
21
22__sigsetjmp:
23        movl 4   (%esp), %eax
24     	/* Save registers.  */
25        movl %ebx, (0 *4)(%eax)
26        movl %esi, (1 *4)(%eax)
27        movl %edi, (2 *4)(%eax)
28	/* Save SP as it will be after we return.  */
29        leal 4(%esp), %ecx
30        movl %ecx, (4 *4)(%eax)
31	/* Save PC we are returning to now.  */
32        movl 0(%esp), %ecx
33        movl %ecx, (5 *4)(%eax)
34	/* Save caller's frame pointer.  */
35        movl %ebp, (3 *4)(%eax)
36
37	/* Make a tail call to __sigjmp_save; it takes the same args.  */
38#ifdef	__PIC__
39	/* We cannot use the PLT, because it requires that %ebx be set, but
40           we can't save and restore our caller's value.  Instead, we do an
41           indirect jump through the GOT, using for the temporary register
42           %ecx, which is call-clobbered.  */
43	call .Lhere
44.Lhere:
45	popl %ecx
46	addl $_GLOBAL_OFFSET_TABLE_+[.- .Lhere  ], %ecx
47	movl    __sigjmp_save    @GOT  (%ecx), %ecx
48	jmp *%ecx
49#else
50	jmp   __sigjmp_save
51#endif
52.size __sigsetjmp,.-__sigsetjmp
53