summaryrefslogtreecommitdiffstats
path: root/usr/klibc/arch/sh/setjmp.S
blob: 25523580d2ad454ae28286f8670a05cbf107ebce (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
#
# arch/sh/setjmp.S
#
# setjmp/longjmp for the SuperH architecture
#

#
# The jmp_buf is assumed to contain the following, in order:
#
#		r8
#		r9
#		r10
#		r11
#		r12
#		r13
#		r14
#		r15
#		pr
#

	.text
	.align 2

	.globl setjmp
	.type setjmp, #function

setjmp:
	add	#(9*4), r4
	sts.l	pr, @-r4
	mov.l	r15, @-r4
	mov.l	r14, @-r4
	mov.l	r13, @-r4
	mov.l	r12, @-r4
	mov.l	r11, @-r4
	mov.l	r10, @-r4
	mov.l	r9, @-r4
	mov.l	r8, @-r4
	rts
	 mov	#0, r0

	.size setjmp,.-setjmp

	.align 2
	.globl longjmp
	.type setjmp, #function

longjmp:
	mov.l	@r4+, r8
	mov.l	@r4+, r9
	mov.l	@r4+, r10
	mov.l	@r4+, r11
	mov.l	@r4+, r12
	mov.l	@r4+, r13
	mov.l	@r4+, r14
	mov.l	@r4+, r15
	lds.l	@r4+, pr
	mov	r5, r0
	tst	r0, r0
	bf	1f
	mov	#1, r0	! in case val==0
1:	rts
	 nop

	.size longjmp,.-longjmp