This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC 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]

Fix for compile/20000804-1.c on ppc



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)			\
============================================================


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