diff options
-rw-r--r-- | gcc/ada/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/ada/gcc-interface/trans.c | 20 |
2 files changed, 21 insertions, 4 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 187b149..6bb8b45 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2008-08-22 Geert Bosch <bosch@adacore.com> + + * gcc-interface/trans.c: Define FP_ARITH_MAY_WIDEN + (convert_with_check): Only use longest_float_type if FP_ARITH_MAY_WIDEN is 0 + 2008-08-22 Doug Rupp <rupp@adacore.com> * bindgen.adb [VMS] (Gen_Adainit_Ada, Gen_Adainit_C): Import and call diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index db63baa..a67476e 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -73,6 +73,19 @@ #define TARGET_ABI_OPEN_VMS 0 #endif +/* For efficient float-to-int rounding, it is necessary to know whether + floating-point arithmetic on may use wider intermediate results. + When FP_ARITH_MAY_WIDEN is not defined, be conservative and only assume + floating-point arithmetic does not widen if double precision is emulated. */ + +#ifndef FP_ARITH_MAY_WIDEN +#if defined(HAVE_extendsfdf2) +#define FP_ARITH_MAY_WIDEN HAVE_extendsfdf2 +#else +#define FP_ARITH_MAY_WIDEN 0 +#endif +#endif + extern char *__gnat_to_canonical_file_spec (char *); int max_gnat_nodes; @@ -6308,12 +6321,11 @@ convert_with_check (Entity_Id gnat_type, tree gnu_expr, bool overflowp, /* The following calculations depend on proper rounding to even of each arithmetic operation. In order to prevent excess precision from spoiling this property, use the widest hardware - floating-point type. + floating-point type if FP_ARITH_MAY_WIDEN is true. */ - FIXME: For maximum efficiency, this should only be done for machines - and types where intermediates may have extra precision. */ + calc_type = (FP_ARITH_MAY_WIDEN ? longest_float_type_node + : gnu_in_basetype); - calc_type = longest_float_type_node; /* FIXME: Should not have padding in the first place */ if (TREE_CODE (calc_type) == RECORD_TYPE && TYPE_IS_PADDING_P (calc_type)) |