xref: /OK3568_Linux_fs/u-boot/arch/mips/include/asm/asm.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) 1995, 1996, 1997, 1999, 2001 by Ralf Baechle
3*4882a593Smuzhiyun  * Copyright (C) 1999 by Silicon Graphics, Inc.
4*4882a593Smuzhiyun  * Copyright (C) 2001 MIPS Technologies, Inc.
5*4882a593Smuzhiyun  * Copyright (C) 2002  Maciej W. Rozycki
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Some useful macros for MIPS assembler code
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * Some of the routines below contain useless nops that will be optimized
10*4882a593Smuzhiyun  * away by gas in -O mode. These nops are however required to fill delay
11*4882a593Smuzhiyun  * slots in noreorder mode.
12*4882a593Smuzhiyun  *
13*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0
14*4882a593Smuzhiyun  */
15*4882a593Smuzhiyun #ifndef __ASM_ASM_H
16*4882a593Smuzhiyun #define __ASM_ASM_H
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #include <asm/sgidefs.h>
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #ifndef CAT
21*4882a593Smuzhiyun #ifdef __STDC__
22*4882a593Smuzhiyun #define __CAT(str1, str2) str1##str2
23*4882a593Smuzhiyun #else
24*4882a593Smuzhiyun #define __CAT(str1, str2) str1/**/str2
25*4882a593Smuzhiyun #endif
26*4882a593Smuzhiyun #define CAT(str1, str2) __CAT(str1, str2)
27*4882a593Smuzhiyun #endif
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun /*
30*4882a593Smuzhiyun  * PIC specific declarations
31*4882a593Smuzhiyun  * Not used for the kernel but here seems to be the right place.
32*4882a593Smuzhiyun  */
33*4882a593Smuzhiyun #ifdef __PIC__
34*4882a593Smuzhiyun #define CPRESTORE(register)				\
35*4882a593Smuzhiyun 		.cprestore register
36*4882a593Smuzhiyun #define CPADD(register)					\
37*4882a593Smuzhiyun 		.cpadd	register
38*4882a593Smuzhiyun #define CPLOAD(register)				\
39*4882a593Smuzhiyun 		.cpload register
40*4882a593Smuzhiyun #else
41*4882a593Smuzhiyun #define CPRESTORE(register)
42*4882a593Smuzhiyun #define CPADD(register)
43*4882a593Smuzhiyun #define CPLOAD(register)
44*4882a593Smuzhiyun #endif
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun #define ENTRY(symbol)					\
47*4882a593Smuzhiyun 		.globl	symbol;				\
48*4882a593Smuzhiyun 		.type	symbol, @function;		\
49*4882a593Smuzhiyun 		.ent	symbol, 0;			\
50*4882a593Smuzhiyun symbol:
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun /*
53*4882a593Smuzhiyun  * LEAF - declare leaf routine
54*4882a593Smuzhiyun  */
55*4882a593Smuzhiyun #define LEAF(symbol)					\
56*4882a593Smuzhiyun 		.globl	symbol;				\
57*4882a593Smuzhiyun 		.align	2;				\
58*4882a593Smuzhiyun 		.type	symbol, @function;		\
59*4882a593Smuzhiyun 		.ent	symbol, 0;			\
60*4882a593Smuzhiyun 		.section .text.symbol, "x";             \
61*4882a593Smuzhiyun symbol:		.frame	sp, 0, ra
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun /*
64*4882a593Smuzhiyun  * NESTED - declare nested routine entry point
65*4882a593Smuzhiyun  */
66*4882a593Smuzhiyun #define NESTED(symbol, framesize, rpc)			\
67*4882a593Smuzhiyun 		.globl	symbol;				\
68*4882a593Smuzhiyun 		.align	2;				\
69*4882a593Smuzhiyun 		.type	symbol, @function;		\
70*4882a593Smuzhiyun 		.ent	symbol, 0;			\
71*4882a593Smuzhiyun 		.section .text.symbol, "x";             \
72*4882a593Smuzhiyun symbol:		.frame	sp, framesize, rpc
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun /*
75*4882a593Smuzhiyun  * END - mark end of function
76*4882a593Smuzhiyun  */
77*4882a593Smuzhiyun #define END(function)					\
78*4882a593Smuzhiyun 		.end	function;			\
79*4882a593Smuzhiyun 		.size	function, .-function
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun /*
82*4882a593Smuzhiyun  * EXPORT - export definition of symbol
83*4882a593Smuzhiyun  */
84*4882a593Smuzhiyun #define EXPORT(symbol)					\
85*4882a593Smuzhiyun 		.globl	symbol;				\
86*4882a593Smuzhiyun symbol:
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun /*
89*4882a593Smuzhiyun  * FEXPORT - export definition of a function symbol
90*4882a593Smuzhiyun  */
91*4882a593Smuzhiyun #define FEXPORT(symbol)					\
92*4882a593Smuzhiyun 		.globl	symbol;				\
93*4882a593Smuzhiyun 		.type	symbol, @function;		\
94*4882a593Smuzhiyun symbol:
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun /*
97*4882a593Smuzhiyun  * ABS - export absolute symbol
98*4882a593Smuzhiyun  */
99*4882a593Smuzhiyun #define ABS(symbol,value)				\
100*4882a593Smuzhiyun 		.globl	symbol;				\
101*4882a593Smuzhiyun symbol		=	value
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun #define PANIC(msg)					\
104*4882a593Smuzhiyun 		.set	push;				\
105*4882a593Smuzhiyun 		.set	reorder;			\
106*4882a593Smuzhiyun 		PTR_LA	a0, 8f;				 \
107*4882a593Smuzhiyun 		jal	panic;				\
108*4882a593Smuzhiyun 9:		b	9b;				\
109*4882a593Smuzhiyun 		.set	pop;				\
110*4882a593Smuzhiyun 		TEXT(msg)
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun /*
113*4882a593Smuzhiyun  * Print formatted string
114*4882a593Smuzhiyun  */
115*4882a593Smuzhiyun #ifdef CONFIG_PRINTK
116*4882a593Smuzhiyun #define PRINT(string)					\
117*4882a593Smuzhiyun 		.set	push;				\
118*4882a593Smuzhiyun 		.set	reorder;			\
119*4882a593Smuzhiyun 		PTR_LA	a0, 8f;				 \
120*4882a593Smuzhiyun 		jal	printk;				\
121*4882a593Smuzhiyun 		.set	pop;				\
122*4882a593Smuzhiyun 		TEXT(string)
123*4882a593Smuzhiyun #else
124*4882a593Smuzhiyun #define PRINT(string)
125*4882a593Smuzhiyun #endif
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun #define TEXT(msg)					\
128*4882a593Smuzhiyun 		.pushsection .data;			\
129*4882a593Smuzhiyun 8:		.asciiz msg;				\
130*4882a593Smuzhiyun 		.popsection;
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun /*
133*4882a593Smuzhiyun  * Build text tables
134*4882a593Smuzhiyun  */
135*4882a593Smuzhiyun #define TTABLE(string)					\
136*4882a593Smuzhiyun 		.pushsection .text;			\
137*4882a593Smuzhiyun 		.word	1f;				\
138*4882a593Smuzhiyun 		.popsection				\
139*4882a593Smuzhiyun 		.pushsection .data;			\
140*4882a593Smuzhiyun 1:		.asciiz string;				\
141*4882a593Smuzhiyun 		.popsection
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun /*
144*4882a593Smuzhiyun  * MIPS IV pref instruction.
145*4882a593Smuzhiyun  * Use with .set noreorder only!
146*4882a593Smuzhiyun  *
147*4882a593Smuzhiyun  * MIPS IV implementations are free to treat this as a nop.  The R5000
148*4882a593Smuzhiyun  * is one of them.  So we should have an option not to use this instruction.
149*4882a593Smuzhiyun  */
150*4882a593Smuzhiyun #ifdef CONFIG_CPU_HAS_PREFETCH
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun #define PREF(hint, addr)				\
153*4882a593Smuzhiyun 		.set	push;				\
154*4882a593Smuzhiyun 		.set	arch=r5000;			\
155*4882a593Smuzhiyun 		pref	hint, addr;			\
156*4882a593Smuzhiyun 		.set	pop
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun #define PREFE(hint, addr)				\
159*4882a593Smuzhiyun 		.set	push;				\
160*4882a593Smuzhiyun 		.set	mips0;				\
161*4882a593Smuzhiyun 		.set	eva;				\
162*4882a593Smuzhiyun 		prefe	hint, addr;			\
163*4882a593Smuzhiyun 		.set	pop
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun #define PREFX(hint, addr)				\
166*4882a593Smuzhiyun 		.set	push;				\
167*4882a593Smuzhiyun 		.set	arch=r5000;			\
168*4882a593Smuzhiyun 		prefx	hint, addr;			\
169*4882a593Smuzhiyun 		.set	pop
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun #else /* !CONFIG_CPU_HAS_PREFETCH */
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun #define PREF(hint, addr)
174*4882a593Smuzhiyun #define PREFE(hint, addr)
175*4882a593Smuzhiyun #define PREFX(hint, addr)
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun #endif /* !CONFIG_CPU_HAS_PREFETCH */
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun /*
180*4882a593Smuzhiyun  * MIPS ISA IV/V movn/movz instructions and equivalents for older CPUs.
181*4882a593Smuzhiyun  */
182*4882a593Smuzhiyun #if (_MIPS_ISA == _MIPS_ISA_MIPS1)
183*4882a593Smuzhiyun #define MOVN(rd, rs, rt)				\
184*4882a593Smuzhiyun 		.set	push;				\
185*4882a593Smuzhiyun 		.set	reorder;			\
186*4882a593Smuzhiyun 		beqz	rt, 9f;				\
187*4882a593Smuzhiyun 		move	rd, rs;				\
188*4882a593Smuzhiyun 		.set	pop;				\
189*4882a593Smuzhiyun 9:
190*4882a593Smuzhiyun #define MOVZ(rd, rs, rt)				\
191*4882a593Smuzhiyun 		.set	push;				\
192*4882a593Smuzhiyun 		.set	reorder;			\
193*4882a593Smuzhiyun 		bnez	rt, 9f;				\
194*4882a593Smuzhiyun 		move	rd, rs;				\
195*4882a593Smuzhiyun 		.set	pop;				\
196*4882a593Smuzhiyun 9:
197*4882a593Smuzhiyun #endif /* _MIPS_ISA == _MIPS_ISA_MIPS1 */
198*4882a593Smuzhiyun #if (_MIPS_ISA == _MIPS_ISA_MIPS2) || (_MIPS_ISA == _MIPS_ISA_MIPS3)
199*4882a593Smuzhiyun #define MOVN(rd, rs, rt)				\
200*4882a593Smuzhiyun 		.set	push;				\
201*4882a593Smuzhiyun 		.set	noreorder;			\
202*4882a593Smuzhiyun 		bnezl	rt, 9f;				\
203*4882a593Smuzhiyun 		 move	rd, rs;				\
204*4882a593Smuzhiyun 		.set	pop;				\
205*4882a593Smuzhiyun 9:
206*4882a593Smuzhiyun #define MOVZ(rd, rs, rt)				\
207*4882a593Smuzhiyun 		.set	push;				\
208*4882a593Smuzhiyun 		.set	noreorder;			\
209*4882a593Smuzhiyun 		beqzl	rt, 9f;				\
210*4882a593Smuzhiyun 		 move	rd, rs;				\
211*4882a593Smuzhiyun 		.set	pop;				\
212*4882a593Smuzhiyun 9:
213*4882a593Smuzhiyun #endif /* (_MIPS_ISA == _MIPS_ISA_MIPS2) || (_MIPS_ISA == _MIPS_ISA_MIPS3) */
214*4882a593Smuzhiyun #if (_MIPS_ISA == _MIPS_ISA_MIPS4 ) || (_MIPS_ISA == _MIPS_ISA_MIPS5) || \
215*4882a593Smuzhiyun     (_MIPS_ISA == _MIPS_ISA_MIPS32) || (_MIPS_ISA == _MIPS_ISA_MIPS64)
216*4882a593Smuzhiyun #define MOVN(rd, rs, rt)				\
217*4882a593Smuzhiyun 		movn	rd, rs, rt
218*4882a593Smuzhiyun #define MOVZ(rd, rs, rt)				\
219*4882a593Smuzhiyun 		movz	rd, rs, rt
220*4882a593Smuzhiyun #endif /* MIPS IV, MIPS V, MIPS32 or MIPS64 */
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun /*
223*4882a593Smuzhiyun  * Stack alignment
224*4882a593Smuzhiyun  */
225*4882a593Smuzhiyun #if (_MIPS_SIM == _MIPS_SIM_ABI32)
226*4882a593Smuzhiyun #define ALSZ	7
227*4882a593Smuzhiyun #define ALMASK	~7
228*4882a593Smuzhiyun #endif
229*4882a593Smuzhiyun #if (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64)
230*4882a593Smuzhiyun #define ALSZ	15
231*4882a593Smuzhiyun #define ALMASK	~15
232*4882a593Smuzhiyun #endif
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun /*
235*4882a593Smuzhiyun  * Macros to handle different pointer/register sizes for 32/64-bit code
236*4882a593Smuzhiyun  */
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun /*
239*4882a593Smuzhiyun  * Size of a register
240*4882a593Smuzhiyun  */
241*4882a593Smuzhiyun #ifdef __mips64
242*4882a593Smuzhiyun #define SZREG	8
243*4882a593Smuzhiyun #else
244*4882a593Smuzhiyun #define SZREG	4
245*4882a593Smuzhiyun #endif
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun /*
248*4882a593Smuzhiyun  * Use the following macros in assemblercode to load/store registers,
249*4882a593Smuzhiyun  * pointers etc.
250*4882a593Smuzhiyun  */
251*4882a593Smuzhiyun #if (_MIPS_SIM == _MIPS_SIM_ABI32)
252*4882a593Smuzhiyun #define REG_S		sw
253*4882a593Smuzhiyun #define REG_L		lw
254*4882a593Smuzhiyun #define REG_SUBU	subu
255*4882a593Smuzhiyun #define REG_ADDU	addu
256*4882a593Smuzhiyun #endif
257*4882a593Smuzhiyun #if (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64)
258*4882a593Smuzhiyun #define REG_S		sd
259*4882a593Smuzhiyun #define REG_L		ld
260*4882a593Smuzhiyun #define REG_SUBU	dsubu
261*4882a593Smuzhiyun #define REG_ADDU	daddu
262*4882a593Smuzhiyun #endif
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun /*
265*4882a593Smuzhiyun  * How to add/sub/load/store/shift C int variables.
266*4882a593Smuzhiyun  */
267*4882a593Smuzhiyun #if (_MIPS_SZINT == 32)
268*4882a593Smuzhiyun #define INT_ADD		add
269*4882a593Smuzhiyun #define INT_ADDU	addu
270*4882a593Smuzhiyun #define INT_ADDI	addi
271*4882a593Smuzhiyun #define INT_ADDIU	addiu
272*4882a593Smuzhiyun #define INT_SUB		sub
273*4882a593Smuzhiyun #define INT_SUBU	subu
274*4882a593Smuzhiyun #define INT_L		lw
275*4882a593Smuzhiyun #define INT_S		sw
276*4882a593Smuzhiyun #define INT_SLL		sll
277*4882a593Smuzhiyun #define INT_SLLV	sllv
278*4882a593Smuzhiyun #define INT_SRL		srl
279*4882a593Smuzhiyun #define INT_SRLV	srlv
280*4882a593Smuzhiyun #define INT_SRA		sra
281*4882a593Smuzhiyun #define INT_SRAV	srav
282*4882a593Smuzhiyun #endif
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun #if (_MIPS_SZINT == 64)
285*4882a593Smuzhiyun #define INT_ADD		dadd
286*4882a593Smuzhiyun #define INT_ADDU	daddu
287*4882a593Smuzhiyun #define INT_ADDI	daddi
288*4882a593Smuzhiyun #define INT_ADDIU	daddiu
289*4882a593Smuzhiyun #define INT_SUB		dsub
290*4882a593Smuzhiyun #define INT_SUBU	dsubu
291*4882a593Smuzhiyun #define INT_L		ld
292*4882a593Smuzhiyun #define INT_S		sd
293*4882a593Smuzhiyun #define INT_SLL		dsll
294*4882a593Smuzhiyun #define INT_SLLV	dsllv
295*4882a593Smuzhiyun #define INT_SRL		dsrl
296*4882a593Smuzhiyun #define INT_SRLV	dsrlv
297*4882a593Smuzhiyun #define INT_SRA		dsra
298*4882a593Smuzhiyun #define INT_SRAV	dsrav
299*4882a593Smuzhiyun #endif
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun /*
302*4882a593Smuzhiyun  * How to add/sub/load/store/shift C long variables.
303*4882a593Smuzhiyun  */
304*4882a593Smuzhiyun #if (_MIPS_SZLONG == 32)
305*4882a593Smuzhiyun #define LONG_ADD	add
306*4882a593Smuzhiyun #define LONG_ADDU	addu
307*4882a593Smuzhiyun #define LONG_ADDI	addi
308*4882a593Smuzhiyun #define LONG_ADDIU	addiu
309*4882a593Smuzhiyun #define LONG_SUB	sub
310*4882a593Smuzhiyun #define LONG_SUBU	subu
311*4882a593Smuzhiyun #define LONG_L		lw
312*4882a593Smuzhiyun #define LONG_S		sw
313*4882a593Smuzhiyun #define LONG_SP		swp
314*4882a593Smuzhiyun #define LONG_SLL	sll
315*4882a593Smuzhiyun #define LONG_SLLV	sllv
316*4882a593Smuzhiyun #define LONG_SRL	srl
317*4882a593Smuzhiyun #define LONG_SRLV	srlv
318*4882a593Smuzhiyun #define LONG_SRA	sra
319*4882a593Smuzhiyun #define LONG_SRAV	srav
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun #define LONG		.word
322*4882a593Smuzhiyun #define LONGSIZE	4
323*4882a593Smuzhiyun #define LONGMASK	3
324*4882a593Smuzhiyun #define LONGLOG		2
325*4882a593Smuzhiyun #endif
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun #if (_MIPS_SZLONG == 64)
328*4882a593Smuzhiyun #define LONG_ADD	dadd
329*4882a593Smuzhiyun #define LONG_ADDU	daddu
330*4882a593Smuzhiyun #define LONG_ADDI	daddi
331*4882a593Smuzhiyun #define LONG_ADDIU	daddiu
332*4882a593Smuzhiyun #define LONG_SUB	dsub
333*4882a593Smuzhiyun #define LONG_SUBU	dsubu
334*4882a593Smuzhiyun #define LONG_L		ld
335*4882a593Smuzhiyun #define LONG_S		sd
336*4882a593Smuzhiyun #define LONG_SP		sdp
337*4882a593Smuzhiyun #define LONG_SLL	dsll
338*4882a593Smuzhiyun #define LONG_SLLV	dsllv
339*4882a593Smuzhiyun #define LONG_SRL	dsrl
340*4882a593Smuzhiyun #define LONG_SRLV	dsrlv
341*4882a593Smuzhiyun #define LONG_SRA	dsra
342*4882a593Smuzhiyun #define LONG_SRAV	dsrav
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun #define LONG		.dword
345*4882a593Smuzhiyun #define LONGSIZE	8
346*4882a593Smuzhiyun #define LONGMASK	7
347*4882a593Smuzhiyun #define LONGLOG		3
348*4882a593Smuzhiyun #endif
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun /*
351*4882a593Smuzhiyun  * How to add/sub/load/store/shift pointers.
352*4882a593Smuzhiyun  */
353*4882a593Smuzhiyun #if (_MIPS_SZPTR == 32)
354*4882a593Smuzhiyun #define PTR_ADD		add
355*4882a593Smuzhiyun #define PTR_ADDU	addu
356*4882a593Smuzhiyun #define PTR_ADDI	addi
357*4882a593Smuzhiyun #define PTR_ADDIU	addiu
358*4882a593Smuzhiyun #define PTR_SUB		sub
359*4882a593Smuzhiyun #define PTR_SUBU	subu
360*4882a593Smuzhiyun #define PTR_L		lw
361*4882a593Smuzhiyun #define PTR_S		sw
362*4882a593Smuzhiyun #define PTR_LA		la
363*4882a593Smuzhiyun #define PTR_LI		li
364*4882a593Smuzhiyun #define PTR_SLL		sll
365*4882a593Smuzhiyun #define PTR_SLLV	sllv
366*4882a593Smuzhiyun #define PTR_SRL		srl
367*4882a593Smuzhiyun #define PTR_SRLV	srlv
368*4882a593Smuzhiyun #define PTR_SRA		sra
369*4882a593Smuzhiyun #define PTR_SRAV	srav
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun #define PTR_SCALESHIFT	2
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun #define PTR		.word
374*4882a593Smuzhiyun #define PTRSIZE		4
375*4882a593Smuzhiyun #define PTRLOG		2
376*4882a593Smuzhiyun #endif
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun #if (_MIPS_SZPTR == 64)
379*4882a593Smuzhiyun #define PTR_ADD		dadd
380*4882a593Smuzhiyun #define PTR_ADDU	daddu
381*4882a593Smuzhiyun #define PTR_ADDI	daddi
382*4882a593Smuzhiyun #define PTR_ADDIU	daddiu
383*4882a593Smuzhiyun #define PTR_SUB		dsub
384*4882a593Smuzhiyun #define PTR_SUBU	dsubu
385*4882a593Smuzhiyun #define PTR_L		ld
386*4882a593Smuzhiyun #define PTR_S		sd
387*4882a593Smuzhiyun #define PTR_LA		dla
388*4882a593Smuzhiyun #define PTR_LI		dli
389*4882a593Smuzhiyun #define PTR_SLL		dsll
390*4882a593Smuzhiyun #define PTR_SLLV	dsllv
391*4882a593Smuzhiyun #define PTR_SRL		dsrl
392*4882a593Smuzhiyun #define PTR_SRLV	dsrlv
393*4882a593Smuzhiyun #define PTR_SRA		dsra
394*4882a593Smuzhiyun #define PTR_SRAV	dsrav
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun #define PTR_SCALESHIFT	3
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun #define PTR		.dword
399*4882a593Smuzhiyun #define PTRSIZE		8
400*4882a593Smuzhiyun #define PTRLOG		3
401*4882a593Smuzhiyun #endif
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun /*
404*4882a593Smuzhiyun  * Some cp0 registers were extended to 64bit for MIPS III.
405*4882a593Smuzhiyun  */
406*4882a593Smuzhiyun #if (_MIPS_SIM == _MIPS_SIM_ABI32)
407*4882a593Smuzhiyun #define MFC0		mfc0
408*4882a593Smuzhiyun #define MTC0		mtc0
409*4882a593Smuzhiyun #endif
410*4882a593Smuzhiyun #if (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64)
411*4882a593Smuzhiyun #define MFC0		dmfc0
412*4882a593Smuzhiyun #define MTC0		dmtc0
413*4882a593Smuzhiyun #endif
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun #define SSNOP		sll zero, zero, 1
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun #ifdef CONFIG_SGI_IP28
418*4882a593Smuzhiyun /* Inhibit speculative stores to volatile (e.g.DMA) or invalid addresses. */
419*4882a593Smuzhiyun #include <asm/cacheops.h>
420*4882a593Smuzhiyun #define R10KCBARRIER(addr)  cache   CACHE_BARRIER, addr;
421*4882a593Smuzhiyun #else
422*4882a593Smuzhiyun #define R10KCBARRIER(addr)
423*4882a593Smuzhiyun #endif
424*4882a593Smuzhiyun 
425*4882a593Smuzhiyun #endif /* __ASM_ASM_H */
426