Commit 0948ccb2 by Paolo Bonzini Committed by Paolo Bonzini

i386.h (enum ix86_fpcmp_strategy): New.

2009-06-28  Paolo Bonzini  <bonzini@gnu.org>

        * config/i386/i386.h (enum ix86_fpcmp_strategy): New.
        * config/i386/i386.md (cbranchxf4, cstorexf4, cbranch<MODEF>4,
        cstore<MODEF>4, mov<X87MODEF>cc): Change predicate to
        ix86_fp_comparison_operator.
        (*fp_jcc_1_mixed, *fp_jcc_1_sse, *fp_jcc_1_387, *fp_jcc_2_mixed,
        *fp_jcc_2_sse, *fp_jcc_2_387): Delete
        (*fp_jcc_3_387, *fp_jcc_4_387, *fp_jcc_5_387, *fp_jcc_6_387,
        *fp_jcc_7_387, *fp_jcc_8<MODEF>_387): Eliminate call to
        !ix86_use_fcomi_compare, change ix86_fp_jump_nontrivial_p call
        to !TARGET_CMOVE, change predicate to ix86_fp_comparison_operator.
        (related splits): Change predicate to ix86_fp_comparison_operator.
        * config/i386/predicates.md: Use ix86_trivial_fp_comparison_operator
        instead of ix86_fp_comparison_codes.
        (ix86_trivial_fp_comparison_operator,
        ix86_fp_comparison_operator): New.
        * config/i386/i386-protos.h (ix86_fp_comparison_strategy): New.
        (ix86_expand_compare): Eliminate last two parameters.
        (ix86_fp_jump_nontrivial_p): Kill.
        * config/i386/i386.c (put_condition_code): Eliminate call to
        ix86_fp_comparison_codes and subsequent assertion.
        (ix86_fp_comparison_codes): Eliminate.
        (ix86_fp_swap_condition): New.
        (ix86_fp_comparison_arithmetics_cost, ix86_fp_comparison_fcomi_cost,
        ix86_fp_comparison_sahf_cost, ix86_use_fcomi_compare): Consolidate
        into ix86_fp_comparison_cost and ix86_fp_comparison_strategy.
        (ix86_prepare_fp_compare_args): Use ix86_fp_comparison_strategy
        and ix86_fp_swap_condition.
        (ix86_expand_fp_compare): Eliminate code for second jump/bypass jump.
        Use ix86_fp_comparison_strategy.
        (ix86_expand_compare): Likewise.  Eliminate last two arguments.
        (ix86_fp_jump_nontrivial_p): Eliminate.
        (ix86_expand_branch): Treat SFmode/DFmode/XFmode as simple.  Adjust
        call to ix86_expand_compare.
        (ix86_split_fp_branch, ix86_expand_setcc,
        ix86_expand_carry_flag_compare, ix86_expand_int_movcc,
        ix86_expand_fp_movcc): Eliminate code for second jump/bypass jump.

