1 /* Copyright (C) 1997, 1998, 2002, 2003, 2004 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3 Contributed by Ralf Baechle <ralf@gnu.org>.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, write to the Free
17 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
27 # define __CAT(str1,str2) str1##str2
29 # define __CAT(str1,str2) str1/**/str2
31 # define CAT(str1,str2) __CAT(str1,str2)
35 * Macros to handle different pointer/register sizes for 32/64-bit code
37 * 64 bit address space isn't used yet, so we may use the R3000 32 bit
40 #if _MIPS_SIM == _ABIO32 || _MIPS_SIM == _ABIN32
44 #elif _MIPS_SIM == _ABI64
51 * PIC specific declarations
53 #if _MIPS_SIM == _ABIO32
55 # define CPRESTORE(register) \
57 # define CPLOAD(register) \
60 # define CPRESTORE(register)
61 # define CPLOAD(register)
64 # define CPADD(register) \
68 * Set gp when at 1st instruction
74 /* Set gp when not at 1st instruction */
75 # define SETUP_GPX(r) \
77 move r, $31; /* Save old ra. */ \
78 bal 10f; /* Find addr of cpload. */ \
84 # define SETUP_GPX_L(r, l) \
86 move r, $31; /* Save old ra. */ \
87 bal l; /* Find addr of cpload. */ \
94 .cprestore x /* Save gp trigger t9/jalr conversion. */
95 # define SETUP_GP64(a, b)
96 # define SETUP_GPX64(a, b)
97 # define SETUP_GPX64_L(cp_reg, ra_save, l)
99 # define USE_ALT_CP(a)
100 #else /* _MIPS_SIM == _ABI64 || _MIPS_SIM == _ABIN32 */
102 * For callee-saved gp calling convention:
105 # define SETUP_GPX(r)
106 # define SETUP_GPX_L(r, l)
109 # define SETUP_GP64(gpoffset, proc) \
110 .cpsetup $25, gpoffset, proc
111 # define SETUP_GPX64(cp_reg, ra_save) \
112 move ra_save, $31; /* Save old ra. */ \
114 bal 10f; /* Find addr of .cpsetup. */ \
118 .cpsetup $31, cp_reg, 10b; \
120 # define SETUP_GPX64_L(cp_reg, ra_save, l) \
121 move ra_save, $31; /* Save old ra. */ \
123 bal l; /* Find addr of .cpsetup. */ \
127 .cpsetup $31, cp_reg, l; \
129 # define RESTORE_GP64 \
131 /* Use alternate register for context pointer. */
132 # define USE_ALT_CP(reg) \
134 #endif /* _MIPS_SIM != _ABIO32 */
137 * Stack Frame Definitions
139 #if _MIPS_SIM == _ABIO32
140 # define NARGSAVE 4 /* Space for 4 argument registers must be allocated. */
142 #if _MIPS_SIM == _ABI64 || _MIPS_SIM == _ABIN32
143 # define NARGSAVE 0 /* No caller responsibilities. */
148 * LEAF - declare leaf routine
150 #define LEAF(symbol) \
153 .type symbol,@function; \
155 symbol: .frame sp,0,ra
158 * NESTED - declare nested routine entry point
160 #define NESTED(symbol, framesize, rpc) \
163 .type symbol,@function; \
165 symbol: .frame sp, framesize, rpc
168 * END - mark end of function
171 # define END(function) \
173 .size function,.-function
177 * EXPORT - export definition of symbol
179 #define EXPORT(symbol) \
184 * ABS - export absolute symbol
186 #define ABS(symbol,value) \
200 * Print formated string
202 #define PRINT(string) \
218 #define TTABLE(string) \
227 * MIPS IV pref instruction.
228 * Use with .set noreorder only!
230 * MIPS IV implementations are free to treat this as a nop. The R5000
231 * is one of them. So we should have an option not to use this instruction.
233 #if (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5) || \
234 (_MIPS_ISA == _MIPS_ISA_MIPS32) || (_MIPS_ISA == _MIPS_ISA_MIPS64)
235 # define PREF(hint,addr) \
237 # define PREFX(hint,addr) \
245 * MIPS ISA IV/V movn/movz instructions and equivalents for older CPUs.
247 #if _MIPS_ISA == _MIPS_ISA_MIPS1
248 # define MOVN(rd,rs,rt) \
255 # define MOVZ(rd,rs,rt) \
262 #endif /* _MIPS_ISA == _MIPS_ISA_MIPS1 */
263 #if (_MIPS_ISA == _MIPS_ISA_MIPS2) || (_MIPS_ISA == _MIPS_ISA_MIPS3)
264 # define MOVN(rd,rs,rt) \
271 # define MOVZ(rd,rs,rt) \
278 #endif /* (_MIPS_ISA == _MIPS_ISA_MIPS2) || (_MIPS_ISA == _MIPS_ISA_MIPS3) */
279 #if (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5) || \
280 (_MIPS_ISA == _MIPS_ISA_MIPS32) || (_MIPS_ISA == _MIPS_ISA_MIPS64)
281 # define MOVN(rd,rs,rt) \
283 # define MOVZ(rd,rs,rt) \
285 #endif /* (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5) */
290 #if _MIPS_SIM == _ABI64 || _MIPS_SIM == _ABIN32
301 #if _MIPS_SIM == _ABI64 || _MIPS_SIM == _ABIN32
308 * Use the following macros in assemblercode to load/store registers,
320 * How to add/sub/load/store/shift C int variables.
322 #if (_MIPS_SZINT == 32)
324 # define INT_ADDI addi
325 # define INT_ADDU addu
326 # define INT_ADDIU addiu
328 # define INT_SUBI subi
329 # define INT_SUBU subu
330 # define INT_SUBIU subu
335 #if (_MIPS_SZINT == 64)
336 # define INT_ADD dadd
337 # define INT_ADDI daddi
338 # define INT_ADDU daddu
339 # define INT_ADDIU daddiu
340 # define INT_SUB dadd
341 # define INT_SUBI dsubi
342 # define INT_SUBU dsubu
343 # define INT_SUBIU dsubu
349 * How to add/sub/load/store/shift C long variables.
351 #if (_MIPS_SZLONG == 32)
352 # define LONG_ADD add
353 # define LONG_ADDI addi
354 # define LONG_ADDU addu
355 # define LONG_ADDIU addiu
356 # define LONG_SUB add
357 # define LONG_SUBI subi
358 # define LONG_SUBU subu
359 # define LONG_SUBIU subu
362 # define LONG_SLL sll
363 # define LONG_SLLV sllv
364 # define LONG_SRL srl
365 # define LONG_SRLV srlv
366 # define LONG_SRA sra
367 # define LONG_SRAV srav
370 #if (_MIPS_SZLONG == 64)
371 # define LONG_ADD dadd
372 # define LONG_ADDI daddi
373 # define LONG_ADDU daddu
374 # define LONG_ADDIU daddiu
375 # define LONG_SUB dadd
376 # define LONG_SUBI dsubi
377 # define LONG_SUBU dsubu
378 # define LONG_SUBIU dsubu
381 # define LONG_SLL dsll
382 # define LONG_SLLV dsllv
383 # define LONG_SRL dsrl
384 # define LONG_SRLV dsrlv
385 # define LONG_SRA dsra
386 # define LONG_SRAV dsrav
390 * How to add/sub/load/store/shift pointers.
392 #if (_MIPS_SIM == _ABIO32 && _MIPS_SZPTR == 32)
394 # define PTR_ADDI addi
395 # define PTR_ADDU addu
396 # define PTR_ADDIU addiu
398 # define PTR_SUBI subi
399 # define PTR_SUBU subu
400 # define PTR_SUBIU subu
405 # define PTR_SLLV sllv
407 # define PTR_SRLV srlv
409 # define PTR_SRAV srav
411 # define PTR_SCALESHIFT 2
414 #if _MIPS_SIM == _ABIN32
416 # define PTR_ADDI addi
417 # define PTR_ADDU add /* no u */
418 # define PTR_ADDIU addi /* no u */
420 # define PTR_SUBI subi
421 # define PTR_SUBU sub /* no u */
422 # define PTR_SUBIU sub /* no u */
427 # define PTR_SLLV sllv
429 # define PTR_SRLV srlv
431 # define PTR_SRAV srav
433 # define PTR_SCALESHIFT 2
436 #if (_MIPS_SIM == _ABIO32 && _MIPS_SZPTR == 64 /* o64??? */) \
437 || _MIPS_SIM == _ABI64
438 # define PTR_ADD dadd
439 # define PTR_ADDI daddi
440 # define PTR_ADDU daddu
441 # define PTR_ADDIU daddiu
442 # define PTR_SUB dadd
443 # define PTR_SUBI dsubi
444 # define PTR_SUBU dsubu
445 # define PTR_SUBIU dsubu
449 # define PTR_SLL dsll
450 # define PTR_SLLV dsllv
451 # define PTR_SRL dsrl
452 # define PTR_SRLV dsrlv
453 # define PTR_SRA dsra
454 # define PTR_SRAV dsrav
456 # define PTR_SCALESHIFT 3
460 * Some cp0 registers were extended to 64bit for MIPS III.
462 #if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2) || \
463 (_MIPS_ISA == _MIPS_ISA_MIPS32)
467 #if (_MIPS_ISA == _MIPS_ISA_MIPS3) || (_MIPS_ISA == _MIPS_ISA_MIPS4) || \
468 (_MIPS_ISA == _MIPS_ISA_MIPS5) || (_MIPS_ISA == _MIPS_ISA_MIPS64)
473 #endif /* sys/asm.h */