public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PING][PATCH][libobjc,rs6000] Fix DDmode ICE on testcase.
@ 2007-10-05 18:09 Peter Bergner
  2007-10-25 17:52 ` David Edelsohn
  0 siblings, 1 reply; 7+ messages in thread
From: Peter Bergner @ 2007-10-05 18:09 UTC (permalink / raw)
  To: gcc-patches; +Cc: David Edelsohn

I'd like to ping the following patch (with the libobjc change Andrew wanted
changed to -1) that fixes a DDmode ICE caused by legitimate_lo_sum_address_p
not handling DDmode similarly to DFmode.  The patch can be found at:

    http://gcc.gnu.org/ml/gcc-patches/2007-09/msg01937.html

The patch with Andrew's suggested change passed bootstrap and regression
testing on powerpc64-linux running the testsuite in both 32-bit and 64-bit
modes.  Is this ok for mainline?


Peter




^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PING][PATCH][libobjc,rs6000] Fix DDmode ICE on testcase.
  2007-10-05 18:09 [PING][PATCH][libobjc,rs6000] Fix DDmode ICE on testcase Peter Bergner
@ 2007-10-25 17:52 ` David Edelsohn
  2007-11-06  3:12   ` Peter Bergner
  0 siblings, 1 reply; 7+ messages in thread
From: David Edelsohn @ 2007-10-25 17:52 UTC (permalink / raw)
  To: Peter Bergner; +Cc: gcc-patches

	AIX uses natural alignment for the new decimal float types, so
please remove those ABI changes from the patch.  In other words,
ADJUST_FIELD_ALIGN and ROUND_TYPE_ALIGN where the alignment depends upon
TARGET_ALIGN_NATURAL.  ALIGN_POWER does not change the alignment of
decimal float.

Thanks, David

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PING][PATCH][libobjc,rs6000] Fix DDmode ICE on testcase.
  2007-10-25 17:52 ` David Edelsohn
@ 2007-11-06  3:12   ` Peter Bergner
  2007-11-08 14:55     ` David Edelsohn
  0 siblings, 1 reply; 7+ messages in thread
From: Peter Bergner @ 2007-11-06  3:12 UTC (permalink / raw)
  To: David Edelsohn; +Cc: gcc-patches

On Thu, Oct 25, 2007 at 09:53:38AM -0400, David Edelsohn wrote:
> 	AIX uses natural alignment for the new decimal float types, so
> please remove those ABI changes from the patch.  In other words,
> ADJUST_FIELD_ALIGN and ROUND_TYPE_ALIGN where the alignment depends upon
> TARGET_ALIGN_NATURAL.  ALIGN_POWER does not change the alignment of
> decimal float.

Ok, I removed the ADJUST_FIELD_ALIGN changes in aix.h, linux64.h, as well
as the rs6000_special_round_type_align(), and libobjc/encoding.c changes.
This updated patch has passed bootstrap and regtesting on powerpc64-linux
running the testsuite in both 32-bit and 64-bit modes.
Is this ok for mainline now?

Peter


gcc/
	* config/rs6000/rs6000.c (invalid_e500_subreg,
	rs6000_legitimate_offset_address_p, legitimate_lo_sum_address_p,
	rs6000_legitimize_address, rs6000_legitimize_reload_address,
	rs6000_legitimate_address, function_arg_advance,
	spe_build_register_parallel, rs6000_spe_function_arg,
	rs6000_split_multireg_move, spe_func_has_64bit_regs_p,
	emit_frame_save, gen_frame_mem_offset, rs6000_function_value,
	rs6000_libcall_value, rs6000_dwarf_register_span): Handle DDmode and
	TDmode similarly to DFmode and TFmode.
	* config/rs6000/rs6000.h (LOCAL_ALIGNMENT, MEMBER_TYPE_FORCES_BLK,
	DATA_ALIGNMENT, CLASS_MAX_NREGS, CANNOT_CHANGE_MODE_CLASS): Likewise.

gcc/testsuite/
	* gcc.dg/dfp/ddmode-ice.c: New test.


