diff options
author | Richard Henderson <rth@gcc.gnu.org> | 2000-01-24 12:10:04 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2000-01-24 12:10:04 -0800 |
commit | 1eb8759b1bc0fd2a74ddbd83db1f01df1a35df69 (patch) | |
tree | a9f7967b844ec94122754eade0945e4f551bf9f1 /gcc/combine.c | |
parent | d6cde8451a650824fcf971d56978b50d949aa3a2 (diff) | |
download | gcc-1eb8759b1bc0fd2a74ddbd83db1f01df1a35df69.zip gcc-1eb8759b1bc0fd2a74ddbd83db1f01df1a35df69.tar.gz gcc-1eb8759b1bc0fd2a74ddbd83db1f01df1a35df69.tar.bz2 |
rtl.def: Add unordered fp comparisions.
* rtl.def: Add unordered fp comparisions.
* tree.def: Likewise.
* tree.h: Add ISO C 9x unordered fp comparision builtins.
* builtins.c (expand_tree_builtin): New function.
* c-typeck.c (build_function_call): Use it.
(build_binary_op): Support unordered compares.
* c-common.c (c_common_nodes_and_builtins): Add unordered compares.
* combine.c (known_cond): Handle reverse_condition returning UNKNOWN.
(reversible_comparison_p): Allow UNORDERED/ORDERED to be reversed.
* cse.c (fold_rtx): Check FLOAT_MODE_P before reversing.
(record_jump_equiv): Handle reverse_condition returning UNKNOWN.
* jump.c (reverse_condition): Don't abort for UNLE etc, but
return UNKNOWN.
(swap_condition): Handle unordered compares.
(thread_jumps): Check can_reverse before reversing.
* loop.c (get_condition): Likewise. Allow UNORERED/ORDERED to be
reversed for FP.
* optabs.c (can_compare_p): New argument CODE. Verify branch or
setcc is present before acking for cmp_optab. Update all callers.
(prepare_float_lib_cmp, init_optabs): Handle UNORDERED.
* expmed.c (do_cmp_and_jump): Update for can_compare_p.
* expr.c (expand_expr): Likewise. Support unordered compares.
(do_jump, do_store_flag): Likewise.
* expr.h (enum libfunc_index): Add unordered compares.
* Makefile.in (FPBIT_FUNCS): Add _unord_sf.
(DPBIT_FUNCS): Add _unord_df.
* config/fp-bit.c (_unord_f2): New.
* fp-test.c (main): Try unordered compare builtins.
* alpha-protos.h (alpha_fp_comparison_operator): Declare.
* alpha.c (alpha_comparison_operator): Check mode properly.
(alpha_swapped_comparison_operator): Likewise.
(signed_comparison_operator): Likewise.
(alpha_fp_comparison_operator): New.
(alpha_emit_conditional_branch): Handle unordered compares.
* alpha.h (PREDICATE_CODES): Update.
* alpha.md (fp compares): Use alpha_fp_comparison_operator.
(bunordered, bordered): New.
* cp/call.c (build_over_call): Use expand_tree_builtin.
* cp/typeck.c (build_function_call_real): Likewise.
(build_binary_op_nodefault): Handle unordered compares.
* gcc.c-torture/execute/ieee/fp-cmp-4.c: New.
From-SVN: r31591
Diffstat (limited to 'gcc/combine.c')
-rw-r--r-- | gcc/combine.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/gcc/combine.c b/gcc/combine.c index 99fe499..8d578eb 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -7313,11 +7313,17 @@ known_cond (x, cond, reg, val) if (rtx_equal_p (XEXP (x, 0), reg) && rtx_equal_p (XEXP (x, 1), val)) { if (GET_RTX_CLASS (code) == '<') - return (comparison_dominates_p (cond, code) ? const_true_rtx - : (comparison_dominates_p (cond, - reverse_condition (code)) - ? const0_rtx : x)); + { + if (comparison_dominates_p (cond, code)) + return const_true_rtx; + code = reverse_condition (code); + if (code != UNKNOWN + && comparison_dominates_p (cond, code)) + return const0_rtx; + else + return x; + } else if (code == SMAX || code == SMIN || code == UMIN || code == UMAX) { @@ -10852,7 +10858,8 @@ reversible_comparison_p (x) { if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT || flag_fast_math - || GET_CODE (x) == NE || GET_CODE (x) == EQ) + || GET_CODE (x) == NE || GET_CODE (x) == EQ + || GET_CODE (x) == UNORDERED || GET_CODE (x) == ORDERED) return 1; switch (GET_MODE_CLASS (GET_MODE (XEXP (x, 0)))) |