This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Fix for compile/20000804-1.c on ppc
- From: Geoff Keating <geoffk at geoffk dot org>
- To: gcc-patches at gcc dot gnu dot org
- Cc: Corey Minyard <minyard at acm dot org>
- Date: Sat, 1 Dec 2001 09:01:32 -0800
- Subject: Fix for compile/20000804-1.c on ppc
- Reply-to: Geoff Keating <geoffk at redhat dot com>
This is the final patch I came up with.
Bootstrapped and tested on powerpc-unknown-linux-gnu.
--
- Geoffrey Keating <geoffk@geoffk.org> <geoffk@redhat.com>
===File ~/patches/cygnus/rs6000-complexlosum.patch==========
2001-12-01 Geoff Keating <geoffk@redhat.com>
Corey Minyard <minyard@acm.org>
* config/rs6000/rs6000.h (LEGITIMATE_LO_SUM_ADDRESS_P): Complex
LO_SUM addresses less than word size are not legitimate,
because they lead to invalid SUBREGs.
* config/rs6000/rs6000.c (rs6000_legitimize_address): Likewise.
Index: config/rs6000/rs6000.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.c,v
retrieving revision 1.246
diff -p -u -u -p -r1.246 rs6000.c
--- rs6000.c 2001/12/01 01:59:00 1.246
+++ rs6000.c 2001/12/01 16:56:08
@@ -1617,6 +1617,7 @@ rs6000_legitimize_address (x, oldx, mode
else if (GET_CODE (x) == PLUS
&& GET_CODE (XEXP (x, 0)) == REG
&& GET_CODE (XEXP (x, 1)) != CONST_INT
+ && GET_MODE_NUNITS (mode) == 1
&& (TARGET_HARD_FLOAT || TARGET_POWERPC64 || mode != DFmode)
&& (TARGET_POWERPC64 || mode != DImode)
&& mode != TImode)
@@ -1640,9 +1641,9 @@ rs6000_legitimize_address (x, oldx, mode
&& GET_CODE (x) != CONST_INT
&& GET_CODE (x) != CONST_DOUBLE
&& CONSTANT_P (x)
- && (TARGET_HARD_FLOAT || mode != DFmode)
- && mode != DImode
- && mode != TImode)
+ && GET_MODE_NUNITS (mode) == 1
+ && (GET_MODE_BITSIZE (mode) <= 32
+ || (TARGET_HARD_FLOAT && mode != DFmode)))
{
rtx reg = gen_reg_rtx (Pmode);
emit_insn (gen_elf_high (reg, (x)));
Index: config/rs6000/rs6000.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.h,v
retrieving revision 1.146
diff -p -u -u -p -r1.146 rs6000.h
--- rs6000.h 2001/12/01 01:59:00 1.146
+++ rs6000.h 2001/12/01 16:56:24
@@ -1975,16 +1975,15 @@ typedef struct rs6000_args
#define LEGITIMATE_INDIRECT_ADDRESS_P(X, STRICT) \
(GET_CODE (X) == REG && INT_REG_OK_FOR_BASE_P (X, (STRICT)))
-#define LEGITIMATE_LO_SUM_ADDRESS_P(MODE, X, STRICT) \
- (TARGET_ELF \
- && ! flag_pic && ! TARGET_TOC \
- && (MODE) != DImode \
- && (MODE) != TImode \
- && ! ALTIVEC_VECTOR_MODE (MODE) \
- && (TARGET_HARD_FLOAT || (MODE) != DFmode) \
- && GET_CODE (X) == LO_SUM \
- && GET_CODE (XEXP (X, 0)) == REG \
- && INT_REG_OK_FOR_BASE_P (XEXP (X, 0), (STRICT)) \
+#define LEGITIMATE_LO_SUM_ADDRESS_P(MODE, X, STRICT) \
+ (TARGET_ELF \
+ && ! flag_pic && ! TARGET_TOC \
+ && GET_MODE_NUNITS (MODE) == 1 \
+ && (GET_MODE_BITSIZE (MODE) <= 32 \
+ || (TARGET_HARD_FLOAT && (MODE) != DFmode)) \
+ && GET_CODE (X) == LO_SUM \
+ && GET_CODE (XEXP (X, 0)) == REG \
+ && INT_REG_OK_FOR_BASE_P (XEXP (X, 0), (STRICT)) \
&& CONSTANT_P (XEXP (X, 1)))
#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \
============================================================