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]

Re: Add SETUP_GP and others to mips sys/asm.h


Alexandre Oliva <aoliva at redhat dot com> writes:

> 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?

Please clean it up a bit (see my comments) and then commit the cleaned
up version.

Andreas

>
> 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

Please indent those nicely like (please go through the whole file and
tidy it up):
# define

>  
>  /*
>   * 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
> +*/

Pleas fix the comment.

> +#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*/

Fix the comment according to coding conventions.

> +#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

Are those not needed anywhere?  Ok, then let's remove them.

>  #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

Andreas
-- 
 Andreas Jaeger
  SuSE Labs aj at suse dot de
   private aj at arthur dot inka dot de
    http://www.suse.de/~aj


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