diff --git a/lib/Target/IA64/IA64RegisterInfo.cpp b/lib/Target/IA64/IA64RegisterInfo.cpp index 15a0d4ab947..4c944ad69c5 100644 --- a/lib/Target/IA64/IA64RegisterInfo.cpp +++ b/lib/Target/IA64/IA64RegisterInfo.cpp @@ -60,6 +60,38 @@ void IA64RegisterInfo::storeRegToStackSlot(MachineBasicBlock &MBB, "sorry, I don't know how to store this sort of reg in the stack\n"); } +void IA64RegisterInfo::storeRegToAddr(MachineFunction &MF, unsigned SrcReg, + SmallVector Addr, + const TargetRegisterClass *RC, + SmallVector &NewMIs) const { + unsigned Opc = 0; + if (RC == IA64::FPRegisterClass) { + Opc = IA64::STF8; + } else if (RC == IA64::GRRegisterClass) { + Opc = IA64::ST8; + } else if (RC == IA64::PRRegisterClass) { + Opc = IA64::ST1; + } else { + assert(0 && + "sorry, I don't know how to store this sort of reg\n"); + } + + MachineInstrBuilder MIB = BuildMI(TII.get(Opc)); + for (unsigned i = 0, e = Addr.size(); i != e; ++i) { + MachineOperand &MO = Addr[i]; + if (MO.isRegister()) + MIB.addReg(MO.getReg()); + else if (MO.isImmediate()) + MIB.addImm(MO.getImmedValue()); + else + MIB.addFrameIndex(MO.getFrameIndex()); + } + MIB.addReg(SrcReg, false, false, true); + NewMIs.push_back(MIB); + return; + +} + void IA64RegisterInfo::loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, unsigned DestReg, int FrameIdx, @@ -80,6 +112,36 @@ void IA64RegisterInfo::loadRegFromStackSlot(MachineBasicBlock &MBB, "sorry, I don't know how to load this sort of reg from the stack\n"); } +void IA64RegisterInfo::loadRegFromAddr(MachineFunction &MF, unsigned DestReg, + SmallVector Addr, + const TargetRegisterClass *RC, + SmallVector &NewMIs) const { + unsigned Opc = 0; + if (RC == IA64::FPRegisterClass) { + Opc = IA64::LDF8; + } else if (RC == IA64::GRRegisterClass) { + Opc = IA64::LD8; + } else if (RC == IA64::PRRegisterClass) { + Opc = IA64::LD1; + } else { + assert(0 && + "sorry, I don't know how to store this sort of reg\n"); + } + + MachineInstrBuilder MIB = BuildMI(TII.get(Opc), DestReg); + for (unsigned i = 0, e = Addr.size(); i != e; ++i) { + MachineOperand &MO = Addr[i]; + if (MO.isRegister()) + MIB.addReg(MO.getReg()); + else if (MO.isImmediate()) + MIB.addImm(MO.getImmedValue()); + else + MIB.addFrameIndex(MO.getFrameIndex()); + } + NewMIs.push_back(MIB); + return; +} + void IA64RegisterInfo::copyRegToReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, unsigned DestReg, unsigned SrcReg, diff --git a/lib/Target/IA64/IA64RegisterInfo.h b/lib/Target/IA64/IA64RegisterInfo.h index 52e8ed354fc..c55675250f8 100644 --- a/lib/Target/IA64/IA64RegisterInfo.h +++ b/lib/Target/IA64/IA64RegisterInfo.h @@ -34,11 +34,21 @@ struct IA64RegisterInfo : public IA64GenRegisterInfo { unsigned SrcReg, int FrameIndex, const TargetRegisterClass *RC) const; + void storeRegToAddr(MachineFunction &MF, unsigned SrcReg, + SmallVector Addr, + const TargetRegisterClass *RC, + SmallVector &NewMIs) const; + void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, unsigned DestReg, int FrameIndex, const TargetRegisterClass *RC) const; + void loadRegFromAddr(MachineFunction &MF, unsigned DestReg, + SmallVector Addr, + const TargetRegisterClass *RC, + SmallVector &NewMIs) const; + void copyRegToReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, unsigned DestReg, unsigned SrcReg,