• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) 2020 Loongson Technology Corporation Limited
4  */
5 #ifndef _ASM_ASMMACRO_H
6 #define _ASM_ASMMACRO_H
7 
8 #include <asm/asm-offsets.h>
9 
10 #ifdef CONFIG_32BIT
11 #include <asm/asmmacro-32.h>
12 #endif
13 #ifdef CONFIG_64BIT
14 #include <asm/asmmacro-64.h>
15 #endif
16 
17 	.macro	parse_v var val
18 	\var	= \val
19 	.endm
20 
21 	.macro	parse_r var r
22 	\var	= -1
23 	.ifc	\r, $r0
24 	\var	= 0
25 	.endif
26 	.ifc	\r, $r1
27 	\var	= 1
28 	.endif
29 	.ifc	\r, $r2
30 	\var	= 2
31 	.endif
32 	.ifc	\r, $r3
33 	\var	= 3
34 	.endif
35 	.ifc	\r, $r4
36 	\var	= 4
37 	.endif
38 	.ifc	\r, $r5
39 	\var	= 5
40 	.endif
41 	.ifc	\r, $r6
42 	\var	= 6
43 	.endif
44 	.ifc	\r, $r7
45 	\var	= 7
46 	.endif
47 	.ifc	\r, $r8
48 	\var	= 8
49 	.endif
50 	.ifc	\r, $r9
51 	\var	= 9
52 	.endif
53 	.ifc	\r, $r10
54 	\var	= 10
55 	.endif
56 	.ifc	\r, $r11
57 	\var	= 11
58 	.endif
59 	.ifc	\r, $r12
60 	\var	= 12
61 	.endif
62 	.ifc	\r, $r13
63 	\var	= 13
64 	.endif
65 	.ifc	\r, $r14
66 	\var	= 14
67 	.endif
68 	.ifc	\r, $r15
69 	\var	= 15
70 	.endif
71 	.ifc	\r, $r16
72 	\var	= 16
73 	.endif
74 	.ifc	\r, $r17
75 	\var	= 17
76 	.endif
77 	.ifc	\r, $r18
78 	\var	= 18
79 	.endif
80 	.ifc	\r, $r19
81 	\var	= 19
82 	.endif
83 	.ifc	\r, $r20
84 	\var	= 20
85 	.endif
86 	.ifc	\r, $r21
87 	\var	= 21
88 	.endif
89 	.ifc	\r, $r22
90 	\var	= 22
91 	.endif
92 	.ifc	\r, $r23
93 	\var	= 23
94 	.endif
95 	.ifc	\r, $r24
96 	\var	= 24
97 	.endif
98 	.ifc	\r, $r25
99 	\var	= 25
100 	.endif
101 	.ifc	\r, $r26
102 	\var	= 26
103 	.endif
104 	.ifc	\r, $r27
105 	\var	= 27
106 	.endif
107 	.ifc	\r, $r28
108 	\var	= 28
109 	.endif
110 	.ifc	\r, $r29
111 	\var	= 29
112 	.endif
113 	.ifc	\r, $r30
114 	\var	= 30
115 	.endif
116 	.ifc	\r, $r31
117 	\var	= 31
118 	.endif
119 	.iflt	\var
120 	.error	"Unable to parse register name \r"
121 	.endif
122 	.endm
123 
124 	.macro	parse_vr var vr
125 	\var	= -1
126 	.ifc	\vr, $vr0
127 	\var	= 0
128 	.endif
129 	.ifc	\vr, $vr1
130 	\var	= 1
131 	.endif
132 	.ifc	\vr, $vr2
133 	\var	= 2
134 	.endif
135 	.ifc	\vr, $vr3
136 	\var	= 3
137 	.endif
138 	.ifc	\vr, $vr4
139 	\var	= 4
140 	.endif
141 	.ifc	\vr, $vr5
142 	\var	= 5
143 	.endif
144 	.ifc	\vr, $vr6
145 	\var	= 6
146 	.endif
147 	.ifc	\vr, $vr7
148 	\var	= 7
149 	.endif
150 	.ifc	\vr, $vr8
151 	\var	= 8
152 	.endif
153 	.ifc	\vr, $vr9
154 	\var	= 9
155 	.endif
156 	.ifc	\vr, $vr10
157 	\var	= 10
158 	.endif
159 	.ifc	\vr, $vr11
160 	\var	= 11
161 	.endif
162 	.ifc	\vr, $vr12
163 	\var	= 12
164 	.endif
165 	.ifc	\vr, $vr13
166 	\var	= 13
167 	.endif
168 	.ifc	\vr, $vr14
169 	\var	= 14
170 	.endif
171 	.ifc	\vr, $vr15
172 	\var	= 15
173 	.endif
174 	.ifc	\vr, $vr16
175 	\var	= 16
176 	.endif
177 	.ifc	\vr, $vr17
178 	\var	= 17
179 	.endif
180 	.ifc	\vr, $vr18
181 	\var	= 18
182 	.endif
183 	.ifc	\vr, $vr19
184 	\var	= 19
185 	.endif
186 	.ifc	\vr, $vr20
187 	\var	= 20
188 	.endif
189 	.ifc	\vr, $vr21
190 	\var	= 21
191 	.endif
192 	.ifc	\vr, $vr22
193 	\var	= 22
194 	.endif
195 	.ifc	\vr, $vr23
196 	\var	= 23
197 	.endif
198 	.ifc	\vr, $vr24
199 	\var	= 24
200 	.endif
201 	.ifc	\vr, $vr25
202 	\var	= 25
203 	.endif
204 	.ifc	\vr, $vr26
205 	\var	= 26
206 	.endif
207 	.ifc	\vr, $vr27
208 	\var	= 27
209 	.endif
210 	.ifc	\vr, $vr28
211 	\var	= 28
212 	.endif
213 	.ifc	\vr, $vr29
214 	\var	= 29
215 	.endif
216 	.ifc	\vr, $vr30
217 	\var	= 30
218 	.endif
219 	.ifc	\vr, $vr31
220 	\var	= 31
221 	.endif
222 	.iflt	\var
223 	.error	"Unable to parse register name \r"
224 	.endif
225 	.endm
226 
227 	.macro	parse_xr var xr
228 	\var	= -1
229 	.ifc	\xr, $xr0
230 	\var	= 0
231 	.endif
232 	.ifc	\xr, $xr1
233 	\var	= 1
234 	.endif
235 	.ifc	\xr, $xr2
236 	\var	= 2
237 	.endif
238 	.ifc	\xr, $xr3
239 	\var	= 3
240 	.endif
241 	.ifc	\xr, $xr4
242 	\var	= 4
243 	.endif
244 	.ifc	\xr, $xr5
245 	\var	= 5
246 	.endif
247 	.ifc	\xr, $xr6
248 	\var	= 6
249 	.endif
250 	.ifc	\xr, $xr7
251 	\var	= 7
252 	.endif
253 	.ifc	\xr, $xr8
254 	\var	= 8
255 	.endif
256 	.ifc	\xr, $xr9
257 	\var	= 9
258 	.endif
259 	.ifc	\xr, $xr10
260 	\var	= 10
261 	.endif
262 	.ifc	\xr, $xr11
263 	\var	= 11
264 	.endif
265 	.ifc	\xr, $xr12
266 	\var	= 12
267 	.endif
268 	.ifc	\xr, $xr13
269 	\var	= 13
270 	.endif
271 	.ifc	\xr, $xr14
272 	\var	= 14
273 	.endif
274 	.ifc	\xr, $xr15
275 	\var	= 15
276 	.endif
277 	.ifc	\xr, $xr16
278 	\var	= 16
279 	.endif
280 	.ifc	\xr, $xr17
281 	\var	= 17
282 	.endif
283 	.ifc	\xr, $xr18
284 	\var	= 18
285 	.endif
286 	.ifc	\xr, $xr19
287 	\var	= 19
288 	.endif
289 	.ifc	\xr, $xr20
290 	\var	= 20
291 	.endif
292 	.ifc	\xr, $xr21
293 	\var	= 21
294 	.endif
295 	.ifc	\xr, $xr22
296 	\var	= 22
297 	.endif
298 	.ifc	\xr, $xr23
299 	\var	= 23
300 	.endif
301 	.ifc	\xr, $xr24
302 	\var	= 24
303 	.endif
304 	.ifc	\xr, $xr25
305 	\var	= 25
306 	.endif
307 	.ifc	\xr, $xr26
308 	\var	= 26
309 	.endif
310 	.ifc	\xr, $xr27
311 	\var	= 27
312 	.endif
313 	.ifc	\xr, $xr28
314 	\var	= 28
315 	.endif
316 	.ifc	\xr, $xr29
317 	\var	= 29
318 	.endif
319 	.ifc	\xr, $xr30
320 	\var	= 30
321 	.endif
322 	.ifc	\xr, $xr31
323 	\var	= 31
324 	.endif
325 	.iflt	\var
326 	.error	"Unable to parse register name \r"
327 	.endif
328 	.endm
329 
330 	.macro fpu_save_csr thread tmp
331 	movfcsr2gr	\tmp, fcsr0
332 	stptr.w	\tmp, \thread, THREAD_FCSR
333 #ifdef CONFIG_CPU_HAS_LBT
334 	/* TM bit is always 0 if LBT not supported */
335 	andi	\tmp, \tmp, FPU_CSR_TM
336 	beqz	\tmp, 1f
337 	bstrins.d \tmp, zero, FPU_CSR_TM_SHIFT, FPU_CSR_TM_SHIFT
338 	movgr2fcsr      fcsr0, \tmp
339 	x86mftop \tmp
340 	stptr.d	\tmp, \thread, THREAD_FTOP
341 1:
342 #endif
343 	.endm
344 
345 	.macro fpu_restore_csr thread tmp
346 	ldptr.w	\tmp, \thread, THREAD_FCSR
347 	movgr2fcsr	fcsr0, \tmp
348 #ifdef CONFIG_CPU_HAS_LBT
349 	/* TM bit is always 0 if LBT not supported */
350 	andi	\tmp, \tmp, FPU_CSR_TM
351 	beqz	\tmp, 1f
352 	ldptr.d	\tmp, \thread, THREAD_FTOP
353 	x86mttop 0x0
354 	beq	\tmp, zero, 1f
355 	addi.d	\tmp, \tmp, -1
356 	x86mttop 0x1
357 	beq	\tmp, zero, 1f
358 	addi.d	\tmp, \tmp, -1
359 	x86mttop 0x2
360 	beq	\tmp, zero, 1f
361 	addi.d	\tmp, \tmp, -1
362 	x86mttop 0x3
363 	beq	\tmp, zero, 1f
364 	addi.d	\tmp, \tmp, -1
365 	x86mttop 0x4
366 	beq	\tmp, zero, 1f
367 	addi.d	\tmp, \tmp, -1
368 	x86mttop 0x5
369 	beq	\tmp, zero, 1f
370 	addi.d	\tmp, \tmp, -1
371 	x86mttop 0x6
372 	beq	\tmp, zero, 1f
373 	addi.d	\tmp, \tmp, -1
374 	x86mttop 0x7
375 1:
376 #endif
377 	.endm
378 
379 	.macro fpu_save_cc thread tmp0 tmp1
380 	movcf2gr	\tmp0, $fcc0
381 	move	\tmp1, \tmp0
382 	movcf2gr	\tmp0, $fcc1
383 	bstrins.d	\tmp1, \tmp0, 15, 8
384 	movcf2gr	\tmp0, $fcc2
385 	bstrins.d	\tmp1, \tmp0, 23, 16
386 	movcf2gr	\tmp0, $fcc3
387 	bstrins.d	\tmp1, \tmp0, 31, 24
388 	movcf2gr	\tmp0, $fcc4
389 	bstrins.d	\tmp1, \tmp0, 39, 32
390 	movcf2gr	\tmp0, $fcc5
391 	bstrins.d	\tmp1, \tmp0, 47, 40
392 	movcf2gr	\tmp0, $fcc6
393 	bstrins.d	\tmp1, \tmp0, 55, 48
394 	movcf2gr	\tmp0, $fcc7
395 	bstrins.d	\tmp1, \tmp0, 63, 56
396 	stptr.d		\tmp1, \thread, THREAD_FCC
397 	.endm
398 
399 	.macro fpu_restore_cc thread tmp0 tmp1
400 	ldptr.d	\tmp0, \thread, THREAD_FCC
401 	bstrpick.d	\tmp1, \tmp0, 7, 0
402 	movgr2cf	$fcc0, \tmp1
403 	bstrpick.d	\tmp1, \tmp0, 15, 8
404 	movgr2cf	$fcc1, \tmp1
405 	bstrpick.d	\tmp1, \tmp0, 23, 16
406 	movgr2cf	$fcc2, \tmp1
407 	bstrpick.d	\tmp1, \tmp0, 31, 24
408 	movgr2cf	$fcc3, \tmp1
409 	bstrpick.d	\tmp1, \tmp0, 39, 32
410 	movgr2cf	$fcc4, \tmp1
411 	bstrpick.d	\tmp1, \tmp0, 47, 40
412 	movgr2cf	$fcc5, \tmp1
413 	bstrpick.d	\tmp1, \tmp0, 55, 48
414 	movgr2cf	$fcc6, \tmp1
415 	bstrpick.d	\tmp1, \tmp0, 63, 56
416 	movgr2cf	$fcc7, \tmp1
417 	.endm
418 
419 	.macro	fpu_save_double thread tmp
420 	li.w	\tmp, THREAD_FPR0
421 	PTR_ADD \tmp, \tmp, \thread
422 	fst.d	$f0, \tmp, THREAD_FPR0  - THREAD_FPR0
423 	fst.d	$f1, \tmp, THREAD_FPR1  - THREAD_FPR0
424 	fst.d	$f2, \tmp, THREAD_FPR2  - THREAD_FPR0
425 	fst.d	$f3, \tmp, THREAD_FPR3  - THREAD_FPR0
426 	fst.d	$f4, \tmp, THREAD_FPR4  - THREAD_FPR0
427 	fst.d	$f5, \tmp, THREAD_FPR5  - THREAD_FPR0
428 	fst.d	$f6, \tmp, THREAD_FPR6  - THREAD_FPR0
429 	fst.d	$f7, \tmp, THREAD_FPR7  - THREAD_FPR0
430 	fst.d	$f8, \tmp, THREAD_FPR8  - THREAD_FPR0
431 	fst.d	$f9, \tmp, THREAD_FPR9  - THREAD_FPR0
432 	fst.d	$f10, \tmp, THREAD_FPR10 - THREAD_FPR0
433 	fst.d	$f11, \tmp, THREAD_FPR11 - THREAD_FPR0
434 	fst.d	$f12, \tmp, THREAD_FPR12 - THREAD_FPR0
435 	fst.d	$f13, \tmp, THREAD_FPR13 - THREAD_FPR0
436 	fst.d	$f14, \tmp, THREAD_FPR14 - THREAD_FPR0
437 	fst.d	$f15, \tmp, THREAD_FPR15 - THREAD_FPR0
438 	fst.d	$f16, \tmp, THREAD_FPR16 - THREAD_FPR0
439 	fst.d	$f17, \tmp, THREAD_FPR17 - THREAD_FPR0
440 	fst.d	$f18, \tmp, THREAD_FPR18 - THREAD_FPR0
441 	fst.d	$f19, \tmp, THREAD_FPR19 - THREAD_FPR0
442 	fst.d	$f20, \tmp, THREAD_FPR20 - THREAD_FPR0
443 	fst.d	$f21, \tmp, THREAD_FPR21 - THREAD_FPR0
444 	fst.d	$f22, \tmp, THREAD_FPR22 - THREAD_FPR0
445 	fst.d	$f23, \tmp, THREAD_FPR23 - THREAD_FPR0
446 	fst.d	$f24, \tmp, THREAD_FPR24 - THREAD_FPR0
447 	fst.d	$f25, \tmp, THREAD_FPR25 - THREAD_FPR0
448 	fst.d	$f26, \tmp, THREAD_FPR26 - THREAD_FPR0
449 	fst.d	$f27, \tmp, THREAD_FPR27 - THREAD_FPR0
450 	fst.d	$f28, \tmp, THREAD_FPR28 - THREAD_FPR0
451 	fst.d	$f29, \tmp, THREAD_FPR29 - THREAD_FPR0
452 	fst.d	$f30, \tmp, THREAD_FPR30 - THREAD_FPR0
453 	fst.d	$f31, \tmp, THREAD_FPR31 - THREAD_FPR0
454 	.endm
455 
456 	.macro	fpu_restore_double thread tmp
457 	li.w	\tmp, THREAD_FPR0
458 	PTR_ADD \tmp, \tmp, \thread
459 	fld.d	$f0, \tmp, THREAD_FPR0  - THREAD_FPR0
460 	fld.d	$f1, \tmp, THREAD_FPR1  - THREAD_FPR0
461 	fld.d	$f2, \tmp, THREAD_FPR2  - THREAD_FPR0
462 	fld.d	$f3, \tmp, THREAD_FPR3  - THREAD_FPR0
463 	fld.d	$f4, \tmp, THREAD_FPR4  - THREAD_FPR0
464 	fld.d	$f5, \tmp, THREAD_FPR5  - THREAD_FPR0
465 	fld.d	$f6, \tmp, THREAD_FPR6  - THREAD_FPR0
466 	fld.d	$f7, \tmp, THREAD_FPR7  - THREAD_FPR0
467 	fld.d	$f8, \tmp, THREAD_FPR8  - THREAD_FPR0
468 	fld.d	$f9, \tmp, THREAD_FPR9  - THREAD_FPR0
469 	fld.d	$f10, \tmp, THREAD_FPR10 - THREAD_FPR0
470 	fld.d	$f11, \tmp, THREAD_FPR11 - THREAD_FPR0
471 	fld.d	$f12, \tmp, THREAD_FPR12 - THREAD_FPR0
472 	fld.d	$f13, \tmp, THREAD_FPR13 - THREAD_FPR0
473 	fld.d	$f14, \tmp, THREAD_FPR14 - THREAD_FPR0
474 	fld.d	$f15, \tmp, THREAD_FPR15 - THREAD_FPR0
475 	fld.d	$f16, \tmp, THREAD_FPR16 - THREAD_FPR0
476 	fld.d	$f17, \tmp, THREAD_FPR17 - THREAD_FPR0
477 	fld.d	$f18, \tmp, THREAD_FPR18 - THREAD_FPR0
478 	fld.d	$f19, \tmp, THREAD_FPR19 - THREAD_FPR0
479 	fld.d	$f20, \tmp, THREAD_FPR20 - THREAD_FPR0
480 	fld.d	$f21, \tmp, THREAD_FPR21 - THREAD_FPR0
481 	fld.d	$f22, \tmp, THREAD_FPR22 - THREAD_FPR0
482 	fld.d	$f23, \tmp, THREAD_FPR23 - THREAD_FPR0
483 	fld.d	$f24, \tmp, THREAD_FPR24 - THREAD_FPR0
484 	fld.d	$f25, \tmp, THREAD_FPR25 - THREAD_FPR0
485 	fld.d	$f26, \tmp, THREAD_FPR26 - THREAD_FPR0
486 	fld.d	$f27, \tmp, THREAD_FPR27 - THREAD_FPR0
487 	fld.d	$f28, \tmp, THREAD_FPR28 - THREAD_FPR0
488 	fld.d	$f29, \tmp, THREAD_FPR29 - THREAD_FPR0
489 	fld.d	$f30, \tmp, THREAD_FPR30 - THREAD_FPR0
490 	fld.d	$f31, \tmp, THREAD_FPR31 - THREAD_FPR0
491 	.endm
492 
493 	.macro lsx_save_data thread tmp
494 	parse_r __tmp, \tmp
495 	li.w		\tmp, THREAD_FPR0
496 	PTR_ADD 	\tmp, \thread, \tmp
497 	/* vst opcode is 0xb1 */
498 	.word (0xb1 << 22 | ((THREAD_FPR0-THREAD_FPR0) << 10) | __tmp << 5 | 0)
499 	.word (0xb1 << 22 | ((THREAD_FPR1-THREAD_FPR0) << 10) | __tmp << 5 | 1)
500 	.word (0xb1 << 22 | ((THREAD_FPR2-THREAD_FPR0) << 10) | __tmp << 5 | 2)
501 	.word (0xb1 << 22 | ((THREAD_FPR3-THREAD_FPR0) << 10) | __tmp << 5 | 3)
502 	.word (0xb1 << 22 | ((THREAD_FPR4-THREAD_FPR0) << 10) | __tmp << 5 | 4)
503 	.word (0xb1 << 22 | ((THREAD_FPR5-THREAD_FPR0) << 10) | __tmp << 5 | 5)
504 	.word (0xb1 << 22 | ((THREAD_FPR6-THREAD_FPR0) << 10) | __tmp << 5 | 6)
505 	.word (0xb1 << 22 | ((THREAD_FPR7-THREAD_FPR0) << 10) | __tmp << 5 | 7)
506 	.word (0xb1 << 22 | ((THREAD_FPR8-THREAD_FPR0) << 10) | __tmp << 5 | 8)
507 	.word (0xb1 << 22 | ((THREAD_FPR9-THREAD_FPR0) << 10) | __tmp << 5 | 9)
508 	.word (0xb1 << 22 | ((THREAD_FPR10-THREAD_FPR0) << 10) | __tmp << 5 | 10)
509 	.word (0xb1 << 22 | ((THREAD_FPR11-THREAD_FPR0) << 10) | __tmp << 5 | 11)
510 	.word (0xb1 << 22 | ((THREAD_FPR12-THREAD_FPR0) << 10) | __tmp << 5 | 12)
511 	.word (0xb1 << 22 | ((THREAD_FPR13-THREAD_FPR0) << 10) | __tmp << 5 | 13)
512 	.word (0xb1 << 22 | ((THREAD_FPR14-THREAD_FPR0) << 10) | __tmp << 5 | 14)
513 	.word (0xb1 << 22 | ((THREAD_FPR15-THREAD_FPR0) << 10) | __tmp << 5 | 15)
514 	.word (0xb1 << 22 | ((THREAD_FPR16-THREAD_FPR0) << 10) | __tmp << 5 | 16)
515 	.word (0xb1 << 22 | ((THREAD_FPR17-THREAD_FPR0) << 10) | __tmp << 5 | 17)
516 	.word (0xb1 << 22 | ((THREAD_FPR18-THREAD_FPR0) << 10) | __tmp << 5 | 18)
517 	.word (0xb1 << 22 | ((THREAD_FPR19-THREAD_FPR0) << 10) | __tmp << 5 | 19)
518 	.word (0xb1 << 22 | ((THREAD_FPR20-THREAD_FPR0) << 10) | __tmp << 5 | 20)
519 	.word (0xb1 << 22 | ((THREAD_FPR21-THREAD_FPR0) << 10) | __tmp << 5 | 21)
520 	.word (0xb1 << 22 | ((THREAD_FPR22-THREAD_FPR0) << 10) | __tmp << 5 | 22)
521 	.word (0xb1 << 22 | ((THREAD_FPR23-THREAD_FPR0) << 10) | __tmp << 5 | 23)
522 	.word (0xb1 << 22 | ((THREAD_FPR24-THREAD_FPR0) << 10) | __tmp << 5 | 24)
523 	.word (0xb1 << 22 | ((THREAD_FPR25-THREAD_FPR0) << 10) | __tmp << 5 | 25)
524 	.word (0xb1 << 22 | ((THREAD_FPR26-THREAD_FPR0) << 10) | __tmp << 5 | 26)
525 	.word (0xb1 << 22 | ((THREAD_FPR27-THREAD_FPR0) << 10) | __tmp << 5 | 27)
526 	.word (0xb1 << 22 | ((THREAD_FPR28-THREAD_FPR0) << 10) | __tmp << 5 | 28)
527 	.word (0xb1 << 22 | ((THREAD_FPR29-THREAD_FPR0) << 10) | __tmp << 5 | 29)
528 	.word (0xb1 << 22 | ((THREAD_FPR30-THREAD_FPR0) << 10) | __tmp << 5 | 30)
529 	.word (0xb1 << 22 | ((THREAD_FPR31-THREAD_FPR0) << 10) | __tmp << 5 | 31)
530 	.endm
531 
532 	.macro lsx_restore_data thread tmp
533 	parse_r __tmp, \tmp
534 	li.w		\tmp, THREAD_FPR0
535 	PTR_ADD		\tmp, \thread, \tmp
536 	/* vld opcode is 0xb0 */
537 	.word (0xb0 << 22 | ((THREAD_FPR0-THREAD_FPR0) << 10) | __tmp << 5 | 0)
538 	.word (0xb0 << 22 | ((THREAD_FPR1-THREAD_FPR0) << 10) | __tmp << 5 | 1)
539 	.word (0xb0 << 22 | ((THREAD_FPR2-THREAD_FPR0) << 10) | __tmp << 5 | 2)
540 	.word (0xb0 << 22 | ((THREAD_FPR3-THREAD_FPR0) << 10) | __tmp << 5 | 3)
541 	.word (0xb0 << 22 | ((THREAD_FPR4-THREAD_FPR0) << 10) | __tmp << 5 | 4)
542 	.word (0xb0 << 22 | ((THREAD_FPR5-THREAD_FPR0) << 10) | __tmp << 5 | 5)
543 	.word (0xb0 << 22 | ((THREAD_FPR6-THREAD_FPR0) << 10) | __tmp << 5 | 6)
544 	.word (0xb0 << 22 | ((THREAD_FPR7-THREAD_FPR0) << 10) | __tmp << 5 | 7)
545 	.word (0xb0 << 22 | ((THREAD_FPR8-THREAD_FPR0) << 10) | __tmp << 5 | 8)
546 	.word (0xb0 << 22 | ((THREAD_FPR9-THREAD_FPR0) << 10) | __tmp << 5 | 9)
547 	.word (0xb0 << 22 | ((THREAD_FPR10-THREAD_FPR0) << 10) | __tmp << 5 | 10)
548 	.word (0xb0 << 22 | ((THREAD_FPR11-THREAD_FPR0) << 10) | __tmp << 5 | 11)
549 	.word (0xb0 << 22 | ((THREAD_FPR12-THREAD_FPR0) << 10) | __tmp << 5 | 12)
550 	.word (0xb0 << 22 | ((THREAD_FPR13-THREAD_FPR0) << 10) | __tmp << 5 | 13)
551 	.word (0xb0 << 22 | ((THREAD_FPR14-THREAD_FPR0) << 10) | __tmp << 5 | 14)
552 	.word (0xb0 << 22 | ((THREAD_FPR15-THREAD_FPR0) << 10) | __tmp << 5 | 15)
553 	.word (0xb0 << 22 | ((THREAD_FPR16-THREAD_FPR0) << 10) | __tmp << 5 | 16)
554 	.word (0xb0 << 22 | ((THREAD_FPR17-THREAD_FPR0) << 10) | __tmp << 5 | 17)
555 	.word (0xb0 << 22 | ((THREAD_FPR18-THREAD_FPR0) << 10) | __tmp << 5 | 18)
556 	.word (0xb0 << 22 | ((THREAD_FPR19-THREAD_FPR0) << 10) | __tmp << 5 | 19)
557 	.word (0xb0 << 22 | ((THREAD_FPR20-THREAD_FPR0) << 10) | __tmp << 5 | 20)
558 	.word (0xb0 << 22 | ((THREAD_FPR21-THREAD_FPR0) << 10) | __tmp << 5 | 21)
559 	.word (0xb0 << 22 | ((THREAD_FPR22-THREAD_FPR0) << 10) | __tmp << 5 | 22)
560 	.word (0xb0 << 22 | ((THREAD_FPR23-THREAD_FPR0) << 10) | __tmp << 5 | 23)
561 	.word (0xb0 << 22 | ((THREAD_FPR24-THREAD_FPR0) << 10) | __tmp << 5 | 24)
562 	.word (0xb0 << 22 | ((THREAD_FPR25-THREAD_FPR0) << 10) | __tmp << 5 | 25)
563 	.word (0xb0 << 22 | ((THREAD_FPR26-THREAD_FPR0) << 10) | __tmp << 5 | 26)
564 	.word (0xb0 << 22 | ((THREAD_FPR27-THREAD_FPR0) << 10) | __tmp << 5 | 27)
565 	.word (0xb0 << 22 | ((THREAD_FPR28-THREAD_FPR0) << 10) | __tmp << 5 | 28)
566 	.word (0xb0 << 22 | ((THREAD_FPR29-THREAD_FPR0) << 10) | __tmp << 5 | 29)
567 	.word (0xb0 << 22 | ((THREAD_FPR30-THREAD_FPR0) << 10) | __tmp << 5 | 30)
568 	.word (0xb0 << 22 | ((THREAD_FPR31-THREAD_FPR0) << 10) | __tmp << 5 | 31)
569 	.endm
570 
571 	.macro	lsx_save_all	thread tmp0 tmp1
572 	fpu_save_cc	\thread, \tmp0, \tmp1
573 	fpu_save_csr	\thread, \tmp0
574 	lsx_save_data	\thread, \tmp0
575 	.endm
576 
577 	.macro	lsx_restore_all	thread tmp0 tmp1
578 	lsx_restore_data	\thread, \tmp0
579 	fpu_restore_cc	\thread, \tmp0, \tmp1
580 	fpu_restore_csr	\thread, \tmp0
581 	.endm
582 
583 	.macro lsx_save_upper vd base tmp off
584 	parse_vr __vd, \vd
585 	parse_r __tmp, \tmp
586 	/* vpickve2gr opcode is 0xe5dfe */
587 	.word (0xe5dfe << 11 | 1 << 10 | __vd << 5 | __tmp)
588 	st.d	\tmp, \base, (\off+8)
589 	.endm
590 
591 	.macro lsx_save_all_upper thread base tmp
592 	li.w	\tmp, THREAD_FPR0
593 	PTR_ADD	\base, \thread, \tmp
594 	lsx_save_upper $vr0,  \base, \tmp, (THREAD_FPR0-THREAD_FPR0)
595 	lsx_save_upper $vr1,  \base, \tmp, (THREAD_FPR1-THREAD_FPR0)
596 	lsx_save_upper $vr2,  \base, \tmp, (THREAD_FPR2-THREAD_FPR0)
597 	lsx_save_upper $vr3,  \base, \tmp, (THREAD_FPR3-THREAD_FPR0)
598 	lsx_save_upper $vr4,  \base, \tmp, (THREAD_FPR4-THREAD_FPR0)
599 	lsx_save_upper $vr5,  \base, \tmp, (THREAD_FPR5-THREAD_FPR0)
600 	lsx_save_upper $vr6,  \base, \tmp, (THREAD_FPR6-THREAD_FPR0)
601 	lsx_save_upper $vr7,  \base, \tmp, (THREAD_FPR7-THREAD_FPR0)
602 	lsx_save_upper $vr8,  \base, \tmp, (THREAD_FPR8-THREAD_FPR0)
603 	lsx_save_upper $vr9,  \base, \tmp, (THREAD_FPR9-THREAD_FPR0)
604 	lsx_save_upper $vr10, \base, \tmp, (THREAD_FPR10-THREAD_FPR0)
605 	lsx_save_upper $vr11, \base, \tmp, (THREAD_FPR11-THREAD_FPR0)
606 	lsx_save_upper $vr12, \base, \tmp, (THREAD_FPR12-THREAD_FPR0)
607 	lsx_save_upper $vr13, \base, \tmp, (THREAD_FPR13-THREAD_FPR0)
608 	lsx_save_upper $vr14, \base, \tmp, (THREAD_FPR14-THREAD_FPR0)
609 	lsx_save_upper $vr15, \base, \tmp, (THREAD_FPR15-THREAD_FPR0)
610 	lsx_save_upper $vr16, \base, \tmp, (THREAD_FPR16-THREAD_FPR0)
611 	lsx_save_upper $vr17, \base, \tmp, (THREAD_FPR17-THREAD_FPR0)
612 	lsx_save_upper $vr18, \base, \tmp, (THREAD_FPR18-THREAD_FPR0)
613 	lsx_save_upper $vr19, \base, \tmp, (THREAD_FPR19-THREAD_FPR0)
614 	lsx_save_upper $vr20, \base, \tmp, (THREAD_FPR20-THREAD_FPR0)
615 	lsx_save_upper $vr21, \base, \tmp, (THREAD_FPR21-THREAD_FPR0)
616 	lsx_save_upper $vr22, \base, \tmp, (THREAD_FPR22-THREAD_FPR0)
617 	lsx_save_upper $vr23, \base, \tmp, (THREAD_FPR23-THREAD_FPR0)
618 	lsx_save_upper $vr24, \base, \tmp, (THREAD_FPR24-THREAD_FPR0)
619 	lsx_save_upper $vr25, \base, \tmp, (THREAD_FPR25-THREAD_FPR0)
620 	lsx_save_upper $vr26, \base, \tmp, (THREAD_FPR26-THREAD_FPR0)
621 	lsx_save_upper $vr27, \base, \tmp, (THREAD_FPR27-THREAD_FPR0)
622 	lsx_save_upper $vr28, \base, \tmp, (THREAD_FPR28-THREAD_FPR0)
623 	lsx_save_upper $vr29, \base, \tmp, (THREAD_FPR29-THREAD_FPR0)
624 	lsx_save_upper $vr30, \base, \tmp, (THREAD_FPR30-THREAD_FPR0)
625 	lsx_save_upper $vr31, \base, \tmp, (THREAD_FPR31-THREAD_FPR0)
626 	.endm
627 
628 	.macro lsx_restore_upper vd base tmp off
629 	parse_vr __vd, \vd
630 	parse_r __tmp, \tmp
631 	ld.d	\tmp, \base, (\off+8)
632 	/* vinsgr2vr opcode is 0xe5d7e */
633 	.word	(0xe5d7e << 11 | 1 << 10 | __tmp << 5 | __vd)
634 	.endm
635 
636 	.macro lsx_restore_all_upper thread base tmp
637 	li.w	\tmp, THREAD_FPR0
638 	PTR_ADD	\base, \thread, \tmp
639 	lsx_restore_upper $vr0,  \base, \tmp, (THREAD_FPR0-THREAD_FPR0)
640 	lsx_restore_upper $vr1,  \base, \tmp, (THREAD_FPR1-THREAD_FPR0)
641 	lsx_restore_upper $vr2,  \base, \tmp, (THREAD_FPR2-THREAD_FPR0)
642 	lsx_restore_upper $vr3,  \base, \tmp, (THREAD_FPR3-THREAD_FPR0)
643 	lsx_restore_upper $vr4,  \base, \tmp, (THREAD_FPR4-THREAD_FPR0)
644 	lsx_restore_upper $vr5,  \base, \tmp, (THREAD_FPR5-THREAD_FPR0)
645 	lsx_restore_upper $vr6,  \base, \tmp, (THREAD_FPR6-THREAD_FPR0)
646 	lsx_restore_upper $vr7,  \base, \tmp, (THREAD_FPR7-THREAD_FPR0)
647 	lsx_restore_upper $vr8,  \base, \tmp, (THREAD_FPR8-THREAD_FPR0)
648 	lsx_restore_upper $vr9,  \base, \tmp, (THREAD_FPR9-THREAD_FPR0)
649 	lsx_restore_upper $vr10, \base, \tmp, (THREAD_FPR10-THREAD_FPR0)
650 	lsx_restore_upper $vr11, \base, \tmp, (THREAD_FPR11-THREAD_FPR0)
651 	lsx_restore_upper $vr12, \base, \tmp, (THREAD_FPR12-THREAD_FPR0)
652 	lsx_restore_upper $vr13, \base, \tmp, (THREAD_FPR13-THREAD_FPR0)
653 	lsx_restore_upper $vr14, \base, \tmp, (THREAD_FPR14-THREAD_FPR0)
654 	lsx_restore_upper $vr15, \base, \tmp, (THREAD_FPR15-THREAD_FPR0)
655 	lsx_restore_upper $vr16, \base, \tmp, (THREAD_FPR16-THREAD_FPR0)
656 	lsx_restore_upper $vr17, \base, \tmp, (THREAD_FPR17-THREAD_FPR0)
657 	lsx_restore_upper $vr18, \base, \tmp, (THREAD_FPR18-THREAD_FPR0)
658 	lsx_restore_upper $vr19, \base, \tmp, (THREAD_FPR19-THREAD_FPR0)
659 	lsx_restore_upper $vr20, \base, \tmp, (THREAD_FPR20-THREAD_FPR0)
660 	lsx_restore_upper $vr21, \base, \tmp, (THREAD_FPR21-THREAD_FPR0)
661 	lsx_restore_upper $vr22, \base, \tmp, (THREAD_FPR22-THREAD_FPR0)
662 	lsx_restore_upper $vr23, \base, \tmp, (THREAD_FPR23-THREAD_FPR0)
663 	lsx_restore_upper $vr24, \base, \tmp, (THREAD_FPR24-THREAD_FPR0)
664 	lsx_restore_upper $vr25, \base, \tmp, (THREAD_FPR25-THREAD_FPR0)
665 	lsx_restore_upper $vr26, \base, \tmp, (THREAD_FPR26-THREAD_FPR0)
666 	lsx_restore_upper $vr27, \base, \tmp, (THREAD_FPR27-THREAD_FPR0)
667 	lsx_restore_upper $vr28, \base, \tmp, (THREAD_FPR28-THREAD_FPR0)
668 	lsx_restore_upper $vr29, \base, \tmp, (THREAD_FPR29-THREAD_FPR0)
669 	lsx_restore_upper $vr30, \base, \tmp, (THREAD_FPR30-THREAD_FPR0)
670 	lsx_restore_upper $vr31, \base, \tmp, (THREAD_FPR31-THREAD_FPR0)
671 	.endm
672 
673 	.macro	lsx_init_upper vd tmp
674 	parse_vr __vd, \vd
675 	parse_r __tmp, \tmp
676 	/* vinsgr2vr opcode is 0xe5d7e */
677 	.word	(0xe5d7e << 11 | 1 << 10 | __tmp << 5 | __vd)
678 	.endm
679 
680 	.macro	lsx_init_all_upper tmp
681 	not	\tmp, zero
682 	lsx_init_upper	$vr0 \tmp
683 	lsx_init_upper	$vr1 \tmp
684 	lsx_init_upper	$vr2 \tmp
685 	lsx_init_upper	$vr3 \tmp
686 	lsx_init_upper	$vr4 \tmp
687 	lsx_init_upper	$vr5 \tmp
688 	lsx_init_upper	$vr6 \tmp
689 	lsx_init_upper	$vr7 \tmp
690 	lsx_init_upper	$vr8 \tmp
691 	lsx_init_upper	$vr9 \tmp
692 	lsx_init_upper	$vr10 \tmp
693 	lsx_init_upper	$vr11 \tmp
694 	lsx_init_upper	$vr12 \tmp
695 	lsx_init_upper	$vr13 \tmp
696 	lsx_init_upper	$vr14 \tmp
697 	lsx_init_upper	$vr15 \tmp
698 	lsx_init_upper	$vr16 \tmp
699 	lsx_init_upper	$vr17 \tmp
700 	lsx_init_upper	$vr18 \tmp
701 	lsx_init_upper	$vr19 \tmp
702 	lsx_init_upper	$vr20 \tmp
703 	lsx_init_upper	$vr21 \tmp
704 	lsx_init_upper	$vr22 \tmp
705 	lsx_init_upper	$vr23 \tmp
706 	lsx_init_upper	$vr24 \tmp
707 	lsx_init_upper	$vr25 \tmp
708 	lsx_init_upper	$vr26 \tmp
709 	lsx_init_upper	$vr27 \tmp
710 	lsx_init_upper	$vr28 \tmp
711 	lsx_init_upper	$vr29 \tmp
712 	lsx_init_upper	$vr30 \tmp
713 	lsx_init_upper	$vr31 \tmp
714 	.endm
715 
716 	.macro lasx_save_data thread tmp
717 	parse_r __tmp, \tmp
718 	li.w            \tmp, THREAD_FPR0
719 	PTR_ADD         \tmp, \thread, \tmp
720 	/* xvst opcode is 0xb3 */
721 	.word (0xb3 << 22 | ((THREAD_FPR0-THREAD_FPR0) << 10) | __tmp << 5 | 0)
722 	.word (0xb3 << 22 | ((THREAD_FPR1-THREAD_FPR0) << 10) | __tmp << 5 | 1)
723 	.word (0xb3 << 22 | ((THREAD_FPR2-THREAD_FPR0) << 10) | __tmp << 5 | 2)
724 	.word (0xb3 << 22 | ((THREAD_FPR3-THREAD_FPR0) << 10) | __tmp << 5 | 3)
725 	.word (0xb3 << 22 | ((THREAD_FPR4-THREAD_FPR0) << 10) | __tmp << 5 | 4)
726 	.word (0xb3 << 22 | ((THREAD_FPR5-THREAD_FPR0) << 10) | __tmp << 5 | 5)
727 	.word (0xb3 << 22 | ((THREAD_FPR6-THREAD_FPR0) << 10) | __tmp << 5 | 6)
728 	.word (0xb3 << 22 | ((THREAD_FPR7-THREAD_FPR0) << 10) | __tmp << 5 | 7)
729 	.word (0xb3 << 22 | ((THREAD_FPR8-THREAD_FPR0) << 10) | __tmp << 5 | 8)
730 	.word (0xb3 << 22 | ((THREAD_FPR9-THREAD_FPR0) << 10) | __tmp << 5 | 9)
731 	.word (0xb3 << 22 | ((THREAD_FPR10-THREAD_FPR0) << 10) | __tmp << 5 | 10)
732 	.word (0xb3 << 22 | ((THREAD_FPR11-THREAD_FPR0) << 10) | __tmp << 5 | 11)
733 	.word (0xb3 << 22 | ((THREAD_FPR12-THREAD_FPR0) << 10) | __tmp << 5 | 12)
734 	.word (0xb3 << 22 | ((THREAD_FPR13-THREAD_FPR0) << 10) | __tmp << 5 | 13)
735 	.word (0xb3 << 22 | ((THREAD_FPR14-THREAD_FPR0) << 10) | __tmp << 5 | 14)
736 	.word (0xb3 << 22 | ((THREAD_FPR15-THREAD_FPR0) << 10) | __tmp << 5 | 15)
737 	.word (0xb3 << 22 | ((THREAD_FPR16-THREAD_FPR0) << 10) | __tmp << 5 | 16)
738 	.word (0xb3 << 22 | ((THREAD_FPR17-THREAD_FPR0) << 10) | __tmp << 5 | 17)
739 	.word (0xb3 << 22 | ((THREAD_FPR18-THREAD_FPR0) << 10) | __tmp << 5 | 18)
740 	.word (0xb3 << 22 | ((THREAD_FPR19-THREAD_FPR0) << 10) | __tmp << 5 | 19)
741 	.word (0xb3 << 22 | ((THREAD_FPR20-THREAD_FPR0) << 10) | __tmp << 5 | 20)
742 	.word (0xb3 << 22 | ((THREAD_FPR21-THREAD_FPR0) << 10) | __tmp << 5 | 21)
743 	.word (0xb3 << 22 | ((THREAD_FPR22-THREAD_FPR0) << 10) | __tmp << 5 | 22)
744 	.word (0xb3 << 22 | ((THREAD_FPR23-THREAD_FPR0) << 10) | __tmp << 5 | 23)
745 	.word (0xb3 << 22 | ((THREAD_FPR24-THREAD_FPR0) << 10) | __tmp << 5 | 24)
746 	.word (0xb3 << 22 | ((THREAD_FPR25-THREAD_FPR0) << 10) | __tmp << 5 | 25)
747 	.word (0xb3 << 22 | ((THREAD_FPR26-THREAD_FPR0) << 10) | __tmp << 5 | 26)
748 	.word (0xb3 << 22 | ((THREAD_FPR27-THREAD_FPR0) << 10) | __tmp << 5 | 27)
749 	.word (0xb3 << 22 | ((THREAD_FPR28-THREAD_FPR0) << 10) | __tmp << 5 | 28)
750 	.word (0xb3 << 22 | ((THREAD_FPR29-THREAD_FPR0) << 10) | __tmp << 5 | 29)
751 	.word (0xb3 << 22 | ((THREAD_FPR30-THREAD_FPR0) << 10) | __tmp << 5 | 30)
752 	.word (0xb3 << 22 | ((THREAD_FPR31-THREAD_FPR0) << 10) | __tmp << 5 | 31)
753 	.endm
754 
755 	.macro lasx_restore_data thread tmp
756 	parse_r __tmp, \tmp
757 	li.w            \tmp, THREAD_FPR0
758 	PTR_ADD         \tmp, \thread, \tmp
759 	/* xvld opcode is 0xb2 */
760 	.word (0xb2 << 22 | ((THREAD_FPR0-THREAD_FPR0) << 10) | __tmp << 5 | 0)
761 	.word (0xb2 << 22 | ((THREAD_FPR1-THREAD_FPR0) << 10) | __tmp << 5 | 1)
762 	.word (0xb2 << 22 | ((THREAD_FPR2-THREAD_FPR0) << 10) | __tmp << 5 | 2)
763 	.word (0xb2 << 22 | ((THREAD_FPR3-THREAD_FPR0) << 10) | __tmp << 5 | 3)
764 	.word (0xb2 << 22 | ((THREAD_FPR4-THREAD_FPR0) << 10) | __tmp << 5 | 4)
765 	.word (0xb2 << 22 | ((THREAD_FPR5-THREAD_FPR0) << 10) | __tmp << 5 | 5)
766 	.word (0xb2 << 22 | ((THREAD_FPR6-THREAD_FPR0) << 10) | __tmp << 5 | 6)
767 	.word (0xb2 << 22 | ((THREAD_FPR7-THREAD_FPR0) << 10) | __tmp << 5 | 7)
768 	.word (0xb2 << 22 | ((THREAD_FPR8-THREAD_FPR0) << 10) | __tmp << 5 | 8)
769 	.word (0xb2 << 22 | ((THREAD_FPR9-THREAD_FPR0) << 10) | __tmp << 5 | 9)
770 	.word (0xb2 << 22 | ((THREAD_FPR10-THREAD_FPR0) << 10) | __tmp << 5 | 10)
771 	.word (0xb2 << 22 | ((THREAD_FPR11-THREAD_FPR0) << 10) | __tmp << 5 | 11)
772 	.word (0xb2 << 22 | ((THREAD_FPR12-THREAD_FPR0) << 10) | __tmp << 5 | 12)
773 	.word (0xb2 << 22 | ((THREAD_FPR13-THREAD_FPR0) << 10) | __tmp << 5 | 13)
774 	.word (0xb2 << 22 | ((THREAD_FPR14-THREAD_FPR0) << 10) | __tmp << 5 | 14)
775 	.word (0xb2 << 22 | ((THREAD_FPR15-THREAD_FPR0) << 10) | __tmp << 5 | 15)
776 	.word (0xb2 << 22 | ((THREAD_FPR16-THREAD_FPR0) << 10) | __tmp << 5 | 16)
777 	.word (0xb2 << 22 | ((THREAD_FPR17-THREAD_FPR0) << 10) | __tmp << 5 | 17)
778 	.word (0xb2 << 22 | ((THREAD_FPR18-THREAD_FPR0) << 10) | __tmp << 5 | 18)
779 	.word (0xb2 << 22 | ((THREAD_FPR19-THREAD_FPR0) << 10) | __tmp << 5 | 19)
780 	.word (0xb2 << 22 | ((THREAD_FPR20-THREAD_FPR0) << 10) | __tmp << 5 | 20)
781 	.word (0xb2 << 22 | ((THREAD_FPR21-THREAD_FPR0) << 10) | __tmp << 5 | 21)
782 	.word (0xb2 << 22 | ((THREAD_FPR22-THREAD_FPR0) << 10) | __tmp << 5 | 22)
783 	.word (0xb2 << 22 | ((THREAD_FPR23-THREAD_FPR0) << 10) | __tmp << 5 | 23)
784 	.word (0xb2 << 22 | ((THREAD_FPR24-THREAD_FPR0) << 10) | __tmp << 5 | 24)
785 	.word (0xb2 << 22 | ((THREAD_FPR25-THREAD_FPR0) << 10) | __tmp << 5 | 25)
786 	.word (0xb2 << 22 | ((THREAD_FPR26-THREAD_FPR0) << 10) | __tmp << 5 | 26)
787 	.word (0xb2 << 22 | ((THREAD_FPR27-THREAD_FPR0) << 10) | __tmp << 5 | 27)
788 	.word (0xb2 << 22 | ((THREAD_FPR28-THREAD_FPR0) << 10) | __tmp << 5 | 28)
789 	.word (0xb2 << 22 | ((THREAD_FPR29-THREAD_FPR0) << 10) | __tmp << 5 | 29)
790 	.word (0xb2 << 22 | ((THREAD_FPR30-THREAD_FPR0) << 10) | __tmp << 5 | 30)
791 	.word (0xb2 << 22 | ((THREAD_FPR31-THREAD_FPR0) << 10) | __tmp << 5 | 31)
792 	.endm
793 
794 	.macro	lasx_save_all	thread tmp0 tmp1
795 	fpu_save_cc	\thread, \tmp0, \tmp1
796 	fpu_save_csr	\thread, \tmp0
797 	lasx_save_data	\thread, \tmp0
798 	.endm
799 
800 	.macro	lasx_restore_all thread tmp0 tmp1
801 	lasx_restore_data	\thread, \tmp0
802 	fpu_restore_cc	\thread, \tmp0, \tmp1
803 	fpu_restore_csr	\thread, \tmp0
804 	.endm
805 
806 	.macro lasx_save_upper xd base tmp off
807 	/* Nothing */
808 	.endm
809 
810 	.macro lasx_save_all_upper thread base tmp
811 	/* Nothing */
812 	.endm
813 
814 	.macro lasx_restore_upper xd base tmp off
815 	parse_xr __xd, \xd
816 	parse_xr __xt, \tmp
817 	parse_r __base, \base
818 	/* vld opcode is 0xb0 */
819 	.word (0xb0 << 22 | (\off+16) << 10 | __base << 5 | __xt)
820 	/* xvpermi.q opcode is 0x1dfb */
821 	.word (0x1dfb << 18 | 0x2 << 10 | __xt << 5 | __xd)
822 	.endm
823 
824 	.macro lasx_restore_all_upper thread base tmp
825 	li.w	\tmp, THREAD_FPR0
826 	PTR_ADD	\base, \thread, \tmp
827 	/* Save $vr31, xvpickve2gr opcode is 0x76efe */
828 	.word (0x76efe << 12 | 0 << 10 | 31 << 5 | 0x11)
829 	.word (0x76efe << 12 | 1 << 10 | 31 << 5 | 0x12)
830 	lasx_restore_upper $xr0, \base, $xr31, (THREAD_FPR0-THREAD_FPR0)
831 	lasx_restore_upper $xr1, \base, $xr31, (THREAD_FPR1-THREAD_FPR0)
832 	lasx_restore_upper $xr2, \base, $xr31, (THREAD_FPR2-THREAD_FPR0)
833 	lasx_restore_upper $xr3, \base, $xr31, (THREAD_FPR3-THREAD_FPR0)
834 	lasx_restore_upper $xr4, \base, $xr31, (THREAD_FPR4-THREAD_FPR0)
835 	lasx_restore_upper $xr5, \base, $xr31, (THREAD_FPR5-THREAD_FPR0)
836 	lasx_restore_upper $xr6, \base, $xr31, (THREAD_FPR6-THREAD_FPR0)
837 	lasx_restore_upper $xr7, \base, $xr31, (THREAD_FPR7-THREAD_FPR0)
838 	lasx_restore_upper $xr8, \base, $xr31, (THREAD_FPR8-THREAD_FPR0)
839 	lasx_restore_upper $xr9, \base, $xr31, (THREAD_FPR9-THREAD_FPR0)
840 	lasx_restore_upper $xr10, \base, $xr31, (THREAD_FPR10-THREAD_FPR0)
841 	lasx_restore_upper $xr11, \base, $xr31, (THREAD_FPR11-THREAD_FPR0)
842 	lasx_restore_upper $xr12, \base, $xr31, (THREAD_FPR12-THREAD_FPR0)
843 	lasx_restore_upper $xr13, \base, $xr31, (THREAD_FPR13-THREAD_FPR0)
844 	lasx_restore_upper $xr14, \base, $xr31, (THREAD_FPR14-THREAD_FPR0)
845 	lasx_restore_upper $xr15, \base, $xr31, (THREAD_FPR15-THREAD_FPR0)
846 	lasx_restore_upper $xr16, \base, $xr31, (THREAD_FPR16-THREAD_FPR0)
847 	lasx_restore_upper $xr17, \base, $xr31, (THREAD_FPR17-THREAD_FPR0)
848 	lasx_restore_upper $xr18, \base, $xr31, (THREAD_FPR18-THREAD_FPR0)
849 	lasx_restore_upper $xr19, \base, $xr31, (THREAD_FPR19-THREAD_FPR0)
850 	lasx_restore_upper $xr20, \base, $xr31, (THREAD_FPR20-THREAD_FPR0)
851 	lasx_restore_upper $xr21, \base, $xr31, (THREAD_FPR21-THREAD_FPR0)
852 	lasx_restore_upper $xr22, \base, $xr31, (THREAD_FPR22-THREAD_FPR0)
853 	lasx_restore_upper $xr23, \base, $xr31, (THREAD_FPR23-THREAD_FPR0)
854 	lasx_restore_upper $xr24, \base, $xr31, (THREAD_FPR24-THREAD_FPR0)
855 	lasx_restore_upper $xr25, \base, $xr31, (THREAD_FPR25-THREAD_FPR0)
856 	lasx_restore_upper $xr26, \base, $xr31, (THREAD_FPR26-THREAD_FPR0)
857 	lasx_restore_upper $xr27, \base, $xr31, (THREAD_FPR27-THREAD_FPR0)
858 	lasx_restore_upper $xr28, \base, $xr31, (THREAD_FPR28-THREAD_FPR0)
859 	lasx_restore_upper $xr29, \base, $xr31, (THREAD_FPR29-THREAD_FPR0)
860 	lasx_restore_upper $xr30, \base, $xr31, (THREAD_FPR30-THREAD_FPR0)
861 	lasx_restore_upper $xr31, \base, $xr31, (THREAD_FPR31-THREAD_FPR0)
862 	/* Restore $vr31, xvinsgr2vr opcode is 0x76ebe */
863 	.word (0x76ebe << 12 | 0 << 10 | 0x11 << 5 | 31)
864 	.word (0x76ebe << 12 | 1 << 10 | 0x12 << 5 | 31)
865 	.endm
866 
867 	.macro	lasx_init_upper xd tmp
868 	parse_xr __xd, \xd
869 	parse_r __tmp, \tmp
870 	/* xvinsgr2vr opcode is 0x76ebe */
871 	.word	(0x76ebe << 12 | 2 << 10 | __tmp << 5 | __xd)
872 	.word	(0x76ebe << 12 | 3 << 10 | __tmp << 5 | __xd)
873 	.endm
874 
875 	.macro	lasx_init_all_upper tmp
876 	not	\tmp, zero
877 	lasx_init_upper	$xr0 \tmp
878 	lasx_init_upper	$xr1 \tmp
879 	lasx_init_upper	$xr2 \tmp
880 	lasx_init_upper	$xr3 \tmp
881 	lasx_init_upper	$xr4 \tmp
882 	lasx_init_upper	$xr5 \tmp
883 	lasx_init_upper	$xr6 \tmp
884 	lasx_init_upper	$xr7 \tmp
885 	lasx_init_upper	$xr8 \tmp
886 	lasx_init_upper	$xr9 \tmp
887 	lasx_init_upper	$xr10 \tmp
888 	lasx_init_upper	$xr11 \tmp
889 	lasx_init_upper	$xr12 \tmp
890 	lasx_init_upper	$xr13 \tmp
891 	lasx_init_upper	$xr14 \tmp
892 	lasx_init_upper	$xr15 \tmp
893 	lasx_init_upper	$xr16 \tmp
894 	lasx_init_upper	$xr17 \tmp
895 	lasx_init_upper	$xr18 \tmp
896 	lasx_init_upper	$xr19 \tmp
897 	lasx_init_upper	$xr20 \tmp
898 	lasx_init_upper	$xr21 \tmp
899 	lasx_init_upper	$xr22 \tmp
900 	lasx_init_upper	$xr23 \tmp
901 	lasx_init_upper	$xr24 \tmp
902 	lasx_init_upper	$xr25 \tmp
903 	lasx_init_upper	$xr26 \tmp
904 	lasx_init_upper	$xr27 \tmp
905 	lasx_init_upper	$xr28 \tmp
906 	lasx_init_upper	$xr29 \tmp
907 	lasx_init_upper	$xr30 \tmp
908 	lasx_init_upper	$xr31 \tmp
909 	.endm
910 
911 .macro jr dst
912 	jirl	zero, \dst, 0
913 .endm
914 
915 .macro jalr	dst
916 	jirl	ra, \dst, 0
917 .endm
918 
919 .macro not dst src
920 	nor	\dst, \src, zero
921 .endm
922 
923 .macro bgt r0 r1 label
924 	blt	\r1, \r0, \label
925 .endm
926 
927 .macro bltz r0 label
928 	blt	\r0, zero, \label
929 .endm
930 
931 .macro bgez r0 label
932 	bge	\r0, zero, \label
933 .endm
934 
935 #endif /* _ASM_ASMMACRO_H */
936