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) 1995, 1996, 1997, 1999, 2001 by Ralf Baechle
7  * Copyright (C) 1999 by Silicon Graphics, Inc.
8  * Copyright (C) 2001 MIPS Technologies, Inc.
9  * Copyright (C) 2002  Maciej W. Rozycki
10  *
11  * Some useful macros for MIPS assembler code
12  *
13  * Some of the routines below contain useless nops that will be optimized
14  * away by gas in -O mode. These nops are however required to fill delay
15  * slots in noreorder mode.
16  */
17 #ifndef __ASM_ASM_H
18 #define __ASM_ASM_H
19 
20 #include <asm/sgidefs.h>
21 #include <asm/asm-eva.h>
22 
23 /*
24  * LEAF - declare leaf routine
25  */
26 #define LEAF(symbol)					\
27 		.globl	symbol;				\
28 		.align	2;				\
29 		.type	symbol, @function;		\
30 		.ent	symbol, 0;			\
31 symbol:		.frame	sp, 0, ra;			\
32 		.cfi_startproc;				\
33 		.insn
34 
35 /*
36  * NESTED - declare nested routine entry point
37  */
38 #define NESTED(symbol, framesize, rpc)			\
39 		.globl	symbol;				\
40 		.align	2;				\
41 		.type	symbol, @function;		\
42 		.ent	symbol, 0;			\
43 symbol:		.frame	sp, framesize, rpc;		\
44 		.cfi_startproc;				\
45 		.insn
46 
47 /*
48  * END - mark end of function
49  */
50 #define END(function)					\
51 		.cfi_endproc;				\
52 		.end	function;			\
53 		.size	function, .-function
54 
55 /*
56  * EXPORT - export definition of symbol
57  */
58 #define EXPORT(symbol)					\
59 		.globl	symbol;				\
60 symbol:
61 
62 /*
63  * FEXPORT - export definition of a function symbol
64  */
65 #define FEXPORT(symbol)					\
66 		.globl	symbol;				\
67 		.type	symbol, @function;		\
68 symbol:		.insn
69 
70 /*
71  * ABS - export absolute symbol
72  */
73 #define ABS(symbol,value)				\
74 		.globl	symbol;				\
75 symbol		=	value
76 
77 #define PANIC(msg)					\
78 		.set	push;				\
79 		.set	reorder;			\
80 		PTR_LA	a0, 8f;				 \
81 		jal	panic;				\
82 9:		b	9b;				\
83 		.set	pop;				\
84 		TEXT(msg)
85 
86 /*
87  * Print formatted string
88  */
89 #ifdef CONFIG_PRINTK
90 #define PRINT(string)					\
91 		.set	push;				\
92 		.set	reorder;			\
93 		PTR_LA	a0, 8f;				 \
94 		jal	printk;				\
95 		.set	pop;				\
96 		TEXT(string)
97 #else
98 #define PRINT(string)
99 #endif
100 
101 #define TEXT(msg)					\
102 		.pushsection .data;			\
103 8:		.asciiz msg;				\
104 		.popsection;
105 
106 /*
107  * Stack alignment
108  */
109 #if (_MIPS_SIM == _MIPS_SIM_ABI32)
110 #define ALSZ	7
111 #define ALMASK	~7
112 #endif
113 #if (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64)
114 #define ALSZ	15
115 #define ALMASK	~15
116 #endif
117 
118 /*
119  * Macros to handle different pointer/register sizes for 32/64-bit code
120  */
121 
122 /*
123  * Size of a register
124  */
125 #ifdef __mips64
126 #define SZREG	8
127 #else
128 #define SZREG	4
129 #endif
130 
131 /*
132  * Use the following macros in assemblercode to load/store registers,
133  * pointers etc.
134  */
135 #if (_MIPS_SIM == _MIPS_SIM_ABI32)
136 #define REG_S		sw
137 #define REG_L		lw
138 #define REG_SUBU	subu
139 #define REG_ADDU	addu
140 #endif
141 #if (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64)
142 #define REG_S		sd
143 #define REG_L		ld
144 #define REG_SUBU	dsubu
145 #define REG_ADDU	daddu
146 #endif
147 
148 /*
149  * How to add/sub/load/store/shift C int variables.
150  */
151 #if (_MIPS_SZINT == 32)
152 #define INT_ADD		add
153 #define INT_ADDU	addu
154 #define INT_ADDI	addi
155 #define INT_ADDIU	addiu
156 #define INT_SUB		sub
157 #define INT_SUBU	subu
158 #define INT_L		lw
159 #define INT_S		sw
160 #define INT_SLL		sll
161 #define INT_SLLV	sllv
162 #define INT_SRL		srl
163 #define INT_SRLV	srlv
164 #define INT_SRA		sra
165 #define INT_SRAV	srav
166 #endif
167 
168 #if (_MIPS_SZINT == 64)
169 #define INT_ADD		dadd
170 #define INT_ADDU	daddu
171 #define INT_ADDI	daddi
172 #define INT_ADDIU	daddiu
173 #define INT_SUB		dsub
174 #define INT_SUBU	dsubu
175 #define INT_L		ld
176 #define INT_S		sd
177 #define INT_SLL		dsll
178 #define INT_SLLV	dsllv
179 #define INT_SRL		dsrl
180 #define INT_SRLV	dsrlv
181 #define INT_SRA		dsra
182 #define INT_SRAV	dsrav
183 #endif
184 
185 /*
186  * How to add/sub/load/store/shift C long variables.
187  */
188 #if (_MIPS_SZLONG == 32)
189 #define LONG_ADD	add
190 #define LONG_ADDU	addu
191 #define LONG_ADDI	addi
192 #define LONG_ADDIU	addiu
193 #define LONG_SUB	sub
194 #define LONG_SUBU	subu
195 #define LONG_L		lw
196 #define LONG_S		sw
197 #define LONG_SP		swp
198 #define LONG_SLL	sll
199 #define LONG_SLLV	sllv
200 #define LONG_SRL	srl
201 #define LONG_SRLV	srlv
202 #define LONG_SRA	sra
203 #define LONG_SRAV	srav
204 
205 #define LONG		.word
206 #define LONGSIZE	4
207 #define LONGMASK	3
208 #define LONGLOG		2
209 #endif
210 
211 #if (_MIPS_SZLONG == 64)
212 #define LONG_ADD	dadd
213 #define LONG_ADDU	daddu
214 #define LONG_ADDI	daddi
215 #define LONG_ADDIU	daddiu
216 #define LONG_SUB	dsub
217 #define LONG_SUBU	dsubu
218 #define LONG_L		ld
219 #define LONG_S		sd
220 #define LONG_SP		sdp
221 #define LONG_SLL	dsll
222 #define LONG_SLLV	dsllv
223 #define LONG_SRL	dsrl
224 #define LONG_SRLV	dsrlv
225 #define LONG_SRA	dsra
226 #define LONG_SRAV	dsrav
227 
228 #define LONG		.dword
229 #define LONGSIZE	8
230 #define LONGMASK	7
231 #define LONGLOG		3
232 #endif
233 
234 /*
235  * How to add/sub/load/store/shift pointers.
236  */
237 #if (_MIPS_SZPTR == 32)
238 #define PTR_ADD		add
239 #define PTR_ADDU	addu
240 #define PTR_ADDI	addi
241 #define PTR_ADDIU	addiu
242 #define PTR_SUB		sub
243 #define PTR_SUBU	subu
244 #define PTR_L		lw
245 #define PTR_S		sw
246 #define PTR_LA		la
247 #define PTR_LI		li
248 #define PTR_SLL		sll
249 #define PTR_SLLV	sllv
250 #define PTR_SRL		srl
251 #define PTR_SRLV	srlv
252 #define PTR_SRA		sra
253 #define PTR_SRAV	srav
254 
255 #define PTR_SCALESHIFT	2
256 
257 #define PTR		.word
258 #define PTRSIZE		4
259 #define PTRLOG		2
260 #endif
261 
262 #if (_MIPS_SZPTR == 64)
263 #define PTR_ADD		dadd
264 #define PTR_ADDU	daddu
265 #define PTR_ADDI	daddi
266 #define PTR_ADDIU	daddiu
267 #define PTR_SUB		dsub
268 #define PTR_SUBU	dsubu
269 #define PTR_L		ld
270 #define PTR_S		sd
271 #define PTR_LA		dla
272 #define PTR_LI		dli
273 #define PTR_SLL		dsll
274 #define PTR_SLLV	dsllv
275 #define PTR_SRL		dsrl
276 #define PTR_SRLV	dsrlv
277 #define PTR_SRA		dsra
278 #define PTR_SRAV	dsrav
279 
280 #define PTR_SCALESHIFT	3
281 
282 #define PTR		.dword
283 #define PTRSIZE		8
284 #define PTRLOG		3
285 #endif
286 
287 /*
288  * Some cp0 registers were extended to 64bit for MIPS III.
289  */
290 #if (_MIPS_SIM == _MIPS_SIM_ABI32)
291 #define MFC0		mfc0
292 #define MTC0		mtc0
293 #endif
294 #if (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64)
295 #define MFC0		dmfc0
296 #define MTC0		dmtc0
297 #endif
298 
299 #define SSNOP		sll zero, zero, 1
300 
301 #ifdef CONFIG_SGI_IP28
302 /* Inhibit speculative stores to volatile (e.g.DMA) or invalid addresses. */
303 #include <asm/cacheops.h>
304 #define R10KCBARRIER(addr)  cache   Cache_Barrier, addr;
305 #else
306 #define R10KCBARRIER(addr)
307 #endif
308 
309 #endif /* __ASM_ASM_H */
310