Linux Audio

Check our new training course

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