Merge branch 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[linux-2.6-microblaze.git] / arch / mips / include / asm / asm.h
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 */