This is the mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]