xref: /linux/arch/mips/include/asm/asmmacro.h (revision 37744feebc086908fd89760650f458ab19071750)
1 /*
2  * This file is subject to the terms and conditions of the GNU General Public
3  * License.  See the file "COPYING" in the main directory of this archive
4  * for more details.
5  *
6  * Copyright (C) 2003 Ralf Baechle
7  */
8 #ifndef _ASM_ASMMACRO_H
9 #define _ASM_ASMMACRO_H
10 
11 #include <asm/hazards.h>
12 #include <asm/asm-offsets.h>
13 #include <asm/msa.h>
14 
15 #ifdef CONFIG_32BIT
16 #include <asm/asmmacro-32.h>
17 #endif
18 #ifdef CONFIG_64BIT
19 #include <asm/asmmacro-64.h>
20 #endif
21 
22 /* preprocessor replaces the fp in ".set fp=64" with $30 otherwise */
23 #undef fp
24 
25 /*
26  * Helper macros for generating raw instruction encodings.
27  */
28 #ifdef CONFIG_CPU_MICROMIPS
29 	.macro	insn32_if_mm enc
30 	.insn
31 	.hword ((\enc) >> 16)
32 	.hword ((\enc) & 0xffff)
33 	.endm
34 
35 	.macro	insn_if_mips enc
36 	.endm
37 #else
38 	.macro	insn32_if_mm enc
39 	.endm
40 
41 	.macro	insn_if_mips enc
42 	.insn
43 	.word (\enc)
44 	.endm
45 #endif
46 
47 #if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6)
48 	.macro	local_irq_enable reg=t0
49 	ei
50 	irq_enable_hazard
51 	.endm
52 
53 	.macro	local_irq_disable reg=t0
54 	di
55 	irq_disable_hazard
56 	.endm
57 #else
58 	.macro	local_irq_enable reg=t0
59 	mfc0	\reg, CP0_STATUS
60 	ori	\reg, \reg, 1
61 	mtc0	\reg, CP0_STATUS
62 	irq_enable_hazard
63 	.endm
64 
65 	.macro	local_irq_disable reg=t0
66 #ifdef CONFIG_PREEMPTION
67 	lw      \reg, TI_PRE_COUNT($28)
68 	addi    \reg, \reg, 1
69 	sw      \reg, TI_PRE_COUNT($28)
70 #endif
71 	mfc0	\reg, CP0_STATUS
72 	ori	\reg, \reg, 1
73 	xori	\reg, \reg, 1
74 	mtc0	\reg, CP0_STATUS
75 	irq_disable_hazard
76 #ifdef CONFIG_PREEMPTION
77 	lw      \reg, TI_PRE_COUNT($28)
78 	addi    \reg, \reg, -1
79 	sw      \reg, TI_PRE_COUNT($28)
80 #endif
81 	.endm
82 #endif /* CONFIG_CPU_MIPSR2 */
83 
84 	.macro	fpu_save_16even thread tmp=t0
85 	.set	push
86 	SET_HARDFLOAT
87 	cfc1	\tmp, fcr31
88 	sdc1	$f0,  THREAD_FPR0(\thread)
89 	sdc1	$f2,  THREAD_FPR2(\thread)
90 	sdc1	$f4,  THREAD_FPR4(\thread)
91 	sdc1	$f6,  THREAD_FPR6(\thread)
92 	sdc1	$f8,  THREAD_FPR8(\thread)
93 	sdc1	$f10, THREAD_FPR10(\thread)
94 	sdc1	$f12, THREAD_FPR12(\thread)
95 	sdc1	$f14, THREAD_FPR14(\thread)
96 	sdc1	$f16, THREAD_FPR16(\thread)
97 	sdc1	$f18, THREAD_FPR18(\thread)
98 	sdc1	$f20, THREAD_FPR20(\thread)
99 	sdc1	$f22, THREAD_FPR22(\thread)
100 	sdc1	$f24, THREAD_FPR24(\thread)
101 	sdc1	$f26, THREAD_FPR26(\thread)
102 	sdc1	$f28, THREAD_FPR28(\thread)
103 	sdc1	$f30, THREAD_FPR30(\thread)
104 	sw	\tmp, THREAD_FCR31(\thread)
105 	.set	pop
106 	.endm
107 
108 	.macro	fpu_save_16odd thread
109 	.set	push
110 	.set	mips64r2
111 	.set	fp=64
112 	SET_HARDFLOAT
113 	sdc1	$f1,  THREAD_FPR1(\thread)
114 	sdc1	$f3,  THREAD_FPR3(\thread)
115 	sdc1	$f5,  THREAD_FPR5(\thread)
116 	sdc1	$f7,  THREAD_FPR7(\thread)
117 	sdc1	$f9,  THREAD_FPR9(\thread)
118 	sdc1	$f11, THREAD_FPR11(\thread)
119 	sdc1	$f13, THREAD_FPR13(\thread)
120 	sdc1	$f15, THREAD_FPR15(\thread)
121 	sdc1	$f17, THREAD_FPR17(\thread)
122 	sdc1	$f19, THREAD_FPR19(\thread)
123 	sdc1	$f21, THREAD_FPR21(\thread)
124 	sdc1	$f23, THREAD_FPR23(\thread)
125 	sdc1	$f25, THREAD_FPR25(\thread)
126 	sdc1	$f27, THREAD_FPR27(\thread)
127 	sdc1	$f29, THREAD_FPR29(\thread)
128 	sdc1	$f31, THREAD_FPR31(\thread)
129 	.set	pop
130 	.endm
131 
132 	.macro	fpu_save_double thread status tmp
133 #if defined(CONFIG_64BIT) || defined(CONFIG_CPU_MIPSR2) || \
134 		defined(CONFIG_CPU_MIPSR6)
135 	sll	\tmp, \status, 5
136 	bgez	\tmp, 10f
137 	fpu_save_16odd \thread
138 10:
139 #endif
140 	fpu_save_16even \thread \tmp
141 	.endm
142 
143 	.macro	fpu_restore_16even thread tmp=t0
144 	.set	push
145 	SET_HARDFLOAT
146 	lw	\tmp, THREAD_FCR31(\thread)
147 	ldc1	$f0,  THREAD_FPR0(\thread)
148 	ldc1	$f2,  THREAD_FPR2(\thread)
149 	ldc1	$f4,  THREAD_FPR4(\thread)
150 	ldc1	$f6,  THREAD_FPR6(\thread)
151 	ldc1	$f8,  THREAD_FPR8(\thread)
152 	ldc1	$f10, THREAD_FPR10(\thread)
153 	ldc1	$f12, THREAD_FPR12(\thread)
154 	ldc1	$f14, THREAD_FPR14(\thread)
155 	ldc1	$f16, THREAD_FPR16(\thread)
156 	ldc1	$f18, THREAD_FPR18(\thread)
157 	ldc1	$f20, THREAD_FPR20(\thread)
158 	ldc1	$f22, THREAD_FPR22(\thread)
159 	ldc1	$f24, THREAD_FPR24(\thread)
160 	ldc1	$f26, THREAD_FPR26(\thread)
161 	ldc1	$f28, THREAD_FPR28(\thread)
162 	ldc1	$f30, THREAD_FPR30(\thread)
163 	ctc1	\tmp, fcr31
164 	.set	pop
165 	.endm
166 
167 	.macro	fpu_restore_16odd thread
168 	.set	push
169 	.set	mips64r2
170 	.set	fp=64
171 	SET_HARDFLOAT
172 	ldc1	$f1,  THREAD_FPR1(\thread)
173 	ldc1	$f3,  THREAD_FPR3(\thread)
174 	ldc1	$f5,  THREAD_FPR5(\thread)
175 	ldc1	$f7,  THREAD_FPR7(\thread)
176 	ldc1	$f9,  THREAD_FPR9(\thread)
177 	ldc1	$f11, THREAD_FPR11(\thread)
178 	ldc1	$f13, THREAD_FPR13(\thread)
179 	ldc1	$f15, THREAD_FPR15(\thread)
180 	ldc1	$f17, THREAD_FPR17(\thread)
181 	ldc1	$f19, THREAD_FPR19(\thread)
182 	ldc1	$f21, THREAD_FPR21(\thread)
183 	ldc1	$f23, THREAD_FPR23(\thread)
184 	ldc1	$f25, THREAD_FPR25(\thread)
185 	ldc1	$f27, THREAD_FPR27(\thread)
186 	ldc1	$f29, THREAD_FPR29(\thread)
187 	ldc1	$f31, THREAD_FPR31(\thread)
188 	.set	pop
189 	.endm
190 
191 	.macro	fpu_restore_double thread status tmp
192 #if defined(CONFIG_64BIT) || defined(CONFIG_CPU_MIPSR2) || \
193 		defined(CONFIG_CPU_MIPSR6)
194 	sll	\tmp, \status, 5
195 	bgez	\tmp, 10f				# 16 register mode?
196 
197 	fpu_restore_16odd \thread
198 10:
199 #endif
200 	fpu_restore_16even \thread \tmp
201 	.endm
202 
203 #if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6)
204 	.macro	_EXT	rd, rs, p, s
205 	ext	\rd, \rs, \p, \s
206 	.endm
207 #else /* !CONFIG_CPU_MIPSR2 || !CONFIG_CPU_MIPSR6 */
208 	.macro	_EXT	rd, rs, p, s
209 	srl	\rd, \rs, \p
210 	andi	\rd, \rd, (1 << \s) - 1
211 	.endm
212 #endif /* !CONFIG_CPU_MIPSR2 || !CONFIG_CPU_MIPSR6 */
213 
214 /*
215  * Temporary until all gas have MT ASE support
216  */
217 	.macro	DMT	reg=0
218 	.word	0x41600bc1 | (\reg << 16)
219 	.endm
220 
221 	.macro	EMT	reg=0
222 	.word	0x41600be1 | (\reg << 16)
223 	.endm
224 
225 	.macro	DVPE	reg=0
226 	.word	0x41600001 | (\reg << 16)
227 	.endm
228 
229 	.macro	EVPE	reg=0
230 	.word	0x41600021 | (\reg << 16)
231 	.endm
232 
233 	.macro	MFTR	rt=0, rd=0, u=0, sel=0
234 	 .word	0x41000000 | (\rt << 16) | (\rd << 11) | (\u << 5) | (\sel)
235 	.endm
236 
237 	.macro	MTTR	rt=0, rd=0, u=0, sel=0
238 	 .word	0x41800000 | (\rt << 16) | (\rd << 11) | (\u << 5) | (\sel)
239 	.endm
240 
241 #ifdef TOOLCHAIN_SUPPORTS_MSA
242 	.macro	_cfcmsa	rd, cs
243 	.set	push
244 	.set	mips32r2
245 	.set	fp=64
246 	.set	msa
247 	cfcmsa	\rd, $\cs
248 	.set	pop
249 	.endm
250 
251 	.macro	_ctcmsa	cd, rs
252 	.set	push
253 	.set	mips32r2
254 	.set	fp=64
255 	.set	msa
256 	ctcmsa	$\cd, \rs
257 	.set	pop
258 	.endm
259 
260 	.macro	ld_b	wd, off, base
261 	.set	push
262 	.set	mips32r2
263 	.set	fp=64
264 	.set	msa
265 	ld.b	$w\wd, \off(\base)
266 	.set	pop
267 	.endm
268 
269 	.macro	ld_h	wd, off, base
270 	.set	push
271 	.set	mips32r2
272 	.set	fp=64
273 	.set	msa
274 	ld.h	$w\wd, \off(\base)
275 	.set	pop
276 	.endm
277 
278 	.macro	ld_w	wd, off, base
279 	.set	push
280 	.set	mips32r2
281 	.set	fp=64
282 	.set	msa
283 	ld.w	$w\wd, \off(\base)
284 	.set	pop
285 	.endm
286 
287 	.macro	ld_d	wd, off, base
288 	.set	push
289 	.set	mips32r2
290 	.set	fp=64
291 	.set	msa
292 	ld.d	$w\wd, \off(\base)
293 	.set	pop
294 	.endm
295 
296 	.macro	st_b	wd, off, base
297 	.set	push
298 	.set	mips32r2
299 	.set	fp=64
300 	.set	msa
301 	st.b	$w\wd, \off(\base)
302 	.set	pop
303 	.endm
304 
305 	.macro	st_h	wd, off, base
306 	.set	push
307 	.set	mips32r2
308 	.set	fp=64
309 	.set	msa
310 	st.h	$w\wd, \off(\base)
311 	.set	pop
312 	.endm
313 
314 	.macro	st_w	wd, off, base
315 	.set	push
316 	.set	mips32r2
317 	.set	fp=64
318 	.set	msa
319 	st.w	$w\wd, \off(\base)
320 	.set	pop
321 	.endm
322 
323 	.macro	st_d	wd, off, base
324 	.set	push
325 	.set	mips32r2
326 	.set	fp=64
327 	.set	msa
328 	st.d	$w\wd, \off(\base)
329 	.set	pop
330 	.endm
331 
332 	.macro	copy_s_w	ws, n
333 	.set	push
334 	.set	mips32r2
335 	.set	fp=64
336 	.set	msa
337 	copy_s.w $1, $w\ws[\n]
338 	.set	pop
339 	.endm
340 
341 	.macro	copy_s_d	ws, n
342 	.set	push
343 	.set	mips64r2
344 	.set	fp=64
345 	.set	msa
346 	copy_s.d $1, $w\ws[\n]
347 	.set	pop
348 	.endm
349 
350 	.macro	insert_w	wd, n
351 	.set	push
352 	.set	mips32r2
353 	.set	fp=64
354 	.set	msa
355 	insert.w $w\wd[\n], $1
356 	.set	pop
357 	.endm
358 
359 	.macro	insert_d	wd, n
360 	.set	push
361 	.set	mips64r2
362 	.set	fp=64
363 	.set	msa
364 	insert.d $w\wd[\n], $1
365 	.set	pop
366 	.endm
367 #else
368 
369 	/*
370 	 * Temporary until all toolchains in use include MSA support.
371 	 */
372 	.macro	_cfcmsa	rd, cs
373 	.set	push
374 	.set	noat
375 	SET_HARDFLOAT
376 	insn_if_mips 0x787e0059 | (\cs << 11)
377 	insn32_if_mm 0x587e0056 | (\cs << 11)
378 	move	\rd, $1
379 	.set	pop
380 	.endm
381 
382 	.macro	_ctcmsa	cd, rs
383 	.set	push
384 	.set	noat
385 	SET_HARDFLOAT
386 	move	$1, \rs
387 	insn_if_mips 0x783e0819 | (\cd << 6)
388 	insn32_if_mm 0x583e0816 | (\cd << 6)
389 	.set	pop
390 	.endm
391 
392 	.macro	ld_b	wd, off, base
393 	.set	push
394 	.set	noat
395 	SET_HARDFLOAT
396 	PTR_ADDU $1, \base, \off
397 	insn_if_mips 0x78000820 | (\wd << 6)
398 	insn32_if_mm 0x58000807 | (\wd << 6)
399 	.set	pop
400 	.endm
401 
402 	.macro	ld_h	wd, off, base
403 	.set	push
404 	.set	noat
405 	SET_HARDFLOAT
406 	PTR_ADDU $1, \base, \off
407 	insn_if_mips 0x78000821 | (\wd << 6)
408 	insn32_if_mm 0x58000817 | (\wd << 6)
409 	.set	pop
410 	.endm
411 
412 	.macro	ld_w	wd, off, base
413 	.set	push
414 	.set	noat
415 	SET_HARDFLOAT
416 	PTR_ADDU $1, \base, \off
417 	insn_if_mips 0x78000822 | (\wd << 6)
418 	insn32_if_mm 0x58000827 | (\wd << 6)
419 	.set	pop
420 	.endm
421 
422 	.macro	ld_d	wd, off, base
423 	.set	push
424 	.set	noat
425 	SET_HARDFLOAT
426 	PTR_ADDU $1, \base, \off
427 	insn_if_mips 0x78000823 | (\wd << 6)
428 	insn32_if_mm 0x58000837 | (\wd << 6)
429 	.set	pop
430 	.endm
431 
432 	.macro	st_b	wd, off, base
433 	.set	push
434 	.set	noat
435 	SET_HARDFLOAT
436 	PTR_ADDU $1, \base, \off
437 	insn_if_mips 0x78000824 | (\wd << 6)
438 	insn32_if_mm 0x5800080f | (\wd << 6)
439 	.set	pop
440 	.endm
441 
442 	.macro	st_h	wd, off, base
443 	.set	push
444 	.set	noat
445 	SET_HARDFLOAT
446 	PTR_ADDU $1, \base, \off
447 	insn_if_mips 0x78000825 | (\wd << 6)
448 	insn32_if_mm 0x5800081f | (\wd << 6)
449 	.set	pop
450 	.endm
451 
452 	.macro	st_w	wd, off, base
453 	.set	push
454 	.set	noat
455 	SET_HARDFLOAT
456 	PTR_ADDU $1, \base, \off
457 	insn_if_mips 0x78000826 | (\wd << 6)
458 	insn32_if_mm 0x5800082f | (\wd << 6)
459 	.set	pop
460 	.endm
461 
462 	.macro	st_d	wd, off, base
463 	.set	push
464 	.set	noat
465 	SET_HARDFLOAT
466 	PTR_ADDU $1, \base, \off
467 	insn_if_mips 0x78000827 | (\wd << 6)
468 	insn32_if_mm 0x5800083f | (\wd << 6)
469 	.set	pop
470 	.endm
471 
472 	.macro	copy_s_w	ws, n
473 	.set	push
474 	.set	noat
475 	SET_HARDFLOAT
476 	insn_if_mips 0x78b00059 | (\n << 16) | (\ws << 11)
477 	insn32_if_mm 0x58b00056 | (\n << 16) | (\ws << 11)
478 	.set	pop
479 	.endm
480 
481 	.macro	copy_s_d	ws, n
482 	.set	push
483 	.set	noat
484 	SET_HARDFLOAT
485 	insn_if_mips 0x78b80059 | (\n << 16) | (\ws << 11)
486 	insn32_if_mm 0x58b80056 | (\n << 16) | (\ws << 11)
487 	.set	pop
488 	.endm
489 
490 	.macro	insert_w	wd, n
491 	.set	push
492 	.set	noat
493 	SET_HARDFLOAT
494 	insn_if_mips 0x79300819 | (\n << 16) | (\wd << 6)
495 	insn32_if_mm 0x59300816 | (\n << 16) | (\wd << 6)
496 	.set	pop
497 	.endm
498 
499 	.macro	insert_d	wd, n
500 	.set	push
501 	.set	noat
502 	SET_HARDFLOAT
503 	insn_if_mips 0x79380819 | (\n << 16) | (\wd << 6)
504 	insn32_if_mm 0x59380816 | (\n << 16) | (\wd << 6)
505 	.set	pop
506 	.endm
507 #endif
508 
509 #ifdef TOOLCHAIN_SUPPORTS_MSA
510 #define FPR_BASE_OFFS	THREAD_FPR0
511 #define FPR_BASE	$1
512 #else
513 #define FPR_BASE_OFFS	0
514 #define FPR_BASE	\thread
515 #endif
516 
517 	.macro	msa_save_all	thread
518 	.set	push
519 	.set	noat
520 #ifdef TOOLCHAIN_SUPPORTS_MSA
521 	PTR_ADDU FPR_BASE, \thread, FPR_BASE_OFFS
522 #endif
523 	st_d	 0, THREAD_FPR0  - FPR_BASE_OFFS, FPR_BASE
524 	st_d	 1, THREAD_FPR1  - FPR_BASE_OFFS, FPR_BASE
525 	st_d	 2, THREAD_FPR2  - FPR_BASE_OFFS, FPR_BASE
526 	st_d	 3, THREAD_FPR3  - FPR_BASE_OFFS, FPR_BASE
527 	st_d	 4, THREAD_FPR4  - FPR_BASE_OFFS, FPR_BASE
528 	st_d	 5, THREAD_FPR5  - FPR_BASE_OFFS, FPR_BASE
529 	st_d	 6, THREAD_FPR6  - FPR_BASE_OFFS, FPR_BASE
530 	st_d	 7, THREAD_FPR7  - FPR_BASE_OFFS, FPR_BASE
531 	st_d	 8, THREAD_FPR8  - FPR_BASE_OFFS, FPR_BASE
532 	st_d	 9, THREAD_FPR9  - FPR_BASE_OFFS, FPR_BASE
533 	st_d	10, THREAD_FPR10 - FPR_BASE_OFFS, FPR_BASE
534 	st_d	11, THREAD_FPR11 - FPR_BASE_OFFS, FPR_BASE
535 	st_d	12, THREAD_FPR12 - FPR_BASE_OFFS, FPR_BASE
536 	st_d	13, THREAD_FPR13 - FPR_BASE_OFFS, FPR_BASE
537 	st_d	14, THREAD_FPR14 - FPR_BASE_OFFS, FPR_BASE
538 	st_d	15, THREAD_FPR15 - FPR_BASE_OFFS, FPR_BASE
539 	st_d	16, THREAD_FPR16 - FPR_BASE_OFFS, FPR_BASE
540 	st_d	17, THREAD_FPR17 - FPR_BASE_OFFS, FPR_BASE
541 	st_d	18, THREAD_FPR18 - FPR_BASE_OFFS, FPR_BASE
542 	st_d	19, THREAD_FPR19 - FPR_BASE_OFFS, FPR_BASE
543 	st_d	20, THREAD_FPR20 - FPR_BASE_OFFS, FPR_BASE
544 	st_d	21, THREAD_FPR21 - FPR_BASE_OFFS, FPR_BASE
545 	st_d	22, THREAD_FPR22 - FPR_BASE_OFFS, FPR_BASE
546 	st_d	23, THREAD_FPR23 - FPR_BASE_OFFS, FPR_BASE
547 	st_d	24, THREAD_FPR24 - FPR_BASE_OFFS, FPR_BASE
548 	st_d	25, THREAD_FPR25 - FPR_BASE_OFFS, FPR_BASE
549 	st_d	26, THREAD_FPR26 - FPR_BASE_OFFS, FPR_BASE
550 	st_d	27, THREAD_FPR27 - FPR_BASE_OFFS, FPR_BASE
551 	st_d	28, THREAD_FPR28 - FPR_BASE_OFFS, FPR_BASE
552 	st_d	29, THREAD_FPR29 - FPR_BASE_OFFS, FPR_BASE
553 	st_d	30, THREAD_FPR30 - FPR_BASE_OFFS, FPR_BASE
554 	st_d	31, THREAD_FPR31 - FPR_BASE_OFFS, FPR_BASE
555 	SET_HARDFLOAT
556 	_cfcmsa	$1, MSA_CSR
557 	sw	$1, THREAD_MSA_CSR(\thread)
558 	.set	pop
559 	.endm
560 
561 	.macro	msa_restore_all	thread
562 	.set	push
563 	.set	noat
564 	SET_HARDFLOAT
565 	lw	$1, THREAD_MSA_CSR(\thread)
566 	_ctcmsa	MSA_CSR, $1
567 #ifdef TOOLCHAIN_SUPPORTS_MSA
568 	PTR_ADDU FPR_BASE, \thread, FPR_BASE_OFFS
569 #endif
570 	ld_d	 0, THREAD_FPR0  - FPR_BASE_OFFS, FPR_BASE
571 	ld_d	 1, THREAD_FPR1  - FPR_BASE_OFFS, FPR_BASE
572 	ld_d	 2, THREAD_FPR2  - FPR_BASE_OFFS, FPR_BASE
573 	ld_d	 3, THREAD_FPR3  - FPR_BASE_OFFS, FPR_BASE
574 	ld_d	 4, THREAD_FPR4  - FPR_BASE_OFFS, FPR_BASE
575 	ld_d	 5, THREAD_FPR5  - FPR_BASE_OFFS, FPR_BASE
576 	ld_d	 6, THREAD_FPR6  - FPR_BASE_OFFS, FPR_BASE
577 	ld_d	 7, THREAD_FPR7  - FPR_BASE_OFFS, FPR_BASE
578 	ld_d	 8, THREAD_FPR8  - FPR_BASE_OFFS, FPR_BASE
579 	ld_d	 9, THREAD_FPR9  - FPR_BASE_OFFS, FPR_BASE
580 	ld_d	10, THREAD_FPR10 - FPR_BASE_OFFS, FPR_BASE
581 	ld_d	11, THREAD_FPR11 - FPR_BASE_OFFS, FPR_BASE
582 	ld_d	12, THREAD_FPR12 - FPR_BASE_OFFS, FPR_BASE
583 	ld_d	13, THREAD_FPR13 - FPR_BASE_OFFS, FPR_BASE
584 	ld_d	14, THREAD_FPR14 - FPR_BASE_OFFS, FPR_BASE
585 	ld_d	15, THREAD_FPR15 - FPR_BASE_OFFS, FPR_BASE
586 	ld_d	16, THREAD_FPR16 - FPR_BASE_OFFS, FPR_BASE
587 	ld_d	17, THREAD_FPR17 - FPR_BASE_OFFS, FPR_BASE
588 	ld_d	18, THREAD_FPR18 - FPR_BASE_OFFS, FPR_BASE
589 	ld_d	19, THREAD_FPR19 - FPR_BASE_OFFS, FPR_BASE
590 	ld_d	20, THREAD_FPR20 - FPR_BASE_OFFS, FPR_BASE
591 	ld_d	21, THREAD_FPR21 - FPR_BASE_OFFS, FPR_BASE
592 	ld_d	22, THREAD_FPR22 - FPR_BASE_OFFS, FPR_BASE
593 	ld_d	23, THREAD_FPR23 - FPR_BASE_OFFS, FPR_BASE
594 	ld_d	24, THREAD_FPR24 - FPR_BASE_OFFS, FPR_BASE
595 	ld_d	25, THREAD_FPR25 - FPR_BASE_OFFS, FPR_BASE
596 	ld_d	26, THREAD_FPR26 - FPR_BASE_OFFS, FPR_BASE
597 	ld_d	27, THREAD_FPR27 - FPR_BASE_OFFS, FPR_BASE
598 	ld_d	28, THREAD_FPR28 - FPR_BASE_OFFS, FPR_BASE
599 	ld_d	29, THREAD_FPR29 - FPR_BASE_OFFS, FPR_BASE
600 	ld_d	30, THREAD_FPR30 - FPR_BASE_OFFS, FPR_BASE
601 	ld_d	31, THREAD_FPR31 - FPR_BASE_OFFS, FPR_BASE
602 	.set pop
603 	.endm
604 
605 #undef FPR_BASE_OFFS
606 #undef FPR_BASE
607 
608 	.macro	msa_init_upper wd
609 #ifdef CONFIG_64BIT
610 	insert_d \wd, 1
611 #else
612 	insert_w \wd, 2
613 	insert_w \wd, 3
614 #endif
615 	.endm
616 
617 	.macro	msa_init_all_upper
618 	.set	push
619 	.set	noat
620 	SET_HARDFLOAT
621 	not	$1, zero
622 	msa_init_upper	0
623 	msa_init_upper	1
624 	msa_init_upper	2
625 	msa_init_upper	3
626 	msa_init_upper	4
627 	msa_init_upper	5
628 	msa_init_upper	6
629 	msa_init_upper	7
630 	msa_init_upper	8
631 	msa_init_upper	9
632 	msa_init_upper	10
633 	msa_init_upper	11
634 	msa_init_upper	12
635 	msa_init_upper	13
636 	msa_init_upper	14
637 	msa_init_upper	15
638 	msa_init_upper	16
639 	msa_init_upper	17
640 	msa_init_upper	18
641 	msa_init_upper	19
642 	msa_init_upper	20
643 	msa_init_upper	21
644 	msa_init_upper	22
645 	msa_init_upper	23
646 	msa_init_upper	24
647 	msa_init_upper	25
648 	msa_init_upper	26
649 	msa_init_upper	27
650 	msa_init_upper	28
651 	msa_init_upper	29
652 	msa_init_upper	30
653 	msa_init_upper	31
654 	.set	pop
655 	.endm
656 
657 #endif /* _ASM_ASMMACRO_H */
658