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