i386.c (ix86_expand_ashlsi3_const): New function to expand a left shift by an immedia...
authorRoger Sayle <roger@eyesopen.com>
Fri, 10 Sep 2004 02:32:19 +0000 (02:32 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Fri, 10 Sep 2004 02:32:19 +0000 (02:32 +0000)
* config/i386/i386.c (ix86_expand_ashlsi3_const): New function to
expand a left shift by an immediate constant as either an ashl or
a sequence of additions.
(ix86_split_ashldi): Use new ix86_expand_ashlsi3_const function
instead of calling gen_ashlsi3 with a constant directly.

From-SVN: r87271

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

index 06bef510120926047f2fd49df07cb6c9c6850432..90ca63fd3ca5f9bfa98733c421539bd8ee850263 100644 (file)
@@ -1,3 +1,11 @@
+2004-09-09  Roger Sayle  <roger@eyesopen.com>
+
+       * config/i386/i386.c (ix86_expand_ashlsi3_const): New function to
+       expand a left shift by an immediate constant as either an ashl or
+       a sequence of additions.
+       (ix86_split_ashldi): Use new ix86_expand_ashlsi3_const function
+       instead of calling gen_ashlsi3 with a constant directly.
+
 2004-09-09  Roger Sayle  <roger@eyesopen.com>
 
        * config/i386/i386.c (ix86_split_long_move): When optimizing for
index 2a175452a190fc275404bb6a4495e79987d83e23..e034fa9ef4e148bd16f82e61a897b81b80353ad2 100644 (file)
@@ -9973,6 +9973,26 @@ ix86_split_long_move (rtx operands[])
   return;
 }
 
+/* Helper function of ix86_split_ashldi used to generate an SImode
+   left shift by a constant, either using a single shift or
+   a sequence of add instructions.  */
+
+static void
+ix86_expand_ashlsi3_const (rtx operand, int count)
+{
+  if (count == 1)
+    emit_insn (gen_addsi3 (operand, operand, operand));
+  else if (!optimize_size
+          && count * ix86_cost->add <= ix86_cost->shift_const)
+    {
+      int i;
+      for (i=0; i<count; i++)
+       emit_insn (gen_addsi3 (operand, operand, operand));
+    }
+  else
+    emit_insn (gen_ashlsi3 (operand, operand, GEN_INT (count)));
+}
+
 void
 ix86_split_ashldi (rtx *operands, rtx scratch)
 {
@@ -9990,14 +10010,14 @@ ix86_split_ashldi (rtx *operands, rtx scratch)
          emit_move_insn (low[0], const0_rtx);
 
          if (count > 32)
-           emit_insn (gen_ashlsi3 (high[0], high[0], GEN_INT (count - 32)));
+           ix86_expand_ashlsi3_const (high[0], count - 32);
        }
       else
        {
          if (!rtx_equal_p (operands[0], operands[1]))
            emit_move_insn (operands[0], operands[1]);
          emit_insn (gen_x86_shld_1 (high[0], low[0], GEN_INT (count)));
-         emit_insn (gen_ashlsi3 (low[0], low[0], GEN_INT (count)));
+         ix86_expand_ashlsi3_const (low[0], count);
        }
     }
   else