aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Elliston <bje@gcc.gnu.org>2006-02-06 09:59:35 +1100
committerBen Elliston <bje@gcc.gnu.org>2006-02-06 09:59:35 +1100
commit0b59f49d59928689e9816c89d3b02765f9ac49ba (patch)
treec3b9af79340ab1e3ba155a442af7121b99af6cb0
parent3ded621059e0edd541e3b5b921d8e499d7e668f5 (diff)
downloadgcc-0b59f49d59928689e9816c89d3b02765f9ac49ba.zip
gcc-0b59f49d59928689e9816c89d3b02765f9ac49ba.tar.gz
gcc-0b59f49d59928689e9816c89d3b02765f9ac49ba.tar.bz2
dfp.c (decimal_real_arithmetic): Change second argument type from int to enum tree_code.
* 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
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/dfp.c51
-rw-r--r--gcc/dfp.h4
3 files changed, 32 insertions, 36 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0011265..4dce3b3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
@@ -934,11 +941,11 @@
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>
diff --git a/gcc/dfp.c b/gcc/dfp.c
index 804f203..5072264 100644
--- 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.
diff --git a/gcc/dfp.h b/gcc/dfp.h
index d7f5b01..fd28d40 100644
--- 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 *);