i386.md (<rounding_insn><mode>2): Macroize expander from {floor,ceil,btrunc}<mode...
authorUros Bizjak <ubizjak@gmail.com>
Wed, 20 Jun 2012 17:37:40 +0000 (19:37 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Wed, 20 Jun 2012 17:37:40 +0000 (19:37 +0200)
* 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

gcc/ChangeLog
gcc/config/i386/i386.md

index 304d5a971b9666c927d98536c9ecb467cb90b519..4e4dfe5d79d194017cf59c3b371f5eba12a46591 100644 (file)
@@ -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.
index af80786028aaeca51e1332cee61ac87e1fbe28d0..a74fdc0678d35a19c6c3d6b388002d3c3b3b10af 100644 (file)
    && 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)
     {
       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
     {
       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));
     }
    && (!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;
 })