From-SVN: r149035
parent accbd151
2009-06-28 Paolo Bonzini <bonzini@gnu.org> 2009-06-28 Paolo Bonzini <bonzini@gnu.org>
* config/i386/i386.h (enum ix86_fpcmp_strategy): New.
* config/i386/i386.md (cbranchxf4, cstorexf4, cbranch<MODEF>4,
cstore<MODEF>4, mov<X87MODEF>cc): Change predicate to
ix86_fp_comparison_operator.
(*fp_jcc_1_mixed, *fp_jcc_1_sse, *fp_jcc_1_387, *fp_jcc_2_mixed,
*fp_jcc_2_sse, *fp_jcc_2_387): Delete
(*fp_jcc_3_387, *fp_jcc_4_387, *fp_jcc_5_387, *fp_jcc_6_387,
*fp_jcc_7_387, *fp_jcc_8<MODEF>_387): Eliminate call to
!ix86_use_fcomi_compare, change ix86_fp_jump_nontrivial_p call
to !TARGET_CMOVE, change predicate to ix86_fp_comparison_operator.
(related splits): Change predicate to ix86_fp_comparison_operator.
* config/i386/predicates.md: Use ix86_trivial_fp_comparison_operator
instead of ix86_fp_comparison_codes.
(ix86_trivial_fp_comparison_operator,
ix86_fp_comparison_operator): New.
* config/i386/i386-protos.h (ix86_fp_comparison_strategy): New.
(ix86_expand_compare): Eliminate last two parameters.
(ix86_fp_jump_nontrivial_p): Kill.
* config/i386/i386.c (put_condition_code): Eliminate call to
ix86_fp_comparison_codes and subsequent assertion.
(ix86_fp_comparison_codes): Eliminate.
(ix86_fp_swap_condition): New.
(ix86_fp_comparison_arithmetics_cost, ix86_fp_comparison_fcomi_cost,
ix86_fp_comparison_sahf_cost, ix86_use_fcomi_compare): Consolidate
into ix86_fp_comparison_cost and ix86_fp_comparison_strategy.
(ix86_prepare_fp_compare_args): Use ix86_fp_comparison_strategy
and ix86_fp_swap_condition.
(ix86_expand_fp_compare): Eliminate code for second jump/bypass jump.
Use ix86_fp_comparison_strategy.
(ix86_expand_compare): Likewise. Eliminate last two arguments.
(ix86_fp_jump_nontrivial_p): Eliminate.
(ix86_expand_branch): Treat SFmode/DFmode/XFmode as simple. Adjust
call to ix86_expand_compare.
(ix86_split_fp_branch, ix86_expand_setcc,
ix86_expand_carry_flag_compare, ix86_expand_int_movcc,
ix86_expand_fp_movcc): Eliminate code for second jump/bypass jump.
2009-06-28 Paolo Bonzini <bonzini@gnu.org>
* config/arm/arm.c (arm_final_prescan_ins): Eliminate code * config/arm/arm.c (arm_final_prescan_ins): Eliminate code
related to jump_clobbers. related to jump_clobbers.
* config/arm/arm.md (conds): Remove jump_clob case. * config/arm/arm.md (conds): Remove jump_clob case.
......
...@@ -95,6 +95,7 @@ extern void ix86_expand_convert_uns_sixf_sse (rtx, rtx); ...@@ -95,6 +95,7 @@ extern void ix86_expand_convert_uns_sixf_sse (rtx, rtx);
extern void ix86_expand_convert_uns_sidf_sse (rtx, rtx); extern void ix86_expand_convert_uns_sidf_sse (rtx, rtx);
extern void ix86_expand_convert_uns_sisf_sse (rtx, rtx); extern void ix86_expand_convert_uns_sisf_sse (rtx, rtx);
extern void ix86_expand_convert_sign_didf_sse (rtx, rtx); extern void ix86_expand_convert_sign_didf_sse (rtx, rtx);
extern enum ix86_fpcmp_strategy ix86_fp_comparison_strategy (enum rtx_code);
extern void ix86_expand_fp_absneg_operator (enum rtx_code, enum machine_mode, extern void ix86_expand_fp_absneg_operator (enum rtx_code, enum machine_mode,
rtx[]); rtx[]);
extern void ix86_expand_copysign (rtx []); extern void ix86_expand_copysign (rtx []);
...@@ -102,7 +103,7 @@ extern void ix86_split_copysign_const (rtx []); ...@@ -102,7 +103,7 @@ extern void ix86_split_copysign_const (rtx []);
extern void ix86_split_copysign_var (rtx []); extern void ix86_split_copysign_var (rtx []);
extern int ix86_unary_operator_ok (enum rtx_code, enum machine_mode, rtx[]); extern int ix86_unary_operator_ok (enum rtx_code, enum machine_mode, rtx[]);
extern int ix86_match_ccmode (rtx, enum machine_mode); extern int ix86_match_ccmode (rtx, enum machine_mode);
extern rtx ix86_expand_compare (enum rtx_code, rtx *, rtx *); extern rtx ix86_expand_compare (enum rtx_code);
extern int ix86_use_fcomi_compare (enum rtx_code); extern int ix86_use_fcomi_compare (enum rtx_code);
extern void ix86_expand_branch (enum rtx_code, rtx); extern void ix86_expand_branch (enum rtx_code, rtx);
extern void ix86_expand_setcc (enum rtx_code, rtx); extern void ix86_expand_setcc (enum rtx_code, rtx);
...@@ -162,7 +163,6 @@ extern enum reg_class ix86_preferred_output_reload_class (rtx, enum reg_class); ...@@ -162,7 +163,6 @@ extern enum reg_class ix86_preferred_output_reload_class (rtx, enum reg_class);
extern int ix86_memory_move_cost (enum machine_mode, enum reg_class, int); extern int ix86_memory_move_cost (enum machine_mode, enum reg_class, int);
extern int ix86_mode_needed (int, rtx); extern int ix86_mode_needed (int, rtx);
extern void emit_i387_cw_initialization (int); extern void emit_i387_cw_initialization (int);
extern bool ix86_fp_jump_nontrivial_p (enum rtx_code);
extern void x86_order_regs_for_local_alloc (void); extern void x86_order_regs_for_local_alloc (void);
extern void x86_function_profiler (FILE *, int); extern void x86_function_profiler (FILE *, int);
extern void x86_emit_floatuns (rtx [2]); extern void x86_emit_floatuns (rtx [2]);
......
...@@ -2308,6 +2308,12 @@ extern enum reg_class const regclass_map[FIRST_PSEUDO_REGISTER]; ...@@ -2308,6 +2308,12 @@ extern enum reg_class const regclass_map[FIRST_PSEUDO_REGISTER];
extern rtx ix86_compare_op0; /* operand 0 for comparisons */ extern rtx ix86_compare_op0; /* operand 0 for comparisons */
extern rtx ix86_compare_op1; /* operand 1 for comparisons */ extern rtx ix86_compare_op1; /* operand 1 for comparisons */
enum ix86_fpcmp_strategy {
IX86_FPCMP_SAHF,
IX86_FPCMP_COMI,
IX86_FPCMP_ARITH
};
/* To properly truncate FP values into integers, we need to set i387 control /* To properly truncate FP values into integers, we need to set i387 control
word. We can't emit proper mode switching code before reload, as spills word. We can't emit proper mode switching code before reload, as spills
......
...@@ -952,9 +952,7 @@ ...@@ -952,9 +952,7 @@
if (inmode == CCFPmode || inmode == CCFPUmode) if (inmode == CCFPmode || inmode == CCFPUmode)
{ {
enum rtx_code second_code, bypass_code; if (!ix86_trivial_fp_comparison_operator (op, mode))
ix86_fp_comparison_codes (code, &bypass_code, &code, &second_code);
if (bypass_code != UNKNOWN || second_code != UNKNOWN)
return 0; return 0;
code = ix86_fp_compare_code_to_integer (code); code = ix86_fp_compare_code_to_integer (code);
} }
...@@ -1014,11 +1012,8 @@ ...@@ -1014,11 +1012,8 @@
enum rtx_code code = GET_CODE (op); enum rtx_code code = GET_CODE (op);
if (inmode == CCFPmode || inmode == CCFPUmode) if (inmode == CCFPmode || inmode == CCFPUmode)
{ return ix86_trivial_fp_comparison_operator (op, mode);
enum rtx_code second_code, bypass_code;
ix86_fp_comparison_codes (code, &bypass_code, &code, &second_code);
return (bypass_code == UNKNOWN && second_code == UNKNOWN);
}
switch (code) switch (code)
{ {
case EQ: case NE: case EQ: case NE:
...@@ -1059,9 +1054,7 @@ ...@@ -1059,9 +1054,7 @@
if (inmode == CCFPmode || inmode == CCFPUmode) if (inmode == CCFPmode || inmode == CCFPUmode)
{ {
enum rtx_code second_code, bypass_code; if (!ix86_trivial_fp_comparison_operator (op, mode))
ix86_fp_comparison_codes (code, &bypass_code, &code, &second_code);
if (bypass_code != UNKNOWN || second_code != UNKNOWN)
return 0; return 0;
code = ix86_fp_compare_code_to_integer (code); code = ix86_fp_compare_code_to_integer (code);
} }
...@@ -1073,6 +1066,19 @@ ...@@ -1073,6 +1066,19 @@
return code == LTU; return code == LTU;
}) })
;; Return 1 if this comparison only requires testing one flag bit.
(define_predicate "ix86_trivial_fp_comparison_operator"
(match_code "gt,ge,unlt,unle,uneq,ltgt,ordered,unordered"))
;; Return 1 if we know how to do this comparison. Others require
;; testing more than one flag bit, and we let the generic middle-end
;; code do that.
(define_predicate "ix86_fp_comparison_operator"
(if_then_else (match_test "ix86_fp_comparison_strategy (GET_CODE (op))
== IX86_FPCMP_ARITH")
(match_operand 0 "comparison_operator")
(match_operand 0 "ix86_trivial_fp_comparison_operator")))
;; Nearly general operand, but accept any const_double, since we wish ;; Nearly general operand, but accept any const_double, since we wish
;; to be able to drop them into memory rather than have them get pulled ;; to be able to drop them into memory rather than have them get pulled
;; into registers. ;; into registers.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment