dfp.c (decimal_real_arithmetic): Change second argument type from int to enum tree_code.
authorBen Elliston <bje@gcc.gnu.org>
Sun, 5 Feb 2006 22:59:35 +0000 (09:59 +1100)
committerBen Elliston <bje@gcc.gnu.org>
Sun, 5 Feb 2006 22:59:35 +0000 (09:59 +1100)
* dfp.c (decimal_real_arithmetic): Change second argument type
from int to enum tree_code. Do not always return true, but now
return result of any call to decimal_do helper functions.
* dfp.h (decimal_real_arithmetic): Update prototype.

From-SVN: r110626

gcc/ChangeLog
gcc/dfp.c
gcc/dfp.h

index 00112653c05ce1d86c618e63b5f9954269b5841a..4dce3b3b483dea02744e6cc2fbe292f6c854395a 100644 (file)
@@ -1,3 +1,10 @@
+2006-02-04  Ben Elliston  <bje@au.ibm.com>
+
+       * dfp.c (decimal_real_arithmetic): Change second argument type
+       from int to enum tree_code. Do not always return true, but now
+       return result of any call to decimal_do helper functions.
+       * dfp.h (decimal_real_arithmetic): Update prototype.
+
 2006-02-05  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
        * config/sparc/sol2-bi.h (SPARC_DEFAULT_CMODEL): Set to CM_MEDMID.
 
        PR ada/25900
        * tree-vrp.c (extract_range_from_assert): When merging a VR_RANGE
-       with a VR_ANTI_RANGE and the VR_ANTI_RANGEis completely contained
+       with a VR_ANTI_RANGE and the VR_ANTI_RANGE is completely contained
        within the VR_RANGE, use the VR_RANGE as the result, not the
        VR_ANTI_RANGE.
-       (adjust_range_with_scev): Reject ranges from SCEV which are out
-       of bounds for the type.
+       (adjust_range_with_scev): Reject ranges from SCEV which are out of
+       bounds for the type.
 
 2006-01-26  Daniel Berlin  <dberlin@dberlin.org>
 
index 804f2031ca18f613014a91d398b89e5280e4fb07..5072264cb509053578b25ce74383eb0180f9ed9a 100644 (file)
--- a/gcc/dfp.c
+++ b/gcc/dfp.c
@@ -1,5 +1,5 @@
 /* Decimal floating point support.
-   Copyright (C) 2005 Free Software Foundation, Inc.
+   Copyright (C) 2005, 2006 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -597,49 +597,42 @@ decimal_real_to_integer2 (HOST_WIDE_INT *plow, HOST_WIDE_INT *phigh,
   real_to_integer2 (plow, phigh, &to);
 }
 
-/* Perform the decimal floating point operation described by COODE.
-   For a unary operation, leave OP1 NULL.  This function returns true
-   if the result may be inexact due to loss of precision.  */
+/* Perform the decimal floating point operation described by CODE.
+   For a unary operation, OP1 will be NULL.  This function returns
+   true if the result may be inexact due to loss of precision.  */
 
 bool
-decimal_real_arithmetic (REAL_VALUE_TYPE *r, int icode,
+decimal_real_arithmetic (REAL_VALUE_TYPE *r, enum tree_code code,
                         const REAL_VALUE_TYPE *op0,
                         const REAL_VALUE_TYPE *op1)
 {
-  enum tree_code code = icode;
-  REAL_VALUE_TYPE a1;
-  REAL_VALUE_TYPE b1;
+  REAL_VALUE_TYPE a, b;
 
-  /* If either op is not a decimal, create a temporary decimal
-     versions.  */
+  /* If either operand is non-decimal, create temporaries.  */
   if (!op0->decimal)
     {
-      decimal_from_binary (&a1, op0);
-      op0 = &a1;
+      decimal_from_binary (&a, op0);
+      op0 = &a;
     }
   if (op1 && !op1->decimal)
     {
-      decimal_from_binary (&b1, op1);
-      op1 = &b1;
+      decimal_from_binary (&b, op1);
+      op1 = &b;
     }
 
   switch (code)
     {
     case PLUS_EXPR:
-      (void) decimal_do_add (r, op0, op1, 0);
-      break;
+      return decimal_do_add (r, op0, op1, 0);
 
     case MINUS_EXPR:
-      (void) decimal_do_add (r, op0, op1, 1);
-      break;
+      return decimal_do_add (r, op0, op1, 1);
 
     case MULT_EXPR:
-      (void) decimal_do_multiply (r, op0, op1);
-      break;
+      return decimal_do_multiply (r, op0, op1);
 
     case RDIV_EXPR:
-      (void) decimal_do_divide (r, op0, op1);
-      break;
+      return decimal_do_divide (r, op0, op1);
 
     case MIN_EXPR:
       if (op1->cl == rvc_nan)
@@ -648,7 +641,7 @@ decimal_real_arithmetic (REAL_VALUE_TYPE *r, int icode,
         *r = *op0;
       else
         *r = *op1;
-      break;
+      return false;
 
     case MAX_EXPR:
       if (op1->cl == rvc_nan)
@@ -657,7 +650,7 @@ decimal_real_arithmetic (REAL_VALUE_TYPE *r, int icode,
         *r = *op1;
       else
         *r = *op0;
-      break;
+      return false;
 
     case NEGATE_EXPR:
       {
@@ -669,7 +662,7 @@ decimal_real_arithmetic (REAL_VALUE_TYPE *r, int icode,
        /* Keep sign field in sync.  */
        r->sign ^= 1;
       }
-      break;
+      return false;
 
     case ABS_EXPR:
       {
@@ -681,19 +674,15 @@ decimal_real_arithmetic (REAL_VALUE_TYPE *r, int icode,
        /* Keep sign field in sync.  */
        r->sign = 0;
       }
-      break;
+      return false;
 
     case FIX_TRUNC_EXPR:
       decimal_do_fix_trunc (r, op0);
-      break;
+      return false;
 
     default:
       gcc_unreachable ();
     }
-
-  /* FIXME: Indicate all operations as inexact for now due to unknown
-     working precision.  */
-  return true;
 }
 
 /* Fills R with the largest finite value representable in mode MODE.
index d7f5b01cc7dd02fd2d43499f9ba5dabb23d2765d..fd28d40816d932fc8e0be78af9a486b1098e9102 100644 (file)
--- a/gcc/dfp.h
+++ b/gcc/dfp.h
@@ -1,5 +1,5 @@
 /* Decimal floating point support functions for GNU compiler.
-   Copyright (C) 2005 Free Software Foundation, Inc.
+   Copyright (C) 2005, 2006 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -38,7 +38,7 @@ void decimal_round_for_format (const struct real_format *, REAL_VALUE_TYPE *);
 void decimal_real_convert (REAL_VALUE_TYPE *, enum machine_mode, const REAL_VALUE_TYPE *);
 void decimal_real_to_decimal (char *, const REAL_VALUE_TYPE *, size_t, size_t, int);
 void decimal_do_fix_trunc (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
-bool decimal_real_arithmetic (REAL_VALUE_TYPE *, int, const REAL_VALUE_TYPE *,
+bool decimal_real_arithmetic (REAL_VALUE_TYPE *, enum tree_code, const REAL_VALUE_TYPE *,
                              const REAL_VALUE_TYPE *);
 void decimal_real_maxval (REAL_VALUE_TYPE *, int, enum machine_mode);
 void decimal_real_to_integer2 (HOST_WIDE_INT *, HOST_WIDE_INT *, const REAL_VALUE_TYPE *);