File Index
Files and directories
Sign in
FILE

asmmacro.h

File preview with syntax highlighting.

linux-6.19.14/arch/loongarch/include/asm/asmmacro.h C
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/*
  3 * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
  4 */
  5#ifndef _ASM_ASMMACRO_H
  6#define _ASM_ASMMACRO_H
  7
  8#include <linux/sizes.h>
  9#include <asm/asm-offsets.h>
 10#include <asm/regdef.h>
 11#include <asm/fpregdef.h>
 12#include <asm/loongarch.h>
 13
 14#ifdef CONFIG_64BIT
 15#define TASK_STRUCT_OFFSET 0
 16#else
 17#define TASK_STRUCT_OFFSET 2000
 18#endif
 19
 20	.macro	cpu_save_nonscratch thread
 21	LONG_SPTR	s0, \thread, (THREAD_REG23 - TASK_STRUCT_OFFSET)
 22	LONG_SPTR	s1, \thread, (THREAD_REG24 - TASK_STRUCT_OFFSET)
 23	LONG_SPTR	s2, \thread, (THREAD_REG25 - TASK_STRUCT_OFFSET)
 24	LONG_SPTR	s3, \thread, (THREAD_REG26 - TASK_STRUCT_OFFSET)
 25	LONG_SPTR	s4, \thread, (THREAD_REG27 - TASK_STRUCT_OFFSET)
 26	LONG_SPTR	s5, \thread, (THREAD_REG28 - TASK_STRUCT_OFFSET)
 27	LONG_SPTR	s6, \thread, (THREAD_REG29 - TASK_STRUCT_OFFSET)
 28	LONG_SPTR	s7, \thread, (THREAD_REG30 - TASK_STRUCT_OFFSET)
 29	LONG_SPTR	s8, \thread, (THREAD_REG31 - TASK_STRUCT_OFFSET)
 30	LONG_SPTR	ra, \thread, (THREAD_REG01 - TASK_STRUCT_OFFSET)
 31	LONG_SPTR	sp, \thread, (THREAD_REG03 - TASK_STRUCT_OFFSET)
 32	LONG_SPTR	fp, \thread, (THREAD_REG22 - TASK_STRUCT_OFFSET)
 33	.endm
 34
 35	.macro	cpu_restore_nonscratch thread
 36	LONG_LPTR	s0, \thread, (THREAD_REG23 - TASK_STRUCT_OFFSET)
 37	LONG_LPTR	s1, \thread, (THREAD_REG24 - TASK_STRUCT_OFFSET)
 38	LONG_LPTR	s2, \thread, (THREAD_REG25 - TASK_STRUCT_OFFSET)
 39	LONG_LPTR	s3, \thread, (THREAD_REG26 - TASK_STRUCT_OFFSET)
 40	LONG_LPTR	s4, \thread, (THREAD_REG27 - TASK_STRUCT_OFFSET)
 41	LONG_LPTR	s5, \thread, (THREAD_REG28 - TASK_STRUCT_OFFSET)
 42	LONG_LPTR	s6, \thread, (THREAD_REG29 - TASK_STRUCT_OFFSET)
 43	LONG_LPTR	s7, \thread, (THREAD_REG30 - TASK_STRUCT_OFFSET)
 44	LONG_LPTR	s8, \thread, (THREAD_REG31 - TASK_STRUCT_OFFSET)
 45	LONG_LPTR	ra, \thread, (THREAD_REG01 - TASK_STRUCT_OFFSET)
 46	LONG_LPTR	sp, \thread, (THREAD_REG03 - TASK_STRUCT_OFFSET)
 47	LONG_LPTR	fp, \thread, (THREAD_REG22 - TASK_STRUCT_OFFSET)
 48	.endm
 49
 50	.macro fpu_save_csr thread tmp
 51	movfcsr2gr	\tmp, fcsr0
 52#ifdef CONFIG_32BIT
 53	st.w		\tmp, \thread, THREAD_FCSR
 54#else
 55	stptr.w		\tmp, \thread, THREAD_FCSR
 56#endif
 57#ifdef CONFIG_CPU_HAS_LBT
 58	/* TM bit is always 0 if LBT not supported */
 59	andi		\tmp, \tmp, FPU_CSR_TM
 60	beqz		\tmp, 1f
 61	/* Save FTOP */
 62	x86mftop	\tmp
 63	stptr.w		\tmp, \thread, THREAD_FTOP
 64	/* Turn off TM to ensure the order of FPR in memory independent of TM */
 65	x86clrtm
 661:
 67#endif
 68	.endm
 69
 70	.macro fpu_restore_csr thread tmp0 tmp1
 71#ifdef CONFIG_32BIT
 72	ld.w		\tmp0, \thread, THREAD_FCSR
 73#else
 74	ldptr.w		\tmp0, \thread, THREAD_FCSR
 75#endif
 76	movgr2fcsr	fcsr0, \tmp0
 77#ifdef CONFIG_CPU_HAS_LBT
 78	/* TM bit is always 0 if LBT not supported */
 79	andi		\tmp0, \tmp0, FPU_CSR_TM
 80	beqz		\tmp0, 2f
 81	/* Restore FTOP */
 82	ldptr.w		\tmp0, \thread, THREAD_FTOP
 83	andi		\tmp0, \tmp0, 0x7
 84	la.pcrel	\tmp1, 1f
 85	alsl.d		\tmp1, \tmp0, \tmp1, 3
 86	jr		\tmp1
 871:
 88	x86mttop	0
 89	b	2f
 90	x86mttop	1
 91	b	2f
 92	x86mttop	2
 93	b	2f
 94	x86mttop	3
 95	b	2f
 96	x86mttop	4
 97	b	2f
 98	x86mttop	5
 99	b	2f
