This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
Add SETUP_GP and others to mips sys/asm.h
On Mar 14, 2003, Alexandre Oliva <aoliva at redhat dot com> wrote:
> On Mar 13, 2003, Alexandre Oliva <aoliva at redhat dot com> wrote:
>> Since SETUP_GP, an ABI-specified macro, expands to .cpsetup in o32,
>> and will expand to nothing on n32 and n64, we'd better be using
>> them right away.
Except that it was not there yet, contrary to my recollection. Oops.
Here's a patch that adds SETUP_GP and a number of other macros
mandated by the N32 and N64 ABIs to ease transitioning from O32. Ok
to install?
Index: ChangeLog
2003-03-14 Alexandre Oliva <aoliva at redhat dot com>
* sysdeps/mips/sys/asm.h (PTR, PTRSIZE, PTRLOG): Adjust for
all 3 ABIs.
(CPADD): Define for all of them.
(SETUP_GP, SETUP_GPX, SETUP_GPX_L, SAVE_GP, SETUP_GP64,
SETUP_GPX64, SETUP_GPX64_L, RESTORE_GP64, USE_ALT_CP,
NARGSAVE): Define per ABI spec.
(END): Don't redefine.
(LONG_SLL, LONG_SLLV, LONG_SRL, LONG_SRLV, LONG_SRA,
LONG_SRAV): Don't define.
(PTR_ADD, PTR_ADDI, PTR_ADDU, PTR_ADDIU, PTR_SUB, PTR_SUBI,
PTR_SUBU, PTR_SUBIU, PTR_L, PTR_S, PTR_SLL, PTR_SLLV, PTR_SRL,
PTR_SRLV, PTR_SRA, PTR_SRAV, PTR_SCALESHIFT): Define for n32.
(PTR_LA): Define for all 3 ABIs.
Index: sysdeps/mips/sys/asm.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/mips/sys/asm.h,v
retrieving revision 1.2
diff -u -p -r1.2 asm.h
--- sysdeps/mips/sys/asm.h 6 Jul 2001 04:56:01 -0000 1.2
+++ sysdeps/mips/sys/asm.h 14 Mar 2003 04:46:56 -0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1998, 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ralf Baechle <ralf at gnu dot org>.
@@ -37,26 +37,113 @@
* 64 bit address space isn't used yet, so we may use the R3000 32 bit
* defines for now.
*/
+#if (_MIPS_SIM == _MIPS_SIM_ABI32) || (_MIPS_SIM == _MIPS_SIM_NABI32)
#define PTR .word
#define PTRSIZE 4
#define PTRLOG 2
+#elif (_MIPS_SIM == _MIPS_SIM_ABI64)
+#define PTR .dword
+#define PTRSIZE 8
+#define PTRLOG 3
+#endif
/*
* PIC specific declarations
*/
+#if (_MIPS_SIM == _MIPS_SIM_ABI32)
#ifdef __PIC__
#define CPRESTORE(register) \
.cprestore register
-#define CPADD(register) \
- .cpadd register
#define CPLOAD(register) \
.cpload register
#else
#define CPRESTORE(register)
-#define CPADD(register)
#define CPLOAD(register)
#endif
+#define CPADD(register) \
+ .cpadd register
+
+/*
+ * Set gp when at 1st instruction
+ */
+#define SETUP_GP \
+ .set noreorder; \
+ .cpload $25; \
+ .set reorder
+/* Set gp when not at 1st instruction */
+#define SETUP_GPX(r) \
+ .set noreorder; \
+ move r, $31; /* save old ra */ \
+ bal 10f; /* find addr of cpload */\
+ nop; \
+10: \
+ .cpload $31; \
+ move $31, r; \
+ .set reorder;
+#define SETUP_GPX_L(r,l) \
+ .set noreorder; \
+ move r, $31; /* save old ra */ \
+ bal l; /* find addr of cpload */\
+ nop; \
+l: \
+ .cpload $31; \
+ move $31, r; \
+ .set reorder;
+#define SAVE_GP(x) \
+ .cprestore x; /* save gp trigger t9/jalr conversion */
+#define SETUP_GP64(a,b)
+#define SETUP_GPX64(a,b)
+#define SETUP_GPX64_L(cp_reg,ra_save, l)
+#define RESTORE_GP64
+#define USE_ALT_CP(a)
+#else /* (_MIPS_SIM == _MIPS_SIM_ABI64) || (_MIPS_SIM == _MIPS_SIM_NABI32) */
+/*
+ * For callee-saved gp calling convention:
+ */
+#define SETUP_GP
+#define SETUP_GPX(r)
+#define SETUP_GPX_L(r,l)
+#define SAVE_GP(x)
+
+#define SETUP_GP64(gpoffset,proc) \
+ .cpsetup $25, gpoffset, proc
+#define SETUP_GPX64(cp_reg,ra_save) \
+ move ra_save, $31; /* save old ra */ \
+ .set noreorder; \
+ bal 10f; /* find addr of .cpsetup */ \
+ nop; \
+10: \
+ .set reorder; \
+ .cpsetup $31, cp_reg, 10b; \
+ move $31, ra_save
+#define SETUP_GPX64_L(cp_reg,ra_save, l) \
+ move ra_save, $31; /* save old ra */ \
+ .set noreorder; \
+ bal l; /* find addr of .cpsetup */ \
+ nop; \
+l: \
+ .set reorder; \
+ .cpsetup $31, cp_reg, l; \
+ move $31, ra_save
+#define RESTORE_GP64 \
+ .cpreturn
+#define USE_ALT_CP(reg) \
+ .cplocal reg /* use alternate register for context pointer
+*/
+#endif /* _MIPS_SIM != _MIPS_SIM_ABI32 */
+
+/*
+ * Stack Frame Definitions
+ */
+#if (_MIPS_SIM == _MIPS_SIM_ABI32)
+#define NARGSAVE 4 /* space for 4 arg regs must be alloc*/
+#endif
+#if (_MIPS_SIM == _MIPS_SIM_ABI64 || _MIPS_SIM == _MIPS_SIM_NABI32)
+#define NARGSAVE 0 /* no caller responsibilities */
+#endif
+
+
/*
* LEAF - declare leaf routine
*/
@@ -80,9 +167,11 @@ symbol: .frame sp, framesize, rpc
/*
* END - mark end of function
*/
+#ifndef END
#define END(function) \
.end function; \
.size function,.-function
+#endif
/*
* EXPORT - export definition of symbol
@@ -219,19 +308,12 @@ symbol = value
* Use the following macros in assemblercode to load/store registers,
* pointers etc.
*/
-#if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2)
+#if (_MIPS_SIM == _MIPS_SIM_ABI32)
#define REG_S sw
#define REG_L lw
-#define PTR_SUBU subu
-#define PTR_ADDU addu
-#endif
-#if (_MIPS_ISA == _MIPS_ISA_MIPS3) || (_MIPS_ISA == _MIPS_ISA_MIPS4) || \
- (_MIPS_ISA == _MIPS_ISA_MIPS5)
+#else
#define REG_S sd
#define REG_L ld
-/* We still live in a 32 bit address space ... */
-#define PTR_SUBU subu
-#define PTR_ADDU addu
#endif
/*
@@ -248,12 +330,6 @@ symbol = value
#define INT_SUBIU subu
#define INT_L lw
#define INT_S sw
-#define LONG_SLL sll
-#define LONG_SLLV sllv
-#define LONG_SRL srl
-#define LONG_SRLV srlv
-#define LONG_SRA sra
-#define LONG_SRAV srav
#endif
#if (_MIPS_SZINT == 64)
@@ -267,12 +343,6 @@ symbol = value
#define INT_SUBIU dsubu
#define INT_L ld
#define INT_S sd
-#define LONG_SLL dsll
-#define LONG_SLLV dsllv
-#define LONG_SRL dsrl
-#define LONG_SRLV dsrlv
-#define LONG_SRA dsra
-#define LONG_SRAV dsrav
#endif
/*
@@ -319,7 +389,7 @@ symbol = value
/*
* How to add/sub/load/store/shift pointers.
*/
-#if (_MIPS_SZLONG == 32)
+#if (_MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZLONG == 32)
#define PTR_ADD add
#define PTR_ADDI addi
#define PTR_ADDU addu
@@ -329,6 +399,7 @@ symbol = value
#define PTR_SUBU subu
#define PTR_SUBIU subu
#define PTR_L lw
+#define PTR_LA la
#define PTR_S sw
#define PTR_SLL sll
#define PTR_SLLV sllv
@@ -340,7 +411,30 @@ symbol = value
#define PTR_SCALESHIFT 2
#endif
-#if (_MIPS_SZLONG == 64)
+#if _MIPS_SIM == _MIPS_SIM_NABI32
+#define PTR_ADD add
+#define PTR_ADDI addi
+#define PTR_ADDU add /* no u */
+#define PTR_ADDIU addi /* no u */
+#define PTR_SUB add
+#define PTR_SUBI subi
+#define PTR_SUBU sub /* no u */
+#define PTR_SUBIU sub /* no u */
+#define PTR_L lw
+#define PTR_LA la
+#define PTR_S sw
+#define PTR_SLL sll
+#define PTR_SLLV sllv
+#define PTR_SRL srl
+#define PTR_SRLV srlv
+#define PTR_SRA sra
+#define PTR_SRAV srav
+
+#define PTR_SCALESHIFT 2
+#endif
+
+#if (_MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZLONG == 64) \
+ || _MIPS_SIM == _MIPS_SIM_ABI64
#define PTR_ADD dadd
#define PTR_ADDI daddi
#define PTR_ADDU daddu
@@ -350,6 +444,7 @@ symbol = value
#define PTR_SUBU dsubu
#define PTR_SUBIU dsubu
#define PTR_L ld
+#define PTR_LA dla
#define PTR_S sd
#define PTR_SLL dsll
#define PTR_SLLV dsllv
--
Alexandre Oliva Enjoy Guarana', see http://www.ic.unicamp.br/~oliva/
Red Hat GCC Developer aoliva at {redhat dot com, gcc.gnu.org}
CS PhD student at IC-Unicamp oliva at {lsd dot ic dot unicamp dot br, gnu.org}
Free Software Evangelist Professional serial bug killer