summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86/X86RegisterInfo.cpp
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2007-10-13 02:35:06 +0000
committerEvan Cheng <evan.cheng@apple.com>2007-10-13 02:35:06 +0000
commit7082dcf60580f2c4214ac65a1aaf9c6cfc65c2d3 (patch)
treec202e2affd0dff51849ddad190d539a03b6e3e45 /llvm/lib/Target/X86/X86RegisterInfo.cpp
parent9490e0d078aee9409c888234868dcbbf86b3d792 (diff)
downloadbcm5719-llvm-7082dcf60580f2c4214ac65a1aaf9c6cfc65c2d3.tar.gz
bcm5719-llvm-7082dcf60580f2c4214ac65a1aaf9c6cfc65c2d3.zip
Change unfoldMemoryOperand(). User is now responsible for passing in the
register used by the unfolded instructions. User can also specify whether to unfold the load, the store, or both. llvm-svn: 42946
Diffstat (limited to 'llvm/lib/Target/X86/X86RegisterInfo.cpp')
-rw-r--r--llvm/lib/Target/X86/X86RegisterInfo.cpp29
1 files changed, 18 insertions, 11 deletions
diff --git a/llvm/lib/Target/X86/X86RegisterInfo.cpp b/llvm/lib/Target/X86/X86RegisterInfo.cpp
index 2cb42470353..6e8a5432919 100644
--- a/llvm/lib/Target/X86/X86RegisterInfo.cpp
+++ b/llvm/lib/Target/X86/X86RegisterInfo.cpp
@@ -1118,7 +1118,7 @@ MachineInstr* X86RegisterInfo::foldMemoryOperand(MachineInstr *MI, unsigned OpNu
}
bool X86RegisterInfo::unfoldMemoryOperand(MachineFunction &MF, MachineInstr *MI,
- SSARegMap *RegMap,
+ unsigned Reg, bool UnfoldLoad, bool UnfoldStore,
SmallVector<MachineInstr*, 4> &NewMIs) const {
DenseMap<unsigned*, std::pair<unsigned,unsigned> >::iterator I =
MemOp2RegOpTable.find((unsigned*)MI->getOpcode());
@@ -1128,6 +1128,13 @@ bool X86RegisterInfo::unfoldMemoryOperand(MachineFunction &MF, MachineInstr *MI,
unsigned Index = I->second.second & 0xf;
bool HasLoad = I->second.second & (1 << 4);
bool HasStore = I->second.second & (1 << 5);
+ if (UnfoldLoad && !HasLoad)
+ return false;
+ HasLoad &= UnfoldLoad;
+ if (UnfoldStore && !HasStore)
+ return false;
+ HasStore &= UnfoldStore;
+
const TargetInstrDescriptor &TID = TII.get(Opc);
const TargetOperandInfo &TOI = TID.OpInfo[Index];
const TargetRegisterClass *RC = (TOI.Flags & M_LOOK_UP_PTR_REG_CLASS)
@@ -1149,10 +1156,8 @@ bool X86RegisterInfo::unfoldMemoryOperand(MachineFunction &MF, MachineInstr *MI,
}
// Emit the load instruction.
- unsigned LoadReg = 0;
if (HasLoad) {
- LoadReg = RegMap->createVirtualRegister(RC);
- loadRegFromAddr(MF, LoadReg, AddrOps, RC, NewMIs);
+ loadRegFromAddr(MF, Reg, AddrOps, RC, NewMIs);
if (HasStore) {
// Address operands cannot be marked isKill.
for (unsigned i = 1; i != 5; ++i) {
@@ -1164,27 +1169,29 @@ bool X86RegisterInfo::unfoldMemoryOperand(MachineFunction &MF, MachineInstr *MI,
}
// Emit the data processing instruction.
- MachineInstrBuilder MIB = BuildMI(TII.get(Opc));
- unsigned StoreReg = 0;
+ MachineInstr *DataMI = new MachineInstr (TID, true);
+ MachineInstrBuilder MIB(DataMI);
const TargetRegisterClass *DstRC = 0;
if (HasStore) {
const TargetOperandInfo &DstTOI = TID.OpInfo[0];
DstRC = (DstTOI.Flags & M_LOOK_UP_PTR_REG_CLASS)
? TII.getPointerRegClass() : getRegClass(DstTOI.RegClass);
- StoreReg = RegMap->createVirtualRegister(RC);
- MIB.addReg(StoreReg, true);
+ MIB.addReg(Reg, true);
}
for (unsigned i = 0, e = BeforeOps.size(); i != e; ++i)
MIB = X86InstrAddOperand(MIB, BeforeOps[i]);
- if (LoadReg)
- MIB.addReg(LoadReg);
+ MIB.addReg(Reg);
for (unsigned i = 0, e = AfterOps.size(); i != e; ++i)
MIB = X86InstrAddOperand(MIB, AfterOps[i]);
+ for (unsigned i = 0, e = ImpOps.size(); i != e; ++i) {
+ MachineOperand &MO = ImpOps[i];
+ MIB.addReg(MO.getReg(), MO.isDef(), true, MO.isKill(), MO.isDead());
+ }
NewMIs.push_back(MIB);
// Emit the store instruction.
if (HasStore)
- storeRegToAddr(MF, StoreReg, AddrOps, DstRC, NewMIs);
+ storeRegToAddr(MF, Reg, AddrOps, DstRC, NewMIs);
return true;
}
OpenPOWER on IntegriCloud