HexagonRegisterInfo.cpp revision 31d157ae1ac2cd9c787dc3c1d28e64c682803844
13ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//===-- HexagonRegisterInfo.cpp - Hexagon Register Information ------------===// 23ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// 33ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// The LLVM Compiler Infrastructure 43ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// 53ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// This file is distributed under the University of Illinois Open Source 63ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// License. See LICENSE.TXT for details. 73ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// 83ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//===----------------------------------------------------------------------===// 93ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// 101eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar// This file contains the Hexagon implementation of the TargetRegisterInfo 111eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar// class. 123ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// 133ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//===----------------------------------------------------------------------===// 143ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar 152dec85b21822f950bf6035640c496ad835e11728Chad Rosier#include "Hexagon.h" 162dec85b21822f950bf6035640c496ad835e11728Chad Rosier#include "HexagonRegisterInfo.h" 173ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#include "HexagonSubtarget.h" 183ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#include "HexagonTargetMachine.h" 192c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar#include "HexagonMachineFunctionInfo.h" 202dec85b21822f950bf6035640c496ad835e11728Chad Rosier#include "llvm/Function.h" 212dec85b21822f950bf6035640c496ad835e11728Chad Rosier#include "llvm/Type.h" 22af20afb761a2426cd715fb8db36b90092e0bb6efDaniel Dunbar#include "llvm/ADT/BitVector.h" 23af20afb761a2426cd715fb8db36b90092e0bb6efDaniel Dunbar#include "llvm/ADT/STLExtras.h" 242dec85b21822f950bf6035640c496ad835e11728Chad Rosier#include "llvm/CodeGen/MachineInstrBuilder.h" 252c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar#include "llvm/CodeGen/MachineFunction.h" 267f9fc3f7ce076645cb6aefc99c64d9446caf13d6Chris Lattner#include "llvm/CodeGen/MachineFunctionPass.h" 27510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar#include "llvm/CodeGen/MachineFrameInfo.h" 288a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola#include "llvm/CodeGen/MachineRegisterInfo.h" 293ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#include "llvm/CodeGen/RegisterScavenging.h" 308a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola#include "llvm/MC/MachineLocation.h" 31fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer#include "llvm/Target/TargetInstrInfo.h" 328f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar#include "llvm/Target/TargetMachine.h" 338a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola#include "llvm/Target/TargetOptions.h" 348f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar#include "llvm/Support/CommandLine.h" 350de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar#include "llvm/Support/ErrorHandling.h" 3630bc7e8e560941f730fd94109e81ac600767b0abChris Lattner 374ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbarusing namespace llvm; 3803013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer 3903013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer 4003013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. SpencerHexagonRegisterInfo::HexagonRegisterInfo(HexagonSubtarget &st, 4103013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer const HexagonInstrInfo &tii) 42a6b4045dc462c03cd1e7cb9c3ec9dbfdb9c6ad62Evan Cheng : HexagonGenRegisterInfo(Hexagon::R31), 43a6b4045dc462c03cd1e7cb9c3ec9dbfdb9c6ad62Evan Cheng Subtarget(st), 443a321e23f66128dbb986343927456ff6702af617Michael J. Spencer TII(tii) { 4543d013d7060e77f0d15faa9cff820c343ba5629aDouglas Gregor} 464ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar 471b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbarconst unsigned* HexagonRegisterInfo::getCalleeSavedRegs(const MachineFunction 483ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar *MF) 49aeed3da83c112d0649c30493c059314d85d99080Benjamin Kramer const { 500f4c59c3beae302b5a3ecea13f2e257bdaad3188Rafael Espindola static const unsigned CalleeSavedRegsV2[] = { 510f4c59c3beae302b5a3ecea13f2e257bdaad3188Rafael Espindola Hexagon::R24, Hexagon::R25, Hexagon::R26, Hexagon::R27, 0 520f4c59c3beae302b5a3ecea13f2e257bdaad3188Rafael Espindola }; 53734932c7dc77a16b15d466588e10d76bcd6d13c7Daniel Dunbar static const unsigned CalleeSavedRegsV3[] = { 54734932c7dc77a16b15d466588e10d76bcd6d13c7Daniel Dunbar Hexagon::R16, Hexagon::R17, Hexagon::R18, Hexagon::R19, 55734932c7dc77a16b15d466588e10d76bcd6d13c7Daniel Dunbar Hexagon::R20, Hexagon::R21, Hexagon::R22, Hexagon::R23, 56734932c7dc77a16b15d466588e10d76bcd6d13c7Daniel Dunbar Hexagon::R24, Hexagon::R25, Hexagon::R26, Hexagon::R27, 0 57734932c7dc77a16b15d466588e10d76bcd6d13c7Daniel Dunbar }; 58734932c7dc77a16b15d466588e10d76bcd6d13c7Daniel Dunbar 59237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar switch(Subtarget.getHexagonArchVersion()) { 605f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner case HexagonSubtarget::V1: 61ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar break; 62ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar case HexagonSubtarget::V2: 63ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar return CalleeSavedRegsV2; 64ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar case HexagonSubtarget::V3: 65ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar case HexagonSubtarget::V4: 66ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar return CalleeSavedRegsV3; 67ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar } 68ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar llvm_unreachable("Callee saved registers requested for unknown architecture " 69ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar "version"); 70e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar} 71e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar 72ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel DunbarBitVector HexagonRegisterInfo::getReservedRegs(const MachineFunction &MF) 73ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar const { 74ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar BitVector Reserved(getNumRegs()); 75ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar Reserved.set(HEXAGON_RESERVED_REG_1); 760de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar Reserved.set(HEXAGON_RESERVED_REG_2); 770de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar Reserved.set(Hexagon::R29); 78ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar Reserved.set(Hexagon::R30); 79ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar Reserved.set(Hexagon::R31); 80ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar Reserved.set(Hexagon::D14); 81ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar Reserved.set(Hexagon::D15); 82ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar Reserved.set(Hexagon::LC0); 83ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar Reserved.set(Hexagon::LC1); 84ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar Reserved.set(Hexagon::SA0); 85ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar Reserved.set(Hexagon::SA1); 86e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar return Reserved; 87e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar} 88e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar 89e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar 90e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbarconst TargetRegisterClass* const* 915f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerHexagonRegisterInfo::getCalleeSavedRegClasses(const MachineFunction *MF) const { 925f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner static const TargetRegisterClass * const CalleeSavedRegClassesV2[] = { 935f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner &Hexagon::IntRegsRegClass, &Hexagon::IntRegsRegClass, 9430bc7e8e560941f730fd94109e81ac600767b0abChris Lattner &Hexagon::IntRegsRegClass, &Hexagon::IntRegsRegClass, 95ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar }; 96ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar static const TargetRegisterClass * const CalleeSavedRegClassesV3[] = { 97237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar &Hexagon::IntRegsRegClass, &Hexagon::IntRegsRegClass, 98237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar &Hexagon::IntRegsRegClass, &Hexagon::IntRegsRegClass, 990de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar &Hexagon::IntRegsRegClass, &Hexagon::IntRegsRegClass, 100237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar &Hexagon::IntRegsRegClass, &Hexagon::IntRegsRegClass, 101237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar &Hexagon::IntRegsRegClass, &Hexagon::IntRegsRegClass, 102237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar &Hexagon::IntRegsRegClass, &Hexagon::IntRegsRegClass, 103237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar }; 1040de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar 105237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar switch(Subtarget.getHexagonArchVersion()) { 106237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar case HexagonSubtarget::V1: 1070de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar break; 1085f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner case HexagonSubtarget::V2: 1095f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner return CalleeSavedRegClassesV2; 1105f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner case HexagonSubtarget::V3: 1110de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar case HexagonSubtarget::V4: 1120de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar return CalleeSavedRegClassesV3; 1130de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar } 1140de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar llvm_unreachable("Callee saved register classes requested for unknown " 1150de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar "architecture version"); 1160de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar} 1170de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar 1180de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbarvoid HexagonRegisterInfo:: 1190de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel DunbareliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, 1200de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar MachineBasicBlock::iterator I) const { 121237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar MachineInstr &MI = *I; 122237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar 123237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar if (MI.getOpcode() == Hexagon::ADJCALLSTACKDOWN) { 124237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar // Hexagon_TODO: add code 125237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar } else if (MI.getOpcode() == Hexagon::ADJCALLSTACKUP) { 126237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar // Hexagon_TODO: add code 127237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar } else { 128237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar llvm_unreachable("Cannot handle this call frame pseudo instruction"); 129237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar } 130237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar MBB.erase(I); 131237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar} 132237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar 133237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbarvoid HexagonRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, 134237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar int SPAdj, RegScavenger *RS) const { 135237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar 136237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar // 137237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar // Hexagon_TODO: Do we need to enforce this for Hexagon? 138237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar assert(SPAdj == 0 && "Unexpected"); 139237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar 140237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar 141237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar unsigned i = 0; 142237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar MachineInstr &MI = *II; 143237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar while (!MI.getOperand(i).isFI()) { 144237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar ++i; 145237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar assert(i < MI.getNumOperands() && "Instr doesn't have FrameIndex operand!"); 146237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar } 147237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar 148237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar int FrameIndex = MI.getOperand(i).getIndex(); 149237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar 1500de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar // Addressable stack objects are accessed using neg. offsets from %fp. 151237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar MachineFunction &MF = *MI.getParent()->getParent(); 152237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex); 153237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar MachineFrameInfo &MFI = *MF.getFrameInfo(); 154ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar 155ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar unsigned FrameReg = getFrameRegister(MF); 156ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering(); 157ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar if (!TFI->hasFP(MF)) { 1585f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner // We will not reserve space on the stack for the lr and fp registers. 15930bc7e8e560941f730fd94109e81ac600767b0abChris Lattner Offset -= 2 * Hexagon_WordSize; 16030bc7e8e560941f730fd94109e81ac600767b0abChris Lattner } 1615f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner 162237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar const unsigned FrameSize = MFI.getStackSize(); 163e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar 164e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar if (!MFI.hasVarSizedObjects() && 165e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar TII.isValidOffset(MI.getOpcode(), (FrameSize+Offset)) && 166e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar !TII.isSpillPredRegOp(&MI)) { 167e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar // Replace frame index with a stack pointer reference. 168e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar MI.getOperand(i).ChangeToRegister(getStackRegister(), false, false, true); 169ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar MI.getOperand(i+1).ChangeToImmediate(FrameSize+Offset); 170ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar } else { 171ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar // Replace frame index with a frame pointer reference. 172ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar if (!TII.isValidOffset(MI.getOpcode(), Offset)) { 173ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar 174ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar // If the offset overflows, then correct it. 175ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar // 176ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar // For loads, we do not need a reserved register 177ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar // r0 = memw(r30 + #10000) to: 178e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar // 179ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar // r0 = add(r30, #10000) 180ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar // r0 = memw(r0) 181ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar if ( (MI.getOpcode() == Hexagon::LDriw) || 182ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar (MI.getOpcode() == Hexagon::LDrid) || 183ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar (MI.getOpcode() == Hexagon::LDrih) || 184ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar (MI.getOpcode() == Hexagon::LDriuh) || 185c88aa79a6bdfd445df800006f723f83f39934e98Daniel Dunbar (MI.getOpcode() == Hexagon::LDrib) || 186545c28117c64e78521b8b402caa060ba0b58a530Daniel Dunbar (MI.getOpcode() == Hexagon::LDriub) ) { 18741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned dstReg = (MI.getOpcode() == Hexagon::LDrid) ? 18841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar *getSubRegisters(MI.getOperand(0).getReg()) : 189217acbfa3524d5805fda7900b26c1e779443588dDaniel Dunbar MI.getOperand(0).getReg(); 1908a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola 1915f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner // Check if offset can fit in addi. 1928a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola if (!TII.isValidOffset(Hexagon::ADD_ri, Offset)) { 1938a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 1941e4c01b79273b9cd4e9e9ecfd3422df3900b8356Dylan Noblesmith TII.get(Hexagon::CONST32_Int_Real), dstReg).addImm(Offset); 1954eeebc464e1f968d9968a4786c82558f18ac2ed8Michael J. Spencer BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 1968a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola TII.get(Hexagon::ADD_rr), 1978a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola dstReg).addReg(FrameReg).addReg(dstReg); 1988a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola } else { 1998a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 2008a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola TII.get(Hexagon::ADD_ri), 2018a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola dstReg).addReg(FrameReg).addImm(Offset); 2028a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola } 2038a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola 2048a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola MI.getOperand(i).ChangeToRegister(dstReg, false, false, true); 2058a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola MI.getOperand(i+1).ChangeToImmediate(0); 2068a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola } else if ((MI.getOpcode() == Hexagon::STriw) || 2078a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola (MI.getOpcode() == Hexagon::STrid) || 2088a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola (MI.getOpcode() == Hexagon::STrih) || 2098a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola (MI.getOpcode() == Hexagon::STrib) || 2108a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola (MI.getOpcode() == Hexagon::STriwt)) { 2118a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola // For stores, we need a reserved register. Change 2128a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola // memw(r30 + #10000) = r0 to: 2138a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola // 2148a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola // rs = add(r30, #10000); 2158a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola // memw(rs) = r0 2168a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola unsigned resReg = HEXAGON_RESERVED_REG_1; 2178a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola 2188a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola // Check if offset can fit in addi. 2198a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola if (!TII.isValidOffset(Hexagon::ADD_ri, Offset)) { 2208a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 2218a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola TII.get(Hexagon::CONST32_Int_Real), resReg).addImm(Offset); 2228a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 2238a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola TII.get(Hexagon::ADD_rr), 2248a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola resReg).addReg(FrameReg).addReg(resReg); 2258a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola } else { 2268a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 2278a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola TII.get(Hexagon::ADD_ri), 2288a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola resReg).addReg(FrameReg).addImm(Offset); 2298a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola } 2308a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola MI.getOperand(i).ChangeToRegister(resReg, false, false, true); 2318a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola MI.getOperand(i+1).ChangeToImmediate(0); 2328a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola } else if (TII.isMemOp(&MI)) { 2338a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola unsigned resReg = HEXAGON_RESERVED_REG_1; 2348a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola if (!MFI.hasVarSizedObjects() && 2358a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola TII.isValidOffset(MI.getOpcode(), (FrameSize+Offset))) { 2368a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola MI.getOperand(i).ChangeToRegister(getStackRegister(), false, false, 2378a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola true); 2388a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola MI.getOperand(i+1).ChangeToImmediate(FrameSize+Offset); 2398a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola } else if (!TII.isValidOffset(Hexagon::ADD_ri, Offset)) { 2408a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 2418a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola TII.get(Hexagon::CONST32_Int_Real), resReg).addImm(Offset); 2428a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 2438a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola TII.get(Hexagon::ADD_rr), 2448a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola resReg).addReg(FrameReg).addReg(resReg); 2458a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola MI.getOperand(i).ChangeToRegister(resReg, false, false, true); 2468a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola MI.getOperand(i+1).ChangeToImmediate(0); 2478a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola } else { 2488a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 2495f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner TII.get(Hexagon::ADD_ri), 2508a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola resReg).addReg(FrameReg).addImm(Offset); 2518a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola MI.getOperand(i).ChangeToRegister(resReg, false, false, true); 2528a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola MI.getOperand(i+1).ChangeToImmediate(0); 2538a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola } 2548a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola } else { 2558a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola unsigned dstReg = MI.getOperand(0).getReg(); 2568a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 2578a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola TII.get(Hexagon::CONST32_Int_Real), dstReg).addImm(Offset); 2588a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 2598a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola TII.get(Hexagon::ADD_rr), 2608a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola dstReg).addReg(FrameReg).addReg(dstReg); 2618a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola // Can we delete MI??? r2 = add (r2, #0). 2625f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner MI.getOperand(i).ChangeToRegister(dstReg, false, false, true); 2630ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger MI.getOperand(i+1).ChangeToImmediate(0); 2640ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger } 2650ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger } else { 2660ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger // If the offset is small enough to fit in the immediate field, directly 2670ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger // encode it. 2680ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger MI.getOperand(i).ChangeToRegister(FrameReg, false); 2690ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger MI.getOperand(i+1).ChangeToImmediate(Offset); 2700ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger } 2710ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger } 2720ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger 2730ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger} 2740ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger 2750ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenbergerunsigned HexagonRegisterInfo::getRARegister() const { 2760ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger return Hexagon::R31; 2770ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger} 2780ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger 2799ec60dfe771ff28a84889dced6f8fd3748d3d55eSebastian Popunsigned HexagonRegisterInfo::getFrameRegister(const MachineFunction 2800ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger &MF) const { 2810ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering(); 2820ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger if (TFI->hasFP(MF)) { 2830ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger return Hexagon::R30; 2840ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger } 2850ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger 2860ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger return Hexagon::R29; 2870ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger} 2880ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger 2890ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenbergerunsigned HexagonRegisterInfo::getFrameRegister() const { 2900ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger return Hexagon::R30; 2910ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger} 2920ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger 2930ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenbergerunsigned HexagonRegisterInfo::getStackRegister() const { 2940ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger return Hexagon::R29; 2950ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger} 2960ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger 2975f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid HexagonRegisterInfo::getInitialFrameState(std::vector<MachineMove> 2985f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner &Moves) const 2990ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger{ 3000ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger // VirtualFP = (R30 + #0). 3010ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger unsigned FPReg = getFrameRegister(); 3020ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger MachineLocation Dst(MachineLocation::VirtualFP); 3030ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger MachineLocation Src(FPReg, 0); 3040ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger Moves.push_back(MachineMove(0, Dst, Src)); 3050ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger} 3060ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger 3070ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenbergerunsigned HexagonRegisterInfo::getEHExceptionRegister() const { 3080ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger llvm_unreachable("What is the exception register"); 3090ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger} 3100ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger 3110ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenbergerunsigned HexagonRegisterInfo::getEHHandlerRegister() const { 3120ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger llvm_unreachable("What is the exception handler register"); 3130ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger} 3140ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger 3150ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger#define GET_REGINFO_TARGET_DESC 3165f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner#include "HexagonGenRegisterInfo.inc" 3170ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger