From 0b59f49d59928689e9816c89d3b02765f9ac49ba Mon Sep 17 00:00:00 2001 From: Ben Elliston Date: Mon, 6 Feb 2006 09:59:35 +1100 Subject: 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 --- gcc/ChangeLog | 13 ++++++++++--- gcc/dfp.c | 51 ++++++++++++++++++++------------------------------- gcc/dfp.h | 4 ++-- 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 + + * 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 * 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 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 *); -- cgit v1.1