This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
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