Index: config/rs6000/rs6000.c
===================================================================
--- config/rs6000/rs6000.c	(revision 129901)
+++ config/rs6000/rs6000.c	(working copy)
@@ -3115,13 +3115,16 @@ invalid_e500_subreg (rtx op, enum machin
 	  && (mode == SImode || mode == DImode || mode == TImode)
 	  && REG_P (SUBREG_REG (op))
 	  && (GET_MODE (SUBREG_REG (op)) == DFmode
-	      || GET_MODE (SUBREG_REG (op)) == TFmode))
+	      || GET_MODE (SUBREG_REG (op)) == TFmode
+	      || GET_MODE (SUBREG_REG (op)) == DDmode
+	      || GET_MODE (SUBREG_REG (op)) == TDmode))
 	return true;
 
       /* Reject (subreg:DF (reg:DI)); likewise with subreg:TF and
 	 reg:TI.  */
       if (GET_CODE (op) == SUBREG
-	  && (mode == DFmode || mode == TFmode)
+	  && (mode == DFmode || mode == TFmode
+	      || mode == DDmode || mode == TDmode)
 	  && REG_P (SUBREG_REG (op))
 	  && (GET_MODE (SUBREG_REG (op)) == DImode
 	      || GET_MODE (SUBREG_REG (op)) == TImode))
@@ -3390,12 +3393,12 @@ rs6000_legitimate_offset_address_p (enum
       break;
 
     case TFmode:
+    case TDmode:
       if (TARGET_E500_DOUBLE)
 	return (SPE_CONST_OFFSET_OK (offset)
 		&& SPE_CONST_OFFSET_OK (offset + 8));
 
     case TImode:
-    case TDmode:
       if (mode == TFmode || mode == TDmode || !TARGET_POWERPC64)
 	extra = 12;
       else if (offset & 3)
@@ -3474,6 +3477,7 @@ legitimate_lo_sum_address_p (enum machin
     return false;
   /* Restrict addressing for DI because of our SUBREG hackery.  */
   if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
+			     || mode == DDmode || mode == TDmode
 			     || mode == DImode))
     return false;
   x = XEXP (x, 1);
@@ -3488,7 +3492,8 @@ legitimate_lo_sum_address_p (enum machin
 	return false;
       if (GET_MODE_BITSIZE (mode) > 64
 	  || (GET_MODE_BITSIZE (mode) > 32 && !TARGET_POWERPC64
-	      && !(TARGET_HARD_FLOAT && TARGET_FPRS && mode == DFmode)))
+	      && !(TARGET_HARD_FLOAT && TARGET_FPRS
+		   && (mode == DFmode || mode == DDmode))))
 	return false;
 
       return CONSTANT_P (x);
