[llvm-commits] [llvm] r111850 - /llvm/trunk/lib/Target/ARM/ARMFastISel.cpp
Eric Christopher
echristo at apple.com
Mon Aug 23 14:44:13 PDT 2010
Author: echristo
Date: Mon Aug 23 16:44:12 2010
New Revision: 111850
URL: http://llvm.org/viewvc/llvm-project?rev=111850&view=rev
Log:
Start getting ARM loads/address computation going.
Modified:
llvm/trunk/lib/Target/ARM/ARMFastISel.cpp
Modified: llvm/trunk/lib/Target/ARM/ARMFastISel.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMFastISel.cpp?rev=111850&r1=111849&r2=111850&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMFastISel.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMFastISel.cpp Mon Aug 23 16:44:12 2010
@@ -101,8 +101,14 @@
virtual bool TargetSelectInstruction(const Instruction *I);
#include "ARMGenFastISel.inc"
+
+ // Instruction selection routines.
+ virtual bool ARMSelectLoad(const Instruction *I);
+ // Utility routines.
private:
+ bool ARMComputeRegOffset(const Instruction *I, unsigned &Reg, int &Offset);
+
bool DefinesOptionalPredicate(MachineInstr *MI, bool *CPSR);
const MachineInstrBuilder &AddOptionalDefs(const MachineInstrBuilder &MIB);
};
@@ -301,8 +307,75 @@
return ResultReg;
}
+bool ARMFastISel::ARMComputeRegOffset(const Instruction *I, unsigned &Reg,
+ int &Offset) {
+ // Some boilerplate from the X86 FastISel.
+ const User *U = NULL;
+ Value *Op1 = I->getOperand(0);
+ unsigned Opcode = Instruction::UserOp1;
+ if (const Instruction *I = dyn_cast<Instruction>(Op1)) {
+ // Don't walk into other basic blocks; it's possible we haven't
+ // visited them yet, so the instructions may not yet be assigned
+ // virtual registers.
+ if (FuncInfo.MBBMap[I->getParent()] != FuncInfo.MBB)
+ return false;
+
+ Opcode = I->getOpcode();
+ U = I;
+ } else if (const ConstantExpr *C = dyn_cast<ConstantExpr>(Op1)) {
+ Opcode = C->getOpcode();
+ U = C;
+ }
+
+ if (const PointerType *Ty = dyn_cast<PointerType>(Op1->getType()))
+ if (Ty->getAddressSpace() > 255)
+ // Fast instruction selection doesn't support the special
+ // address spaces.
+ return false;
+
+ switch (Opcode) {
+ default:
+ //errs() << "Failing Opcode is: " << *Op1 << "\n";
+ break;
+ case Instruction::Alloca: {
+ // Do static allocas.
+ const AllocaInst *A = cast<AllocaInst>(Op1);
+ DenseMap<const AllocaInst*, int>::iterator SI =
+ FuncInfo.StaticAllocaMap.find(A);
+ if (SI != FuncInfo.StaticAllocaMap.end())
+ Offset =
+ TM.getRegisterInfo()->getFrameIndexReference(*FuncInfo.MF,
+ SI->second, Reg);
+ else
+ return false;
+ return true;
+ }
+ }
+ return false;
+}
+
+bool ARMFastISel::ARMSelectLoad(const Instruction *I) {
+
+ unsigned Reg;
+ int Offset;
+
+ // See if we can handle this as Reg + Offset
+ if (!ARMComputeRegOffset(I, Reg, Offset))
+ return false;
+
+
+ unsigned ResultReg = createResultReg(ARM::GPRRegisterClass);
+ AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
+ TII.get(ARM::LDR), ResultReg)
+ .addImm(0).addReg(Reg).addImm(Offset));
+
+ return true;
+}
+
bool ARMFastISel::TargetSelectInstruction(const Instruction *I) {
switch (I->getOpcode()) {
+ case Instruction::Load:
+ return ARMSelectLoad(I);
default: break;
}
return false;
More information about the llvm-commits
mailing list