diff options
author | Uros Bizjak <ubizjak@gmail.com> | 2012-06-20 19:37:40 +0200 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2012-06-20 19:37:40 +0200 |
commit | bafda72341d399da97197e738167a8606bc45e54 (patch) | |
tree | 0bcf60c1ade986481733e6b5fb38f276abbae475 | |
parent | 975667e7fb254910851ec33e3a650bcffb51f237 (diff) | |
download | gcc-bafda72341d399da97197e738167a8606bc45e54.zip gcc-bafda72341d399da97197e738167a8606bc45e54.tar.gz gcc-bafda72341d399da97197e738167a8606bc45e54.tar.bz2 |
i386.md (<rounding_insn><mode>2): Macroize expander from {floor,ceil,btrunc}<mode>2 using FIST_ROUNDING int iterator.
* config/i386/i386.md (<rounding_insn><mode>2): Macroize expander
from {floor,ceil,btrunc}<mode>2 using FIST_ROUNDING int iterator.
(l<rounding_insn><MODEF:mode><SWI48:mode>2): Macroize expander
from l{floor,ceil}<MODEF:mode><SWI48:mode>2 using FIST_ROUNDING
int iterator.
From-SVN: r188840
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | 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 <ubizjak@gmail.com> + + * config/i386/i386.md (<rounding_insn><mode>2): Macroize expander + from {floor,ceil,btrunc}<mode>2 using FIST_ROUNDING int iterator. + (l<rounding_insn><MODEF:mode><SWI48:mode>2): Macroize expander + from l{floor,ceil}<MODEF:mode><SWI48:mode>2 using FIST_ROUNDING + int iterator. + 2012-06-20 Steven Bosscher <steven@gcc.gnu.org> * 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 "floor<mode>2" - [(use (match_operand:MODEF 0 "register_operand")) - (use (match_operand:MODEF 1 "register_operand"))] - "(TARGET_USE_FANCY_MATH_387 - && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) - || TARGET_MIX_SSE_I387) - && flag_unsafe_math_optimizations) - || (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH - && !flag_trapping_math)" -{ - if (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH - && !flag_trapping_math) - { - if (TARGET_ROUND) - emit_insn (gen_sse4_1_round<mode>2 - (operands[0], operands[1], GEN_INT (ROUND_FLOOR))); - else if (optimize_insn_for_size_p ()) - FAIL; - else if (TARGET_64BIT || (<MODE>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_extend<mode>xf2 (op1, operands[1])); - emit_insn (gen_frndintxf2_floor (op0, op1)); - - emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0)); - } - DONE; -}) - -(define_expand "ceil<mode>2" - [(use (match_operand:MODEF 0 "register_operand")) - (use (match_operand:MODEF 1 "register_operand"))] - "(TARGET_USE_FANCY_MATH_387 - && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) - || TARGET_MIX_SSE_I387) - && flag_unsafe_math_optimizations) - || (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH - && !flag_trapping_math)" -{ - if (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH - && !flag_trapping_math) - { - if (TARGET_ROUND) - emit_insn (gen_sse4_1_round<mode>2 - (operands[0], operands[1], GEN_INT (ROUND_CEIL))); - else if (optimize_insn_for_size_p ()) - FAIL; - else if (TARGET_64BIT || (<MODE>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_extend<mode>xf2 (op1, operands[1])); - emit_insn (gen_frndintxf2_ceil (op0, op1)); - - emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0)); - } - DONE; -}) - -(define_expand "btrunc<mode>2" - [(use (match_operand:MODEF 0 "register_operand")) - (use (match_operand:MODEF 1 "register_operand"))] +(define_expand "<rounding_insn><mode>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>mode) && TARGET_SSE_MATH) || TARGET_MIX_SSE_I387) @@ -15273,13 +15195,31 @@ { if (TARGET_ROUND) emit_insn (gen_sse4_1_round<mode>2 - (operands[0], operands[1], GEN_INT (ROUND_TRUNC))); + (operands[0], operands[1], GEN_INT (ROUND_<ROUNDING>))); else if (optimize_insn_for_size_p ()) FAIL; else if (TARGET_64BIT || (<MODE>mode != DFmode)) - ix86_expand_trunc (operands[0], operands[1]); + { + if (ROUND_<ROUNDING> == ROUND_FLOOR) + ix86_expand_floorceil (operands[0], operands[1], true); + else if (ROUND_<ROUNDING> == ROUND_CEIL) + ix86_expand_floorceil (operands[0], operands[1], false); + else if (ROUND_<ROUNDING> == ROUND_TRUNC) + ix86_expand_trunc (operands[0], operands[1]); + else + gcc_unreachable (); + } else - ix86_expand_truncdf_32 (operands[0], operands[1]); + { + if (ROUND_<ROUNDING> == ROUND_FLOOR) + ix86_expand_floorceildf_32 (operands[0], operands[1], true); + else if (ROUND_<ROUNDING> == ROUND_CEIL) + ix86_expand_floorceildf_32 (operands[0], operands[1], false); + else if (ROUND_<ROUNDING> == 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_extend<mode>xf2 (op1, operands[1])); - emit_insn (gen_frndintxf2_trunc (op0, op1)); + emit_insn (gen_frndintxf2_<rounding> (op0, op1)); emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0)); } @@ -15519,25 +15459,24 @@ && (!TARGET_SSE_MATH || TARGET_MIX_SSE_I387) && flag_unsafe_math_optimizations") -(define_expand "lfloor<MODEF:mode><SWI48:mode>2" - [(match_operand:SWI48 0 "nonimmediate_operand") - (match_operand:MODEF 1 "register_operand")] +(define_expand "l<rounding_insn><MODEF:mode><SWI48:mode>2" + [(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 (<MODEF:MODE>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 "lceil<MODEF:mode><SWI48:mode>2" - [(match_operand:SWI48 0 "nonimmediate_operand") - (match_operand:MODEF 1 "register_operand")] - "SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH - && !flag_trapping_math" -{ - ix86_expand_lfloorceil (operands[0], operands[1], false); + if (ROUND_<ROUNDING> == ROUND_FLOOR) + ix86_expand_lfloorceil (operands[0], operands[1], true); + else if (ROUND_<ROUNDING> == ROUND_CEIL) + ix86_expand_lfloorceil (operands[0], operands[1], false); + else + gcc_unreachable (); + DONE; }) |