diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 304d5a971b9..4e4dfe5d79d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2012-06-20 Uros Bizjak + + * config/i386/i386.md (2): Macroize expander + from {floor,ceil,btrunc}2 using FIST_ROUNDING int iterator. + (l2): Macroize expander + from l{floor,ceil}2 using FIST_ROUNDING + int iterator. + 2012-06-20 Steven Bosscher * system.h: Poison ASM_OUTPUT_IDENT and IDENT_ASM_OP. diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index af80786028a..a74fdc0678d 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -15178,9 +15178,11 @@ && flag_unsafe_math_optimizations && !optimize_insn_for_size_p ()") -(define_expand "floor2" - [(use (match_operand:MODEF 0 "register_operand")) - (use (match_operand:MODEF 1 "register_operand"))] +(define_expand "2" + [(parallel [(set (match_operand:MODEF 0 "register_operand") + (unspec:MODEF [(match_operand:MODEF 1 "register_operand")] + FRNDINT_ROUNDING)) + (clobber (reg:CC FLAGS_REG))])] "(TARGET_USE_FANCY_MATH_387 && (!(SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH) || TARGET_MIX_SSE_I387) @@ -15193,13 +15195,31 @@ { if (TARGET_ROUND) emit_insn (gen_sse4_1_round2 - (operands[0], operands[1], GEN_INT (ROUND_FLOOR))); + (operands[0], operands[1], GEN_INT (ROUND_))); else if (optimize_insn_for_size_p ()) - FAIL; + FAIL; else if (TARGET_64BIT || (mode != DFmode)) - ix86_expand_floorceil (operands[0], operands[1], true); + { + if (ROUND_ == ROUND_FLOOR) + ix86_expand_floorceil (operands[0], operands[1], true); + else if (ROUND_ == ROUND_CEIL) + ix86_expand_floorceil (operands[0], operands[1], false); + else if (ROUND_ == ROUND_TRUNC) + ix86_expand_trunc (operands[0], operands[1]); + else + gcc_unreachable (); + } else - ix86_expand_floorceildf_32 (operands[0], operands[1], true); + { + if (ROUND_ == ROUND_FLOOR) + ix86_expand_floorceildf_32 (operands[0], operands[1], true); + else if (ROUND_ == ROUND_CEIL) + ix86_expand_floorceildf_32 (operands[0], operands[1], false); + else if (ROUND_ == ROUND_TRUNC) + ix86_expand_truncdf_32 (operands[0], operands[1]); + else + gcc_unreachable (); + } } else { @@ -15211,87 +15231,7 @@ op0 = gen_reg_rtx (XFmode); op1 = gen_reg_rtx (XFmode); emit_insn (gen_extendxf2 (op1, operands[1])); - emit_insn (gen_frndintxf2_floor (op0, op1)); - - emit_insn (gen_truncxf2_i387_noop (operands[0], op0)); - } - DONE; -}) - -(define_expand "ceil2" - [(use (match_operand:MODEF 0 "register_operand")) - (use (match_operand:MODEF 1 "register_operand"))] - "(TARGET_USE_FANCY_MATH_387 - && (!(SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH) - || TARGET_MIX_SSE_I387) - && flag_unsafe_math_optimizations) - || (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH - && !flag_trapping_math)" -{ - if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH - && !flag_trapping_math) - { - if (TARGET_ROUND) - emit_insn (gen_sse4_1_round2 - (operands[0], operands[1], GEN_INT (ROUND_CEIL))); - else if (optimize_insn_for_size_p ()) - FAIL; - else if (TARGET_64BIT || (mode != DFmode)) - ix86_expand_floorceil (operands[0], operands[1], false); - else - ix86_expand_floorceildf_32 (operands[0], operands[1], false); - } - else - { - rtx op0, op1; - - if (optimize_insn_for_size_p ()) - FAIL; - - op0 = gen_reg_rtx (XFmode); - op1 = gen_reg_rtx (XFmode); - emit_insn (gen_extendxf2 (op1, operands[1])); - emit_insn (gen_frndintxf2_ceil (op0, op1)); - - emit_insn (gen_truncxf2_i387_noop (operands[0], op0)); - } - DONE; -}) - -(define_expand "btrunc2" - [(use (match_operand:MODEF 0 "register_operand")) - (use (match_operand:MODEF 1 "register_operand"))] - "(TARGET_USE_FANCY_MATH_387 - && (!(SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH) - || TARGET_MIX_SSE_I387) - && flag_unsafe_math_optimizations) - || (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH - && !flag_trapping_math)" -{ - if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH - && !flag_trapping_math) - { - if (TARGET_ROUND) - emit_insn (gen_sse4_1_round2 - (operands[0], operands[1], GEN_INT (ROUND_TRUNC))); - else if (optimize_insn_for_size_p ()) - FAIL; - else if (TARGET_64BIT || (mode != DFmode)) - ix86_expand_trunc (operands[0], operands[1]); - else - ix86_expand_truncdf_32 (operands[0], operands[1]); - } - else - { - rtx op0, op1; - - if (optimize_insn_for_size_p ()) - FAIL; - - op0 = gen_reg_rtx (XFmode); - op1 = gen_reg_rtx (XFmode); - emit_insn (gen_extendxf2 (op1, operands[1])); - emit_insn (gen_frndintxf2_trunc (op0, op1)); + emit_insn (gen_frndintxf2_ (op0, op1)); emit_insn (gen_truncxf2_i387_noop (operands[0], op0)); } @@ -15519,25 +15459,24 @@ && (!TARGET_SSE_MATH || TARGET_MIX_SSE_I387) && flag_unsafe_math_optimizations") -(define_expand "lfloor2" - [(match_operand:SWI48 0 "nonimmediate_operand") - (match_operand:MODEF 1 "register_operand")] +(define_expand "l2" + [(parallel [(set (match_operand:SWI48 0 "nonimmediate_operand") + (unspec:SWI48 [(match_operand:MODEF 1 "register_operand")] + FIST_ROUNDING)) + (clobber (reg:CC FLAGS_REG))])] "SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH && !flag_trapping_math" { if (TARGET_64BIT && optimize_insn_for_size_p ()) FAIL; - ix86_expand_lfloorceil (operands[0], operands[1], true); - DONE; -}) -(define_expand "lceil2" - [(match_operand:SWI48 0 "nonimmediate_operand") - (match_operand:MODEF 1 "register_operand")] - "SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH - && !flag_trapping_math" -{ - ix86_expand_lfloorceil (operands[0], operands[1], false); + if (ROUND_ == ROUND_FLOOR) + ix86_expand_lfloorceil (operands[0], operands[1], true); + else if (ROUND_ == ROUND_CEIL) + ix86_expand_lfloorceil (operands[0], operands[1], false); + else + gcc_unreachable (); + DONE; })