i386.c (ix86_emit_swdivsf): Implement more efficiently.
authorRichard Guenther <rguenther@suse.de>
Tue, 15 Mar 2011 09:30:13 +0000 (09:30 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 15 Mar 2011 09:30:13 +0000 (09:30 +0000)
2011-03-15  Richard Guenther  <rguenther@suse.de>

* config/i386/i386.c (ix86_emit_swdivsf): Implement more
efficiently.

From-SVN: r170981

gcc/ChangeLog
gcc/config/i386/i386.c

index a4bcde02f7525bb370a0d837a64cca1292a95a8c..aae2ea0d70f77a69a27f5052e9b66859f782b5a7 100644 (file)
@@ -1,3 +1,8 @@
+2011-03-15  Richard Guenther  <rguenther@suse.de>
+
+       * config/i386/i386.c (ix86_emit_swdivsf): Implement more
+       efficiently.
+
 2011-03-15  Alan Modra  <amodra@gmail.com>
 
        PR target/48032
index 9673524b33c0097d33f532c42a59a4ebfaab673a..1a3c97fa9486e5ff345fb70bda6fa71db31174d1 100644 (file)
@@ -31935,38 +31935,38 @@ void ix86_emit_i387_log1p (rtx op0, rtx op1)
 
 void ix86_emit_swdivsf (rtx res, rtx a, rtx b, enum machine_mode mode)
 {
-  rtx x0, x1, e0, e1, two;
+  rtx x0, x1, e0, e1;
 
   x0 = gen_reg_rtx (mode);
   e0 = gen_reg_rtx (mode);
   e1 = gen_reg_rtx (mode);
   x1 = gen_reg_rtx (mode);
 
-  two = CONST_DOUBLE_FROM_REAL_VALUE (dconst2, SFmode);
-
-  if (VECTOR_MODE_P (mode))
-    two = ix86_build_const_vector (mode, true, two);
-
-  two = force_reg (mode, two);
-
-  /* a / b = a * rcp(b) * (2.0 - b * rcp(b)) */
+  /* a / b = a * ((rcp(b) + rcp(b)) - (b * rcp(b) * rcp (b))) */
 
   /* x0 = rcp(b) estimate */
   emit_insn (gen_rtx_SET (VOIDmode, x0,
                          gen_rtx_UNSPEC (mode, gen_rtvec (1, b),
                                          UNSPEC_RCP)));
-  /* e0 = x0 * a */
+  /* e0 = x0 * b */
   emit_insn (gen_rtx_SET (VOIDmode, e0,
-                         gen_rtx_MULT (mode, x0, a)));
-  /* e1 = x0 * b */
-  emit_insn (gen_rtx_SET (VOIDmode, e1,
                          gen_rtx_MULT (mode, x0, b)));
-  /* x1 = 2. - e1 */
+
+  /* e0 = x0 * e0 */
+  emit_insn (gen_rtx_SET (VOIDmode, e0,
+                         gen_rtx_MULT (mode, x0, e0)));
+
+  /* e1 = x0 + x0 */
+  emit_insn (gen_rtx_SET (VOIDmode, e1,
+                         gen_rtx_PLUS (mode, x0, x0)));
+
+  /* x1 = e1 - e0 */
   emit_insn (gen_rtx_SET (VOIDmode, x1,
-                         gen_rtx_MINUS (mode, two, e1)));
-  /* res = e0 * x1 */
+                         gen_rtx_MINUS (mode, e1, e0)));
+
+  /* res = a * x1 */
   emit_insn (gen_rtx_SET (VOIDmode, res,
-                         gen_rtx_MULT (mode, e0, x1)));
+                         gen_rtx_MULT (mode, a, x1)));
 }
 
 /* Output code to perform a Newton-Rhapson approximation of a