OSDN Git Service

* real.c (c4x_single_format, c4x_extended_format): Provide values
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 15 Mar 2005 20:43:12 +0000 (20:43 +0000)
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 15 Mar 2005 20:43:12 +0000 (20:43 +0000)
for signbit_ro for c4x's single and extended floating point formats.
* optabs.c (expand_copysign): Use the floating point format's
signbit_ro for expanding via expand_copysign_absneg, and it's
signbit_rw field for expanding via expand_copysign_bit.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@96530 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/optabs.c
gcc/real.c

index 0d3e60f..67cce72 100644 (file)
@@ -1,3 +1,12 @@
+2005-03-15  Roger Sayle  <roger@eyesopen.com>
+           Richard Henderson  <rth@redhat.com>
+
+       * real.c (c4x_single_format, c4x_extended_format): Provide values
+       for signbit_ro for c4x's single and extended floating point formats.
+       * optabs.c (expand_copysign): Use the floating point format's
+       signbit_ro for expanding via expand_copysign_absneg, and it's
+       signbit_rw field for expanding via expand_copysign_bit.
+
 2005-03-15  Dorit Naishlos  <dorit@il.ibm.com>
 
        * tree-vectorizer.h (unknown_alignment_for_access_p): Replaced by
index d41a234..a28042a 100644 (file)
@@ -2865,7 +2865,6 @@ expand_copysign (rtx op0, rtx op1, rtx target)
 {
   enum machine_mode mode = GET_MODE (op0);
   const struct real_format *fmt;
-  int bitpos;
   bool op0_is_abs;
   rtx temp;
 
@@ -2882,10 +2881,6 @@ expand_copysign (rtx op0, rtx op1, rtx target)
   if (fmt == NULL || !fmt->has_signed_zero)
     return NULL_RTX;
 
-  bitpos = fmt->signbit_rw;
-  if (bitpos < 0)
-    return NULL_RTX;
-
   op0_is_abs = false;
   if (GET_CODE (op0) == CONST_DOUBLE)
     {
@@ -2894,17 +2889,21 @@ expand_copysign (rtx op0, rtx op1, rtx target)
       op0_is_abs = true;
     }
 
-  if (GET_CODE (op0) == CONST_DOUBLE
-      || (neg_optab->handlers[mode].insn_code != CODE_FOR_nothing
-          && abs_optab->handlers[mode].insn_code != CODE_FOR_nothing))
+  if (fmt->signbit_ro >= 0
+      && (GET_CODE (op0) == CONST_DOUBLE
+         || (neg_optab->handlers[mode].insn_code != CODE_FOR_nothing
+             && abs_optab->handlers[mode].insn_code != CODE_FOR_nothing)))
     {
       temp = expand_copysign_absneg (mode, op0, op1, target,
-                                    bitpos, op0_is_abs);
+                                    fmt->signbit_ro, op0_is_abs);
       if (temp)
        return temp;
     }
 
-  return expand_copysign_bit (mode, op0, op1, target, bitpos, op0_is_abs);
+  if (fmt->signbit_rw < 0)
+    return NULL_RTX;
+  return expand_copysign_bit (mode, op0, op1, target,
+                             fmt->signbit_rw, op0_is_abs);
 }
 \f
 /* Generate an instruction whose insn-code is INSN_CODE,
index bed2fb0..81bce44 100644 (file)
@@ -4414,7 +4414,7 @@ const struct real_format c4x_single_format =
     24,
     -126,
     128,
-    -1,
+    23,
     -1,
     false,
     false,
@@ -4433,7 +4433,7 @@ const struct real_format c4x_extended_format =
     32,
     -126,
     128,
-    -1,
+    31,
     -1,
     false,
     false,