1/*
2Copyright (c) 1990 The Regents of the University of California.
3All rights reserved.
4
5Redistribution and use in source and binary forms are permitted
6provided that the above copyright notice and this paragraph are
7duplicated in all such forms and that any documentation,
8and/or other materials related to such
9distribution and use acknowledge that the software was developed
10by the University of California, Berkeley.  The name of the
11University may not be used to endorse or promote products derived
12from this software without specific prior written permission.
13THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16 */
17/* We want to pretend we're in SHmedia mode, even when assembling for
18   SHcompact.  */
19#include <picolibc.h>
20
21#if __SH5__ == 32 && ! __SHMEDIA__
22# undef __SHMEDIA__
23# define __SHMEDIA__ 1
24#endif
25
26#if __SHMEDIA__
27	.mode	SHmedia
28#endif
29
30#include "asm.h"
31
32ENTRY(setjmp)
33#if __SH5__
34	ptabs	r18, tr0
35	gettr	tr5, r5
36	gettr	tr6, r6
37	gettr	tr7, r7
38	st.q	r2,  0*8, r18
39	st.q	r2,  1*8, r10
40	st.q	r2,  2*8, r11
41	st.q	r2,  3*8, r12
42	st.q	r2,  4*8, r13
43	st.q	r2,  5*8, r14
44	st.q	r2,  6*8, r15
45	st.q	r2,  7*8, r28
46	st.q	r2,  8*8, r29
47	st.q	r2,  9*8, r30
48	st.q	r2, 10*8, r31
49	st.q	r2, 11*8, r32
50	st.q	r2, 12*8, r33
51	st.q	r2, 13*8, r34
52	st.q	r2, 14*8, r35
53	st.q	r2, 15*8, r44
54	st.q	r2, 16*8, r45
55	st.q	r2, 17*8, r46
56	st.q	r2, 18*8, r47
57	st.q	r2, 19*8, r48
58	st.q	r2, 20*8, r49
59	st.q	r2, 21*8, r50
60	st.q	r2, 22*8, r51
61	st.q	r2, 23*8, r52
62	st.q	r2, 24*8, r53
63	st.q	r2, 25*8, r54
64	st.q	r2, 26*8, r55
65	st.q	r2, 27*8, r56
66	st.q	r2, 28*8, r57
67	st.q	r2, 29*8, r58
68	st.q	r2, 30*8, r59
69	st.q	r2, 31*8, r5
70	st.q	r2, 32*8, r6
71	st.q	r2, 33*8, r7
72#if ! __SH4_NOFPU__
73	fst.d	r2, 34*8, dr12
74	fst.d	r2, 35*8, dr14
75	fst.d	r2, 36*8, dr36
76	fst.d	r2, 37*8, dr38
77	fst.d	r2, 38*8, dr40
78	fst.d	r2, 39*8, dr42
79	fst.d	r2, 40*8, dr44
80	fst.d	r2, 41*8, dr46
81	fst.d	r2, 42*8, dr48
82	fst.d	r2, 43*8, dr50
83	fst.d	r2, 44*8, dr52
84	fst.d	r2, 45*8, dr54
85	fst.d	r2, 46*8, dr56
86	fst.d	r2, 47*8, dr58
87	fst.d	r2, 48*8, dr60
88	fst.d	r2, 49*8, dr62
89#endif
90	movi	0, r2
91	blink	tr0, r63
92#else
93#if defined (__SH2E__) || defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__)
94	add	#(13*4),r4
95#else
96	add	#(9*4),r4
97#endif
98
99	sts.l	pr,@-r4
100
101#if defined (__SH2E__) || defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__)
102	fmov.s	fr15,@-r4	! call saved floating point registers
103	fmov.s	fr14,@-r4
104	fmov.s	fr13,@-r4
105	fmov.s	fr12,@-r4
106#endif
107
108	mov.l	r15,@-r4	! call saved integer registers
109	mov.l	r14,@-r4
110	mov.l	r13,@-r4
111	mov.l	r12,@-r4
112
113	mov.l	r11,@-r4
114	mov.l	r10,@-r4
115	mov.l	r9,@-r4
116	mov.l	r8,@-r4
117
118	rts
119	mov    #0,r0
120#endif /* __SH5__ */
121
122ENTRY(longjmp)
123#if __SH5__
124	ld.q	r2,  0*8, r18
125	ptabs	r18, tr0
126	ld.q	r2,  1*8, r10
127	ld.q	r2,  2*8, r11
128	ld.q	r2,  3*8, r12
129	ld.q	r2,  4*8, r13
130	ld.q	r2,  5*8, r14
131	ld.q	r2,  6*8, r15
132	ld.q	r2,  7*8, r28
133	ld.q	r2,  8*8, r29
134	ld.q	r2,  9*8, r30
135	ld.q	r2, 10*8, r31
136	ld.q	r2, 11*8, r32
137	ld.q	r2, 12*8, r33
138	ld.q	r2, 13*8, r34
139	ld.q	r2, 14*8, r35
140	ld.q	r2, 15*8, r44
141	ld.q	r2, 16*8, r45
142	ld.q	r2, 17*8, r46
143	ld.q	r2, 18*8, r47
144	ld.q	r2, 19*8, r48
145	ld.q	r2, 20*8, r49
146	ld.q	r2, 21*8, r50
147	ld.q	r2, 22*8, r51
148	ld.q	r2, 23*8, r52
149	ld.q	r2, 24*8, r53
150	ld.q	r2, 25*8, r54
151	ld.q	r2, 26*8, r55
152	ld.q	r2, 27*8, r56
153	ld.q	r2, 28*8, r57
154	ld.q	r2, 29*8, r58
155	ld.q	r2, 30*8, r59
156	ld.q	r2, 31*8, r5
157	ld.q	r2, 32*8, r6
158	ld.q	r2, 33*8, r7
159	ptabs	r5, tr5
160	ptabs	r6, tr6
161	ptabs	r7, tr7
162#if ! __SH4_NOFPU__
163	fld.d	r2, 34*8, dr12
164	fld.d	r2, 35*8, dr14
165	fld.d	r2, 36*8, dr36
166	fld.d	r2, 37*8, dr38
167	fld.d	r2, 38*8, dr40
168	fld.d	r2, 39*8, dr42
169	fld.d	r2, 40*8, dr44
170	fld.d	r2, 41*8, dr46
171	fld.d	r2, 42*8, dr48
172	fld.d	r2, 43*8, dr50
173	fld.d	r2, 44*8, dr52
174	fld.d	r2, 45*8, dr54
175	fld.d	r2, 46*8, dr56
176	fld.d	r2, 47*8, dr58
177	fld.d	r2, 48*8, dr60
178	fld.d	r2, 49*8, dr62
179#endif
180	movi	1, r2
181	cmvne	r3, r3, r2
182	blink	tr0, r63
183#else
184	mov.l	@r4+,r8
185	mov.l	@r4+,r9
186	mov.l	@r4+,r10
187	mov.l	@r4+,r11
188
189	mov.l	@r4+,r12
190	mov.l	@r4+,r13
191	mov.l	@r4+,r14
192	mov.l	@r4+,r15
193
194#if defined (__SH2E__) || defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__)
195	fmov.s	@r4+,fr12	! call saved floating point registers
196	fmov.s	@r4+,fr13
197	fmov.s	@r4+,fr14
198	fmov.s	@r4+,fr15
199#endif
200
201	lds.l	@r4+,pr
202
203	mov	r5,r0
204	tst	r0,r0
205	bf	retr4
206	movt	r0
207retr4:	rts
208	nop
209#endif /* __SH5__ */
210