This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
Re: [mips] ABI shouldn't depend on ISA
- From: Andreas Jaeger <aj at suse dot de>
- To: Alexandre Oliva <aoliva at redhat dot com>
- Cc: libc-alpha at sources dot redhat dot com
- Date: Tue, 25 Mar 2003 07:07:27 +0100
- Subject: Re: [mips] ABI shouldn't depend on ISA
- References: <or1y0wc7e8.fsf@free.redhat.lsd.ic.unicamp.br>
Alexandre Oliva <aoliva at redhat dot com> writes:
> Some data structures used by o32 used to change depending on the ISA
> in use. This Shouldn't Happen (TM). The assumption was that o32
> could only be built for MIPS1 and MIPS2, but this no longer holds
> (even if you extend the set to MIPS32). It is now possible to compile
> for o32 targeting any MIPS architecture, regardless of its being 32-
> or 64-bits, even though you won't be able to take advantage of most of
> the 64-bit opcodes in o32 land, since o32 uses only 32-bits per
> register.
>
> This patch adds support for MIPS32 and MIPS64 ISAs, and fixes some
> code, that used to depend on the ISA or other macros, to depend on ABI
> properties instead, where this change is appropriate. Ok?
>
>
> Index: ChangeLog
> from Alexandre Oliva <aoliva at redhat dot com>
>
> * sysdeps/mips/sgidefs.h (_MIPS_ISA_MIPS32, _MIPS_ISA_MIPS64):
> Define.
> * sysdeps/mips/sys/asm.h: Test _MIPS_ISA against them on all
> ISA tests.
> (ALSZ, ALMASK, SZREG, REG_S, REG_L): Define based on ABI, not ISA.
> (PTR_ADD, etc): Test _MIPS_SZPTR instead of _MIPS_SZLONG.
> * sysdeps/unix/sysv/linux/mips/bits/sigaction.h: Use _MIPS_SZPTR
> to decide whether to add padding.
> * sysdeps/unix/sysv/linux/mips/bits/sigaction.h: Use _MIPS_SZPTR
> to decide whether to add padding.
> * sysdeps/unix/sysv/linux/mips/kernel_sigaction.h (struct
> old_kernel_sigaction): Likewise.
>
> Index: sysdeps/mips/sgidefs.h
> ===================================================================
> RCS file: /cvs/glibc/libc/sysdeps/mips/sgidefs.h,v
> retrieving revision 1.2
> diff -u -p -r1.2 sgidefs.h
> --- sysdeps/mips/sgidefs.h 6 Jul 2001 04:56:00 -0000 1.2
> +++ sysdeps/mips/sgidefs.h 25 Mar 2003 05:53:54 -0000
> @@ -1,4 +1,4 @@
> -/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
> +/* Copyright (C) 1996, 1997, 1998, 2003 Free Software Foundation, Inc.
> This file is part of the GNU C Library.
> Contributed by Ralf Baechle <ralf at gnu dot org>.
>
> @@ -28,6 +28,8 @@
> #define _MIPS_ISA_MIPS3 3
> #define _MIPS_ISA_MIPS4 4
> #define _MIPS_ISA_MIPS5 5
> +#define _MIPS_ISA_MIPS32 6
> +#define _MIPS_ISA_MIPS64 7
I know there weren't comments before for this but can you add them
nevertheless?
Ok with that change,
Andreas
> /*
> * Subprogram calling convention
> Index: sysdeps/mips/sys/asm.h
> ===================================================================
> RCS file: /cvs/glibc/libc/sysdeps/mips/sys/asm.h,v
> retrieving revision 1.3
> diff -u -p -r1.3 asm.h
> --- sysdeps/mips/sys/asm.h 14 Mar 2003 11:06:32 -0000 1.3
> +++ sysdeps/mips/sys/asm.h 25 Mar 2003 05:53:54 -0000
> @@ -230,7 +230,8 @@ symbol = value
> * MIPS IV implementations are free to treat this as a nop. The R5000
> * is one of them. So we should have an option not to use this instruction.
> */
> -#if (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5)
> +#if (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5) || \
> + (_MIPS_ISA == _MIPS_ISA_MIPS32) || (_MIPS_ISA == _MIPS_ISA_MIPS64)
> # define PREF(hint,addr) \
> pref hint,addr
> # define PREFX(hint,addr) \
> @@ -275,7 +276,8 @@ symbol = value
> .set pop; \
> 9:
> #endif /* (_MIPS_ISA == _MIPS_ISA_MIPS2) || (_MIPS_ISA == _MIPS_ISA_MIPS3) */
> -#if (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5)
> +#if (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5) || \
> + (_MIPS_ISA == _MIPS_ISA_MIPS32) || (_MIPS_ISA == _MIPS_ISA_MIPS64)
> # define MOVN(rd,rs,rt) \
> movn rd,rs,rt
> # define MOVZ(rd,rs,rt) \
> @@ -285,20 +287,18 @@ symbol = value
> /*
> * Stack alignment
> */
> -#if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2)
> -# define ALSZ 7
> -# define ALMASK ~7
> -#endif
> -#if (_MIPS_ISA == _MIPS_ISA_MIPS3) || (_MIPS_ISA == _MIPS_ISA_MIPS4) || \
> - (_MIPS_ISA == _MIPS_ISA_MIPS5)
> +#if (_MIPS_SIM == _MIPS_SIM_ABI64) || (_MIPS_SIM == _MIPS_SIM_NABI32)
> # define ALSZ 15
> # define ALMASK ~15
> +#else
> +# define ALSZ 7
> +# define ALMASK ~7
> #endif
>
> /*
> * Size of a register
> */
> -#ifdef __mips64
> +#if (_MIPS_SIM == _MIPS_SIM_ABI64) || (_MIPS_SIM == _MIPS_SIM_NABI32)
> # define SZREG 8
> #else
> # define SZREG 4
> @@ -308,7 +308,7 @@ symbol = value
> * Use the following macros in assemblercode to load/store registers,
> * pointers etc.
> */
> -#if (_MIPS_SIM == _MIPS_SIM_ABI32)
> +#if (SZREG == 4)
> # define REG_S sw
> # define REG_L lw
> #else
> @@ -389,7 +389,7 @@ symbol = value
> /*
> * How to add/sub/load/store/shift pointers.
> */
> -#if (_MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZLONG == 32)
> +#if (_MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32)
> # define PTR_ADD add
> # define PTR_ADDI addi
> # define PTR_ADDU addu
> @@ -433,7 +433,7 @@ symbol = value
> # define PTR_SCALESHIFT 2
> #endif
>
> -#if (_MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZLONG == 64) \
> +#if (_MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 64 /* o64??? */) \
> || _MIPS_SIM == _MIPS_SIM_ABI64
> # define PTR_ADD dadd
> # define PTR_ADDI daddi
> @@ -459,12 +459,13 @@ symbol = value
> /*
> * Some cp0 registers were extended to 64bit for MIPS III.
> */
> -#if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2)
> +#if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2) || \
> + (_MIPS_ISA == _MIPS_ISA_MIPS32)
> # define MFC0 mfc0
> # define MTC0 mtc0
> #endif
> #if (_MIPS_ISA == _MIPS_ISA_MIPS3) || (_MIPS_ISA == _MIPS_ISA_MIPS4) || \
> - (_MIPS_ISA == _MIPS_ISA_MIPS5)
> + (_MIPS_ISA == _MIPS_ISA_MIPS5) || (_MIPS_ISA == _MIPS_ISA_MIPS64)
> # define MFC0 dmfc0
> # define MTC0 dmtc0
> #endif
> Index: sysdeps/unix/sysv/linux/mips/bits/sigaction.h
> ===================================================================
> RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/mips/bits/sigaction.h,v
> retrieving revision 1.11
> diff -u -p -r1.11 sigaction.h
> --- sysdeps/unix/sysv/linux/mips/bits/sigaction.h 6 Jul 2001 04:56:18 -0000 1.11
> +++ sysdeps/unix/sysv/linux/mips/bits/sigaction.h 25 Mar 2003 05:53:54 -0000
> @@ -1,5 +1,6 @@
> /* The proper definitions for Linux/MIPS's sigaction.
> - Copyright (C) 1993,94,95,97,98,99,2000 Free Software Foundation, Inc.
> + Copyright (C) 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2003
> + Free Software Foundation, Inc.
> This file is part of the GNU C Library.
>
> The GNU C Library is free software; you can redistribute it and/or
> @@ -49,7 +50,7 @@ struct sigaction
> /* Restore handler. */
> void (*sa_restorer) (void);
>
> -#if _MIPS_ISA == _MIPS_ISA_MIPS1 || _MIPS_ISA == _MIPS_ISA_MIPS2
> +#if _MIPS_SZPTR < 64
> int sa_resv[1];
> #endif
> };
> Index: sysdeps/unix/sysv/linux/mips/kernel_sigaction.h
> ===================================================================
> RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/mips/kernel_sigaction.h,v
> retrieving revision 1.5
> diff -u -p -r1.5 kernel_sigaction.h
> --- sysdeps/unix/sysv/linux/mips/kernel_sigaction.h 14 Mar 2003 07:49:05 -0000 1.5
> +++ sysdeps/unix/sysv/linux/mips/kernel_sigaction.h 25 Mar 2003 05:53:54 -0000
> @@ -12,7 +12,7 @@ struct old_kernel_sigaction {
>
> /* Abi says here follows reserved int[2] */
> void (*sa_restorer)(void);
> -#if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2)
> +#if (_MIPS_SZPTR < 64)
> /*
> * For 32 bit code we have to pad struct sigaction to get
> * constant size for the ABI
Andreas
--
Andreas Jaeger
SuSE Labs aj at suse dot de
private aj at arthur dot inka dot de
http://www.suse.de/~aj