[llvm-commits] CVS: llvm/lib/Target/X86/X86ISelPattern.cpp X86ISelSimple.cpp

Chris Lattner lattner at cs.uiuc.edu
Tue Aug 2 12:25:17 PDT 2005



Changes in directory llvm/lib/Target/X86:

X86ISelPattern.cpp updated: 1.162 -> 1.163
X86ISelSimple.cpp updated: 1.321 -> 1.322
---
Log message:

Update to use the new MathExtras.h support for log2 computation.
Patch contributed by Jim Laskey!



---
Diffs of the changes:  (+14 -23)

 X86ISelPattern.cpp |    2 +-
 X86ISelSimple.cpp  |   35 +++++++++++++----------------------
 2 files changed, 14 insertions(+), 23 deletions(-)


Index: llvm/lib/Target/X86/X86ISelPattern.cpp
diff -u llvm/lib/Target/X86/X86ISelPattern.cpp:1.162 llvm/lib/Target/X86/X86ISelPattern.cpp:1.163
--- llvm/lib/Target/X86/X86ISelPattern.cpp:1.162	Sat Jul 30 13:33:25 2005
+++ llvm/lib/Target/X86/X86ISelPattern.cpp	Tue Aug  2 14:25:03 2005
@@ -3023,7 +3023,7 @@
           RHS = -RHS;
         }
         if (RHS && (RHS & (RHS-1)) == 0) {   // Signed division by power of 2?
-          unsigned Log = log2(RHS);
+          unsigned Log = Log2_32(RHS);
           unsigned SAROpc, SHROpc, ADDOpc, NEGOpc;
           switch (N.getValueType()) {
           default: assert("Unknown type to signed divide!");


Index: llvm/lib/Target/X86/X86ISelSimple.cpp
diff -u llvm/lib/Target/X86/X86ISelSimple.cpp:1.321 llvm/lib/Target/X86/X86ISelSimple.cpp:1.322
--- llvm/lib/Target/X86/X86ISelSimple.cpp:1.321	Wed Jul 27 01:12:34 2005
+++ llvm/lib/Target/X86/X86ISelSimple.cpp	Tue Aug  2 14:25:03 2005
@@ -29,6 +29,7 @@
 #include "llvm/Target/TargetOptions.h"
 #include "llvm/Support/GetElementPtrTypeIterator.h"
 #include "llvm/Support/InstVisitor.h"
+#include "llvm/Support/MathExtras.h"
 #include "llvm/ADT/Statistic.h"
 using namespace llvm;
 
@@ -2496,19 +2497,6 @@
   }
 }
 
-// ExactLog2 - This function solves for (Val == 1 << (N-1)) and returns N.  It
-// returns zero when the input is not exactly a power of two.
-static unsigned ExactLog2(unsigned Val) {
-  if (Val == 0 || (Val & (Val-1))) return 0;
-  unsigned Count = 0;
-  while (Val != 1) {
-    Val >>= 1;
-    ++Count;
-  }
-  return Count+1;
-}
-
-
 /// doMultiplyConst - This function is specialized to efficiently codegen an 8,
 /// 16, or 32-bit integer multiply by a constant.
 void X86ISel::doMultiplyConst(MachineBasicBlock *MBB,
@@ -2573,35 +2561,37 @@
   }
 
   // If the element size is exactly a power of 2, use a shift to get it.
-  if (unsigned Shift = ExactLog2(ConstRHS)) {
+  if (isPowerOf2_32(ConstRHS)) {
+    unsigned Shift = Log2_32(ConstRHS);
     switch (Class) {
     default: assert(0 && "Unknown class for this function!");
     case cByte:
-      BuildMI(*MBB, IP, X86::SHL8ri,2, DestReg).addReg(op0Reg).addImm(Shift-1);
+      BuildMI(*MBB, IP, X86::SHL8ri,2, DestReg).addReg(op0Reg).addImm(Shift);
       return;
     case cShort:
-      BuildMI(*MBB, IP, X86::SHL16ri,2, DestReg).addReg(op0Reg).addImm(Shift-1);
+      BuildMI(*MBB, IP, X86::SHL16ri,2, DestReg).addReg(op0Reg).addImm(Shift);
       return;
     case cInt:
-      BuildMI(*MBB, IP, X86::SHL32ri,2, DestReg).addReg(op0Reg).addImm(Shift-1);
+      BuildMI(*MBB, IP, X86::SHL32ri,2, DestReg).addReg(op0Reg).addImm(Shift);
       return;
     }
   }
 
   // If the element size is a negative power of 2, use a shift/neg to get it.
-  if (unsigned Shift = ExactLog2(-ConstRHS)) {
+  if (isPowerOf2_32(-ConstRHS)) {
+    unsigned Shift = Log2_32(-ConstRHS);
     TmpReg = makeAnotherReg(DestTy);
     BuildMI(*MBB, IP, NEGrTab[Class], 1, TmpReg).addReg(op0Reg);
     switch (Class) {
     default: assert(0 && "Unknown class for this function!");
     case cByte:
-      BuildMI(*MBB, IP, X86::SHL8ri,2, DestReg).addReg(TmpReg).addImm(Shift-1);
+      BuildMI(*MBB, IP, X86::SHL8ri,2, DestReg).addReg(TmpReg).addImm(Shift);
       return;
     case cShort:
-      BuildMI(*MBB, IP, X86::SHL16ri,2, DestReg).addReg(TmpReg).addImm(Shift-1);
+      BuildMI(*MBB, IP, X86::SHL16ri,2, DestReg).addReg(TmpReg).addImm(Shift);
       return;
     case cInt:
-      BuildMI(*MBB, IP, X86::SHL32ri,2, DestReg).addReg(TmpReg).addImm(Shift-1);
+      BuildMI(*MBB, IP, X86::SHL32ri,2, DestReg).addReg(TmpReg).addImm(Shift);
       return;
     }
   }
@@ -2917,7 +2907,8 @@
         V = -V;
         isNeg = true;      // Maybe it's a negative power of 2.
       }
-      if (unsigned Log = ExactLog2(V)) {
+      if (isPowerOf2_32(V)) {
+        unsigned Log = Log2_32(V);
         --Log;
         unsigned Op0Reg = getReg(Op0, BB, IP);
         unsigned TmpReg = makeAnotherReg(Op0->getType());






More information about the llvm-commits mailing list