HexagonRegisterInfo.cpp revision 0b8c9a80f20772c3793201ab5b251d3520b9cea3
131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- HexagonRegisterInfo.cpp - Hexagon Register Information ------------===// 2b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// 3b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// The LLVM Compiler Infrastructure 4b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// 5b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// This file is distributed under the University of Illinois Open Source 6b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// License. See LICENSE.TXT for details. 7b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// 8b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//===----------------------------------------------------------------------===// 9b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// 10b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// This file contains the Hexagon implementation of the TargetRegisterInfo 11b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// class. 12b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// 13b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//===----------------------------------------------------------------------===// 14b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 15b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "HexagonRegisterInfo.h" 1679aa3417eb6f58d668aadfedf075240a41d35a26Craig Topper#include "Hexagon.h" 17d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "HexagonMachineFunctionInfo.h" 18b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "HexagonSubtarget.h" 19b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "HexagonTargetMachine.h" 20f3fd7ee415ec8a6475a060e29959d04d6158f45fBenjamin Kramer#include "llvm/ADT/BitVector.h" 21f3fd7ee415ec8a6475a060e29959d04d6158f45fBenjamin Kramer#include "llvm/ADT/STLExtras.h" 22d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineFrameInfo.h" 23b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/CodeGen/MachineFunction.h" 24f3fd7ee415ec8a6475a060e29959d04d6158f45fBenjamin Kramer#include "llvm/CodeGen/MachineFunctionPass.h" 25d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineInstrBuilder.h" 26b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/CodeGen/MachineRegisterInfo.h" 27b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/CodeGen/RegisterScavenging.h" 280b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h" 290b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Type.h" 30b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/MC/MachineLocation.h" 31d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/CommandLine.h" 32d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/ErrorHandling.h" 33b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/Target/TargetInstrInfo.h" 34b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/Target/TargetMachine.h" 35b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/Target/TargetOptions.h" 36b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 37b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumusing namespace llvm; 38b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 39b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 40b4b54153ad760c69a00a08531abef4ed434a5092Tony LinthicumHexagonRegisterInfo::HexagonRegisterInfo(HexagonSubtarget &st, 41b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum const HexagonInstrInfo &tii) 42b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum : HexagonGenRegisterInfo(Hexagon::R31), 43b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Subtarget(st), 44b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum TII(tii) { 45b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 46b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 47015f228861ef9b337366f92f637d4e8d624bb006Craig Topperconst uint16_t* HexagonRegisterInfo::getCalleeSavedRegs(const MachineFunction 48b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum *MF) 49b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum const { 50015f228861ef9b337366f92f637d4e8d624bb006Craig Topper static const uint16_t CalleeSavedRegsV2[] = { 51015f228861ef9b337366f92f637d4e8d624bb006Craig Topper Hexagon::R24, Hexagon::R25, Hexagon::R26, Hexagon::R27, 0 52b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum }; 53015f228861ef9b337366f92f637d4e8d624bb006Craig Topper static const uint16_t CalleeSavedRegsV3[] = { 54b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Hexagon::R16, Hexagon::R17, Hexagon::R18, Hexagon::R19, 55b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Hexagon::R20, Hexagon::R21, Hexagon::R22, Hexagon::R23, 56b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Hexagon::R24, Hexagon::R25, Hexagon::R26, Hexagon::R27, 0 57b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum }; 58b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 59b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum switch(Subtarget.getHexagonArchVersion()) { 6027baab62e7d6267d9b18e4665c6bb1b75dae10d4Benjamin Kramer case HexagonSubtarget::V1: 6127baab62e7d6267d9b18e4665c6bb1b75dae10d4Benjamin Kramer break; 62b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum case HexagonSubtarget::V2: 63b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum return CalleeSavedRegsV2; 64b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum case HexagonSubtarget::V3: 65b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum case HexagonSubtarget::V4: 667517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande case HexagonSubtarget::V5: 67b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum return CalleeSavedRegsV3; 68b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 6927baab62e7d6267d9b18e4665c6bb1b75dae10d4Benjamin Kramer llvm_unreachable("Callee saved registers requested for unknown architecture " 7027baab62e7d6267d9b18e4665c6bb1b75dae10d4Benjamin Kramer "version"); 71b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 72b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 73b4b54153ad760c69a00a08531abef4ed434a5092Tony LinthicumBitVector HexagonRegisterInfo::getReservedRegs(const MachineFunction &MF) 74b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum const { 75b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum BitVector Reserved(getNumRegs()); 76b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Reserved.set(HEXAGON_RESERVED_REG_1); 77b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Reserved.set(HEXAGON_RESERVED_REG_2); 78b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Reserved.set(Hexagon::R29); 79b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Reserved.set(Hexagon::R30); 80b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Reserved.set(Hexagon::R31); 81b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Reserved.set(Hexagon::D14); 82b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Reserved.set(Hexagon::D15); 83b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Reserved.set(Hexagon::LC0); 84b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Reserved.set(Hexagon::LC1); 85b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Reserved.set(Hexagon::SA0); 86b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Reserved.set(Hexagon::SA1); 87b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum return Reserved; 88b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 89b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 90b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 91b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumconst TargetRegisterClass* const* 92b4b54153ad760c69a00a08531abef4ed434a5092Tony LinthicumHexagonRegisterInfo::getCalleeSavedRegClasses(const MachineFunction *MF) const { 93b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum static const TargetRegisterClass * const CalleeSavedRegClassesV2[] = { 94b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum &Hexagon::IntRegsRegClass, &Hexagon::IntRegsRegClass, 95b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum &Hexagon::IntRegsRegClass, &Hexagon::IntRegsRegClass, 96b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum }; 97b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum static const TargetRegisterClass * const CalleeSavedRegClassesV3[] = { 98b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum &Hexagon::IntRegsRegClass, &Hexagon::IntRegsRegClass, 99b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum &Hexagon::IntRegsRegClass, &Hexagon::IntRegsRegClass, 100b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum &Hexagon::IntRegsRegClass, &Hexagon::IntRegsRegClass, 101b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum &Hexagon::IntRegsRegClass, &Hexagon::IntRegsRegClass, 102b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum &Hexagon::IntRegsRegClass, &Hexagon::IntRegsRegClass, 103b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum &Hexagon::IntRegsRegClass, &Hexagon::IntRegsRegClass, 104b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum }; 105b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 106b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum switch(Subtarget.getHexagonArchVersion()) { 10727baab62e7d6267d9b18e4665c6bb1b75dae10d4Benjamin Kramer case HexagonSubtarget::V1: 10827baab62e7d6267d9b18e4665c6bb1b75dae10d4Benjamin Kramer break; 109b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum case HexagonSubtarget::V2: 110b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum return CalleeSavedRegClassesV2; 111b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum case HexagonSubtarget::V3: 112b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum case HexagonSubtarget::V4: 1137517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande case HexagonSubtarget::V5: 114b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum return CalleeSavedRegClassesV3; 115b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 11627baab62e7d6267d9b18e4665c6bb1b75dae10d4Benjamin Kramer llvm_unreachable("Callee saved register classes requested for unknown " 11727baab62e7d6267d9b18e4665c6bb1b75dae10d4Benjamin Kramer "architecture version"); 118b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 119b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 120b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumvoid HexagonRegisterInfo:: 121b4b54153ad760c69a00a08531abef4ed434a5092Tony LinthicumeliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, 122b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MachineBasicBlock::iterator I) const { 123b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MachineInstr &MI = *I; 124b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 125b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum if (MI.getOpcode() == Hexagon::ADJCALLSTACKDOWN) { 126b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // Hexagon_TODO: add code 127b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } else if (MI.getOpcode() == Hexagon::ADJCALLSTACKUP) { 128b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // Hexagon_TODO: add code 129b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } else { 130bc2198133a1836598b54b943420748e75d5dea94Craig Topper llvm_unreachable("Cannot handle this call frame pseudo instruction"); 131b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 132b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MBB.erase(I); 133b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 134b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 135b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumvoid HexagonRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, 136b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum int SPAdj, RegScavenger *RS) const { 137b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 138b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // 139b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // Hexagon_TODO: Do we need to enforce this for Hexagon? 140b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum assert(SPAdj == 0 && "Unexpected"); 141b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 142b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 143b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum unsigned i = 0; 144b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MachineInstr &MI = *II; 145b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum while (!MI.getOperand(i).isFI()) { 146b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum ++i; 147b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum assert(i < MI.getNumOperands() && "Instr doesn't have FrameIndex operand!"); 148b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 149b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 150b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum int FrameIndex = MI.getOperand(i).getIndex(); 151b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 152b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // Addressable stack objects are accessed using neg. offsets from %fp. 153b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MachineFunction &MF = *MI.getParent()->getParent(); 154b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex); 155b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MachineFrameInfo &MFI = *MF.getFrameInfo(); 156b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 157b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum unsigned FrameReg = getFrameRegister(MF); 158b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering(); 159b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum if (!TFI->hasFP(MF)) { 160b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // We will not reserve space on the stack for the lr and fp registers. 161b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Offset -= 2 * Hexagon_WordSize; 162b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 163b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 164b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum const unsigned FrameSize = MFI.getStackSize(); 165b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 166b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum if (!MFI.hasVarSizedObjects() && 167b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum TII.isValidOffset(MI.getOpcode(), (FrameSize+Offset)) && 168b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum !TII.isSpillPredRegOp(&MI)) { 169b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // Replace frame index with a stack pointer reference. 170b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MI.getOperand(i).ChangeToRegister(getStackRegister(), false, false, true); 171b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MI.getOperand(i+1).ChangeToImmediate(FrameSize+Offset); 172b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } else { 173b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // Replace frame index with a frame pointer reference. 174b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum if (!TII.isValidOffset(MI.getOpcode(), Offset)) { 175b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 176b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // If the offset overflows, then correct it. 177b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // 178b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // For loads, we do not need a reserved register 179b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // r0 = memw(r30 + #10000) to: 180b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // 181b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // r0 = add(r30, #10000) 182b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // r0 = memw(r0) 183b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum if ( (MI.getOpcode() == Hexagon::LDriw) || 1847517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande (MI.getOpcode() == Hexagon::LDrid) || 1857517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande (MI.getOpcode() == Hexagon::LDrih) || 1867517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande (MI.getOpcode() == Hexagon::LDriuh) || 1877517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande (MI.getOpcode() == Hexagon::LDrib) || 1887517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande (MI.getOpcode() == Hexagon::LDriub) || 1897517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande (MI.getOpcode() == Hexagon::LDriw_f) || 1907517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande (MI.getOpcode() == Hexagon::LDrid_f)) { 191b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum unsigned dstReg = (MI.getOpcode() == Hexagon::LDrid) ? 1926c823822cdab902e8ecc52603f9c24a0e4b95d42Jakob Stoklund Olesen getSubReg(MI.getOperand(0).getReg(), Hexagon::subreg_loreg) : 193b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MI.getOperand(0).getReg(); 194b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 195b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // Check if offset can fit in addi. 196b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum if (!TII.isValidOffset(Hexagon::ADD_ri, Offset)) { 197b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 198b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum TII.get(Hexagon::CONST32_Int_Real), dstReg).addImm(Offset); 199b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 200b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum TII.get(Hexagon::ADD_rr), 201b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum dstReg).addReg(FrameReg).addReg(dstReg); 202b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } else { 203b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 204b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum TII.get(Hexagon::ADD_ri), 205b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum dstReg).addReg(FrameReg).addImm(Offset); 206b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 207b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 208b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MI.getOperand(i).ChangeToRegister(dstReg, false, false, true); 209b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MI.getOperand(i+1).ChangeToImmediate(0); 2107517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande } else if ((MI.getOpcode() == Hexagon::STriw_indexed) || 2117517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande (MI.getOpcode() == Hexagon::STriw) || 212b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum (MI.getOpcode() == Hexagon::STrid) || 213b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum (MI.getOpcode() == Hexagon::STrih) || 2147517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande (MI.getOpcode() == Hexagon::STrib) || 2157517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande (MI.getOpcode() == Hexagon::STrid_f) || 2167517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande (MI.getOpcode() == Hexagon::STriw_f)) { 217b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // For stores, we need a reserved register. Change 218b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // memw(r30 + #10000) = r0 to: 219b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // 220b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // rs = add(r30, #10000); 221b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // memw(rs) = r0 222b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum unsigned resReg = HEXAGON_RESERVED_REG_1; 223b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 224b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // Check if offset can fit in addi. 225b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum if (!TII.isValidOffset(Hexagon::ADD_ri, Offset)) { 226b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 227b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum TII.get(Hexagon::CONST32_Int_Real), resReg).addImm(Offset); 228b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 229b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum TII.get(Hexagon::ADD_rr), 230b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum resReg).addReg(FrameReg).addReg(resReg); 231b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } else { 232b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 233b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum TII.get(Hexagon::ADD_ri), 234b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum resReg).addReg(FrameReg).addImm(Offset); 235b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 236b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MI.getOperand(i).ChangeToRegister(resReg, false, false, true); 237b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MI.getOperand(i+1).ChangeToImmediate(0); 238b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } else if (TII.isMemOp(&MI)) { 239b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum unsigned resReg = HEXAGON_RESERVED_REG_1; 240b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum if (!MFI.hasVarSizedObjects() && 241b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum TII.isValidOffset(MI.getOpcode(), (FrameSize+Offset))) { 242b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MI.getOperand(i).ChangeToRegister(getStackRegister(), false, false, 243b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum true); 244b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MI.getOperand(i+1).ChangeToImmediate(FrameSize+Offset); 245b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } else if (!TII.isValidOffset(Hexagon::ADD_ri, Offset)) { 246b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 247b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum TII.get(Hexagon::CONST32_Int_Real), resReg).addImm(Offset); 248b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 249b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum TII.get(Hexagon::ADD_rr), 250b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum resReg).addReg(FrameReg).addReg(resReg); 251b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MI.getOperand(i).ChangeToRegister(resReg, false, false, true); 252b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MI.getOperand(i+1).ChangeToImmediate(0); 253b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } else { 254b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 255b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum TII.get(Hexagon::ADD_ri), 256b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum resReg).addReg(FrameReg).addImm(Offset); 257b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MI.getOperand(i).ChangeToRegister(resReg, false, false, true); 258b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MI.getOperand(i+1).ChangeToImmediate(0); 259b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 260b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } else { 261b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum unsigned dstReg = MI.getOperand(0).getReg(); 262b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 263b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum TII.get(Hexagon::CONST32_Int_Real), dstReg).addImm(Offset); 264b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 265b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum TII.get(Hexagon::ADD_rr), 266b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum dstReg).addReg(FrameReg).addReg(dstReg); 267b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // Can we delete MI??? r2 = add (r2, #0). 268b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MI.getOperand(i).ChangeToRegister(dstReg, false, false, true); 269b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MI.getOperand(i+1).ChangeToImmediate(0); 270b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 271b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } else { 272b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // If the offset is small enough to fit in the immediate field, directly 273b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // encode it. 274b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MI.getOperand(i).ChangeToRegister(FrameReg, false); 275b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MI.getOperand(i+1).ChangeToImmediate(Offset); 276b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 277b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 278b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 279b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 280b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 281b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumunsigned HexagonRegisterInfo::getRARegister() const { 282b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum return Hexagon::R31; 283b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 284b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 285b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumunsigned HexagonRegisterInfo::getFrameRegister(const MachineFunction 286b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum &MF) const { 287b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering(); 288b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum if (TFI->hasFP(MF)) { 289b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum return Hexagon::R30; 290b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 291b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 292b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum return Hexagon::R29; 293b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 294b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 295b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumunsigned HexagonRegisterInfo::getFrameRegister() const { 296b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum return Hexagon::R30; 297b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 298b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 299b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumunsigned HexagonRegisterInfo::getStackRegister() const { 300b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum return Hexagon::R29; 301b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 302b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 303b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumvoid HexagonRegisterInfo::getInitialFrameState(std::vector<MachineMove> 304b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum &Moves) const 305b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum{ 306b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // VirtualFP = (R30 + #0). 307b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum unsigned FPReg = getFrameRegister(); 308b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MachineLocation Dst(MachineLocation::VirtualFP); 309b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MachineLocation Src(FPReg, 0); 310b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Moves.push_back(MachineMove(0, Dst, Src)); 311b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 312b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 3133e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin// Get the weight in units of pressure for this register class. 3143e59040810d0e6e04269ac8f781fa44df6088458Sergei Larinconst RegClassWeight & 3153e59040810d0e6e04269ac8f781fa44df6088458Sergei LarinHexagonRegisterInfo::getRegClassWeight(const TargetRegisterClass *RC) const { 3163e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin // Each TargetRegisterClass has a per register weight, and weight 3173e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin // limit which must be less than the limits of its pressure sets. 3183e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin static const RegClassWeight RCWeightTable[] = { 3193e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin {1, 32}, // IntRegs 3203e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin {1, 8}, // CRRegs 3213e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin {1, 4}, // PredRegs 3223e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin {2, 16}, // DoubleRegs 3233e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin {0, 0} }; 3243e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin return RCWeightTable[RC->getID()]; 3253e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin} 3263e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 3273e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin/// Get the number of dimensions of register pressure. 3283e59040810d0e6e04269ac8f781fa44df6088458Sergei Larinunsigned HexagonRegisterInfo::getNumRegPressureSets() const { 3293e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin return 4; 3303e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin} 3313e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 3323e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin/// Get the name of this register unit pressure set. 3333e59040810d0e6e04269ac8f781fa44df6088458Sergei Larinconst char *HexagonRegisterInfo::getRegPressureSetName(unsigned Idx) const { 3343e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin static const char *const RegPressureSetName[] = { 3353e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin "IntRegsRegSet", 3363e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin "CRRegsRegSet", 3373e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin "PredRegsRegSet", 3383e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin "DoubleRegsRegSet" 3393e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin }; 3403e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin assert((Idx < 4) && "Index out of bounds"); 3413e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin return RegPressureSetName[Idx]; 3423e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin} 3433e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 3443e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin/// Get the register unit pressure limit for this dimension. 3453e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin/// This limit must be adjusted dynamically for reserved registers. 3463e59040810d0e6e04269ac8f781fa44df6088458Sergei Larinunsigned HexagonRegisterInfo::getRegPressureSetLimit(unsigned Idx) const { 3473e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin static const int RegPressureLimit [] = { 16, 4, 2, 8 }; 3483e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin assert((Idx < 4) && "Index out of bounds"); 3493e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin return RegPressureLimit[Idx]; 3503e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin} 3513e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 3523e59040810d0e6e04269ac8f781fa44df6088458Sergei Larinconst int* 3533e59040810d0e6e04269ac8f781fa44df6088458Sergei LarinHexagonRegisterInfo::getRegClassPressureSets(const TargetRegisterClass *RC) 3543e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin const { 3553e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin static const int RCSetsTable[] = { 3563e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 0, -1, // IntRegs 3573e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 1, -1, // CRRegs 3583e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 2, -1, // PredRegs 3593e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 0, -1, // DoubleRegs 3603e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin -1 }; 3613e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin static const unsigned RCSetStartTable[] = { 0, 2, 4, 6, 0 }; 3623e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin unsigned SetListStart = RCSetStartTable[RC->getID()]; 3633e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin return &RCSetsTable[SetListStart]; 3643e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin} 365b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumunsigned HexagonRegisterInfo::getEHExceptionRegister() const { 366bc2198133a1836598b54b943420748e75d5dea94Craig Topper llvm_unreachable("What is the exception register"); 367b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 368b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 369b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumunsigned HexagonRegisterInfo::getEHHandlerRegister() const { 370bc2198133a1836598b54b943420748e75d5dea94Craig Topper llvm_unreachable("What is the exception handler register"); 371b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 372b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 373d239ff67f210094c205be7e57332948caecf6a24Tony Linthicum#define GET_REGINFO_TARGET_DESC 374b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "HexagonGenRegisterInfo.inc" 375