100	x86mttop	6
101	b	2f
102	x86mttop	7
1032:
104#endif
105	.endm
106
107#ifdef CONFIG_32BIT
108	.macro fpu_save_cc thread tmp0 tmp1
109	movcf2gr	\tmp0, $fcc0
110	move		\tmp1, \tmp0
111	movcf2gr	\tmp0, $fcc1
112	bstrins.w	\tmp1, \tmp0, 15, 8
113	movcf2gr	\tmp0, $fcc2
114	bstrins.w	\tmp1, \tmp0, 23, 16
115	movcf2gr	\tmp0, $fcc3
116	bstrins.w	\tmp1, \tmp0, 31, 24
117	st.w		\tmp1, \thread, THREAD_FCC
118	movcf2gr	\tmp0, $fcc4
119	move		\tmp1, \tmp0
120	movcf2gr	\tmp0, $fcc5
121	bstrins.w	\tmp1, \tmp0, 15, 8
122	movcf2gr	\tmp0, $fcc6
123	bstrins.w	\tmp1, \tmp0, 23, 16
124	movcf2gr	\tmp0, $fcc7
125	bstrins.w	\tmp1, \tmp0, 31, 24
126	st.w		\tmp1, \thread, (THREAD_FCC + 4)
127	.endm
128
129	.macro fpu_restore_cc thread tmp0 tmp1
130	ld.w		\tmp0, \thread, THREAD_FCC
131	bstrpick.w	\tmp1, \tmp0, 7, 0
132	movgr2cf	$fcc0, \tmp1
133	bstrpick.w	\tmp1, \tmp0, 15, 8
134	movgr2cf	$fcc1, \tmp1
135	bstrpick.w	\tmp1, \tmp0, 23, 16
136	movgr2cf	$fcc2, \tmp1
137	bstrpick.w	\tmp1, \tmp0, 31, 24
138	movgr2cf	$fcc3, \tmp1
139	ld.w		\tmp0, \thread, (THREAD_FCC + 4)
140	bstrpick.w	\tmp1, \tmp0, 7, 0
141	movgr2cf	$fcc4, \tmp1
142	bstrpick.w	\tmp1, \tmp0, 15, 8
143	movgr2cf	$fcc5, \tmp1
144	bstrpick.w	\tmp1, \tmp0, 23, 16
145	movgr2cf	$fcc6, \tmp1
146	bstrpick.w	\tmp1, \tmp0, 31, 24
147	movgr2cf	$fcc7, \tmp1
148	.endm
149#else
150	.macro fpu_save_cc thread tmp0 tmp1
151	movcf2gr	\tmp0, $fcc0
152	move		\tmp1, \tmp0
153	movcf2gr	\tmp0, $fcc1
154	bstrins.d	\tmp1, \tmp0, 15, 8
155	movcf2gr	\tmp0, $fcc2
156	bstrins.d	\tmp1, \tmp0, 23, 16
157	movcf2gr	\tmp0, $fcc3
158	bstrins.d	\tmp1, \tmp0, 31, 24
159	movcf2gr	\tmp0, $fcc4
160	bstrins.d	\tmp1, \tmp0, 39, 32
161	movcf2gr	\tmp0, $fcc5
162	bstrins.d	\tmp1, \tmp0, 47, 40
163	movcf2gr	\tmp0, $fcc6
164	bstrins.d	\tmp1, \tmp0, 55, 48
165	movcf2gr	\tmp0, $fcc7
166	bstrins.d	\tmp1, \tmp0, 63, 56
167	stptr.d		\tmp1, \thread, THREAD_FCC
168	.endm
169
170	.macro fpu_restore_cc thread tmp0 tmp1
171	ldptr.d		\tmp0, \thread, THREAD_FCC
172	bstrpick.d	\tmp1, \tmp0, 7, 0
173	movgr2cf	$fcc0, \tmp1
174	bstrpick.d	\tmp1, \tmp0, 15, 8
175	movgr2cf	$fcc1, \tmp1
176	bstrpick.d	\tmp1, \tmp0, 23, 16
177	movgr2cf	$fcc2, \tmp1
178	bstrpick.d	\tmp1, \tmp0, 31, 24
179	movgr2cf	$fcc3, \tmp1
180	bstrpick.d	\tmp1, \tmp0, 39, 32
181	movgr2cf	$fcc4, \tmp1
182	bstrpick.d	\tmp1, \tmp0, 47, 40
183	movgr2cf	$fcc5, \tmp1
184	bstrpick.d	\tmp1, \tmp0, 55, 48
185	movgr2cf	$fcc6, \tmp1
186	bstrpick.d	\tmp1, \tmp0, 63, 56
187	movgr2cf	$fcc7, \tmp1
188	.endm
189#endif
190
191	.macro	fpu_save_double thread tmp
192	li.w	\tmp, THREAD_FPR0
193	PTR_ADD \tmp, \tmp, \thread
194	fst.d	$f0, \tmp, THREAD_FPR0  - THREAD_FPR0
195	fst.d	$f1, \tmp, THREAD_FPR1  - THREAD_FPR0
196	fst.d	$f2, \tmp, THREAD_FPR2  - THREAD_FPR0
197	fst.d	$f3, \tmp, THREAD_FPR3  - THREAD_FPR0
198	fst.d	$f4, \tmp, THREAD_FPR4  - THREAD_FPR0
199	fst.d	$f5, \tmp, THREAD_FPR5  - THREAD_FPR0
200	fst.d	$f6, \tmp, THREAD_FPR6  - THREAD_FPR0
201	fst.d	$f7, \tmp, THREAD_FPR7  - THREAD_FPR0
202	fst.d	$f8, \tmp, THREAD_FPR8  - THREAD_FPR0
203	fst.d	$f9, \tmp, THREAD_FPR9  - THREAD_FPR0
204	fst.d	$f10, \tmp, THREAD_FPR10 - THREAD_FPR0
205	fst.d	$f11, \tmp, THREAD_FPR11 - THREAD_FPR0
206	fst.d	$f12, \tmp, THREAD_FPR12 - THREAD_FPR0
207	fst.d	$f13, \tmp, THREAD_FPR13 - THREAD_FPR0
208	fst.d	$f14, \tmp, THREAD_FPR14 - THREAD_FPR0
209	fst.d	$f15, \tmp, THREAD_FPR15 - THREAD_FPR0
210	fst.d	$f16, \tmp, THREAD_FPR16 - THREAD_FPR0
211	fst.d	$f17, \tmp, THREAD_FPR17 - THREAD_FPR0
212	fst.d	$f18, \tmp, THREAD_FPR18 - THREAD_FPR0
213	fst.d	$f19, \tmp, THREAD_FPR19 - THREAD_FPR0
214	fst.d	$f20, \tmp, THREAD_FPR20 - THREAD_FPR0
215	fst.d	$f21, \tmp, THREAD_FPR21 - THREAD_FPR0
216	fst.d	$f22, \tmp, THREAD_FPR22 - THREAD_FPR0
217	fst.d	$f23, \tmp, THREAD_FPR23 - THREAD_FPR0
218	fst.d	$f24, \tmp, THREAD_FPR24 - THREAD_FPR0
219	fst.d	$f25, \tmp, THREAD_FPR25 - THREAD_FPR0
220	fst.d	$f26, \tmp, THREAD_FPR26 - THREAD_FPR0
221	fst.d	$f27, \tmp, THREAD_FPR27 - THREAD_FPR0
222	fst.d	$f28, \tmp, THREAD_FPR28 - THREAD_FPR0
223	fst.d	$f29, \tmp, THREAD_FPR29 - THREAD_FPR0
224	fst.d	$f30, \tmp, THREAD_FPR30 - THREAD_FPR0
225	fst.d	$f31, \tmp, THREAD_FPR31 - THREAD_FPR0
226	.endm
227
228	.macro	fpu_restore_double thread tmp
229	li.w	\tmp, THREAD_FPR0
230	PTR_ADD \tmp, \tmp, \thread
231	fld.d	$f0, \tmp, THREAD_FPR0  - THREAD_FPR0
232	fld.d	$f1, \tmp, THREAD_FPR1  - THREAD_FPR0
233	fld.d	$f2, \tmp, THREAD_FPR2  - THREAD_FPR0
234	fld.d	$f3, \tmp, THREAD_FPR3  - THREAD_FPR0
235	fld.d	$f4, \tmp, THREAD_FPR4  - THREAD_FPR0
236	fld.d	$f5, \tmp, THREAD_FPR5  - THREAD_FPR0
237	fld.d	$f6, \tmp, THREAD_FPR6  - THREAD_FPR0
238	fld.d	$f7, \tmp, THREAD_FPR7  - THREAD_FPR0
239	fld.d	$f8, \tmp, THREAD_FPR8  - THREAD_FPR0
240	fld.d	$f9, \tmp, THREAD_FPR9  - THREAD_FPR0
241	fld.d	$f10, \tmp, THREAD_FPR10 - THREAD_FPR0
242	fld.d	$f11, \tmp, THREAD_FPR11 - THREAD_FPR0
243	fld.d	$f12, \tmp, THREAD_FPR12 - THREAD_FPR0
244	fld.d	$f13, \tmp, THREAD_FPR13 - THREAD_FPR0
245	fld.d	$f14, \tmp, THREAD_FPR14 - THREAD_FPR0
246	fld.d	$f15, \tmp, THREAD_FPR15 - THREAD_FPR0
247	fld.d	$f16, \tmp, THREAD_FPR16 - THREAD_FPR0
248	fld.d	$f17, \tmp, THREAD_FPR17 - THREAD_FPR0
249	fld.d	$f18, \tmp, THREAD_FPR18 - THREAD_FPR0
250	fld.d	$f19, \tmp, THREAD_FPR19 - THREAD_FPR0
251	fld.d	$f20, \tmp, THREAD_FPR20 - THREAD_FPR0
252	fld.d	$f21, \tmp, THREAD_FPR21 - THREAD_FPR0
253	fld.d	$f22, \tmp, THREAD_FPR22 - THREAD_FPR0
254	fld.d	$f23, \tmp, THREAD_FPR23 - THREAD_FPR0
255	fld.d	$f24, \tmp, THREAD_FPR24 - THREAD_FPR0
256	fld.d	$f25, \tmp, THREAD_FPR25 - THREAD_FPR0
257	fld.d	$f26, \tmp, THREAD_FPR26 - THREAD_FPR0
258	fld.d	$f27, \tmp, THREAD_FPR27 - THREAD_FPR0
259	fld.d	$f28, \tmp, THREAD_FPR28 - THREAD_FPR0
260	fld.d	$f29, \tmp, THREAD_FPR29 - THREAD_FPR0
261	fld.d	$f30, \tmp, THREAD_FPR30 - THREAD_FPR0
262	fld.d	$f31, \tmp, THREAD_FPR31 - THREAD_FPR0
263	.endm
264
265	.macro	lsx_save_data thread tmp
266	li.w	\tmp, THREAD_FPR0
267	PTR_ADD \tmp, \thread, \tmp
268	vst	$vr0, \tmp, THREAD_FPR0  - THREAD_FPR0
269	vst	$vr1, \tmp, THREAD_FPR1  - THREAD_FPR0
270	vst	$vr2, \tmp, THREAD_FPR2  - THREAD_FPR0
271	vst	$vr3, \tmp, THREAD_FPR3  - THREAD_FPR0
272	vst	$vr4, \tmp, THREAD_FPR4  - THREAD_FPR0
273	vst	$vr5, \tmp, THREAD_FPR5  - THREAD_FPR0
274	vst	$vr6, \tmp, THREAD_FPR6  - THREAD_FPR0
275	vst	$vr7, \tmp, THREAD_FPR7  - THREAD_FPR0
276	vst	$vr8, \tmp, THREAD_FPR8  - THREAD_FPR0
277	vst	$vr9, \tmp, THREAD_FPR9  - THREAD_FPR0
278	vst	$vr10, \tmp, THREAD_FPR10 - THREAD_FPR0
279	vst	$vr11, \tmp, THREAD_FPR11 - THREAD_FPR0
280	vst	$vr12, \tmp, THREAD_FPR12 - THREAD_FPR0
281	vst	$vr13, \tmp, THREAD_FPR13 - THREAD_FPR0
282	vst	$vr14, \tmp, THREAD_FPR14 - THREAD_FPR0
283	vst	$vr15, \tmp, THREAD_FPR15 - THREAD_FPR0
284	vst	$vr16, \tmp, THREAD_FPR16 - THREAD_FPR0
285	vst	$vr17, \tmp, THREAD_FPR17 - THREAD_FPR0
286	vst	$vr18, \tmp, THREAD_FPR18 - THREAD_FPR0
287	vst	$vr19, \tmp, THREAD_FPR19 - THREAD_FPR0
288	vst	$vr20, \tmp, THREAD_FPR20 - THREAD_FPR0
289	vst	$vr21, \tmp, THREAD_FPR21 - THREAD_FPR0
290	vst	$vr22, \tmp, THREAD_FPR22 - THREAD_FPR0
291	vst	$vr23, \tmp, THREAD_FPR23 - THREAD_FPR0
292	vst	$vr24, \tmp, THREAD_FPR24 - THREAD_FPR0
293	vst	$vr25, \tmp, THREAD_FPR25 - THREAD_FPR0
294	vst	$vr26, \tmp, THREAD_FPR26 - THREAD_FPR0
295	vst	$vr27, \tmp, THREAD_FPR27 - THREAD_FPR0
296	vst	$vr28, \tmp, THREAD_FPR28 - THREAD_FPR0
297	vst	$vr29, \tmp, THREAD_FPR29 - THREAD_FPR0
298	vst	$vr30, \tmp, THREAD_FPR30 - THREAD_FPR0
299	vst	$vr31, \tmp, THREAD_FPR31 - THREAD_FPR0
300	.endm
301
302	.macro	lsx_restore_data thread tmp
303	li.w	\tmp, THREAD_FPR0
304	PTR_ADD	\tmp, \thread, \tmp
305	vld	$vr0, \tmp, THREAD_FPR0  - THREAD_FPR0
306	vld	$vr1, \tmp, THREAD_FPR1  - THREAD_FPR0
307	vld	$vr2, \tmp, THREAD_FPR2  - THREAD_FPR0
308	vld	$vr3, \tmp, THREAD_FPR3  - THREAD_FPR0
309	vld	$vr4, \tmp, THREAD_FPR4  - THREAD_FPR0
310	vld	$vr5, \tmp, THREAD_FPR5  - THREAD_FPR0
311	vld	$vr6, \tmp, THREAD_FPR6  - THREAD_FPR0
312	vld	$vr7, \tmp, THREAD_FPR7  - THREAD_FPR0
313	vld	$vr8, \tmp, THREAD_FPR8  - THREAD_FPR0
314	vld	$vr9, \tmp, THREAD_FPR9  - THREAD_FPR0
315	vld	$vr10, \tmp, THREAD_FPR10 - THREAD_FPR0
316	vld	$vr11, \tmp, THREAD_FPR11 - THREAD_FPR0
317	vld	$vr12, \tmp, THREAD_FPR12 - THREAD_FPR0
318	vld	$vr13, \tmp, THREAD_FPR13 - THREAD_FPR0
319	vld	$vr14, \tmp, THREAD_FPR14 - THREAD_FPR0
320	vld	$vr15, \tmp, THREAD_FPR15 - THREAD_FPR0
321	vld	$vr16, \tmp, THREAD_FPR16 - THREAD_FPR0
322	vld	$vr17, \tmp, THREAD_FPR17 - THREAD_FPR0
323	vld	$vr18, \tmp, THREAD_FPR18 - THREAD_FPR0
324	vld	$vr19, \tmp, THREAD_FPR19 - THREAD_FPR0
325	vld	$vr20, \tmp, THREAD_FPR20 - THREAD_FPR0
326	vld	$vr21, \tmp, THREAD_FPR21 - THREAD_FPR0
327	vld	$vr22, \tmp, THREAD_FPR22 - THREAD_FPR0
328	vld	$vr23, \tmp, THREAD_FPR23 - THREAD_FPR0
329	vld	$vr24, \tmp, THREAD_FPR24 - THREAD_FPR0
330	vld	$vr25, \tmp, THREAD_FPR25 - THREAD_FPR0
331	vld	$vr26, \tmp, THREAD_FPR26 - THREAD_FPR0
332	vld	$vr27, \tmp, THREAD_FPR27 - THREAD_FPR0
333	vld	$vr28, \tmp, THREAD_FPR28 - THREAD_FPR0
334	vld	$vr29, \tmp, THREAD_FPR29 - THREAD_FPR0
335	vld	$vr30, \tmp, THREAD_FPR30 - THREAD_FPR0
336	vld	$vr31, \tmp, THREAD_FPR31 - THREAD_FPR0
337	.endm
338
339	.macro	lsx_save_all	thread tmp0 tmp1
340	fpu_save_cc		\thread, \tmp0, \tmp1
341	fpu_save_csr		\thread, \tmp0
342	lsx_save_data		\thread, \tmp0
343	.endm
344
345	.macro	lsx_restore_all	thread tmp0 tmp1
346	lsx_restore_data	\thread, \tmp0
347	fpu_restore_cc		\thread, \tmp0, \tmp1
348	fpu_restore_csr		\thread, \tmp0, \tmp1
349	.endm
350
351	.macro	lsx_save_upper vd base tmp off
352	vpickve2gr.d	\tmp, \vd, 1
353	st.d		\tmp, \base, (\off+8)
354	.endm
355
356	.macro	lsx_save_all_upper thread base tmp
357	li.w		\tmp, THREAD_FPR0
358	PTR_ADD		\base, \thread, \tmp
359	lsx_save_upper	$vr0,  \base, \tmp, (THREAD_FPR0-THREAD_FPR0)
360	lsx_save_upper	$vr1,  \base, \tmp, (THREAD_FPR1-THREAD_FPR0)
361	lsx_save_upper	$vr2,  \base, \tmp, (THREAD_FPR2-THREAD_FPR0)
362	lsx_save_upper	$vr3,  \base, \tmp, (THREAD_FPR3-THREAD_FPR0)
363	lsx_save_upper	$vr4,  \base, \tmp, (THREAD_FPR4-THREAD_FPR0)
364	lsx_save_upper	$vr5,  \base, \tmp, (THREAD_FPR5-THREAD_FPR0)
365	lsx_save_upper	$vr6,  \base, \tmp, (THREAD_FPR6-THREAD_FPR0)
366	lsx_save_upper	$vr7,  \base, \tmp, (THREAD_FPR7-THREAD_FPR0)
367	lsx_save_upper	$vr8,  \base, \tmp, (THREAD_FPR8-THREAD_FPR0)
368	lsx_save_upper	$vr9,  \base, \tmp, (THREAD_FPR9-THREAD_FPR0)
369	lsx_save_upper	$vr10, \base, \tmp, (THREAD_FPR10-THREAD_FPR0)
370	lsx_save_upper	$vr11, \base, \tmp, (THREAD_FPR11-THREAD_FPR0)
371	lsx_save_upper	$vr12, \base, \tmp, (THREAD_FPR12-THREAD_FPR0)
372	lsx_save_upper	$vr13, \base, \tmp, (THREAD_FPR13-THREAD_FPR0)
373	lsx_save_upper	$vr14, \base, \tmp, (THREAD_FPR14-THREAD_FPR0)
374	lsx_save_upper	$vr15, \base, \tmp, (THREAD_FPR15-THREAD_FPR0)
375	lsx_save_upper	$vr16, \base, \tmp, (THREAD_FPR16-THREAD_FPR0)
376	lsx_save_upper	$vr17, \base, \tmp, (THREAD_FPR17-THREAD_FPR0)
377	lsx_save_upper	$vr18, \base, \tmp, (THREAD_FPR18-THREAD_FPR0)
378	lsx_save_upper	$vr19, \base, \tmp, (THREAD_FPR19-THREAD_FPR0)
379	lsx_save_upper	$vr20, \base, \tmp, (THREAD_FPR20-THREAD_FPR0)
380	lsx_save_upper	$vr21, \base, \tmp, (THREAD_FPR21-THREAD_FPR0)
381	lsx_save_upper	$vr22, \base, \tmp, (THREAD_FPR22-THREAD_FPR0)
382	lsx_save_upper	$vr23, \base, \tmp, (THREAD_FPR23-THREAD_FPR0)
383	lsx_save_upper	$vr24, \base, \tmp, (THREAD_FPR24-THREAD_FPR0)
384	lsx_save_upper	$vr25, \base, \tmp, (THREAD_FPR25-THREAD_FPR0)
385	lsx_save_upper	$vr26, \base, \tmp, (THREAD_FPR26-THREAD_FPR0)
386	lsx_save_upper	$vr27, \base, \tmp, (THREAD_FPR27-THREAD_FPR0)
387	lsx_save_upper	$vr28, \base, \tmp, (THREAD_FPR28-THREAD_FPR0)
388	lsx_save_upper	$vr29, \base, \tmp, (THREAD_FPR29-THREAD_FPR0)
389	lsx_save_upper	$vr30, \base, \tmp, (THREAD_FPR30-THREAD_FPR0)
390	lsx_save_upper	$vr31, \base, \tmp, (THREAD_FPR31-THREAD_FPR0)
391	.endm
392
393	.macro	lsx_restore_upper vd base tmp off
394	ld.d		\tmp, \base, (\off+8)
395	vinsgr2vr.d	\vd,  \tmp, 1
396	.endm
397
398	.macro	lsx_restore_all_upper thread base tmp
399	li.w		  \tmp, THREAD_FPR0
400	PTR_ADD		  \base, \thread, \tmp
401	lsx_restore_upper $vr0,  \base, \tmp, (THREAD_FPR0-THREAD_FPR0)
402	lsx_restore_upper $vr1,  \base, \tmp, (THREAD_FPR1-THREAD_FPR0)
403	lsx_restore_upper $vr2,  \base, \tmp, (THREAD_FPR2-THREAD_FPR0)
404	lsx_restore_upper $vr3,  \base, \tmp, (THREAD_FPR3-THREAD_FPR0)
405	lsx_restore_upper $vr4,  \base, \tmp, (THREAD_FPR4-THREAD_FPR0)
406	lsx_restore_upper $vr5,  \base, \tmp, (THREAD_FPR5-THREAD_FPR0)
407	lsx_restore_upper $vr6,  \base, \tmp, (THREAD_FPR6-THREAD_FPR0)
408	lsx_restore_upper $vr7,  \base, \tmp, (THREAD_FPR7-THREAD_FPR0)
409	lsx_restore_upper $vr8,  \base, \tmp, (THREAD_FPR8-THREAD_FPR0)
410	lsx_restore_upper $vr9,  \base, \tmp, (THREAD_FPR9-THREAD_FPR0)
411	lsx_restore_upper $vr10, \base, \tmp, (THREAD_FPR10-THREAD_FPR0)
412	lsx_restore_upper $vr11, \base, \tmp, (THREAD_FPR11-THREAD_FPR0)
413	lsx_restore_upper $vr12, \base, \tmp, (THREAD_FPR12-THREAD_FPR0)
414	lsx_restore_upper $vr13, \base, \tmp, (THREAD_FPR13-THREAD_FPR0)
415	lsx_restore_upper $vr14, \base, \tmp, (THREAD_FPR14-THREAD_FPR0)
416	lsx_restore_upper $vr15, \base, \tmp, (THREAD_FPR15-THREAD_FPR0)
417	lsx_restore_upper $vr16, \base, \tmp, (THREAD_FPR16-THREAD_FPR0)
418	lsx_restore_upper $vr17, \base, \tmp, (THREAD_FPR17-THREAD_FPR0)
419	lsx_restore_upper $vr18, \base, \tmp, (THREAD_FPR18-THREAD_FPR0)
420	lsx_restore_upper $vr19, \base, \tmp, (THREAD_FPR19-THREAD_FPR0)
421	lsx_restore_upper $vr20, \base, \tmp, (THREAD_FPR20-THREAD_FPR0)
422	lsx_restore_upper $vr21, \base, \tmp, (THREAD_FPR21-THREAD_FPR0)
423	lsx_restore_upper $vr22, \base, \tmp, (THREAD_FPR22-THREAD_FPR0)
424	lsx_restore_upper $vr23, \base, \tmp, (THREAD_FPR23-THREAD_FPR0)
425	lsx_restore_upper $vr24, \base, \tmp, (THREAD_FPR24-THREAD_FPR0)
426	lsx_restore_upper $vr25, \base, \tmp, (THREAD_FPR25-THREAD_FPR0)
427	lsx_restore_upper $vr26, \base, \tmp, (THREAD_FPR26-THREAD_FPR0)
428	lsx_restore_upper $vr27, \base, \tmp, (THREAD_FPR27-THREAD_FPR0)
429	lsx_restore_upper $vr28, \base, \tmp, (THREAD_FPR28-THREAD_FPR0)
430	lsx_restore_upper $vr29, \base, \tmp, (THREAD_FPR29-THREAD_FPR0)
431	lsx_restore_upper $vr30, \base, \tmp, (THREAD_FPR30-THREAD_FPR0)
432	lsx_restore_upper $vr31, \base, \tmp, (THREAD_FPR31-THREAD_FPR0)
433	.endm
434
435	.macro	lsx_init_upper vd tmp
436	vinsgr2vr.d	\vd, \tmp, 1
437	.endm
438
439	.macro	lsx_init_all_upper tmp
440	not		\tmp, zero
441	lsx_init_upper	$vr0 \tmp
442	lsx_init_upper	$vr1 \tmp
443	lsx_init_upper	$vr2 \tmp
444	lsx_init_upper	$vr3 \tmp
445	lsx_init_upper	$vr4 \tmp
446	lsx_init_upper	$vr5 \tmp
447	lsx_init_upper	$vr6 \tmp
448	lsx_init_upper	$vr7 \tmp
449	lsx_init_upper	$vr8 \tmp
450	lsx_init_upper	$vr9 \tmp
451	lsx_init_upper	$vr10 \tmp
452	lsx_init_upper	$vr11 \tmp
453	lsx_init_upper	$vr12 \tmp
454	lsx_init_upper	$vr13 \tmp
455	lsx_init_upper	$vr14 \tmp
456	lsx_init_upper	$vr15 \tmp
457	lsx_init_upper	$vr16 \tmp
458	lsx_init_upper	$vr17 \tmp
459	lsx_init_upper	$vr18 \tmp
460	lsx_init_upper	$vr19 \tmp
461	lsx_init_upper	$vr20 \tmp
462	lsx_init_upper	$vr21 \tmp
463	lsx_init_upper	$vr22 \tmp
464	lsx_init_upper	$vr23 \tmp
465	lsx_init_upper	$vr24 \tmp
466	lsx_init_upper	$vr25 \tmp
467	lsx_init_upper	$vr26 \tmp
468	lsx_init_upper	$vr27 \tmp
469	lsx_init_upper	$vr28 \tmp
470	lsx_init_upper	$vr29 \tmp
471	lsx_init_upper	$vr30 \tmp
472	lsx_init_upper	$vr31 \tmp
473	.endm
474
475	.macro	lasx_save_data thread tmp
476	li.w	\tmp, THREAD_FPR0
477	PTR_ADD	\tmp, \thread, \tmp
478	xvst	$xr0, \tmp, THREAD_FPR0  - THREAD_FPR0
479	xvst	$xr1, \tmp, THREAD_FPR1  - THREAD_FPR0
480	xvst	$xr2, \tmp, THREAD_FPR2  - THREAD_FPR0
481	xvst	$xr3, \tmp, THREAD_FPR3  - THREAD_FPR0
482	xvst	$xr4, \tmp, THREAD_FPR4  - THREAD_FPR0
483	xvst	$xr5, \tmp, THREAD_FPR5  - THREAD_FPR0
484	xvst	$xr6, \tmp, THREAD_FPR6  - THREAD_FPR0
485	xvst	$xr7, \tmp, THREAD_FPR7  - THREAD_FPR0
486	xvst	$xr8, \tmp, THREAD_FPR8  - THREAD_FPR0
487	xvst	$xr9, \tmp, THREAD_FPR9  - THREAD_FPR0
488	xvst	$xr10, \tmp, THREAD_FPR10 - THREAD_FPR0
489	xvst	$xr11, \tmp, THREAD_FPR11 - THREAD_FPR0
490	xvst	$xr12, \tmp, THREAD_FPR12 - THREAD_FPR0
491	xvst	$xr13, \tmp, THREAD_FPR13 - THREAD_FPR0
492	xvst	$xr14, \tmp, THREAD_FPR14 - THREAD_FPR0
493	xvst	$xr15, \tmp, THREAD_FPR15 - THREAD_FPR0
494	xvst	$xr16, \tmp, THREAD_FPR16 - THREAD_FPR0
495	xvst	$xr17, \tmp, THREAD_FPR17 - THREAD_FPR0
496	xvst	$xr18, \tmp, THREAD_FPR18 - THREAD_FPR0
497	xvst	$xr19, \tmp, THREAD_FPR19 - THREAD_FPR0
498	xvst	$xr20, \tmp, THREAD_FPR20 - THREAD_FPR0
499	xvst	$xr21, \tmp, THREAD_FPR21 - THREAD_FPR0
500	xvst	$xr22, \tmp, THREAD_FPR22 - THREAD_FPR0
501	xvst	$xr23, \tmp, THREAD_FPR23 - THREAD_FPR0
502	xvst	$xr24, \tmp, THREAD_FPR24 - THREAD_FPR0
503	xvst	$xr25, \tmp, THREAD_FPR25 - THREAD_FPR0
504	xvst	$xr26, \tmp, THREAD_FPR26 - THREAD_FPR0
505	xvst	$xr27, \tmp, THREAD_FPR27 - THREAD_FPR0
506	xvst	$xr28, \tmp, THREAD_FPR28 - THREAD_FPR0
507	xvst	$xr29, \tmp, THREAD_FPR29 - THREAD_FPR0
508	xvst	$xr30, \tmp, THREAD_FPR30 - THREAD_FPR0
509	xvst	$xr31, \tmp, THREAD_FPR31 - THREAD_FPR0
510	.endm
511
512	.macro	lasx_restore_data thread tmp
513	li.w	\tmp, THREAD_FPR0
514	PTR_ADD	\tmp, \thread, \tmp
515	xvld	$xr0, \tmp, THREAD_FPR0  - THREAD_FPR0
516	xvld	$xr1, \tmp, THREAD_FPR1  - THREAD_FPR0
517	xvld	$xr2, \tmp, THREAD_FPR2  - THREAD_FPR0
518	xvld	$xr3, \tmp, THREAD_FPR3  - THREAD_FPR0
519	xvld	$xr4, \tmp, THREAD_FPR4  - THREAD_FPR0
520	xvld	$xr5, \tmp, THREAD_FPR5  - THREAD_FPR0
521	xvld	$xr6, \tmp, THREAD_FPR6  - THREAD_FPR0
522	xvld	$xr7, \tmp, THREAD_FPR7  - THREAD_FPR0
523	xvld	$xr8, \tmp, THREAD_FPR8  - THREAD_FPR0
524	xvld	$xr9, \tmp, THREAD_FPR9  - THREAD_FPR0
525	xvld	$xr10, \tmp, THREAD_FPR10 - THREAD_FPR0
526	xvld	$xr11, \tmp, THREAD_FPR11 - THREAD_FPR0
527	xvld	$xr12, \tmp, THREAD_FPR12 - THREAD_FPR0
528	xvld	$xr13, \tmp, THREAD_FPR13 - THREAD_FPR0
529	xvld	$xr14, \tmp, THREAD_FPR14 - THREAD_FPR0
530	xvld	$xr15, \tmp, THREAD_FPR15 - THREAD_FPR0
531	xvld	$xr16, \tmp, THREAD_FPR16 - THREAD_FPR0
532	xvld	$xr17, \tmp, THREAD_FPR17 - THREAD_FPR0
533	xvld	$xr18, \tmp, THREAD_FPR18 - THREAD_FPR0
534	xvld	$xr19, \tmp, THREAD_FPR19 - THREAD_FPR0
535	xvld	$xr20, \tmp, THREAD_FPR20 - THREAD_FPR0
536	xvld	$xr21, \tmp, THREAD_FPR21 - THREAD_FPR0
537	xvld	$xr22, \tmp, THREAD_FPR22 - THREAD_FPR0
538	xvld	$xr23, \tmp, THREAD_FPR23 - THREAD_FPR0
539	xvld	$xr24, \tmp, THREAD_FPR24 - THREAD_FPR0
540	xvld	$xr25, \tmp, THREAD_FPR25 - THREAD_FPR0
541	xvld	$xr26, \tmp, THREAD_FPR26 - THREAD_FPR0
542	xvld	$xr27, \tmp, THREAD_FPR27 - THREAD_FPR0
543	xvld	$xr28, \tmp, THREAD_FPR28 - THREAD_FPR0
544	xvld	$xr29, \tmp, THREAD_FPR29 - THREAD_FPR0
545	xvld	$xr30, \tmp, THREAD_FPR30 - THREAD_FPR0
546	xvld	$xr31, \tmp, THREAD_FPR31 - THREAD_FPR0
547	.endm
548
549	.macro	lasx_save_all	thread tmp0 tmp1
550	fpu_save_cc		\thread, \tmp0, \tmp1
551	fpu_save_csr		\thread, \tmp0
552	lasx_save_data		\thread, \tmp0
553	.endm
554
555	.macro	lasx_restore_all thread tmp0 tmp1
556	lasx_restore_data	\thread, \tmp0
557	fpu_restore_cc		\thread, \tmp0, \tmp1
558	fpu_restore_csr		\thread, \tmp0, \tmp1
559	.endm
560
561	.macro	lasx_save_upper xd base tmp off
562	/* Nothing */
563	.endm
564
565	.macro	lasx_save_all_upper thread base tmp
566	/* Nothing */
567	.endm
568
569	.macro	lasx_restore_upper xd base tmp0 tmp1 off
570	vld		\tmp0, \base, (\off+16)
571	xvpermi.q 	\xd,   \tmp1, 0x2
572	.endm
573
574	.macro	lasx_restore_all_upper thread base tmp
575	li.w		\tmp, THREAD_FPR0
576	PTR_ADD		\base, \thread, \tmp
577	/* Save $vr31 ($xr31 lower bits) with xvpickve2gr */
578	xvpickve2gr.d	$r17, $xr31, 0
579	xvpickve2gr.d	$r18, $xr31, 1
580	lasx_restore_upper $xr0, \base, $vr31, $xr31, (THREAD_FPR0-THREAD_FPR0)
581	lasx_restore_upper $xr1, \base, $vr31, $xr31, (THREAD_FPR1-THREAD_FPR0)
582	lasx_restore_upper $xr2, \base, $vr31, $xr31, (THREAD_FPR2-THREAD_FPR0)
583	lasx_restore_upper $xr3, \base, $vr31, $xr31, (THREAD_FPR3-THREAD_FPR0)
584	lasx_restore_upper $xr4, \base, $vr31, $xr31, (THREAD_FPR4-THREAD_FPR0)
585	lasx_restore_upper $xr5, \base, $vr31, $xr31, (THREAD_FPR5-THREAD_FPR0)
586	lasx_restore_upper $xr6, \base, $vr31, $xr31, (THREAD_FPR6-THREAD_FPR0)
587	lasx_restore_upper $xr7, \base, $vr31, $xr31, (THREAD_FPR7-THREAD_FPR0)
588	lasx_restore_upper $xr8, \base, $vr31, $xr31, (THREAD_FPR8-THREAD_FPR0)
589	lasx_restore_upper $xr9, \base, $vr31, $xr31, (THREAD_FPR9-THREAD_FPR0)
590	lasx_restore_upper $xr10, \base, $vr31, $xr31, (THREAD_FPR10-THREAD_FPR0)
591	lasx_restore_upper $xr11, \base, $vr31, $xr31, (THREAD_FPR11-THREAD_FPR0)
592	lasx_restore_upper $xr12, \base, $vr31, $xr31, (THREAD_FPR12-THREAD_FPR0)
593	lasx_restore_upper $xr13, \base, $vr31, $xr31, (THREAD_FPR13-THREAD_FPR0)
594	lasx_restore_upper $xr14, \base, $vr31, $xr31, (THREAD_FPR14-THREAD_FPR0)
595	lasx_restore_upper $xr15, \base, $vr31, $xr31, (THREAD_FPR15-THREAD_FPR0)
596	lasx_restore_upper $xr16, \base, $vr31, $xr31, (THREAD_FPR16-THREAD_FPR0)
597	lasx_restore_upper $xr17, \base, $vr31, $xr31, (THREAD_FPR17-THREAD_FPR0)
598	lasx_restore_upper $xr18, \base, $vr31, $xr31, (THREAD_FPR18-THREAD_FPR0)
599	lasx_restore_upper $xr19, \base, $vr31, $xr31, (THREAD_FPR19-THREAD_FPR0)
600	lasx_restore_upper $xr20, \base, $vr31, $xr31, (THREAD_FPR20-THREAD_FPR0)
601	lasx_restore_upper $xr21, \base, $vr31, $xr31, (THREAD_FPR21-THREAD_FPR0)
602	lasx_restore_upper $xr22, \base, $vr31, $xr31, (THREAD_FPR22-THREAD_FPR0)
603	lasx_restore_upper $xr23, \base, $vr31, $xr31, (THREAD_FPR23-THREAD_FPR0)
604	lasx_restore_upper $xr24, \base, $vr31, $xr31, (THREAD_FPR24-THREAD_FPR0)
605	lasx_restore_upper $xr25, \base, $vr31, $xr31, (THREAD_FPR25-THREAD_FPR0)
606	lasx_restore_upper $xr26, \base, $vr31, $xr31, (THREAD_FPR26-THREAD_FPR0)
607	lasx_restore_upper $xr27, \base, $vr31, $xr31, (THREAD_FPR27-THREAD_FPR0)
608	lasx_restore_upper $xr28, \base, $vr31, $xr31, (THREAD_FPR28-THREAD_FPR0)
609	lasx_restore_upper $xr29, \base, $vr31, $xr31, (THREAD_FPR29-THREAD_FPR0)
610	lasx_restore_upper $xr30, \base, $vr31, $xr31, (THREAD_FPR30-THREAD_FPR0)
611	lasx_restore_upper $xr31, \base, $vr31, $xr31, (THREAD_FPR31-THREAD_FPR0)
612	/* Restore $vr31 ($xr31 lower bits) with xvinsgr2vr */
613	xvinsgr2vr.d	$xr31, $r17, 0
614	xvinsgr2vr.d	$xr31, $r18, 1
615	.endm
616
617	.macro	lasx_init_upper xd tmp
618	xvinsgr2vr.d	\xd, \tmp, 2
619	xvinsgr2vr.d	\xd, \tmp, 3
620	.endm
621
622	.macro	lasx_init_all_upper tmp
623	not		\tmp, zero
624	lasx_init_upper	$xr0 \tmp
625	lasx_init_upper	$xr1 \tmp
626	lasx_init_upper	$xr2 \tmp
627	lasx_init_upper	$xr3 \tmp
628	lasx_init_upper	$xr4 \tmp
629	lasx_init_upper	$xr5 \tmp
630	lasx_init_upper	$xr6 \tmp
631	lasx_init_upper	$xr7 \tmp
632	lasx_init_upper	$xr8 \tmp
633	lasx_init_upper	$xr9 \tmp
634	lasx_init_upper	$xr10 \tmp
635	lasx_init_upper	$xr11 \tmp
636	lasx_init_upper	$xr12 \tmp
637	lasx_init_upper	$xr13 \tmp
638	lasx_init_upper	$xr14 \tmp
639	lasx_init_upper	$xr15 \tmp
640	lasx_init_upper	$xr16 \tmp
641	lasx_init_upper	$xr17 \tmp
642	lasx_init_upper	$xr18 \tmp
643	lasx_init_upper	$xr19 \tmp
644	lasx_init_upper	$xr20 \tmp
645	lasx_init_upper	$xr21 \tmp
646	lasx_init_upper	$xr22 \tmp
647	lasx_init_upper	$xr23 \tmp
648	lasx_init_upper	$xr24 \tmp
649	lasx_init_upper	$xr25 \tmp
650	lasx_init_upper	$xr26 \tmp
651	lasx_init_upper	$xr27 \tmp
652	lasx_init_upper	$xr28 \tmp
653	lasx_init_upper	$xr29 \tmp
654	lasx_init_upper	$xr30 \tmp
655	lasx_init_upper	$xr31 \tmp
656	.endm
657
658.macro not dst src
659	nor	\dst, \src, zero
660.endm
661
662.macro la_abs reg, sym
663#ifndef CONFIG_RELOCATABLE
664	la.abs	\reg, \sym
665#else
666	766:
667	lu12i.w	\reg, 0
668	ori	\reg, \reg, 0
669#ifdef CONFIG_64BIT
670	lu32i.d	\reg, 0
671	lu52i.d	\reg, \reg, 0
672#endif
673	.pushsection ".la_abs", "aw", %progbits
674	.p2align PTRLOG
675	PTR	766b
676	PTR	\sym
677	.popsection
678#endif
679.endm
680
681#endif /* _ASM_ASMMACRO_H */
~/ Read-only file preview.