1/* Copyright (c) 2002 Dave Brolley  <brolley@redhat.com> */
2#include <picolibc.h>
3
4# setjmp/longjmp for Frv.  The jmpbuf looks like this:
5#
6# Register	jmpbuf offset
7# R16-R31	0x0-0x03c
8# R48-R63	0x40-0x7c
9# FR16-FR31     0x80-0xbc
10# FR48-FR63     0xc0-0xfc
11# LR            0x100
12# SP            0x104
13# FP            0x108
14#
15# R8 contains the pointer to jmpbuf
16
17#include <frv-asm.h>
18
19	.text
20	.global	EXT(setjmp)
21	.type	EXT(setjmp),@function
22EXT(setjmp):
23	stdi	gr16, @(gr8,0)
24	stdi	gr18, @(gr8,8)
25	stdi 	gr20, @(gr8,16)
26	stdi	gr22, @(gr8,24)
27	stdi	gr24, @(gr8,32)
28	stdi	gr26, @(gr8,40)
29	stdi	gr28, @(gr8,48)
30	stdi	gr30, @(gr8,56)
31#if __FRV_GPR__ != 32
32	stdi	gr48, @(gr8,64)
33	stdi	gr50, @(gr8,72)
34	stdi	gr52, @(gr8,80)
35	stdi	gr54, @(gr8,88)
36	stdi	gr56, @(gr8,96)
37	stdi	gr58, @(gr8,104)
38	stdi	gr60, @(gr8,112)
39	stdi	gr62, @(gr8,120)
40#endif
41
42#if __FRV_FPR__ != 0
43	stdfi	fr16, @(gr8,128)
44	stdfi	fr18, @(gr8,136)
45	stdfi 	fr20, @(gr8,144)
46	stdfi	fr22, @(gr8,152)
47	stdfi	fr24, @(gr8,160)
48	stdfi	fr26, @(gr8,168)
49	stdfi	fr28, @(gr8,176)
50	stdfi	fr30, @(gr8,184)
51#if __FRV_FPR__ != 32
52	stdfi	fr48, @(gr8,192)
53	stdfi	fr50, @(gr8,200)
54	stdfi	fr52, @(gr8,208)
55	stdfi	fr54, @(gr8,216)
56	stdfi	fr56, @(gr8,224)
57	stdfi	fr58, @(gr8,232)
58	stdfi	fr60, @(gr8,240)
59	stdfi	fr62, @(gr8,248)
60#endif
61#endif
62
63        movsg	lr, gr4
64	sti     gr4, @(gr8,256)
65	sti     sp, @(gr8,260)
66	sti     fp, @(gr8,264)
67
68	mov     gr0,gr8
69	ret
70.Lend1:
71	.size	EXT(setjmp),.Lend1-EXT(setjmp)
72
73	.global	EXT(longjmp)
74	.type	EXT(longjmp),@function
75EXT(longjmp):
76	lddi	@(gr8,0), gr16
77	lddi	@(gr8,8), gr18
78	lddi 	@(gr8,16), gr20
79	lddi	@(gr8,24), gr22
80	lddi	@(gr8,32), gr24
81	lddi	@(gr8,40), gr26
82	lddi	@(gr8,48), gr28
83	lddi	@(gr8,56), gr30
84#if __FRV_GPR__ != 32
85	lddi	@(gr8,64), gr48
86	lddi	@(gr8,72), gr50
87	lddi	@(gr8,80), gr52
88	lddi	@(gr8,88), gr54
89	lddi	@(gr8,96), gr56
90	lddi	@(gr8,104), gr58
91	lddi	@(gr8,112), gr60
92	lddi	@(gr8,120), gr62
93#endif
94
95#if __FRV_FPR__ != 0
96	lddfi	@(gr8,128), fr16
97	lddfi	@(gr8,136), fr18
98	lddfi 	@(gr8,144), fr20
99	lddfi	@(gr8,152), fr22
100	lddfi	@(gr8,160), fr24
101	lddfi	@(gr8,168), fr26
102	lddfi	@(gr8,176), fr28
103	lddfi	@(gr8,184), fr30
104#if __FRV_FPR__ != 32
105	lddfi	@(gr8,192), fr48
106	lddfi	@(gr8,200), fr50
107	lddfi	@(gr8,208), fr52
108	lddfi	@(gr8,216), fr54
109	lddfi	@(gr8,224), fr56
110	lddfi	@(gr8,232), fr58
111	lddfi	@(gr8,240), fr60
112	lddfi	@(gr8,248), fr62
113#endif
114#endif
115
116        ldi     @(gr8,256), gr4
117	movgs   gr4,lr
118
119        ldi     @(gr8,260), sp
120        ldi     @(gr8,264), fp
121
122# Value to return is in r9.  If zero, return 1
123	cmp	gr9, gr0, icc0
124	setlos	#1, gr8
125	ckne	icc0, cc4
126	cmov	gr9, gr8, cc4, 1
127	ret
128.Lend2:
129	.size	EXT(longjmp),.Lend2-EXT(longjmp)
130