[Bug rtl-optimization/323] optimized code gives strange floating point results

jsm28 at gcc dot gnu dot org gcc-bugzilla@gcc.gnu.org
Mon Mar 30 01:51:00 GMT 2009



------- Comment #126 from jsm28 at gcc dot gnu dot org  2009-03-30 01:51 -------
Subject: Bug 323

Author: jsm28
Date: Mon Mar 30 01:50:44 2009
New Revision: 145272

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=145272
Log:
        PR rtl-optimization/323
        * c-common.c (c_fully_fold, convert_and_check,
        c_common_truthvalue_conversion): Handle EXCESS_PRECISION_EXPR.
        (c_fully_fold_internal): Disallow EXCESS_PRECISION_EXPR.
        * c-common.def (EXCESS_PRECISION_EXPR): New.
        * c-cppbuiltin.c (builtin_define_float_constants): Define
        constants with enough digits for long double.
        * c-lex.c (interpret_float): Interpret constant with excess
        precision where appropriate.
        * c-opts.c (c_common_post_options): Set
        flag_excess_precision_cmdline.  Give an error for
        -fexcess-precision=standard for C++ for processors where the
        option is significant.
        * c-parser.c (c_parser_conditional_expression): Handle excess
        precision in condition.
        * c-typeck.c (convert_arguments): Handle arguments with excess
        precision.
        (build_unary_op): Move excess precision outside operation.
        (build_conditional_expr): Likewise.
        (build_compound_expr): Likewise.
        (build_c_cast): Do cast on operand of EXCESS_PRECISION_EXPR.
        (build_modify_expr): Handle excess precision in RHS.
        (convert_for_assignment): Handle excess precision in converted
        value.
        (digest_init, output_init_element, process_init_element): Handle
        excess precision in initializer.
        (c_finish_return): Handle excess precision in return value.
        (build_binary_op): Handle excess precision in operands and add
        excess precision as needed for operation.
        * common.opt (-fexcess-precision=): New option.
        * config/i386/i386.h (X87_ENABLE_ARITH, X87_ENABLE_FLOAT): New.
        * config/i386/i386.md (float<SSEMODEI24:mode><X87MODEF:mode>2):
        For standard excess precision, output explicit conversion to and
        truncation from XFmode.
        (*float<SSEMODEI24:mode><X87MODEF:mode>2_1,
        *float<SSEMODEI24:mode><X87MODEF:mode>2_i387_with_temp,
        *float<SSEMODEI24:mode><X87MODEF:mode>2_i387, two unnamed
        define_splits, floatdi<X87MODEF:mode>2_i387_with_xmm, two unnamed
        define_splits, *floatunssi<mode>2_1, two unnamed define_splits,
        floatunssi<mode>2, add<mode>3, sub<mode>3, mul<mode>3, divdf3,
        divsf3, *fop_<mode>_comm_i387, *fop_<mode>_1_i387,
        *fop_<MODEF:mode>_2_i387, *fop_<MODEF:mode>_3_i387,
        *fop_df_4_i387, *fop_df_5_i387, *fop_df_6_i387, two unnamed
        define_splits, sqrt<mode>2): Disable where appropriate for
        standard excess precision.
        * convert.c (convert_to_real): Do not shorten arithmetic to type
        for which excess precision would be used.
        * defaults.h (TARGET_FLT_EVAL_METHOD_NON_DEFAULT): Define.
        * doc/invoke.texi (-fexcess-precision=): Document option.
        (-mfpmath=): Correct index entry.
        * flags.h (enum excess_precision, flag_excess_precision_cmdline,
        flag_excess_precision): New.
        * langhooks.c (lhd_post_options): Set
        flag_excess_precision_cmdline.
        * opts.c (common_handle_option): Handle -fexcess-precision=.
        * toplev.c (flag_excess_precision_cmdline, flag_excess_precision,
        init_excess_precision): New.
        (lang_dependent_init_target): Call init_excess_precision.
        * tree.c (excess_precision_type): New.
        * tree.h (excess_precision_type): Declare.

ada:
        * gcc-interface/misc.c (gnat_post_options): Set
        flag_excess_precision_cmdline.  Give an error for
        -fexcess-precision=standard for processors where the option is
        significant.

fortran:
        * options.c (gfc_post_options): Set
        flag_excess_precision_cmdline.  Give an error for
        -fexcess-precision=standard for processors where the option is
        significant.

java:
        * lang.c (java_post_options): Set flag_excess_precision_cmdline.
        Give an error for -fexcess-precision=standard for processors where
        the option is significant.

testsuite:
        * gcc.target/i386/excess-precision-1.c,
        gcc.target/i386/excess-precision-2.c,
        gcc.target/i386/excess-precision-3.c,
        gcc.target/i386/excess-precision-4.c,
        gcc.target/i386/excess-precision-5.c,
        gcc.target/i386/excess-precision-6.c: New tests.

Added:
    trunk/gcc/testsuite/gcc.target/i386/excess-precision-1.c
    trunk/gcc/testsuite/gcc.target/i386/excess-precision-2.c
    trunk/gcc/testsuite/gcc.target/i386/excess-precision-3.c
    trunk/gcc/testsuite/gcc.target/i386/excess-precision-4.c
    trunk/gcc/testsuite/gcc.target/i386/excess-precision-5.c
    trunk/gcc/testsuite/gcc.target/i386/excess-precision-6.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/ada/ChangeLog
    trunk/gcc/ada/gcc-interface/misc.c
    trunk/gcc/c-common.c
    trunk/gcc/c-common.def
    trunk/gcc/c-cppbuiltin.c
    trunk/gcc/c-lex.c
    trunk/gcc/c-opts.c
    trunk/gcc/c-parser.c
    trunk/gcc/c-typeck.c
    trunk/gcc/common.opt
    trunk/gcc/config/i386/i386.h
    trunk/gcc/config/i386/i386.md
    trunk/gcc/convert.c
    trunk/gcc/defaults.h
    trunk/gcc/doc/invoke.texi
    trunk/gcc/flags.h
    trunk/gcc/fortran/ChangeLog
    trunk/gcc/fortran/options.c
    trunk/gcc/java/ChangeLog
    trunk/gcc/java/lang.c
    trunk/gcc/langhooks.c
    trunk/gcc/opts.c
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/toplev.c
    trunk/gcc/tree.c
    trunk/gcc/tree.h


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=323



More information about the Gcc-bugs mailing list