Welcome to mirror list, hosted at ThFree Co, Russian Federation.

setjmp.S « d30v « machine « libc « newlib - cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: c0ca8250b0fb924112f6bc42491204537390a9b2 (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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
; setjmp/longjmp for D30V.

	.text
	.globl	setjmp
	.type	setjmp,@function
	.stabs	"setjmp.S",100,0,0,setjmp
	.stabs	"int:t(0,1)=r(0,1);-2147483648;2147483647;",128,0,0,0
	.stabs	"setjmp:F(0,1)",36,0,1,setjmp

setjmp:
; Address of jmpbuf is passed in R2.  Save the appropriate registers.
	st2w	r26, @(r2+,r0)
	st2w	r28, @(r2+,r0)
	st2w	r30, @(r2+,r0)
	st2w	r32, @(r2+,r0)
	st2w	r34, @(r2+,r0)
	st2w	r36, @(r2+,r0)
	st2w	r38, @(r2+,r0)
	st2w	r40, @(r2+,r0)
	st2w	r42, @(r2+,r0)
	st2w	r44, @(r2+,r0)
	st2w	r46, @(r2+,r0)
	st2w	r48, @(r2+,r0)
	st2w	r50, @(r2+,r0)
	st2w	r52, @(r2+,r0)
	st2w	r54, @(r2+,r0)
	st2w	r56, @(r2+,r0)
	st2w	r58, @(r2+,r0)
	st2w	r60, @(r2+,r0)
	st2w	r62, @(r2+,r0)

	mvfacc	r4, a1, 16
	mvfacc	r5, a1, 0
	st2w	r4, @(r2+,r0)

	mvfsys	r4, psw
	mvfsys	r5, rpt_c
	st2w	r4, @(r2+,r0)

	mvfsys	r4, rpt_s
	mvfsys	r5, rpt_e
	st2w	r4, @(r2+,r0)

	mvfsys	r4, mod_s
	mvfsys	r5, mod_e
	st2w	r4, @(r2+,r0)

; Return 0 to caller
	add	r2, r0, r0
	jmp	link
.Lsetjmp:
	.size	setjmp,.Lsetjmp-setjmp
	.stabs	"",36,0,0,.Lsetjmp-setjmp

	.globl	longjmp
	.type	longjmp,@function
	.stabs	"longjmp:F(0,1)",36,0,1,longjmp
longjmp:
; Address of jmpbuf is in R2.  Restore the registers.
	ld2w	r26, @(r2+,r0)
	ld2w	r28, @(r2+,r0)
	ld2w	r30, @(r2+,r0)
	ld2w	r32, @(r2+,r0)
	ld2w	r34, @(r2+,r0)
	ld2w	r36, @(r2+,r0)
	ld2w	r38, @(r2+,r0)
	ld2w	r40, @(r2+,r0)
	ld2w	r42, @(r2+,r0)
	ld2w	r44, @(r2+,r0)
	ld2w	r46, @(r2+,r0)
	ld2w	r48, @(r2+,r0)
	ld2w	r50, @(r2+,r0)
	ld2w	r52, @(r2+,r0)
	ld2w	r54, @(r2+,r0)
	ld2w	r56, @(r2+,r0)
	ld2w	r58, @(r2+,r0)
	ld2w	r60, @(r2+,r0)
	ld2w	r62, @(r2+,r0)

	ld2w	r4, @(r2+,r0)
	mvtacc	a1, r4, r5

	mvfsys	r6, psw
	ld2w	r4, @(r2+,r0)		/* psw, rpt_c */
	and	r6, r6, 0xfcff		/* set rp, md bits from setjmp, leave */
	and	r4, r4, 0x0300		/* all other psw bits the same */
	or	r4, r4, r6
	mvtsys	psw, r4
	mvtsys	rpt_c, r5

	ld2w	r4, @(r2+,r0)
	mvtsys	rpt_s, r4
	mvtsys	rpt_e, r5

	ld2w	r4, @(r2+,r0)
	mvtsys	mod_s, r4
	mvtsys	mod_e, r5

; Value to return to caller is in R3.  If caller attemped to return 0,
; return 1 instead.

	cmpeq	f0, r3, 0	|| 	add	r2, r3, r0
	jmp	link		||	add/tx	r2, r2, 1
.Llongjmp:
	.size	longjmp,.Llongjmp-longjmp
	.stabs	"",36,0,0,.Llongjmp-longjmp