This is the mail archive of the gcc@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]

Patch for rs6000 const doubles


Jim or Jeff, please apply the following patch to the release branch of
egcs (I've already applied it to the development branch):

Thu Nov 13 11:07:41 1997  Michael Meissner  <meissner@cygnus.com>

	* rs6000.c (num_insns_constant): Use REAL_VALUE_FROM_CONST_DOUBLE to
	pick apart floating point values, instead of using CONST_DOUBLE_LOW
	and CONST_DOUBLE_HIGH.

	* rs6000.md (define_splits for DF constants): Use the appropriate
	REAL_VALUE_* interface to pick apart DF floating point constants in
	a machine independent fashion.

*** gcc/config/rs6000/rs6000.c.~1~	Fri Oct 24 14:18:02 1997
--- gcc/config/rs6000/rs6000.c	Thu Nov 13 11:05:36 1997
*************** num_insns_constant (op, mode)
*** 673,700 ****
        return num_insns_constant_wide ((HOST_WIDE_INT)l);
      }
  
!   else if (GET_CODE (op) == CONST_DOUBLE && TARGET_32BIT)
!     return (num_insns_constant_wide (CONST_DOUBLE_LOW (op))
! 	    + num_insns_constant_wide (CONST_DOUBLE_HIGH (op)));
! 
!   else if (GET_CODE (op) == CONST_DOUBLE && TARGET_64BIT)
      {
!       HOST_WIDE_INT low  = CONST_DOUBLE_LOW (op);
!       HOST_WIDE_INT high = CONST_DOUBLE_HIGH (op);
! 
!       if (high == 0 && (low & 0x80000000) == 0)
! 	return num_insns_constant_wide (low);
  
!       else if (((high & 0xffffffff) == 0xffffffff)
! 	       && ((low & 0x80000000) != 0))
! 	return num_insns_constant_wide (low);
  
!       else if (low == 0)
! 	return num_insns_constant_wide (high) + 1;
  
        else
! 	return (num_insns_constant_wide (high)
! 		+ num_insns_constant_wide (low) + 1);
      }
  
    else
--- 673,719 ----
        return num_insns_constant_wide ((HOST_WIDE_INT)l);
      }
  
!   else if (GET_CODE (op) == CONST_DOUBLE)
      {
!       HOST_WIDE_INT low;
!       HOST_WIDE_INT high;
!       long l[2];
!       REAL_VALUE_TYPE rv;
!       int endian = (WORDS_BIG_ENDIAN == 0);
  
!       if (mode == VOIDmode || mode == DImode)
! 	{
! 	  high = CONST_DOUBLE_HIGH (op);
! 	  low  = CONST_DOUBLE_LOW (op);
! 	}
!       else
! 	{
! 	  REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
! 	  REAL_VALUE_TO_TARGET_DOUBLE (rv, l);
! 	  high = l[endian];
! 	  low  = l[1 - endian];
! 	}
  
!       if (TARGET_32BIT)
! 	return (num_insns_constant_wide (low)
! 		+ num_insns_constant_wide (high));
  
        else
! 	{
! 	  if (high == 0 && (low & 0x80000000) == 0)
! 	    return num_insns_constant_wide (low);
! 
! 	  else if (((high & 0xffffffff) == 0xffffffff)
! 		   && ((low & 0x80000000) != 0))
! 	    return num_insns_constant_wide (low);
! 
! 	  else if (low == 0)
! 	    return num_insns_constant_wide (high) + 1;
! 
! 	  else
! 	    return (num_insns_constant_wide (high)
! 		    + num_insns_constant_wide (low) + 1);
! 	}
      }
  
    else
