1/*
2 * asmmacro.h: Assembler macros to make things easier to read.
3 *
4 * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com)
5 * Copyright (C) 1998 Ralf Baechle
6 */
7#ifndef _ASM_ASMMACRO_H
8#define _ASM_ASMMACRO_H
9
10#include <linux/config.h>
11#include <asm/offset.h>
12
13#ifdef CONFIG_CPU_SB1
14#define FPU_ENABLE_HAZARD		\
15	.set	push;			\
16	.set	noreorder;		\
17	.set	mips2;			\
18	SSNOP;				\
19	bnezl	$0, .+4;		\
20	 SSNOP;				\
21	.set	pop
22#else
23#define FPU_ENABLE_HAZARD
24#endif
25
26#define FPU_SAVE_DOUBLE(thread, tmp) \
27	cfc1	tmp,  fcr31;                    \
28	sdc1	$f0,  (THREAD_FPU + 0x000)(thread); \
29	sdc1	$f2,  (THREAD_FPU + 0x010)(thread); \
30	sdc1	$f4,  (THREAD_FPU + 0x020)(thread); \
31	sdc1	$f6,  (THREAD_FPU + 0x030)(thread); \
32	sdc1	$f8,  (THREAD_FPU + 0x040)(thread); \
33	sdc1	$f10, (THREAD_FPU + 0x050)(thread); \
34	sdc1	$f12, (THREAD_FPU + 0x060)(thread); \
35	sdc1	$f14, (THREAD_FPU + 0x070)(thread); \
36	sdc1	$f16, (THREAD_FPU + 0x080)(thread); \
37	sdc1	$f18, (THREAD_FPU + 0x090)(thread); \
38	sdc1	$f20, (THREAD_FPU + 0x0a0)(thread); \
39	sdc1	$f22, (THREAD_FPU + 0x0b0)(thread); \
40	sdc1	$f24, (THREAD_FPU + 0x0c0)(thread); \
41	sdc1	$f26, (THREAD_FPU + 0x0d0)(thread); \
42	sdc1	$f28, (THREAD_FPU + 0x0e0)(thread); \
43	sdc1	$f30, (THREAD_FPU + 0x0f0)(thread); \
44	sw	tmp,  (THREAD_FPU + 0x100)(thread)
45
46#if defined(__MIPSEL__)
47#define FPU_SAVE_SINGLE(thread,tmp)                 \
48	cfc1	tmp,  fcr31;                        \
49	swc1	$f0,  (THREAD_FPU + 0x000)(thread); \
50	swc1	$f1,  (THREAD_FPU + 0x004)(thread); \
51	swc1	$f2,  (THREAD_FPU + 0x010)(thread); \
52	swc1	$f3,  (THREAD_FPU + 0x014)(thread); \
53	swc1	$f4,  (THREAD_FPU + 0x020)(thread); \
54	swc1	$f5,  (THREAD_FPU + 0x024)(thread); \
55	swc1	$f6,  (THREAD_FPU + 0x030)(thread); \
56	swc1	$f7,  (THREAD_FPU + 0x034)(thread); \
57	swc1	$f8,  (THREAD_FPU + 0x040)(thread); \
58	swc1	$f9,  (THREAD_FPU + 0x044)(thread); \
59	swc1	$f10, (THREAD_FPU + 0x050)(thread); \
60	swc1	$f11, (THREAD_FPU + 0x054)(thread); \
61	swc1	$f12, (THREAD_FPU + 0x060)(thread); \
62	swc1	$f13, (THREAD_FPU + 0x064)(thread); \
63	swc1	$f14, (THREAD_FPU + 0x070)(thread); \
64	swc1	$f15, (THREAD_FPU + 0x074)(thread); \
65	swc1	$f16, (THREAD_FPU + 0x080)(thread); \
66	swc1	$f17, (THREAD_FPU + 0x084)(thread); \
67	swc1	$f18, (THREAD_FPU + 0x090)(thread); \
68	swc1	$f19, (THREAD_FPU + 0x094)(thread); \
69	swc1	$f20, (THREAD_FPU + 0x0a0)(thread); \
70	swc1	$f21, (THREAD_FPU + 0x0a4)(thread); \
71	swc1	$f22, (THREAD_FPU + 0x0b0)(thread); \
72	swc1	$f23, (THREAD_FPU + 0x0b4)(thread); \
73	swc1	$f24, (THREAD_FPU + 0x0c0)(thread); \
74	swc1	$f25, (THREAD_FPU + 0x0c4)(thread); \
75	swc1	$f26, (THREAD_FPU + 0x0d0)(thread); \
76	swc1	$f27, (THREAD_FPU + 0x0d4)(thread); \
77	swc1	$f28, (THREAD_FPU + 0x0e0)(thread); \
78	swc1	$f29, (THREAD_FPU + 0x0e4)(thread); \
79	swc1	$f30, (THREAD_FPU + 0x0f0)(thread); \
80	swc1	$f31, (THREAD_FPU + 0x0f4)(thread); \
81	sw	tmp,  (THREAD_FPU + 0x100)(thread)
82#elif defined(__MIPSEB__)
83#define FPU_SAVE_SINGLE(thread,tmp)                 \
84	cfc1	tmp,  fcr31;                        \
85	swc1	$f0,  (THREAD_FPU + 0x004)(thread); \
86	swc1	$f1,  (THREAD_FPU + 0x000)(thread); \
87	swc1	$f2,  (THREAD_FPU + 0x014)(thread); \
88	swc1	$f3,  (THREAD_FPU + 0x010)(thread); \
89	swc1	$f4,  (THREAD_FPU + 0x024)(thread); \
90	swc1	$f5,  (THREAD_FPU + 0x020)(thread); \
91	swc1	$f6,  (THREAD_FPU + 0x034)(thread); \
92	swc1	$f7,  (THREAD_FPU + 0x030)(thread); \
93	swc1	$f8,  (THREAD_FPU + 0x044)(thread); \
94	swc1	$f9,  (THREAD_FPU + 0x040)(thread); \
95	swc1	$f10, (THREAD_FPU + 0x054)(thread); \
96	swc1	$f11, (THREAD_FPU + 0x050)(thread); \
97	swc1	$f12, (THREAD_FPU + 0x064)(thread); \
98	swc1	$f13, (THREAD_FPU + 0x060)(thread); \
99	swc1	$f14, (THREAD_FPU + 0x074)(thread); \
100	swc1	$f15, (THREAD_FPU + 0x070)(thread); \
101	swc1	$f16, (THREAD_FPU + 0x084)(thread); \
102	swc1	$f17, (THREAD_FPU + 0x080)(thread); \
103	swc1	$f18, (THREAD_FPU + 0x094)(thread); \
104	swc1	$f19, (THREAD_FPU + 0x090)(thread); \
105	swc1	$f20, (THREAD_FPU + 0x0a4)(thread); \
106	swc1	$f21, (THREAD_FPU + 0x0a0)(thread); \
107	swc1	$f22, (THREAD_FPU + 0x0b4)(thread); \
108	swc1	$f23, (THREAD_FPU + 0x0b0)(thread); \
109	swc1	$f24, (THREAD_FPU + 0x0c4)(thread); \
110	swc1	$f25, (THREAD_FPU + 0x0c0)(thread); \
111	swc1	$f26, (THREAD_FPU + 0x0d4)(thread); \
112	swc1	$f27, (THREAD_FPU + 0x0d0)(thread); \
113	swc1	$f28, (THREAD_FPU + 0x0e4)(thread); \
114	swc1	$f29, (THREAD_FPU + 0x0e0)(thread); \
115	swc1	$f30, (THREAD_FPU + 0x0f4)(thread); \
116	swc1	$f31, (THREAD_FPU + 0x0f0)(thread); \
117	sw	tmp,  (THREAD_FPU + 0x100)(thread)
118#else
119#error "MIPS, but neither __MIPSEB__, nor __MIPSEL__???"
120#endif
121
122#define FPU_RESTORE_DOUBLE(thread, tmp) \
123	lw	tmp,  (THREAD_FPU + 0x100)(thread); \
124	ldc1	$f0,  (THREAD_FPU + 0x000)(thread); \
125	ldc1	$f2,  (THREAD_FPU + 0x010)(thread); \
126	ldc1	$f4,  (THREAD_FPU + 0x020)(thread); \
127	ldc1	$f6,  (THREAD_FPU + 0x030)(thread); \
128	ldc1	$f8,  (THREAD_FPU + 0x040)(thread); \
129	ldc1	$f10, (THREAD_FPU + 0x050)(thread); \
130	ldc1	$f12, (THREAD_FPU + 0x060)(thread); \
131	ldc1	$f14, (THREAD_FPU + 0x070)(thread); \
132	ldc1	$f16, (THREAD_FPU + 0x080)(thread); \
133	ldc1	$f18, (THREAD_FPU + 0x090)(thread); \
134	ldc1	$f20, (THREAD_FPU + 0x0a0)(thread); \
135	ldc1	$f22, (THREAD_FPU + 0x0b0)(thread); \
136	ldc1	$f24, (THREAD_FPU + 0x0c0)(thread); \
137	ldc1	$f26, (THREAD_FPU + 0x0d0)(thread); \
138	ldc1	$f28, (THREAD_FPU + 0x0e0)(thread); \
139	ldc1	$f30, (THREAD_FPU + 0x0f0)(thread); \
140	ctc1	tmp,  fcr31
141
142#if defined(__MIPSEL__)
143#define FPU_RESTORE_SINGLE(thread,tmp)              \
144	lw	tmp,  (THREAD_FPU + 0x100)(thread); \
145	lwc1	$f0,  (THREAD_FPU + 0x000)(thread); \
146	lwc1	$f1,  (THREAD_FPU + 0x004)(thread); \
147	lwc1	$f2,  (THREAD_FPU + 0x010)(thread); \
148	lwc1	$f3,  (THREAD_FPU + 0x014)(thread); \
149	lwc1	$f4,  (THREAD_FPU + 0x020)(thread); \
150	lwc1	$f5,  (THREAD_FPU + 0x024)(thread); \
151	lwc1	$f6,  (THREAD_FPU + 0x030)(thread); \
152	lwc1	$f7,  (THREAD_FPU + 0x034)(thread); \
153	lwc1	$f8,  (THREAD_FPU + 0x040)(thread); \
154	lwc1	$f9,  (THREAD_FPU + 0x044)(thread); \
155	lwc1	$f10, (THREAD_FPU + 0x050)(thread); \
156	lwc1	$f11, (THREAD_FPU + 0x054)(thread); \
157	lwc1	$f12, (THREAD_FPU + 0x060)(thread); \
158	lwc1	$f13, (THREAD_FPU + 0x064)(thread); \
159	lwc1	$f14, (THREAD_FPU + 0x070)(thread); \
160	lwc1	$f15, (THREAD_FPU + 0x074)(thread); \
161	lwc1	$f16, (THREAD_FPU + 0x080)(thread); \
162	lwc1	$f17, (THREAD_FPU + 0x084)(thread); \
163	lwc1	$f18, (THREAD_FPU + 0x090)(thread); \
164	lwc1	$f19, (THREAD_FPU + 0x094)(thread); \
165	lwc1	$f20, (THREAD_FPU + 0x0a0)(thread); \
166	lwc1	$f21, (THREAD_FPU + 0x0a4)(thread); \
167	lwc1	$f22, (THREAD_FPU + 0x0b0)(thread); \
168	lwc1	$f23, (THREAD_FPU + 0x0b4)(thread); \
169	lwc1	$f24, (THREAD_FPU + 0x0c0)(thread); \
170	lwc1	$f25, (THREAD_FPU + 0x0c4)(thread); \
171	lwc1	$f26, (THREAD_FPU + 0x0d0)(thread); \
172	lwc1	$f27, (THREAD_FPU + 0x0d4)(thread); \
173	lwc1	$f28, (THREAD_FPU + 0x0e0)(thread); \
174	lwc1	$f29, (THREAD_FPU + 0x0e4)(thread); \
175	lwc1	$f30, (THREAD_FPU + 0x0f0)(thread); \
176	lwc1	$f31, (THREAD_FPU + 0x0f4)(thread); \
177	ctc1	tmp,  fcr31
178#elif defined(__MIPSEB__)
179#define FPU_RESTORE_SINGLE(thread,tmp)              \
180	lw	tmp,  (THREAD_FPU + 0x100)(thread); \
181	lwc1	$f0,  (THREAD_FPU + 0x004)(thread); \
182	lwc1	$f1,  (THREAD_FPU + 0x000)(thread); \
183	lwc1	$f2,  (THREAD_FPU + 0x014)(thread); \
184	lwc1	$f3,  (THREAD_FPU + 0x010)(thread); \
185	lwc1	$f4,  (THREAD_FPU + 0x024)(thread); \
186	lwc1	$f5,  (THREAD_FPU + 0x020)(thread); \
187	lwc1	$f6,  (THREAD_FPU + 0x034)(thread); \
188	lwc1	$f7,  (THREAD_FPU + 0x030)(thread); \
189	lwc1	$f8,  (THREAD_FPU + 0x044)(thread); \
190	lwc1	$f9,  (THREAD_FPU + 0x040)(thread); \
191	lwc1	$f10, (THREAD_FPU + 0x054)(thread); \
192	lwc1	$f11, (THREAD_FPU + 0x050)(thread); \
193	lwc1	$f12, (THREAD_FPU + 0x064)(thread); \
194	lwc1	$f13, (THREAD_FPU + 0x060)(thread); \
195	lwc1	$f14, (THREAD_FPU + 0x074)(thread); \
196	lwc1	$f15, (THREAD_FPU + 0x070)(thread); \
197	lwc1	$f16, (THREAD_FPU + 0x084)(thread); \
198	lwc1	$f17, (THREAD_FPU + 0x080)(thread); \
199	lwc1	$f18, (THREAD_FPU + 0x094)(thread); \
200	lwc1	$f19, (THREAD_FPU + 0x090)(thread); \
201	lwc1	$f20, (THREAD_FPU + 0x0a4)(thread); \
202	lwc1	$f21, (THREAD_FPU + 0x0a0)(thread); \
203	lwc1	$f22, (THREAD_FPU + 0x0b4)(thread); \
204	lwc1	$f23, (THREAD_FPU + 0x0b0)(thread); \
205	lwc1	$f24, (THREAD_FPU + 0x0c4)(thread); \
206	lwc1	$f25, (THREAD_FPU + 0x0c0)(thread); \
207	lwc1	$f26, (THREAD_FPU + 0x0d4)(thread); \
208	lwc1	$f27, (THREAD_FPU + 0x0d0)(thread); \
209	lwc1	$f28, (THREAD_FPU + 0x0e4)(thread); \
210	lwc1	$f29, (THREAD_FPU + 0x0e0)(thread); \
211	lwc1	$f30, (THREAD_FPU + 0x0f4)(thread); \
212	lwc1	$f31, (THREAD_FPU + 0x0f0)(thread); \
213	ctc1	tmp,  fcr31
214#else
215#error "MIPS, but neither __MIPSEB__, nor __MIPSEL__???"
216#endif
217
218#define CPU_SAVE_NONSCRATCH(thread) \
219	sw	s0, THREAD_REG16(thread); \
220	sw	s1, THREAD_REG17(thread); \
221	sw	s2, THREAD_REG18(thread); \
222	sw	s3, THREAD_REG19(thread); \
223	sw	s4, THREAD_REG20(thread); \
224	sw	s5, THREAD_REG21(thread); \
225	sw	s6, THREAD_REG22(thread); \
226	sw	s7, THREAD_REG23(thread); \
227	sw	sp, THREAD_REG29(thread); \
228	sw	fp, THREAD_REG30(thread)
229
230#define CPU_RESTORE_NONSCRATCH(thread) \
231	lw	s0, THREAD_REG16(thread); \
232	lw	s1, THREAD_REG17(thread); \
233	lw	s2, THREAD_REG18(thread); \
234	lw	s3, THREAD_REG19(thread); \
235	lw	s4, THREAD_REG20(thread); \
236	lw	s5, THREAD_REG21(thread); \
237	lw	s6, THREAD_REG22(thread); \
238	lw	s7, THREAD_REG23(thread); \
239	lw	sp, THREAD_REG29(thread); \
240	lw	fp, THREAD_REG30(thread); \
241	lw	ra, THREAD_REG31(thread)
242
243#endif /* _ASM_ASMMACRO_H */
244