131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- XCoreRegisterInfo.cpp - XCore Register Information ----------------===// 2b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// 3b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// The LLVM Compiler Infrastructure 4b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// 5b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// This file is distributed under the University of Illinois Open Source 6b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// License. See LICENSE.TXT for details. 7b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// 8b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//===----------------------------------------------------------------------===// 9b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// 10b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// This file contains the XCore implementation of the MRegisterInfo class. 11b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// 12b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//===----------------------------------------------------------------------===// 13b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 14b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#include "XCoreRegisterInfo.h" 15b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#include "XCore.h" 16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "XCoreMachineFunctionInfo.h" 17d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/BitVector.h" 18d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/STLExtras.h" 19b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#include "llvm/CodeGen/MachineFrameInfo.h" 20d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineFunction.h" 21d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineInstrBuilder.h" 22b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#include "llvm/CodeGen/MachineModuleInfo.h" 23b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#include "llvm/CodeGen/MachineRegisterInfo.h" 24b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#include "llvm/CodeGen/RegisterScavenging.h" 250b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h" 260b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Type.h" 27b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#include "llvm/Support/Debug.h" 28804e0fea4033e3b91dbc8198cef30de30f141bb5Torok Edwin#include "llvm/Support/ErrorHandling.h" 29804e0fea4033e3b91dbc8198cef30de30f141bb5Torok Edwin#include "llvm/Support/raw_ostream.h" 30d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetFrameLowering.h" 31d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetInstrInfo.h" 32d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetMachine.h" 33d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetOptions.h" 3473f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng 3573f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng#define GET_REGINFO_TARGET_DESC 36a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng#include "XCoreGenRegisterInfo.inc" 3773f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng 38b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborneusing namespace llvm; 39b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 40b25baef26f03b9909b65dd5f762b38f93000445dRichard OsborneXCoreRegisterInfo::XCoreRegisterInfo(const TargetInstrInfo &tii) 410e6a052331f674dd70e28af41f654a7874405eabEvan Cheng : XCoreGenRegisterInfo(XCore::LR), TII(tii) { 42b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne} 43b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 44b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// helper functions 45b25baef26f03b9909b65dd5f762b38f93000445dRichard Osbornestatic inline bool isImmUs(unsigned val) { 46b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne return val <= 11; 47b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne} 48b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 49b25baef26f03b9909b65dd5f762b38f93000445dRichard Osbornestatic inline bool isImmU6(unsigned val) { 50b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne return val < (1 << 6); 51b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne} 52b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 53b25baef26f03b9909b65dd5f762b38f93000445dRichard Osbornestatic inline bool isImmU16(unsigned val) { 54b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne return val < (1 << 16); 55b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne} 56b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 57a267b0076e7887f5566e635ba35790f24d4524d9Chris Lattnerbool XCoreRegisterInfo::needsFrameMoves(const MachineFunction &MF) { 58fc2bb8c4448fa884d79e437cc2d2627a7d7740a8Rafael Espindola return MF.getMMI().hasDebugInfo() || 59fc2bb8c4448fa884d79e437cc2d2627a7d7740a8Rafael Espindola MF.getFunction()->needsUnwindTableEntry(); 60b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne} 61b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 62015f228861ef9b337366f92f637d4e8d624bb006Craig Topperconst uint16_t* XCoreRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) 63b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne const { 64015f228861ef9b337366f92f637d4e8d624bb006Craig Topper static const uint16_t CalleeSavedRegs[] = { 65b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne XCore::R4, XCore::R5, XCore::R6, XCore::R7, 66b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne XCore::R8, XCore::R9, XCore::R10, XCore::LR, 67b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 0 68b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne }; 69b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne return CalleeSavedRegs; 70b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne} 71b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 72b25baef26f03b9909b65dd5f762b38f93000445dRichard OsborneBitVector XCoreRegisterInfo::getReservedRegs(const MachineFunction &MF) const { 73b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne BitVector Reserved(getNumRegs()); 7416c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering(); 75d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov 76b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne Reserved.set(XCore::CP); 77b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne Reserved.set(XCore::DP); 78b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne Reserved.set(XCore::SP); 79b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne Reserved.set(XCore::LR); 80d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov if (TFI->hasFP(MF)) { 81b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne Reserved.set(XCore::R10); 82b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne } 83b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne return Reserved; 84b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne} 85b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 86b25baef26f03b9909b65dd5f762b38f93000445dRichard Osbornebool 87b25baef26f03b9909b65dd5f762b38f93000445dRichard OsborneXCoreRegisterInfo::requiresRegisterScavenging(const MachineFunction &MF) const { 8816c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering(); 89b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 90d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov // TODO can we estimate stack size? 91d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov return TFI->hasFP(MF); 92b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne} 93b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 948ae8cf4559fc2e22fc0366f38533204718a9a32dRichard Osbornebool 956a8c7bf8e72338e55f0f9583e1828f62da165d4aPreston GurdXCoreRegisterInfo::trackLivenessAfterRegAlloc(const MachineFunction &MF) const { 966a8c7bf8e72338e55f0f9583e1828f62da165d4aPreston Gurd return requiresRegisterScavenging(MF); 976a8c7bf8e72338e55f0f9583e1828f62da165d4aPreston Gurd} 986a8c7bf8e72338e55f0f9583e1828f62da165d4aPreston Gurd 996a8c7bf8e72338e55f0f9583e1828f62da165d4aPreston Gurdbool 1008ae8cf4559fc2e22fc0366f38533204718a9a32dRichard OsborneXCoreRegisterInfo::useFPForScavengingIndex(const MachineFunction &MF) const { 1018ae8cf4559fc2e22fc0366f38533204718a9a32dRichard Osborne return false; 1028ae8cf4559fc2e22fc0366f38533204718a9a32dRichard Osborne} 1038ae8cf4559fc2e22fc0366f38533204718a9a32dRichard Osborne 104fcb4a8ead3cd8d9540d5eaa448af5d14a0ee341aJim Grosbachvoid 105b58f498f7502e7e1833decbbbb4df771367c7341Jim GrosbachXCoreRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, 106108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier int SPAdj, unsigned FIOperandNum, 107108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier RegScavenger *RS) const { 108b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne assert(SPAdj == 0 && "Unexpected"); 109b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne MachineInstr &MI = *II; 110bd9ef18f74a361e0ed630d373677c6fc0ce3cad9Dale Johannesen DebugLoc dl = MI.getDebugLoc(); 111108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier MachineOperand &FrameOp = MI.getOperand(FIOperandNum); 112b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne int FrameIndex = FrameOp.getIndex(); 113b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 114b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne MachineFunction &MF = *MI.getParent()->getParent(); 11516c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering(); 116b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex); 117b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne int StackSize = MF.getFrameInfo()->getStackSize(); 118b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 119b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne #ifndef NDEBUG 120ce63ffb52f249b62cdf2d250c128007b13f27e71Daniel Dunbar DEBUG(errs() << "\nFunction : " 12196601ca332ab388754ca4673be8973396fea2dddCraig Topper << MF.getName() << "\n"); 122705e07f578e2b3af47ddab610feb4e7f2d3063a5Chris Lattner DEBUG(errs() << "<--------->\n"); 123705e07f578e2b3af47ddab610feb4e7f2d3063a5Chris Lattner DEBUG(MI.print(errs())); 124705e07f578e2b3af47ddab610feb4e7f2d3063a5Chris Lattner DEBUG(errs() << "FrameIndex : " << FrameIndex << "\n"); 125705e07f578e2b3af47ddab610feb4e7f2d3063a5Chris Lattner DEBUG(errs() << "FrameOffset : " << Offset << "\n"); 126705e07f578e2b3af47ddab610feb4e7f2d3063a5Chris Lattner DEBUG(errs() << "StackSize : " << StackSize << "\n"); 127b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne #endif 128b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 129b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne Offset += StackSize; 130c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne 131c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne unsigned FrameReg = getFrameRegister(MF); 132c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne 133c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne // Special handling of DBG_VALUE instructions. 134c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne if (MI.isDebugValue()) { 135108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier MI.getOperand(FIOperandNum).ChangeToRegister(FrameReg, false /*isDef*/); 136108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier MI.getOperand(FIOperandNum + 1).ChangeToImmediate(Offset); 137c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne return; 138c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne } 139c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne 140b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne // fold constant into offset. 141108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier Offset += MI.getOperand(FIOperandNum + 1).getImm(); 142108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier MI.getOperand(FIOperandNum + 1).ChangeToImmediate(0); 143b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 144b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne assert(Offset%4 == 0 && "Misaligned stack offset"); 145b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 146893e1c90a03a53cf13f73849324e83612688428aChris Lattner DEBUG(errs() << "Offset : " << Offset << "\n" << "<--------->\n"); 147b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 148b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne Offset/=4; 149b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 150d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov bool FP = TFI->hasFP(MF); 151c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne 15229cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne unsigned Reg = MI.getOperand(0).getReg(); 15329cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne bool isKill = MI.getOpcode() == XCore::STWFI && MI.getOperand(0).isKill(); 15429cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne 155420761a0f193e87d08ee1c51b26bba23ab4bac7fCraig Topper assert(XCore::GRRegsRegClass.contains(Reg) && "Unexpected register operand"); 15629cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne 15729cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne MachineBasicBlock &MBB = *MI.getParent(); 15829cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne 159b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne if (FP) { 160b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne bool isUs = isImmUs(Offset); 161b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 162b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne if (!isUs) { 1631bd7335a17010bd4d8f86736cf73cac9f3fb80a5Benjamin Kramer if (!RS) 1641bd7335a17010bd4d8f86736cf73cac9f3fb80a5Benjamin Kramer report_fatal_error("eliminateFrameIndex Frame size too big: " + 1651bd7335a17010bd4d8f86736cf73cac9f3fb80a5Benjamin Kramer Twine(Offset)); 166420761a0f193e87d08ee1c51b26bba23ab4bac7fCraig Topper unsigned ScratchReg = RS->scavengeRegister(&XCore::GRRegsRegClass, II, 167b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne SPAdj); 168bd9ef18f74a361e0ed630d373677c6fc0ce3cad9Dale Johannesen loadConstant(MBB, II, ScratchReg, Offset, dl); 169b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne switch (MI.getOpcode()) { 17029cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne case XCore::LDWFI: 171c2d98bc0d682419f09659d94afefd6a6266dd6eeDuncan Sands BuildMI(MBB, II, dl, TII.get(XCore::LDW_3r), Reg) 172c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne .addReg(FrameReg) 173587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling .addReg(ScratchReg, RegState::Kill); 174b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne break; 17529cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne case XCore::STWFI: 1761f375e5bc78647f9b29564eafdc907250ccd91edRichard Osborne BuildMI(MBB, II, dl, TII.get(XCore::STW_l3r)) 177587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling .addReg(Reg, getKillRegState(isKill)) 178c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne .addReg(FrameReg) 179587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling .addReg(ScratchReg, RegState::Kill); 180b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne break; 18129cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne case XCore::LDAWFI: 182c2d98bc0d682419f09659d94afefd6a6266dd6eeDuncan Sands BuildMI(MBB, II, dl, TII.get(XCore::LDAWF_l3r), Reg) 183c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne .addReg(FrameReg) 184587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling .addReg(ScratchReg, RegState::Kill); 185b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne break; 186b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne default: 187c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("Unexpected Opcode"); 188b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne } 189b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne } else { 190b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne switch (MI.getOpcode()) { 19129cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne case XCore::LDWFI: 192c2d98bc0d682419f09659d94afefd6a6266dd6eeDuncan Sands BuildMI(MBB, II, dl, TII.get(XCore::LDW_2rus), Reg) 193c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne .addReg(FrameReg) 194b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne .addImm(Offset); 195b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne break; 19629cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne case XCore::STWFI: 197c2d98bc0d682419f09659d94afefd6a6266dd6eeDuncan Sands BuildMI(MBB, II, dl, TII.get(XCore::STW_2rus)) 198587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling .addReg(Reg, getKillRegState(isKill)) 199c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne .addReg(FrameReg) 200b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne .addImm(Offset); 201b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne break; 20229cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne case XCore::LDAWFI: 203c2d98bc0d682419f09659d94afefd6a6266dd6eeDuncan Sands BuildMI(MBB, II, dl, TII.get(XCore::LDAWF_l2rus), Reg) 204c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne .addReg(FrameReg) 205b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne .addImm(Offset); 206b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne break; 207b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne default: 208c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("Unexpected Opcode"); 209b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne } 210b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne } 211b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne } else { 212b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne bool isU6 = isImmU6(Offset); 2131bd7335a17010bd4d8f86736cf73cac9f3fb80a5Benjamin Kramer if (!isU6 && !isImmU16(Offset)) 2141bd7335a17010bd4d8f86736cf73cac9f3fb80a5Benjamin Kramer report_fatal_error("eliminateFrameIndex Frame size too big: " + 2151bd7335a17010bd4d8f86736cf73cac9f3fb80a5Benjamin Kramer Twine(Offset)); 216b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 21729cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne switch (MI.getOpcode()) { 21829cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne int NewOpcode; 21929cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne case XCore::LDWFI: 220b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne NewOpcode = (isU6) ? XCore::LDWSP_ru6 : XCore::LDWSP_lru6; 221bd9ef18f74a361e0ed630d373677c6fc0ce3cad9Dale Johannesen BuildMI(MBB, II, dl, TII.get(NewOpcode), Reg) 22229cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne .addImm(Offset); 223b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne break; 22429cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne case XCore::STWFI: 225b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne NewOpcode = (isU6) ? XCore::STWSP_ru6 : XCore::STWSP_lru6; 226bd9ef18f74a361e0ed630d373677c6fc0ce3cad9Dale Johannesen BuildMI(MBB, II, dl, TII.get(NewOpcode)) 227587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling .addReg(Reg, getKillRegState(isKill)) 22829cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne .addImm(Offset); 229b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne break; 23029cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne case XCore::LDAWFI: 231b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne NewOpcode = (isU6) ? XCore::LDAWSP_ru6 : XCore::LDAWSP_lru6; 232bd9ef18f74a361e0ed630d373677c6fc0ce3cad9Dale Johannesen BuildMI(MBB, II, dl, TII.get(NewOpcode), Reg) 23329cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne .addImm(Offset); 234b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne break; 235b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne default: 236c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("Unexpected Opcode"); 237b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne } 238b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne } 23929cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne // Erase old instruction. 24029cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne MBB.erase(II); 241b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne} 242b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 243b25baef26f03b9909b65dd5f762b38f93000445dRichard Osbornevoid XCoreRegisterInfo:: 244b25baef26f03b9909b65dd5f762b38f93000445dRichard OsborneloadConstant(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, 245bd9ef18f74a361e0ed630d373677c6fc0ce3cad9Dale Johannesen unsigned DstReg, int64_t Value, DebugLoc dl) const { 246b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne // TODO use mkmsk if possible. 247b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne if (!isImmU16(Value)) { 248b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne // TODO use constant pool. 2491bd7335a17010bd4d8f86736cf73cac9f3fb80a5Benjamin Kramer report_fatal_error("loadConstant value too big " + Twine(Value)); 250b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne } 251b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne int Opcode = isImmU6(Value) ? XCore::LDC_ru6 : XCore::LDC_lru6; 252bd9ef18f74a361e0ed630d373677c6fc0ce3cad9Dale Johannesen BuildMI(MBB, I, dl, TII.get(Opcode), DstReg).addImm(Value); 253b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne} 254b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 2553f2bf85d14759cc4b28a86805f566ac805a54d00David Greeneunsigned XCoreRegisterInfo::getFrameRegister(const MachineFunction &MF) const { 25616c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering(); 25733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov 258d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov return TFI->hasFP(MF) ? XCore::R10 : XCore::SP; 259b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne} 260