From bafda72341d399da97197e738167a8606bc45e54 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Wed, 20 Jun 2012 19:37:40 +0200 Subject: [PATCH] i386.md (2): Macroize expander from {floor,ceil,btrunc}2 using FIST_ROUNDING int iterator. * 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. From-SVN: r188840 --- gcc/ChangeLog | 8 +++ gcc/config/i386/i386.md | 139 ++++++++++++++---------------------------------- 2 files changed, 47 insertions(+), 100 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 304d5a9..4e4dfe5 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 af80786..a74fdc0 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -15178,89 +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"))] - "(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_FLOOR))); - else if (optimize_insn_for_size_p ()) - FAIL; - else if (TARGET_64BIT || (mode != DFmode)) - ix86_expand_floorceil (operands[0], operands[1], true); - else - ix86_expand_floorceildf_32 (operands[0], operands[1], true); - } - 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_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"))] +(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) @@ -15273,13 +15195,31 @@ { if (TARGET_ROUND) emit_insn (gen_sse4_1_round2 - (operands[0], operands[1], GEN_INT (ROUND_TRUNC))); + (operands[0], operands[1], GEN_INT (ROUND_))); else if (optimize_insn_for_size_p ()) FAIL; else if (TARGET_64BIT || (mode != DFmode)) - ix86_expand_trunc (operands[0], operands[1]); + { + 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_truncdf_32 (operands[0], operands[1]); + { + 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 { @@ -15291,7 +15231,7 @@ 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; }) -- 2.7.4