1/*	$NetBSD: _setjmp.S,v 1.1 2006/07/01 16:37:20 ross Exp $	*/
2
3#include <machine/asm.h>
4
5#if defined(LIBC_SCCS)
6	.text
7	.asciz "$NetBSD: _setjmp.S,v 1.1 2006/07/01 16:37:20 ross Exp $"
8#endif
9
10/*
11 * C library -- _setjmp, _longjmp
12 *
13 *	_longjmp(a,v)
14 * will generate a "return(v?v:1)" from the last call to
15 *	_setjmp(a)
16 * by restoring registers from the stack.
17 * The previous signal state is NOT restored.
18 */
19
20ENTRY(_setjmp)
21	mflr	%r11			/* save return address */
22	mfcr	%r12			/* save condition register */
23	mr	%r10,%r1		/* save stack pointer */
24	mr	%r9,%r2			/* save GPR2 (not needed) */
25	i = 0
26	.rept	32-9
27	std	9+i,i*8+16(%r3)
28	i = i + 1
29	.endr
30	li	%r3,0			/* indicate success */
31	blr				/* return */
32
33ENTRY(_longjmp)
34	i = 0
35	.rept	32-9
36	ld	9+i,i*8+16(%r3)
37	i = i + 1
38	.endr
39	mtlr	%r11			/* restore LR */
40	mtcr	%r12			/* restore CR */
41	mr	%r2,%r9			/* restore GPR2 (not needed) */
42	mr	%r1,%r10		/* restore stack */
43	or.	%r3,%r4,%r4		/* get return value */
44	bnelr				/* return if not 0 */
45	li	%r3,1			/* what's the point? */
46	blr				/* return */
47