*** gcc/config/rs6000/rs6000.md.~1~	Mon Oct 27 11:56:16 1997
--- gcc/config/rs6000/rs6000.md	Thu Nov 13 10:39:59 1997
***************
*** 5734,5749 ****
    "
  {
    int endian = (WORDS_BIG_ENDIAN == 0);
    operands[2] = operand_subword (operands[0], endian, 0, DFmode);
    operands[3] = operand_subword (operands[0], 1 - endian, 0, DFmode);
! 
! #ifdef HOST_WORDS_BIG_ENDIAN
!   operands[4] = GEN_INT (CONST_DOUBLE_LOW  (operands[1]));
!   operands[5] = GEN_INT (CONST_DOUBLE_HIGH (operands[1]));
! #else
!   operands[4] = GEN_INT (CONST_DOUBLE_HIGH (operands[1]));
!   operands[5] = GEN_INT (CONST_DOUBLE_LOW  (operands[1]));
! #endif
  }")
  
  (define_split
--- 5734,5749 ----
    "
  {
    int endian = (WORDS_BIG_ENDIAN == 0);
+   long l[2];
+   REAL_VALUE_TYPE rv;
+ 
+   REAL_VALUE_FROM_CONST_DOUBLE (rv, operands[1]);
+   REAL_VALUE_TO_TARGET_DOUBLE (rv, l);
+ 
    operands[2] = operand_subword (operands[0], endian, 0, DFmode);
    operands[3] = operand_subword (operands[0], 1 - endian, 0, DFmode);
!   operands[4] = GEN_INT (l[endian]);
!   operands[5] = GEN_INT (l[1 - endian]);
  }")
  
  (define_split
***************
*** 5762,5777 ****
    HOST_WIDE_INT high;
    HOST_WIDE_INT low;
    int endian = (WORDS_BIG_ENDIAN == 0);
    rtx high_reg = operand_subword (operands[0], endian, 0, DFmode);
    rtx low_reg  = operand_subword (operands[0], 1 - endian, 0, DFmode);
  
! #ifdef HOST_WORDS_BIG_ENDIAN
!   high = CONST_DOUBLE_LOW  (operands[1]);
!   low  = CONST_DOUBLE_HIGH (operands[1]);
! #else
!   high = CONST_DOUBLE_HIGH (operands[1]);
!   low  = CONST_DOUBLE_LOW  (operands[1]);
! #endif
  
    if (((unsigned HOST_WIDE_INT) (low + 0x8000) < 0x10000)
        || (low & 0xffff) == 0)
--- 5762,5776 ----
    HOST_WIDE_INT high;
    HOST_WIDE_INT low;
    int endian = (WORDS_BIG_ENDIAN == 0);
+   long l[2];
+   REAL_VALUE_TYPE rv;
    rtx high_reg = operand_subword (operands[0], endian, 0, DFmode);
    rtx low_reg  = operand_subword (operands[0], 1 - endian, 0, DFmode);
  
!   REAL_VALUE_FROM_CONST_DOUBLE (rv, operands[1]);
!   REAL_VALUE_TO_TARGET_DOUBLE (rv, l);
!   high = l[endian];
!   low  = l[1 - endian];
  
    if (((unsigned HOST_WIDE_INT) (low + 0x8000) < 0x10000)
        || (low & 0xffff) == 0)
***************
*** 5806,5814 ****
     (set (match_dup 3) (ior:SI (match_dup 3) (match_dup 7)))]
    "
  {
!   HOST_WIDE_INT high = CONST_DOUBLE_HIGH (operands[1]);
!   HOST_WIDE_INT low  = CONST_DOUBLE_LOW  (operands[1]);
    int endian = (WORDS_BIG_ENDIAN == 0);
  
    operands[2] = operand_subword (operands[0], endian, 0, DFmode);
    operands[3] = operand_subword (operands[0], 1 - endian, 0, DFmode);
--- 5805,5820 ----
     (set (match_dup 3) (ior:SI (match_dup 3) (match_dup 7)))]
    "
  {
!   HOST_WIDE_INT high;
!   HOST_WIDE_INT low;
!   long l[2];
!   REAL_VALUE_TYPE rv;
    int endian = (WORDS_BIG_ENDIAN == 0);
+ 
+   REAL_VALUE_FROM_CONST_DOUBLE (rv, operands[1]);
+   REAL_VALUE_TO_TARGET_DOUBLE (rv, l);
+   high = l[endian];
+   low  = l[1 - endian];
  
    operands[2] = operand_subword (operands[0], endian, 0, DFmode);
    operands[3] = operand_subword (operands[0], 1 - endian, 0, DFmode);


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