From 27ac40e2a09b03d11470e714203f509cbf4078f8 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Fri, 13 Apr 2007 10:14:57 +0200 Subject: [PATCH] i386.h (X87_FLOAT_MODE_P): Check for TARGET_80387. * config/i386/i386.h (X87_FLOAT_MODE_P): Check for TARGET_80387. * config/i386/i386.md (*cmpfp0): Remove check for TARGET_80387, this check is now implied in X87_FLOAT_MODE_P. (*cmpfp_u, *cmpfp_, *cmpfp_i_i387): Ditto. (*cmpfp_iu_387, fix_trunc_fisttp_i386_1): Ditto. (fix_trunc_i386_fisttp): Ditto. (fix_trunc_i387_fisttp_with_temp): Ditto. (*fix_trunc_i387_1, fix_truncdi_i387): Ditto. (fix_truncdi_i387_with_temp, fix_trunc_i387): Ditto. (fix_trunc_i387_with_temp, *fp_jcc_1_387): Ditto. (*fp_jcc_2_387, *fp_jcc_5_387, *fp_jcc_6_387): Ditto. (*fp_jcc_7_387, *fp_jcc_8_387): Ditto. (unnamed_splitters): Ditto. * config/i386/i386.c (function_value_32): Generate FIRST_FLOAT_REG for X87_FLOAT_MODE_P mode. Override FIRST_FLOAT_REG with FIRST_SSE_REG for local functions when SSE math is enabled or for functions with sseregparm attribute. (standard_80387_constant_p): Return -1 if mode is not X87_FLOAT_MODE_P. (ix86_cc_mode): Assert that scalar mode is not DECIMAL_FLOAT_MODE_P. (ix86_expand_compare): Ditto. (ix86_expand_carry_flag_compare): Ditto. (ix86_expand_int_movcc): Check for SCALAR_FLOAT_MODE_P instead of FLOAT_MODE_P for cmp_mode and assert that cmp_mode is not DECIMAL_FLOAT_MODE_P. (ix86_preferred_output_reload_class): Use X87_FLOAT_MODE_P instead of SCALAR_FLOAT_MODE_P. (ix86_rtx_costs) [PLUS] Remove FLOAT_MODE_P and fall through to ... [MINUS]: ... here. Add SSE_FLOAT_MODE_P and X87_FLOAT_MODE_P checks before FLOAT_MODE_P. [MULT]: Add SSE_FLOAT_MODE_P and X87_FLOAT_MODE_P checks before FLOAT_MODE_P. [DIV]: Ditto. [NEG]: Ditto. [ABS]: Ditto. [SQRT]: Ditto. [FLOAT_EXTEND]: Use SSE_FLOAT_MODE_P. From-SVN: r123777 --- gcc/ChangeLog | 40 ++++++++++ gcc/config/i386/i386.c | 173 ++++++++++++++++++++++++++++------------ gcc/config/i386/i386.h | 4 +- gcc/config/i386/i386.md | 76 ++++++++---------- 4 files changed, 198 insertions(+), 95 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 86b29907bc76..fb9a7338faad 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,43 @@ +2007-04-13 Uros Bizjak + + * config/i386/i386.h (X87_FLOAT_MODE_P): Check for TARGET_80387. + * config/i386/i386.md (*cmpfp0): Remove check for TARGET_80387, this + check is now implied in X87_FLOAT_MODE_P. + (*cmpfp_u, *cmpfp_, *cmpfp_i_i387): Ditto. + (*cmpfp_iu_387, fix_trunc_fisttp_i386_1): Ditto. + (fix_trunc_i386_fisttp): Ditto. + (fix_trunc_i387_fisttp_with_temp): Ditto. + (*fix_trunc_i387_1, fix_truncdi_i387): Ditto. + (fix_truncdi_i387_with_temp, fix_trunc_i387): Ditto. + (fix_trunc_i387_with_temp, *fp_jcc_1_387): Ditto. + (*fp_jcc_2_387, *fp_jcc_5_387, *fp_jcc_6_387): Ditto. + (*fp_jcc_7_387, *fp_jcc_8_387): Ditto. + (unnamed_splitters): Ditto. + * config/i386/i386.c (function_value_32): Generate FIRST_FLOAT_REG + for X87_FLOAT_MODE_P mode. Override FIRST_FLOAT_REG with + FIRST_SSE_REG for local functions when SSE math is enabled or + for functions with sseregparm attribute. + (standard_80387_constant_p): Return -1 if mode is not + X87_FLOAT_MODE_P. + (ix86_cc_mode): Assert that scalar mode is not DECIMAL_FLOAT_MODE_P. + (ix86_expand_compare): Ditto. + (ix86_expand_carry_flag_compare): Ditto. + (ix86_expand_int_movcc): Check for SCALAR_FLOAT_MODE_P instead + of FLOAT_MODE_P for cmp_mode and assert that cmp_mode is not + DECIMAL_FLOAT_MODE_P. + (ix86_preferred_output_reload_class): Use X87_FLOAT_MODE_P instead + of SCALAR_FLOAT_MODE_P. + (ix86_rtx_costs) [PLUS] Remove FLOAT_MODE_P and fall through to ... + [MINUS]: ... here. Add SSE_FLOAT_MODE_P and X87_FLOAT_MODE_P + checks before FLOAT_MODE_P. + [MULT]: Add SSE_FLOAT_MODE_P and X87_FLOAT_MODE_P checks + before FLOAT_MODE_P. + [DIV]: Ditto. + [NEG]: Ditto. + [ABS]: Ditto. + [SQRT]: Ditto. + [FLOAT_EXTEND]: Use SSE_FLOAT_MODE_P. + 2007-04-12 Paolo Bonzini Charles Wilson diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 1acca3bb5531..a964b6a00535 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -4181,27 +4181,21 @@ function_value_32 (enum machine_mode orig_mode, enum machine_mode mode, || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16)) regno = TARGET_SSE ? FIRST_SSE_REG : 0; - /* Decimal floating point values can go in %eax, unlike other float modes. */ - else if (DECIMAL_FLOAT_MODE_P (mode)) - regno = 0; - - /* Most things go in %eax, except (unless -mno-fp-ret-in-387) fp values. */ - else if (!SCALAR_FLOAT_MODE_P (mode) || !TARGET_FLOAT_RETURNS_IN_80387) - regno = 0; - - /* Floating point return values in %st(0), except for local functions when - SSE math is enabled or for functions with sseregparm attribute. */ + /* Floating point return values in %st(0) (unless -mno-fp-ret-in-387). */ + else if (X87_FLOAT_MODE_P (mode) && TARGET_FLOAT_RETURNS_IN_80387) + regno = FIRST_FLOAT_REG; else + /* Most things go in %eax. */ + regno = 0; + + /* Override FP return register with %xmm0 for local functions when + SSE math is enabled or for functions with sseregparm attribute. */ + if ((fn || fntype) && (mode == SFmode || mode == DFmode)) { - regno = FIRST_FLOAT_REG; - - if ((fn || fntype) && (mode == SFmode || mode == DFmode)) - { - int sse_level = ix86_function_sseregparm (fntype, fn); - if ((sse_level >= 1 && mode == SFmode) - || (sse_level == 2 && mode == DFmode)) - regno = FIRST_SSE_REG; - } + int sse_level = ix86_function_sseregparm (fntype, fn); + if ((sse_level >= 1 && mode == SFmode) + || (sse_level == 2 && mode == DFmode)) + regno = FIRST_SSE_REG; } return gen_rtx_REG (orig_mode, regno); @@ -4976,21 +4970,23 @@ init_ext_80387_constants (void) int standard_80387_constant_p (rtx x) { + enum machine_mode mode = GET_MODE (x); + REAL_VALUE_TYPE r; - if (GET_CODE (x) != CONST_DOUBLE || !FLOAT_MODE_P (GET_MODE (x))) + if (!(X87_FLOAT_MODE_P (mode) && (GET_CODE (x) == CONST_DOUBLE))) return -1; - if (x == CONST0_RTX (GET_MODE (x))) + if (x == CONST0_RTX (mode)) return 1; - if (x == CONST1_RTX (GET_MODE (x))) + if (x == CONST1_RTX (mode)) return 2; REAL_VALUE_FROM_CONST_DOUBLE (r, x); /* For XFmode constants, try to find a special 80387 instruction when optimizing for size or on those CPUs that benefit from them. */ - if (GET_MODE (x) == XFmode + if (mode == XFmode && (optimize_size || TARGET_EXT_80387_CONSTANTS)) { int i; @@ -10683,8 +10679,14 @@ ix86_fp_compare_mode (enum rtx_code code ATTRIBUTE_UNUSED) enum machine_mode ix86_cc_mode (enum rtx_code code, rtx op0, rtx op1) { - if (SCALAR_FLOAT_MODE_P (GET_MODE (op0))) - return ix86_fp_compare_mode (code); + enum machine_mode mode = GET_MODE (op0); + + if (SCALAR_FLOAT_MODE_P (mode)) + { + gcc_assert (!DECIMAL_FLOAT_MODE_P (mode)); + return ix86_fp_compare_mode (code); + } + switch (code) { /* Only zero flag is needed. */ @@ -11269,8 +11271,11 @@ ix86_expand_compare (enum rtx_code code, rtx *second_test, rtx *bypass_test) ix86_compare_emitted = NULL_RTX; } else if (SCALAR_FLOAT_MODE_P (GET_MODE (op0))) - ret = ix86_expand_fp_compare (code, op0, op1, NULL_RTX, - second_test, bypass_test); + { + gcc_assert (!DECIMAL_FLOAT_MODE_P (GET_MODE (op0))); + ret = ix86_expand_fp_compare (code, op0, op1, NULL_RTX, + second_test, bypass_test); + } else ret = ix86_expand_int_compare (code, op0, op1); @@ -11631,16 +11636,20 @@ ix86_expand_carry_flag_compare (enum rtx_code code, rtx op0, rtx op1, rtx *pop) enum machine_mode mode = GET_MODE (op0) != VOIDmode ? GET_MODE (op0) : GET_MODE (op1); - /* Do not handle DImode compares that go through special path. Also we can't - deal with FP compares yet. This is possible to add. */ + /* Do not handle DImode compares that go through special path. + Also we can't deal with FP compares yet. This is possible to add. */ if (mode == (TARGET_64BIT ? TImode : DImode)) return false; - if (FLOAT_MODE_P (mode)) + + if (SCALAR_FLOAT_MODE_P (mode)) { rtx second_test = NULL, bypass_test = NULL; rtx compare_op, compare_seq; - /* Shortcut: following common codes never translate into carry flag compares. */ + gcc_assert (!DECIMAL_FLOAT_MODE_P (mode)); + + /* Shortcut: following common codes never translate + into carry flag compares. */ if (code == EQ || code == NE || code == UNEQ || code == LTGT || code == ORDERED || code == UNORDERED) return false; @@ -11929,11 +11938,16 @@ ix86_expand_int_movcc (rtx operands[]) if (diff < 0) { + enum machine_mode cmp_mode = GET_MODE (ix86_compare_op0); + HOST_WIDE_INT tmp; tmp = ct, ct = cf, cf = tmp; diff = -diff; - if (FLOAT_MODE_P (GET_MODE (ix86_compare_op0))) + + if (SCALAR_FLOAT_MODE_P (cmp_mode)) { + gcc_assert (!DECIMAL_FLOAT_MODE_P (cmp_mode)); + /* We may be reversing unordered compare to normal compare, that is not valid in general (we may convert non-trapping condition to trapping one), however on i386 we currently emit all @@ -12082,14 +12096,21 @@ ix86_expand_int_movcc (rtx operands[]) { if (cf == 0) { + enum machine_mode cmp_mode = GET_MODE (ix86_compare_op0); + cf = ct; ct = 0; - if (FLOAT_MODE_P (GET_MODE (ix86_compare_op0))) - /* We may be reversing unordered compare to normal compare, - that is not valid in general (we may convert non-trapping - condition to trapping one), however on i386 we currently - emit all comparisons unordered. */ - code = reverse_condition_maybe_unordered (code); + + if (SCALAR_FLOAT_MODE_P (cmp_mode)) + { + gcc_assert (!DECIMAL_FLOAT_MODE_P (cmp_mode)); + + /* We may be reversing unordered compare to normal compare, + that is not valid in general (we may convert non-trapping + condition to trapping one), however on i386 we currently + emit all comparisons unordered. */ + code = reverse_condition_maybe_unordered (code); + } else { code = reverse_condition (code); @@ -18863,7 +18884,7 @@ ix86_preferred_output_reload_class (rtx x, enum reg_class class) if (TARGET_SSE_MATH && SSE_FLOAT_MODE_P (mode)) return MAYBE_SSE_CLASS_P (class) ? SSE_REGS : NO_REGS; - if (TARGET_80387 && SCALAR_FLOAT_MODE_P (mode)) + if (X87_FLOAT_MODE_P (mode)) { if (class == FP_TOP_SSE_REGS) return FP_TOP_REG; @@ -19348,8 +19369,20 @@ ix86_rtx_costs (rtx x, int code, int outer_code, int *total) return false; case MULT: - if (FLOAT_MODE_P (mode)) + if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH) { + /* ??? SSE scalar cost should be used here. */ + *total = ix86_cost->fmul; + return false; + } + else if (X87_FLOAT_MODE_P (mode)) + { + *total = ix86_cost->fmul; + return false; + } + else if (FLOAT_MODE_P (mode)) + { + /* ??? SSE vector cost should be used here. */ *total = ix86_cost->fmul; return false; } @@ -19402,16 +19435,20 @@ ix86_rtx_costs (rtx x, int code, int outer_code, int *total) case UDIV: case MOD: case UMOD: - if (FLOAT_MODE_P (mode)) + if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH) + /* ??? SSE cost should be used here. */ + *total = ix86_cost->fdiv; + else if (X87_FLOAT_MODE_P (mode)) + *total = ix86_cost->fdiv; + else if (FLOAT_MODE_P (mode)) + /* ??? SSE vector cost should be used here. */ *total = ix86_cost->fdiv; else *total = ix86_cost->divide[MODE_INDEX (mode)]; return false; case PLUS: - if (FLOAT_MODE_P (mode)) - *total = ix86_cost->fadd; - else if (GET_MODE_CLASS (mode) == MODE_INT + if (GET_MODE_CLASS (mode) == MODE_INT && GET_MODE_BITSIZE (mode) <= GET_MODE_BITSIZE (Pmode)) { if (GET_CODE (XEXP (x, 0)) == PLUS @@ -19454,8 +19491,20 @@ ix86_rtx_costs (rtx x, int code, int outer_code, int *total) /* FALLTHRU */ case MINUS: - if (FLOAT_MODE_P (mode)) + if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH) { + /* ??? SSE cost should be used here. */ + *total = ix86_cost->fadd; + return false; + } + else if (X87_FLOAT_MODE_P (mode)) + { + *total = ix86_cost->fadd; + return false; + } + else if (FLOAT_MODE_P (mode)) + { + /* ??? SSE vector cost should be used here. */ *total = ix86_cost->fadd; return false; } @@ -19476,8 +19525,20 @@ ix86_rtx_costs (rtx x, int code, int outer_code, int *total) /* FALLTHRU */ case NEG: - if (FLOAT_MODE_P (mode)) + if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH) { + /* ??? SSE cost should be used here. */ + *total = ix86_cost->fchs; + return false; + } + else if (X87_FLOAT_MODE_P (mode)) + { + *total = ix86_cost->fchs; + return false; + } + else if (FLOAT_MODE_P (mode)) + { + /* ??? SSE vector cost should be used here. */ *total = ix86_cost->fchs; return false; } @@ -19506,19 +19567,29 @@ ix86_rtx_costs (rtx x, int code, int outer_code, int *total) return false; case FLOAT_EXTEND: - if (!TARGET_SSE_MATH - || mode == XFmode - || (mode == DFmode && !TARGET_SSE2)) + if (!(SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)) *total = 0; return false; case ABS: - if (FLOAT_MODE_P (mode)) + if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH) + /* ??? SSE cost should be used here. */ + *total = ix86_cost->fabs; + else if (X87_FLOAT_MODE_P (mode)) + *total = ix86_cost->fabs; + else if (FLOAT_MODE_P (mode)) + /* ??? SSE vector cost should be used here. */ *total = ix86_cost->fabs; return false; case SQRT: - if (FLOAT_MODE_P (mode)) + if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH) + /* ??? SSE cost should be used here. */ + *total = ix86_cost->fsqrt; + else if (X87_FLOAT_MODE_P (mode)) + *total = ix86_cost->fsqrt; + else if (FLOAT_MODE_P (mode)) + /* ??? SSE vector cost should be used here. */ *total = ix86_cost->fsqrt; return false; diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index 859bcee887a7..0ed9c1245c1a 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -1363,9 +1363,7 @@ enum reg_class #define ANY_FP_REGNO_P(N) (FP_REGNO_P (N) || SSE_REGNO_P (N)) #define X87_FLOAT_MODE_P(MODE) \ - ((MODE) == SFmode \ - || (MODE) == DFmode \ - || (MODE) == XFmode) + (TARGET_80387 && ((MODE) == SFmode || (MODE) == DFmode || (MODE) == XFmode)) #define SSE_REG_P(N) (REG_P (N) && SSE_REGNO_P (REGNO (N))) #define SSE_REGNO_P(N) \ diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 6aa4843578db..b306e05ef217 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -866,8 +866,7 @@ (match_operand 1 "register_operand" "f") (match_operand 2 "const0_operand" "X"))] UNSPEC_FNSTSW))] - "TARGET_80387 - && X87_FLOAT_MODE_P (GET_MODE (operands[1])) + "X87_FLOAT_MODE_P (GET_MODE (operands[1])) && GET_MODE (operands[1]) == GET_MODE (operands[2])" "* return output_fp_compare (insn, operands, 0, 0);" [(set_attr "type" "multi") @@ -913,8 +912,7 @@ (match_operand 1 "register_operand" "f") (match_operand 2 "register_operand" "f"))] UNSPEC_FNSTSW))] - "TARGET_80387 - && X87_FLOAT_MODE_P (GET_MODE (operands[1])) + "X87_FLOAT_MODE_P (GET_MODE (operands[1])) && GET_MODE (operands[1]) == GET_MODE (operands[2])" "* return output_fp_compare (insn, operands, 0, 1);" [(set_attr "type" "multi") @@ -935,8 +933,8 @@ (match_operator 3 "float_operator" [(match_operand:X87MODEI12 2 "memory_operand" "m")]))] UNSPEC_FNSTSW))] - "TARGET_80387 && TARGET_USE_MODE_FIOP - && X87_FLOAT_MODE_P (GET_MODE (operands[1])) + "X87_FLOAT_MODE_P (GET_MODE (operands[1])) + && TARGET_USE_MODE_FIOP && (GET_MODE (operands [3]) == GET_MODE (operands[1]))" "* return output_fp_compare (insn, operands, 0, 0);" [(set_attr "type" "multi") @@ -1014,9 +1012,9 @@ [(set (reg:CCFP FLAGS_REG) (compare:CCFP (match_operand 0 "register_operand" "f") (match_operand 1 "register_operand" "f")))] - "TARGET_80387 && TARGET_CMOVE + "X87_FLOAT_MODE_P (GET_MODE (operands[0])) + && TARGET_CMOVE && (!TARGET_SSE_MATH || !SSE_FLOAT_MODE_P (GET_MODE (operands[0]))) - && X87_FLOAT_MODE_P (GET_MODE (operands[0])) && GET_MODE (operands[0]) == GET_MODE (operands[1])" "* return output_fp_compare (insn, operands, 1, 0);" [(set_attr "type" "fcmp") @@ -1066,9 +1064,9 @@ [(set (reg:CCFPU FLAGS_REG) (compare:CCFPU (match_operand 0 "register_operand" "f") (match_operand 1 "register_operand" "f")))] - "TARGET_80387 && TARGET_CMOVE + "X87_FLOAT_MODE_P (GET_MODE (operands[0])) + && TARGET_CMOVE && (!TARGET_SSE_MATH || !SSE_FLOAT_MODE_P (GET_MODE (operands[0]))) - && X87_FLOAT_MODE_P (GET_MODE (operands[0])) && GET_MODE (operands[0]) == GET_MODE (operands[1])" "* return output_fp_compare (insn, operands, 1, 1);" [(set_attr "type" "fcmp") @@ -4237,8 +4235,8 @@ (define_insn_and_split "fix_trunc_fisttp_i387_1" [(set (match_operand:X87MODEI 0 "nonimmediate_operand" "=m,?r") (fix:X87MODEI (match_operand 1 "register_operand" "f,f")))] - "TARGET_FISTTP - && X87_FLOAT_MODE_P (GET_MODE (operands[1])) + "X87_FLOAT_MODE_P (GET_MODE (operands[1])) + && TARGET_FISTTP && !((SSE_FLOAT_MODE_P (GET_MODE (operands[1])) && (TARGET_64BIT || mode != DImode)) && TARGET_SSE_MATH) @@ -4265,8 +4263,8 @@ [(set (match_operand:X87MODEI 0 "memory_operand" "=m") (fix:X87MODEI (match_operand 1 "register_operand" "f"))) (clobber (match_scratch:XF 2 "=&1f"))] - "TARGET_FISTTP - && X87_FLOAT_MODE_P (GET_MODE (operands[1])) + "X87_FLOAT_MODE_P (GET_MODE (operands[1])) + && TARGET_FISTTP && !((SSE_FLOAT_MODE_P (GET_MODE (operands[1])) && (TARGET_64BIT || mode != DImode)) && TARGET_SSE_MATH)" @@ -4279,8 +4277,8 @@ (fix:X87MODEI (match_operand 1 "register_operand" "f,f"))) (clobber (match_operand:X87MODEI 2 "memory_operand" "=m,m")) (clobber (match_scratch:XF 3 "=&1f,&1f"))] - "TARGET_FISTTP - && X87_FLOAT_MODE_P (GET_MODE (operands[1])) + "X87_FLOAT_MODE_P (GET_MODE (operands[1])) + && TARGET_FISTTP && !((SSE_FLOAT_MODE_P (GET_MODE (operands[1])) && (TARGET_64BIT || mode != DImode)) && TARGET_SSE_MATH)" @@ -4318,8 +4316,8 @@ [(set (match_operand:X87MODEI 0 "nonimmediate_operand" "=m,?r") (fix:X87MODEI (match_operand 1 "register_operand" "f,f"))) (clobber (reg:CC FLAGS_REG))] - "TARGET_80387 && !TARGET_FISTTP - && X87_FLOAT_MODE_P (GET_MODE (operands[1])) + "X87_FLOAT_MODE_P (GET_MODE (operands[1])) + && !TARGET_FISTTP && !(SSE_FLOAT_MODE_P (GET_MODE (operands[1])) && (TARGET_64BIT || mode != DImode)) && !(reload_completed || reload_in_progress)" @@ -4353,8 +4351,8 @@ (use (match_operand:HI 2 "memory_operand" "m")) (use (match_operand:HI 3 "memory_operand" "m")) (clobber (match_scratch:XF 4 "=&1f"))] - "TARGET_80387 && !TARGET_FISTTP - && X87_FLOAT_MODE_P (GET_MODE (operands[1])) + "X87_FLOAT_MODE_P (GET_MODE (operands[1])) + && !TARGET_FISTTP && !(TARGET_64BIT && SSE_FLOAT_MODE_P (GET_MODE (operands[1])))" "* return output_fix_trunc (insn, operands, 0);" [(set_attr "type" "fistp") @@ -4368,8 +4366,8 @@ (use (match_operand:HI 3 "memory_operand" "m,m")) (clobber (match_operand:DI 4 "memory_operand" "=m,m")) (clobber (match_scratch:XF 5 "=&1f,&1f"))] - "TARGET_80387 && !TARGET_FISTTP - && X87_FLOAT_MODE_P (GET_MODE (operands[1])) + "X87_FLOAT_MODE_P (GET_MODE (operands[1])) + && !TARGET_FISTTP && !(TARGET_64BIT && SSE_FLOAT_MODE_P (GET_MODE (operands[1])))" "#" [(set_attr "type" "fistp") @@ -4410,8 +4408,8 @@ (fix:X87MODEI12 (match_operand 1 "register_operand" "f"))) (use (match_operand:HI 2 "memory_operand" "m")) (use (match_operand:HI 3 "memory_operand" "m"))] - "TARGET_80387 && !TARGET_FISTTP - && X87_FLOAT_MODE_P (GET_MODE (operands[1])) + "X87_FLOAT_MODE_P (GET_MODE (operands[1])) + && !TARGET_FISTTP && !SSE_FLOAT_MODE_P (GET_MODE (operands[1]))" "* return output_fix_trunc (insn, operands, 0);" [(set_attr "type" "fistp") @@ -4424,8 +4422,8 @@ (use (match_operand:HI 2 "memory_operand" "m,m")) (use (match_operand:HI 3 "memory_operand" "m,m")) (clobber (match_operand:X87MODEI12 4 "memory_operand" "=m,m"))] - "TARGET_80387 && !TARGET_FISTTP - && X87_FLOAT_MODE_P (GET_MODE (operands[1])) + "X87_FLOAT_MODE_P (GET_MODE (operands[1])) + && !TARGET_FISTTP && !SSE_FLOAT_MODE_P (GET_MODE (operands[1]))" "#" [(set_attr "type" "fistp") @@ -4686,7 +4684,6 @@ [(set (match_operand 0 "fp_register_operand" "") (float (match_operand 1 "register_operand" "")))] "reload_completed - && TARGET_80387 && X87_FLOAT_MODE_P (GET_MODE (operands[0]))" [(const_int 0)] { @@ -13730,8 +13727,8 @@ (pc))) (clobber (reg:CCFP FPSR_REG)) (clobber (reg:CCFP FLAGS_REG))] - "TARGET_CMOVE && TARGET_80387 - && X87_FLOAT_MODE_P (GET_MODE (operands[1])) + "X87_FLOAT_MODE_P (GET_MODE (operands[1])) + && TARGET_CMOVE && GET_MODE (operands[1]) == GET_MODE (operands[2]) && ix86_fp_jump_nontrivial_p (GET_CODE (operands[0]))" "#") @@ -13775,8 +13772,8 @@ (label_ref (match_operand 3 "" "")))) (clobber (reg:CCFP FPSR_REG)) (clobber (reg:CCFP FLAGS_REG))] - "TARGET_CMOVE && TARGET_80387 - && X87_FLOAT_MODE_P (GET_MODE (operands[1])) + "X87_FLOAT_MODE_P (GET_MODE (operands[1])) + && TARGET_CMOVE && GET_MODE (operands[1]) == GET_MODE (operands[2]) && ix86_fp_jump_nontrivial_p (GET_CODE (operands[0]))" "#") @@ -13829,8 +13826,7 @@ (clobber (reg:CCFP FPSR_REG)) (clobber (reg:CCFP FLAGS_REG)) (clobber (match_scratch:HI 4 "=a"))] - "TARGET_80387 - && X87_FLOAT_MODE_P (GET_MODE (operands[1])) + "X87_FLOAT_MODE_P (GET_MODE (operands[1])) && GET_MODE (operands[1]) == GET_MODE (operands[2]) && ix86_fp_jump_nontrivial_p (GET_CODE (operands[0]))" "#") @@ -13845,8 +13841,7 @@ (clobber (reg:CCFP FPSR_REG)) (clobber (reg:CCFP FLAGS_REG)) (clobber (match_scratch:HI 4 "=a"))] - "TARGET_80387 - && X87_FLOAT_MODE_P (GET_MODE (operands[1])) + "X87_FLOAT_MODE_P (GET_MODE (operands[1])) && GET_MODE (operands[1]) == GET_MODE (operands[2]) && ix86_fp_jump_nontrivial_p (GET_CODE (operands[0]))" "#") @@ -13861,8 +13856,7 @@ (clobber (reg:CCFP FPSR_REG)) (clobber (reg:CCFP FLAGS_REG)) (clobber (match_scratch:HI 4 "=a"))] - "TARGET_80387 - && X87_FLOAT_MODE_P (GET_MODE (operands[1])) + "X87_FLOAT_MODE_P (GET_MODE (operands[1])) && GET_MODE (operands[1]) == GET_MODE (operands[2]) && !ix86_use_fcomi_compare (GET_CODE (operands[0])) && SELECT_CC_MODE (GET_CODE (operands[0]), @@ -13886,8 +13880,8 @@ (clobber (reg:CCFP FPSR_REG)) (clobber (reg:CCFP FLAGS_REG)) (clobber (match_scratch:HI 5 "=a,a"))] - "TARGET_80387 && TARGET_USE_MODE_FIOP - && X87_FLOAT_MODE_P (GET_MODE (operands[3])) + "X87_FLOAT_MODE_P (GET_MODE (operands[3])) + && TARGET_USE_MODE_FIOP && GET_MODE (operands[1]) == GET_MODE (operands[3]) && !ix86_use_fcomi_compare (swap_condition (GET_CODE (operands[0]))) && ix86_fp_compare_mode (swap_condition (GET_CODE (operands[0]))) == CCFPmode @@ -15873,7 +15867,7 @@ (match_operator 3 "binary_fp_operator" [(float (match_operand:X87MODEI12 1 "register_operand" "")) (match_operand 2 "register_operand" "")]))] - "TARGET_80387 && reload_completed + "reload_completed && X87_FLOAT_MODE_P (GET_MODE (operands[0]))" [(const_int 0)] { @@ -15893,7 +15887,7 @@ (match_operator 3 "binary_fp_operator" [(match_operand 1 "register_operand" "") (float (match_operand:X87MODEI12 2 "register_operand" ""))]))] - "TARGET_80387 && reload_completed + "reload_completed && X87_FLOAT_MODE_P (GET_MODE (operands[0]))" [(const_int 0)] {