summaryrefslogtreecommitdiffstats
path: root/usr/klibc/arch/s390/setjmp.S
blob: 1386419a26ae3c736f17188515f5b4790f452249 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#
# arch/s390/setjmp.S
#
# setjmp/longjmp for the s390 architecture
#

	.text
	.align 4
	.globl setjmp
	.type setjmp, @function

#ifndef __s390x__

setjmp:
	stm	%r6,%r15,0(%r2)		# save all general registers
	std	%f4,40(%r2)		# save fp registers f4 and f6
	std	%f6,48(%r2)
	lhi	%r2,0			# return 0
	br	%r14

	.size setjmp,.-setjmp

	.text
	.align 4
	.globl longjmp
	.type longjmp, @function
longjmp:
	lr	%r1,%r2			# jmp_buf
	lr	%r2,%r3			# return value
	ld	%f6,48(%r1)		# restore all saved registers
	ld	%f4,40(%r1)
	lm	%r6,%r15,0(%r1)
	br	%r14			# return to restored address

	.size longjmp,.-longjmp

#else

setjmp:
	stmg	%r6,%r15,0(%r2)		# save all general registers
	std	%f8,80(%r2)		# save fp registers f8 to f15
	std	%f9,88(%r2)
	std	%f10,96(%r2)
	std	%f11,104(%r2)
	std	%f12,112(%r2)
	std	%f13,120(%r2)
	std	%f14,128(%r2)
	std	%f15,136(%r2)
	lghi	%r2,0			# return 0
	br	%r14

	.size setjmp,.-setjmp

	.text
	.align 4
	.globl longjmp
	.type longjmp, @function
longjmp:
	lgr	%r1,%r2			# jmp_buf
	lgr	%r2,%r3			# return value
	ld	%f15,136(%r1)		# restore all saved registers
	ld	%f14,128(%r1)
	ld	%f13,120(%r1)
	ld	%f12,112(%r1)
	ld	%f11,104(%r1)
	ld	%f10,96(%r1)
	ld	%f9,88(%r1)
	ld	%f8,80(%r1)
	lmg	%r6,%r15,0(%r1)
	br	%r14			# return to restored address

	.size longjmp,.-longjmp

#endif