@@ -3610,7 +3615,8 @@ rs6000_legitimize_address (rtx x, rtx ol
 	   && CONSTANT_P (x)
 	   && GET_MODE_NUNITS (mode) == 1
 	   && (GET_MODE_BITSIZE (mode) <= 32
-	       || ((TARGET_HARD_FLOAT && TARGET_FPRS) && mode == DFmode)))
+	       || ((TARGET_HARD_FLOAT && TARGET_FPRS)
+		   && (mode == DFmode || mode == DDmode))))
     {
       rtx reg = gen_reg_rtx (Pmode);
       emit_insn (gen_elf_high (reg, x));
@@ -3624,7 +3630,8 @@ rs6000_legitimize_address (rtx x, rtx ol
 	   && GET_CODE (x) != CONST_INT
 	   && GET_CODE (x) != CONST_DOUBLE
 	   && CONSTANT_P (x)
-	   && ((TARGET_HARD_FLOAT && TARGET_FPRS) || mode != DFmode)
+	   && ((TARGET_HARD_FLOAT && TARGET_FPRS)
+	       || (mode != DFmode && mode != DDmode))
 	   && mode != DImode
 	   && mode != TImode)
     {
@@ -3980,6 +3987,7 @@ rs6000_legitimize_reload_address (rtx x,
       && GET_CODE (XEXP (x, 1)) == CONST_INT
       && !SPE_VECTOR_MODE (mode)
       && !(TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
+				  || mode == DDmode || mode == TDmode
 				  || mode == DImode))
       && !ALTIVEC_VECTOR_MODE (mode))
     {
@@ -4021,12 +4029,12 @@ rs6000_legitimize_reload_address (rtx x,
       && !flag_pic
 #endif
       /* Don't do this for TFmode or TDmode, since the result isn't offsettable.
-	 The same goes for DImode without 64-bit gprs and DFmode
+	 The same goes for DImode without 64-bit gprs and DFmode and DDmode
 	 without fprs.  */
       && mode != TFmode
       && mode != TDmode
       && (mode != DImode || TARGET_POWERPC64)
-      && (mode != DFmode || TARGET_POWERPC64
+      && ((mode != DFmode && mode != DDmode) || TARGET_POWERPC64
 	  || (TARGET_FPRS && TARGET_HARD_FLOAT)))
     {
 #if TARGET_MACHO
@@ -4089,11 +4097,11 @@ rs6000_legitimize_reload_address (rtx x,
    refers to a constant pool entry of an address (or the sum of it
    plus a constant), a short (16-bit signed) constant plus a register,
    the sum of two registers, or a register indirect, possibly with an
-   auto-increment.  For DFmode and DImode with a constant plus register,
-   we must ensure that both words are addressable or PowerPC64 with offset
-   word aligned.
+   auto-increment.  For DFmode, DDmode and DImode with a constant plus
+   register, we must ensure that both words are addressable or PowerPC64
+   with offset word aligned.
 
-   For modes spanning multiple registers (DFmode in 32-bit GPRs,
+   For modes spanning multiple registers (DFmode and DDmode in 32-bit GPRs,
    32-bit DImode, TImode, TFmode, TDmode), indexed addressing cannot be used
    because adjacent memory cells are accessed by adding word-sized offsets
    during assembly output.  */
@@ -4118,8 +4126,8 @@ rs6000_legitimate_address (enum machine_
       && mode != TFmode
       && mode != TDmode
       /* Restrict addressing for DI because of our SUBREG hackery.  */
-      && !(TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
-				  || mode == DImode))
+      && !(TARGET_E500_DOUBLE
+	   && (mode == DFmode || mode == DDmode || mode == DImode))
       && TARGET_UPDATE
       && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict))
     return 1;
@@ -4142,7 +4150,7 @@ rs6000_legitimate_address (enum machine_
       && mode != TDmode
       && ((TARGET_HARD_FLOAT && TARGET_FPRS)
 	  || TARGET_POWERPC64
-	  || ((mode != DFmode || TARGET_E500_DOUBLE) && mode != TFmode))
+	  || ((mode != DFmode && mode != DDmode) || TARGET_E500_DOUBLE))
       && (TARGET_POWERPC64 || mode != DImode)
       && legitimate_indexed_address_p (x, reg_ok_strict))
     return 1;
@@ -4152,12 +4160,13 @@ rs6000_legitimate_address (enum machine_
       && mode != TDmode
       && ((TARGET_HARD_FLOAT && TARGET_FPRS)
 	  || TARGET_POWERPC64
-	  || ((mode != DFmode || TARGET_E500_DOUBLE) && mode != TFmode))
+	  || ((mode != DFmode && mode != DDmode) || TARGET_E500_DOUBLE))
       && (TARGET_POWERPC64 || mode != DImode)
       && !ALTIVEC_VECTOR_MODE (mode)
       && !SPE_VECTOR_MODE (mode)
       /* Restrict addressing for DI because of our SUBREG hackery.  */
-      && !(TARGET_E500_DOUBLE && (mode == DFmode || mode == DImode))
+      && !(TARGET_E500_DOUBLE
+	   && (mode == DFmode || mode == DDmode || mode == DImode))
       && TARGET_UPDATE
       && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict)
       && (rs6000_legitimate_offset_address_p (mode, XEXP (x, 1), reg_ok_strict)
@@ -5407,7 +5416,8 @@ function_arg_advance (CUMULATIVE_ARGS *c
 	  else
 	    {
 	      cum->fregno = FP_ARG_V4_MAX_REG + 1;
-	      if (mode == DFmode || mode == TFmode || mode == DDmode || mode == TDmode)
+	      if (mode == DFmode || mode == TFmode
+		  || mode == DDmode || mode == TDmode)
 		cum->words += cum->words & 1;
 	      cum->words += rs6000_arg_size (mode, type);
 	    }
@@ -5490,12 +5500,14 @@ spe_build_register_parallel (enum machin
   switch (mode)
     {
     case DFmode:
+    case DDmode:
       r1 = gen_rtx_REG (DImode, gregno);
       r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
       return gen_rtx_PARALLEL (mode, gen_rtvec (1, r1));
 
     case DCmode:
     case TFmode:
+    case TDmode:
       r1 = gen_rtx_REG (DImode, gregno);
       r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
       r3 = gen_rtx_REG (DImode, gregno + 2);
@@ -5527,13 +5539,14 @@ rs6000_spe_function_arg (CUMULATIVE_ARGS
 
   /* On E500 v2, double arithmetic is done on the full 64-bit GPR, but
      are passed and returned in a pair of GPRs for ABI compatibility.  */
-  if (TARGET_E500_DOUBLE && (mode == DFmode || mode == DCmode
-			     || mode == TFmode || mode == TCmode))
+  if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
+			     || mode == DDmode || mode == TDmode
+			     || mode == DCmode || mode == TCmode))
     {
       int n_words = rs6000_arg_size (mode, type);
 
       /* Doubles go in an odd/even register pair (r5/r6, etc).  */
-      if (mode == DFmode)
+      if (mode == DFmode || mode == DDmode)
 	gregno += (1 - gregno) & 1;
 
       /* Multi-reg args are not split between registers and stack.  */
@@ -13718,8 +13731,8 @@ rs6000_split_multireg_move (rtx dst, rtx
     reg_mode = DECIMAL_FLOAT_MODE_P (mode) ? DDmode : DFmode;
   else if (ALTIVEC_REGNO_P (reg))
     reg_mode = V16QImode;
-  else if (TARGET_E500_DOUBLE && mode == TFmode)
-    reg_mode = DFmode;
+  else if (TARGET_E500_DOUBLE && (mode == TFmode || mode == TDmode))
+    reg_mode = DECIMAL_FLOAT_MODE_P (mode) ? DDmode : DFmode;
   else
     reg_mode = word_mode;
   reg_mode_size = GET_MODE_SIZE (reg_mode);
@@ -14458,7 +14471,8 @@ spe_func_has_64bit_regs_p (void)
 
 	      if (SPE_VECTOR_MODE (mode))
 		return true;
-	      if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode))
+	      if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
+					 || mode == DDmode || mode == TDmode))
 		return true;
 	    }
 	}
@@ -15274,7 +15288,7 @@ emit_frame_save (rtx frame_reg, rtx fram
 
   /* Some cases that need register indexed addressing.  */
   if ((TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
-      || (TARGET_E500_DOUBLE && mode == DFmode)
+      || (TARGET_E500_DOUBLE && (mode == DFmode || mode == DDmode))
       || (TARGET_SPE_ABI
 	  && SPE_VECTOR_MODE (mode)
 	  && !SPE_CONST_OFFSET_OK (offset)))
@@ -15314,7 +15328,7 @@ gen_frame_mem_offset (enum machine_mode 
   int_rtx = GEN_INT (offset);
 
   if ((TARGET_SPE_ABI && SPE_VECTOR_MODE (mode))
-      || (TARGET_E500_DOUBLE && mode == DFmode))
+      || (TARGET_E500_DOUBLE && (mode == DFmode || mode == DDmode)))
     {
       offset_rtx = gen_rtx_REG (Pmode, FIXED_SCRATCH);
       emit_move_insn (offset_rtx, int_rtx);
@@ -21521,8 +21535,8 @@ rs6000_function_value (const_tree valtyp
 	   && ALTIVEC_VECTOR_MODE (mode))
     regno = ALTIVEC_ARG_RETURN;
   else if (TARGET_E500_DOUBLE && TARGET_HARD_FLOAT
-	   && (mode == DFmode || mode == DCmode
-	       || mode == TFmode || mode == TCmode))
+	   && (mode == DFmode || mode == DDmode || mode == DCmode
+	       || mode == TFmode || mode == TDmode || mode == TCmode))
     return spe_build_register_parallel (mode, GP_ARG_RETURN);
   else
     regno = GP_ARG_RETURN;
@@ -21583,8 +21597,8 @@ rs6000_libcall_value (enum machine_mode 
   else if (COMPLEX_MODE_P (mode) && targetm.calls.split_complex_arg)
     return rs6000_complex_function_value (mode);
   else if (TARGET_E500_DOUBLE && TARGET_HARD_FLOAT
-	   && (mode == DFmode || mode == DCmode
-	       || mode == TFmode || mode == TCmode))
+	   && (mode == DFmode || mode == DDmode || mode == DCmode
+	       || mode == TFmode || mode == TDmode || mode == TCmode))
     return spe_build_register_parallel (mode, GP_ARG_RETURN);
   else
     regno = GP_ARG_RETURN;
@@ -21642,7 +21656,8 @@ rs6000_dwarf_register_span (rtx reg)
 
   if (TARGET_SPE
       && (SPE_VECTOR_MODE (GET_MODE (reg))
-	  || (TARGET_E500_DOUBLE && GET_MODE (reg) == DFmode)))
+	  || (TARGET_E500_DOUBLE
+	      && (GET_MODE (reg) == DFmode || GET_MODE (reg) == DDmode))))
     ;
   else
     return NULL_RTX;
Index: config/rs6000/rs6000.h
===================================================================
--- config/rs6000/rs6000.h	(revision 129901)
+++ config/rs6000/rs6000.h	(working copy)
@@ -559,7 +559,8 @@ extern enum rs6000_nop_insertion rs6000_
    that the object would ordinarily have.  */
 #define LOCAL_ALIGNMENT(TYPE, ALIGN)				\
   ((TARGET_ALTIVEC && TREE_CODE (TYPE) == VECTOR_TYPE) ? 128 :	\
-    (TARGET_E500_DOUBLE && TYPE_MODE (TYPE) == DFmode) ? 64 : \
+    (TARGET_E500_DOUBLE						\
+     && (TYPE_MODE (TYPE) == DFmode || TYPE_MODE (TYPE) == DDmode)) ? 64 : \
     ((TARGET_SPE && TREE_CODE (TYPE) == VECTOR_TYPE \
      && SPE_VECTOR_MODE (TYPE_MODE (TYPE))) || (TARGET_PAIRED_FLOAT \
         && TREE_CODE (TYPE) == VECTOR_TYPE \
@@ -585,7 +586,7 @@ extern enum rs6000_nop_insertion rs6000_
    fit into 1, whereas DI still needs two.  */
 #define MEMBER_TYPE_FORCES_BLK(FIELD, MODE) \
   ((TARGET_SPE && TREE_CODE (TREE_TYPE (FIELD)) == VECTOR_TYPE) \
-   || (TARGET_E500_DOUBLE && (MODE) == DFmode))
+   || (TARGET_E500_DOUBLE && ((MODE) == DFmode || (MODE) == DDmode)))
 
 /* A bit-field declared as `int' forces `int' alignment for the struct.  */
 #define PCC_BITFIELD_TYPE_MATTERS 1
@@ -604,7 +605,8 @@ extern enum rs6000_nop_insertion rs6000_
 #define DATA_ALIGNMENT(TYPE, ALIGN)		\
   (TREE_CODE (TYPE) == VECTOR_TYPE ? ((TARGET_SPE_ABI \
    || TARGET_PAIRED_FLOAT) ? 64 : 128)	\
-   : (TARGET_E500_DOUBLE && TYPE_MODE (TYPE) == DFmode) ? 64 \
+   : (TARGET_E500_DOUBLE			\
+      && (TYPE_MODE (TYPE) == DFmode || TYPE_MODE (TYPE) == DDmode)) ? 64 \
    : TREE_CODE (TYPE) == ARRAY_TYPE		\
    && TYPE_MODE (TREE_TYPE (TYPE)) == QImode	\
    && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
@@ -1178,7 +1180,8 @@ enum reg_class
 #define CLASS_MAX_NREGS(CLASS, MODE)					\
  (((CLASS) == FLOAT_REGS) 						\
   ? ((GET_MODE_SIZE (MODE) + UNITS_PER_FP_WORD - 1) / UNITS_PER_FP_WORD) \
-  : (TARGET_E500_DOUBLE && (CLASS) == GENERAL_REGS && (MODE) == DFmode) \
+  : (TARGET_E500_DOUBLE && (CLASS) == GENERAL_REGS			\
+     && ((MODE) == DFmode || (MODE) == DDmode))				\
   ? 1                                                                   \
   : ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD))
 
@@ -1192,6 +1195,8 @@ enum reg_class
    : (((TARGET_E500_DOUBLE						\
 	&& ((((TO) == DFmode) + ((FROM) == DFmode)) == 1		\
 	    || (((TO) == TFmode) + ((FROM) == TFmode)) == 1		\
+	    || (((TO) == DDmode) + ((FROM) == DDmode)) == 1		\
+	    || (((TO) == TDmode) + ((FROM) == TDmode)) == 1		\
 	    || (((TO) == DImode) + ((FROM) == DImode)) == 1))		\
        || (TARGET_SPE							\
 	   && (SPE_VECTOR_MODE (FROM) + SPE_VECTOR_MODE (TO)) == 1))	\
@@ -1717,11 +1722,11 @@ typedef struct rs6000_args
    refers to a constant pool entry of an address (or the sum of it
    plus a constant), a short (16-bit signed) constant plus a register,
    the sum of two registers, or a register indirect, possibly with an
-   auto-increment.  For DFmode and DImode with a constant plus register,
-   we must ensure that both words are addressable or PowerPC64 with offset
-   word aligned.
+   auto-increment.  For DFmode, DDmode and DImode with a constant plus
+   register, we must ensure that both words are addressable or PowerPC64
+   with offset word aligned.
 
-   For modes spanning multiple registers (DFmode in 32-bit GPRs,
+   For modes spanning multiple registers (DFmode and DDmode in 32-bit GPRs,
    32-bit DImode, TImode), indexed addressing cannot be used because
    adjacent memory cells are accessed by adding word-sized offsets
    during assembly output.  */
Index: gcc.dg/dfp/ddmode-ice.c
===================================================================
--- gcc.dg/dfp/ddmode-ice.c	(revision 0)
+++ gcc.dg/dfp/ddmode-ice.c	(revision 0)
@@ -0,0 +1,54 @@
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99 -O1" } */
+
+/* This used to result in an ICE.  */
+
+_Decimal64 y[258][258];
+_Decimal64 dd[258][258];
+_Decimal64 ry[258][258];
+_Decimal64
+foo (void)
+{
+  int i;
+  int j;
+  int m;
+  int im;
+  int jm;
+  int ip;
+  int jp;
+  int i2m;
+  int i1p;
+  _Decimal64 a;
+  _Decimal64 b;
+  _Decimal64 c;
+  _Decimal64 qi;
+  _Decimal64 qj;
+  _Decimal64 xx;
+  _Decimal64 yx;
+  _Decimal64 xy;
+  _Decimal64 yy;
+  _Decimal64 rel;
+  _Decimal64 qxx;
+  _Decimal64 qyy;
+  _Decimal64 qxy;
+  do
+    {
+      jp = j + 1;
+      for (i = i1p; i <= i2m; i++)
+	{
+	  ip = i + 1;
+	  yx = y[ip][j] - y[im][j];
+	  yy = y[i][jp] - y[i][jm];
+	  a = 0.25dd * (xy * xy + yy * yy);
+	  b = 0.25dd * (xx * xx + yx * yx);
+	  c = 0.125dd * (xx * xy + yx * yy);
+	  qj = 0.0dd;
+	  dd[i][m] = b + a * rel + b;
+	  qxx = y[ip][j] - 2.0dd * y[i][j] + y[im][j];
+	  qyy = y[i][jp] - 2.0dd * y[i][j] + y[i][jm];
+	  qxy = y[ip][jp] - y[ip][jm] - y[im][jp] + y[im][jm];
+	  ry[i][m] = a * qxx + b * qyy - c * qxy + yx * qi + yy * qj;
+	}
+    }
+  while (1);
+}

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PING][PATCH][libobjc,rs6000] Fix DDmode ICE on testcase.
  2007-11-06  3:12   ` Peter Bergner
@ 2007-11-08 14:55     ` David Edelsohn
  2007-11-08 17:29       ` Peter Bergner
  0 siblings, 1 reply; 7+ messages in thread
From: David Edelsohn @ 2007-11-08 14:55 UTC (permalink / raw)
  To: Peter Bergner; +Cc: gcc-patches

@@ -4118,8 +4126,8 @@ rs6000_legitimate_address (enum machine_
       && mode != TFmode
       && mode != TDmode
       /* Restrict addressing for DI because of our SUBREG hackery.  */
-      && !(TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
-				  || mode == DImode))
+      && !(TARGET_E500_DOUBLE
+	   && (mode == DFmode || mode == DDmode || mode == DImode))
       && TARGET_UPDATE
       && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict))
     return 1;
@@ -4142,7 +4150,7 @@ rs6000_legitimate_address (enum machine_
       && mode != TDmode
       && ((TARGET_HARD_FLOAT && TARGET_FPRS)
 	  || TARGET_POWERPC64
-	  || ((mode != DFmode || TARGET_E500_DOUBLE) && mode != TFmode))
+	  || ((mode != DFmode && mode != DDmode) || TARGET_E500_DOUBLE))
       && (TARGET_POWERPC64 || mode != DImode)
       && legitimate_indexed_address_p (x, reg_ok_strict))
     return 1;
@@ -4152,12 +4160,13 @@ rs6000_legitimate_address (enum machine_
       && mode != TDmode
       && ((TARGET_HARD_FLOAT && TARGET_FPRS)
 	  || TARGET_POWERPC64
-	  || ((mode != DFmode || TARGET_E500_DOUBLE) && mode != TFmode))
+	  || ((mode != DFmode && mode != DDmode) || TARGET_E500_DOUBLE))
       && (TARGET_POWERPC64 || mode != DImode)
       && !ALTIVEC_VECTOR_MODE (mode)
       && !SPE_VECTOR_MODE (mode)
       /* Restrict addressing for DI because of our SUBREG hackery.  */
-      && !(TARGET_E500_DOUBLE && (mode == DFmode || mode == DImode))
+      && !(TARGET_E500_DOUBLE
+	   && (mode == DFmode || mode == DDmode || mode == DImode))
       && TARGET_UPDATE
       && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict)
       && (rs6000_legitimate_offset_address_p (mode, XEXP (x, 1), reg_ok_strict)

	What happened to TFmode in the above changes?

David

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PING][PATCH][libobjc,rs6000] Fix DDmode ICE on testcase.
  2007-11-08 14:55     ` David Edelsohn
@ 2007-11-08 17:29       ` Peter Bergner
  2007-11-18 21:25         ` David Edelsohn
  0 siblings, 1 reply; 7+ messages in thread
From: Peter Bergner @ 2007-11-08 17:29 UTC (permalink / raw)
  To: David Edelsohn; +Cc: gcc-patches

On Thu, 2007-11-08 at 09:54 -0500, David Edelsohn wrote:
> @@ -4118,8 +4126,8 @@ rs6000_legitimate_address (enum machine_
>        && mode != TFmode
>        && mode != TDmode
>        /* Restrict addressing for DI because of our SUBREG hackery.  */
> -      && !(TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
> -				  || mode == DImode))
> +      && !(TARGET_E500_DOUBLE
> +	   && (mode == DFmode || mode == DDmode || mode == DImode))
>        && TARGET_UPDATE
>        && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict))
>      return 1;
[snip]
> 	What happened to TFmode in the above changes?

I removed them since we've already guaranteed that mode cannot be TFmode
with the "mode != TFmode" tests like the first line in the hunk above.

Peter



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PING][PATCH][libobjc,rs6000] Fix DDmode ICE on testcase.
  2007-11-08 17:29       ` Peter Bergner
@ 2007-11-18 21:25         ` David Edelsohn
  2007-11-20  0:08           ` Peter Bergner
  0 siblings, 1 reply; 7+ messages in thread
From: David Edelsohn @ 2007-11-18 21:25 UTC (permalink / raw)
  To: Peter Bergner; +Cc: gcc-patches

>>>>> Peter Bergner writes:

Peter> I removed them since we've already guaranteed that mode cannot be TFmode
Peter> with the "mode != TFmode" tests like the first line in the hunk above.

	Thanks for the explanation and your patience.  The patch is fine.

Thanks, David

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PING][PATCH][libobjc,rs6000] Fix DDmode ICE on testcase.
  2007-11-18 21:25         ` David Edelsohn
@ 2007-11-20  0:08           ` Peter Bergner
  0 siblings, 0 replies; 7+ messages in thread
From: Peter Bergner @ 2007-11-20  0:08 UTC (permalink / raw)
  To: David Edelsohn; +Cc: gcc-patches

On Sun, 2007-11-18 at 14:03 -0500, David Edelsohn wrote:
> >>>>> Peter Bergner writes:
> Peter> I removed them since we've already guaranteed that mode cannot be TFmode
> Peter> with the "mode != TFmode" tests like the first line in the hunk above.
> 
> 	Thanks for the explanation and your patience.  The patch is fine.


Thanks.  I have committed this as revision 130296.

Peter



^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2007-11-19 19:55 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-10-05 18:09 [PING][PATCH][libobjc,rs6000] Fix DDmode ICE on testcase Peter Bergner
2007-10-25 17:52 ` David Edelsohn
2007-11-06  3:12   ` Peter Bergner
2007-11-08 14:55     ` David Edelsohn
2007-11-08 17:29       ` Peter Bergner
2007-11-18 21:25         ` David Edelsohn
2007-11-20  0:08           ` Peter Bergner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).