From: Geert Bosch Date: Fri, 22 Aug 2008 13:29:10 +0000 (+0000) Subject: trans.c: Define FP_ARITH_MAY_WIDEN X-Git-Tag: releases/gcc-4.4.0~2939 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6eca32ba8d80c1d36903dc28b743ec1b3532a2cd;p=thirdparty%2Fgcc.git trans.c: Define FP_ARITH_MAY_WIDEN 2008-08-22 Geert Bosch * gcc-interface/trans.c: Define FP_ARITH_MAY_WIDEN (convert_with_check): Only use longest_float_type if FP_ARITH_MAY_WIDEN is 0 From-SVN: r139468 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 187b1494c07f..6bb8b4524a10 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2008-08-22 Geert Bosch + + * 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 * 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 db63baae0302..a67476eae708 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))