1 /* Copyright (C) 1997-2016 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, see
17 <http://www.gnu.org/licenses/>. */
25 # define __CAT(str1,str2) str1##str2
26 # define CAT(str1,str2) __CAT(str1,str2)
29 /* Redefined as nonempty in the internal header. */
30 #define __mips_cfi_startproc /* Empty. */
31 #define __mips_cfi_endproc /* Empty. */
34 * Macros to handle different pointer/register sizes for 32/64-bit code
36 * 64 bit address space isn't used yet, so we may use the R3000 32 bit
39 #if _MIPS_SIM == _ABIO32 || _MIPS_SIM == _ABIN32
43 #elif _MIPS_SIM == _ABI64
50 * PIC specific declarations
52 #if _MIPS_SIM == _ABIO32
54 # define CPRESTORE(register) \
56 # define CPLOAD(register) \
59 # define CPRESTORE(register)
60 # define CPLOAD(register)
63 # define CPADD(register) \
67 * Set gp when at 1st instruction
73 /* Set gp when not at 1st instruction */
74 # define SETUP_GPX(r) \
76 move r, $31; /* Save old ra. */ \
77 bal 10f; /* Find addr of cpload. */ \
83 # define SETUP_GPX_L(r, l) \
85 move r, $31; /* Save old ra. */ \
86 bal l; /* Find addr of cpload. */ \
93 .cprestore x /* Save gp trigger t9/jalr conversion. */
94 # define SETUP_GP64(a, b)
95 # define SETUP_GPX64(a, b)
96 # define SETUP_GPX64_L(cp_reg, ra_save, l)
98 # define USE_ALT_CP(a)
99 #else /* _MIPS_SIM == _ABI64 || _MIPS_SIM == _ABIN32 */
101 * For callee-saved gp calling convention:
104 # define SETUP_GPX(r)
105 # define SETUP_GPX_L(r, l)
108 # define SETUP_GP64(gpoffset, proc) \
109 .cpsetup $25, gpoffset, proc
110 # define SETUP_GPX64(cp_reg, ra_save) \
111 move ra_save, $31; /* Save old ra. */ \
113 bal 10f; /* Find addr of .cpsetup. */ \
117 .cpsetup $31, cp_reg, 10b; \
119 # define SETUP_GPX64_L(cp_reg, ra_save, l) \
120 move ra_save, $31; /* Save old ra. */ \
122 bal l; /* Find addr of .cpsetup. */ \
126 .cpsetup $31, cp_reg, l; \
128 # define RESTORE_GP64 \
130 /* Use alternate register for context pointer. */
131 # define USE_ALT_CP(reg) \
133 #endif /* _MIPS_SIM != _ABIO32 */
136 * Stack Frame Definitions
138 #if _MIPS_SIM == _ABIO32
139 # define NARGSAVE 4 /* Space for 4 argument registers must be allocated. */
141 #if _MIPS_SIM == _ABI64 || _MIPS_SIM == _ABIN32
142 # define NARGSAVE 0 /* No caller responsibilities. */
147 * LEAF - declare leaf routine
149 #define LEAF(symbol) \
152 .type symbol,@function; \
154 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; \
169 * END - mark end of function
172 # define END(function) \
173 __mips_cfi_endproc; \
175 .size function,.-function
179 * EXPORT - export definition of symbol
181 #define EXPORT(symbol) \
183 symbol: __mips_cfi_startproc
186 * ABS - export absolute symbol
188 #define ABS(symbol,value) \
202 * Print formated string
204 #define PRINT(string) \
220 #define TTABLE(string) \
229 * MIPS IV pref instruction.
230 * Use with .set noreorder only!
232 * MIPS IV implementations are free to treat this as a nop. The R5000
233 * is one of them. So we should have an option not to use this instruction.
235 #if (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5) || \
236 (_MIPS_ISA == _MIPS_ISA_MIPS32) || (_MIPS_ISA == _MIPS_ISA_MIPS64)
237 # define PREF(hint,addr) \
239 # define PREFX(hint,addr) \
242 # define PREF(hint,addr)
243 # define PREFX(hint,addr)
247 * MIPS ISA IV/V movn/movz instructions and equivalents for older CPUs.
249 #if _MIPS_ISA == _MIPS_ISA_MIPS1
250 # define MOVN(rd,rs,rt) \
257 # define MOVZ(rd,rs,rt) \
264 #endif /* _MIPS_ISA == _MIPS_ISA_MIPS1 */
265 #if (_MIPS_ISA == _MIPS_ISA_MIPS2) || (_MIPS_ISA == _MIPS_ISA_MIPS3)
266 # define MOVN(rd,rs,rt) \
273 # define MOVZ(rd,rs,rt) \
280 #endif /* (_MIPS_ISA == _MIPS_ISA_MIPS2) || (_MIPS_ISA == _MIPS_ISA_MIPS3) */
281 #if (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5) || \
282 (_MIPS_ISA == _MIPS_ISA_MIPS32) || (_MIPS_ISA == _MIPS_ISA_MIPS64)
283 # define MOVN(rd,rs,rt) \
285 # define MOVZ(rd,rs,rt) \
287 #endif /* (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5) */
292 #if _MIPS_SIM == _ABI64 || _MIPS_SIM == _ABIN32
303 #if _MIPS_SIM == _ABI64 || _MIPS_SIM == _ABIN32
310 * Use the following macros in assemblercode to load/store registers,
322 * How to add/sub/load/store/shift C int variables.
324 #if (_MIPS_SZINT == 32)
326 # define INT_ADDI addi
327 # define INT_ADDU addu
328 # define INT_ADDIU addiu
330 # define INT_SUBI subi
331 # define INT_SUBU subu
332 # define INT_SUBIU subu
337 #if (_MIPS_SZINT == 64)
338 # define INT_ADD dadd
339 # define INT_ADDI daddi
340 # define INT_ADDU daddu
341 # define INT_ADDIU daddiu
342 # define INT_SUB dsub
343 # define INT_SUBI dsubi
344 # define INT_SUBU dsubu
345 # define INT_SUBIU dsubu
351 * How to add/sub/load/store/shift C long variables.
353 #if (_MIPS_SZLONG == 32)
354 # define LONG_ADD add
355 # define LONG_ADDI addi
356 # define LONG_ADDU addu
357 # define LONG_ADDIU addiu
358 # define LONG_SUB sub
359 # define LONG_SUBI subi
360 # define LONG_SUBU subu
361 # define LONG_SUBIU subu
364 # define LONG_SLL sll
365 # define LONG_SLLV sllv
366 # define LONG_SRL srl
367 # define LONG_SRLV srlv
368 # define LONG_SRA sra
369 # define LONG_SRAV srav
372 #if (_MIPS_SZLONG == 64)
373 # define LONG_ADD dadd
374 # define LONG_ADDI daddi
375 # define LONG_ADDU daddu
376 # define LONG_ADDIU daddiu
377 # define LONG_SUB dsub
378 # define LONG_SUBI dsubi
379 # define LONG_SUBU dsubu
380 # define LONG_SUBIU dsubu
383 # define LONG_SLL dsll
384 # define LONG_SLLV dsllv
385 # define LONG_SRL dsrl
386 # define LONG_SRLV dsrlv
387 # define LONG_SRA dsra
388 # define LONG_SRAV dsrav
392 * How to add/sub/load/store/shift pointers.
394 #if (_MIPS_SIM == _ABIO32 && _MIPS_SZPTR == 32)
396 # define PTR_ADDI addi
397 # define PTR_ADDU addu
398 # define PTR_ADDIU addiu
400 # define PTR_SUBI subi
401 # define PTR_SUBU subu
402 # define PTR_SUBIU subu
407 # define PTR_SLLV sllv
409 # define PTR_SRLV srlv
411 # define PTR_SRAV srav
413 # define PTR_SCALESHIFT 2
416 #if _MIPS_SIM == _ABIN32
418 # define PTR_ADDI addi
420 # define PTR_SUBI subi
421 #if !defined __mips_isa_rev || __mips_isa_rev < 6
422 # define PTR_ADDU add /* no u */
423 # define PTR_ADDIU addi /* no u */
424 # define PTR_SUBU sub /* no u */
425 # define PTR_SUBIU sub /* no u */
427 # define PTR_ADDU addu
428 # define PTR_ADDIU addiu
429 # define PTR_SUBU subu
430 # define PTR_SUBIU subu
436 # define PTR_SLLV sllv
438 # define PTR_SRLV srlv
440 # define PTR_SRAV srav
442 # define PTR_SCALESHIFT 2
445 #if (_MIPS_SIM == _ABIO32 && _MIPS_SZPTR == 64 /* o64??? */) \
446 || _MIPS_SIM == _ABI64
447 # define PTR_ADD dadd
448 # define PTR_ADDI daddi
449 # define PTR_ADDU daddu
450 # define PTR_ADDIU daddiu
451 # define PTR_SUB dsub
452 # define PTR_SUBI dsubi
453 # define PTR_SUBU dsubu
454 # define PTR_SUBIU dsubu
458 # define PTR_SLL dsll
459 # define PTR_SLLV dsllv
460 # define PTR_SRL dsrl
461 # define PTR_SRLV dsrlv
462 # define PTR_SRA dsra
463 # define PTR_SRAV dsrav
465 # define PTR_SCALESHIFT 3
469 * Some cp0 registers were extended to 64bit for MIPS III.
471 #if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2) || \
472 (_MIPS_ISA == _MIPS_ISA_MIPS32)
476 #if (_MIPS_ISA == _MIPS_ISA_MIPS3) || (_MIPS_ISA == _MIPS_ISA_MIPS4) || \
477 (_MIPS_ISA == _MIPS_ISA_MIPS5) || (_MIPS_ISA == _MIPS_ISA_MIPS64)
482 /* The MIPS architectures do not have a uniform memory model. Particular
483 platforms may provide additional guarantees - for instance, the R4000
484 LL and SC instructions implicitly perform a SYNC, and the 4K promises
487 However, in the absence of those guarantees, we must assume weak ordering
488 and SYNC explicitly where necessary.
490 Some obsolete MIPS processors may not support the SYNC instruction. This
491 applies to "true" MIPS I processors; most of the processors which compile
492 using MIPS I implement parts of MIPS II. */
495 # define MIPS_SYNC sync
498 #endif /* sys/asm.h */