[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