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" 1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#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" 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/MachineFrameInfo.h" 23b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/CodeGen/MachineFunction.h" 24f3fd7ee415ec8a6475a060e29959d04d6158f45fBenjamin Kramer#include "llvm/CodeGen/MachineFunctionPass.h" 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/MachineInstrBuilder.h" 26b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/CodeGen/MachineRegisterInfo.h" 2797e602b574b38d57384f0f877700357531a3d23eJyotsna Verma#include "llvm/CodeGen/PseudoSourceValue.h" 28b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/CodeGen/RegisterScavenging.h" 290b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h" 300b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Type.h" 31b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/MC/MachineLocation.h" 3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/CommandLine.h" 3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/ErrorHandling.h" 34b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/Target/TargetInstrInfo.h" 35b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/Target/TargetMachine.h" 36b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/Target/TargetOptions.h" 37b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 38b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumusing namespace llvm; 39b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 40b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 4154a56fad36a32f12709da5f96998336f08524be9Bill WendlingHexagonRegisterInfo::HexagonRegisterInfo(HexagonSubtarget &st) 42b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum : HexagonGenRegisterInfo(Hexagon::R31), 4354a56fad36a32f12709da5f96998336f08524be9Bill Wendling Subtarget(st) { 44b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 45b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesconst MCPhysReg * 47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesHexagonRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const { 48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines static const MCPhysReg CalleeSavedRegsV2[] = { 49015f228861ef9b337366f92f637d4e8d624bb006Craig Topper Hexagon::R24, Hexagon::R25, Hexagon::R26, Hexagon::R27, 0 50b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum }; 51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines static const MCPhysReg CalleeSavedRegsV3[] = { 52b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Hexagon::R16, Hexagon::R17, Hexagon::R18, Hexagon::R19, 53b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Hexagon::R20, Hexagon::R21, Hexagon::R22, Hexagon::R23, 54b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Hexagon::R24, Hexagon::R25, Hexagon::R26, Hexagon::R27, 0 55b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum }; 56b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 57b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum switch(Subtarget.getHexagonArchVersion()) { 5827baab62e7d6267d9b18e4665c6bb1b75dae10d4Benjamin Kramer case HexagonSubtarget::V1: 5927baab62e7d6267d9b18e4665c6bb1b75dae10d4Benjamin Kramer break; 60b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum case HexagonSubtarget::V2: 61b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum return CalleeSavedRegsV2; 62b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum case HexagonSubtarget::V3: 63b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum case HexagonSubtarget::V4: 647517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande case HexagonSubtarget::V5: 65b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum return CalleeSavedRegsV3; 66b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 6727baab62e7d6267d9b18e4665c6bb1b75dae10d4Benjamin Kramer llvm_unreachable("Callee saved registers requested for unknown architecture " 6827baab62e7d6267d9b18e4665c6bb1b75dae10d4Benjamin Kramer "version"); 69b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 70b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 71b4b54153ad760c69a00a08531abef4ed434a5092Tony LinthicumBitVector HexagonRegisterInfo::getReservedRegs(const MachineFunction &MF) 72b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum const { 73b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum BitVector Reserved(getNumRegs()); 74b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Reserved.set(HEXAGON_RESERVED_REG_1); 75b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Reserved.set(HEXAGON_RESERVED_REG_2); 76b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Reserved.set(Hexagon::R29); 77b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Reserved.set(Hexagon::R30); 78b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Reserved.set(Hexagon::R31); 79b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Reserved.set(Hexagon::D14); 80b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Reserved.set(Hexagon::D15); 81b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Reserved.set(Hexagon::LC0); 82b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Reserved.set(Hexagon::LC1); 83b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Reserved.set(Hexagon::SA0); 84b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Reserved.set(Hexagon::SA1); 85b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum return Reserved; 86b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 87b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 88b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 89b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumconst TargetRegisterClass* const* 90b4b54153ad760c69a00a08531abef4ed434a5092Tony LinthicumHexagonRegisterInfo::getCalleeSavedRegClasses(const MachineFunction *MF) const { 91b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum static const TargetRegisterClass * const CalleeSavedRegClassesV2[] = { 92b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum &Hexagon::IntRegsRegClass, &Hexagon::IntRegsRegClass, 93b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum &Hexagon::IntRegsRegClass, &Hexagon::IntRegsRegClass, 94b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum }; 95b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum static const TargetRegisterClass * const CalleeSavedRegClassesV3[] = { 96b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum &Hexagon::IntRegsRegClass, &Hexagon::IntRegsRegClass, 97b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum &Hexagon::IntRegsRegClass, &Hexagon::IntRegsRegClass, 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 }; 103b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 104b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum switch(Subtarget.getHexagonArchVersion()) { 10527baab62e7d6267d9b18e4665c6bb1b75dae10d4Benjamin Kramer case HexagonSubtarget::V1: 10627baab62e7d6267d9b18e4665c6bb1b75dae10d4Benjamin Kramer break; 107b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum case HexagonSubtarget::V2: 108b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum return CalleeSavedRegClassesV2; 109b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum case HexagonSubtarget::V3: 110b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum case HexagonSubtarget::V4: 1117517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande case HexagonSubtarget::V5: 112b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum return CalleeSavedRegClassesV3; 113b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 11427baab62e7d6267d9b18e4665c6bb1b75dae10d4Benjamin Kramer llvm_unreachable("Callee saved register classes requested for unknown " 11527baab62e7d6267d9b18e4665c6bb1b75dae10d4Benjamin Kramer "architecture version"); 116b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 117b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 118b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumvoid HexagonRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, 119108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier int SPAdj, unsigned FIOperandNum, 120108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier RegScavenger *RS) const { 121b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // 122b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // Hexagon_TODO: Do we need to enforce this for Hexagon? 123b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum assert(SPAdj == 0 && "Unexpected"); 124b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 125b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MachineInstr &MI = *II; 126108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier int FrameIndex = MI.getOperand(FIOperandNum).getIndex(); 127b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 128b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // Addressable stack objects are accessed using neg. offsets from %fp. 129b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MachineFunction &MF = *MI.getParent()->getParent(); 13054a56fad36a32f12709da5f96998336f08524be9Bill Wendling const HexagonInstrInfo &TII = 13154a56fad36a32f12709da5f96998336f08524be9Bill Wendling *static_cast<const HexagonInstrInfo*>(MF.getTarget().getInstrInfo()); 132b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex); 133b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MachineFrameInfo &MFI = *MF.getFrameInfo(); 134b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 135b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum unsigned FrameReg = getFrameRegister(MF); 136b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering(); 137b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum if (!TFI->hasFP(MF)) { 138b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // We will not reserve space on the stack for the lr and fp registers. 139b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum Offset -= 2 * Hexagon_WordSize; 140b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 141b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 142b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum const unsigned FrameSize = MFI.getStackSize(); 143b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 144b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum if (!MFI.hasVarSizedObjects() && 145b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum TII.isValidOffset(MI.getOpcode(), (FrameSize+Offset)) && 146b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum !TII.isSpillPredRegOp(&MI)) { 147b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // Replace frame index with a stack pointer reference. 148108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier MI.getOperand(FIOperandNum).ChangeToRegister(getStackRegister(), false, 149108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier false, true); 150108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier MI.getOperand(FIOperandNum + 1).ChangeToImmediate(FrameSize+Offset); 151b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } else { 152b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // Replace frame index with a frame pointer reference. 153b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum if (!TII.isValidOffset(MI.getOpcode(), Offset)) { 154b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 155b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // If the offset overflows, then correct it. 156b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // 157b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // For loads, we do not need a reserved register 158b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // r0 = memw(r30 + #10000) to: 159b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // 160b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // r0 = add(r30, #10000) 161b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // r0 = memw(r0) 162b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum if ( (MI.getOpcode() == Hexagon::LDriw) || 1637517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande (MI.getOpcode() == Hexagon::LDrid) || 1647517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande (MI.getOpcode() == Hexagon::LDrih) || 1657517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande (MI.getOpcode() == Hexagon::LDriuh) || 1667517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande (MI.getOpcode() == Hexagon::LDrib) || 1677517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande (MI.getOpcode() == Hexagon::LDriub) || 1687517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande (MI.getOpcode() == Hexagon::LDriw_f) || 1697517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande (MI.getOpcode() == Hexagon::LDrid_f)) { 170b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum unsigned dstReg = (MI.getOpcode() == Hexagon::LDrid) ? 1716c823822cdab902e8ecc52603f9c24a0e4b95d42Jakob Stoklund Olesen getSubReg(MI.getOperand(0).getReg(), Hexagon::subreg_loreg) : 172b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum MI.getOperand(0).getReg(); 173b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 174b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // Check if offset can fit in addi. 175b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum if (!TII.isValidOffset(Hexagon::ADD_ri, Offset)) { 176b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 177b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum TII.get(Hexagon::CONST32_Int_Real), dstReg).addImm(Offset); 178b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 179b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum TII.get(Hexagon::ADD_rr), 180b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum dstReg).addReg(FrameReg).addReg(dstReg); 181b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } else { 182b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 183b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum TII.get(Hexagon::ADD_ri), 184b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum dstReg).addReg(FrameReg).addImm(Offset); 185b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 186b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 187108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier MI.getOperand(FIOperandNum).ChangeToRegister(dstReg, false, false,true); 188108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier MI.getOperand(FIOperandNum+1).ChangeToImmediate(0); 1897517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande } else if ((MI.getOpcode() == Hexagon::STriw_indexed) || 1907517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande (MI.getOpcode() == Hexagon::STriw) || 191b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum (MI.getOpcode() == Hexagon::STrid) || 192b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum (MI.getOpcode() == Hexagon::STrih) || 1937517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande (MI.getOpcode() == Hexagon::STrib) || 1947517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande (MI.getOpcode() == Hexagon::STrid_f) || 1957517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande (MI.getOpcode() == Hexagon::STriw_f)) { 196b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // For stores, we need a reserved register. Change 197b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // memw(r30 + #10000) = r0 to: 198b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // 199b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // rs = add(r30, #10000); 200b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // memw(rs) = r0 201b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum unsigned resReg = HEXAGON_RESERVED_REG_1; 202b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 203b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // Check if offset can fit in addi. 204b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum if (!TII.isValidOffset(Hexagon::ADD_ri, Offset)) { 205b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 206b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum TII.get(Hexagon::CONST32_Int_Real), resReg).addImm(Offset); 207b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 208b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum TII.get(Hexagon::ADD_rr), 209b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum resReg).addReg(FrameReg).addReg(resReg); 210b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } else { 211b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 212b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum TII.get(Hexagon::ADD_ri), 213b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum resReg).addReg(FrameReg).addImm(Offset); 214b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 215108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier MI.getOperand(FIOperandNum).ChangeToRegister(resReg, false, false,true); 216108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier MI.getOperand(FIOperandNum+1).ChangeToImmediate(0); 217b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } else if (TII.isMemOp(&MI)) { 21897e602b574b38d57384f0f877700357531a3d23eJyotsna Verma // use the constant extender if the instruction provides it 21997e602b574b38d57384f0f877700357531a3d23eJyotsna Verma // and we are V4TOps. 22097e602b574b38d57384f0f877700357531a3d23eJyotsna Verma if (Subtarget.hasV4TOps()) { 22197e602b574b38d57384f0f877700357531a3d23eJyotsna Verma if (TII.isConstExtended(&MI)) { 22297e602b574b38d57384f0f877700357531a3d23eJyotsna Verma MI.getOperand(FIOperandNum).ChangeToRegister(FrameReg, false); 22397e602b574b38d57384f0f877700357531a3d23eJyotsna Verma MI.getOperand(FIOperandNum+1).ChangeToImmediate(Offset); 22497e602b574b38d57384f0f877700357531a3d23eJyotsna Verma TII.immediateExtend(&MI); 22597e602b574b38d57384f0f877700357531a3d23eJyotsna Verma } else { 22697e602b574b38d57384f0f877700357531a3d23eJyotsna Verma llvm_unreachable("Need to implement for memops"); 22797e602b574b38d57384f0f877700357531a3d23eJyotsna Verma } 228b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } else { 22997e602b574b38d57384f0f877700357531a3d23eJyotsna Verma // Only V3 and older instructions here. 23097e602b574b38d57384f0f877700357531a3d23eJyotsna Verma unsigned ResReg = HEXAGON_RESERVED_REG_1; 23197e602b574b38d57384f0f877700357531a3d23eJyotsna Verma if (!MFI.hasVarSizedObjects() && 23297e602b574b38d57384f0f877700357531a3d23eJyotsna Verma TII.isValidOffset(MI.getOpcode(), (FrameSize+Offset))) { 23397e602b574b38d57384f0f877700357531a3d23eJyotsna Verma MI.getOperand(FIOperandNum).ChangeToRegister(getStackRegister(), 23497e602b574b38d57384f0f877700357531a3d23eJyotsna Verma false, false, false); 23597e602b574b38d57384f0f877700357531a3d23eJyotsna Verma MI.getOperand(FIOperandNum+1).ChangeToImmediate(FrameSize+Offset); 23697e602b574b38d57384f0f877700357531a3d23eJyotsna Verma } else if (!TII.isValidOffset(Hexagon::ADD_ri, Offset)) { 23797e602b574b38d57384f0f877700357531a3d23eJyotsna Verma BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 23897e602b574b38d57384f0f877700357531a3d23eJyotsna Verma TII.get(Hexagon::CONST32_Int_Real), ResReg).addImm(Offset); 23997e602b574b38d57384f0f877700357531a3d23eJyotsna Verma BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 24097e602b574b38d57384f0f877700357531a3d23eJyotsna Verma TII.get(Hexagon::ADD_rr), ResReg).addReg(FrameReg). 24197e602b574b38d57384f0f877700357531a3d23eJyotsna Verma addReg(ResReg); 24297e602b574b38d57384f0f877700357531a3d23eJyotsna Verma MI.getOperand(FIOperandNum).ChangeToRegister(ResReg, false, false, 24397e602b574b38d57384f0f877700357531a3d23eJyotsna Verma true); 24497e602b574b38d57384f0f877700357531a3d23eJyotsna Verma MI.getOperand(FIOperandNum+1).ChangeToImmediate(0); 24597e602b574b38d57384f0f877700357531a3d23eJyotsna Verma } else { 24697e602b574b38d57384f0f877700357531a3d23eJyotsna Verma BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 24797e602b574b38d57384f0f877700357531a3d23eJyotsna Verma TII.get(Hexagon::ADD_ri), ResReg).addReg(FrameReg). 24897e602b574b38d57384f0f877700357531a3d23eJyotsna Verma addImm(Offset); 24997e602b574b38d57384f0f877700357531a3d23eJyotsna Verma MI.getOperand(FIOperandNum).ChangeToRegister(ResReg, false, false, 25097e602b574b38d57384f0f877700357531a3d23eJyotsna Verma true); 25197e602b574b38d57384f0f877700357531a3d23eJyotsna Verma MI.getOperand(FIOperandNum+1).ChangeToImmediate(0); 25297e602b574b38d57384f0f877700357531a3d23eJyotsna Verma } 253b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 254b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } else { 255b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum unsigned dstReg = MI.getOperand(0).getReg(); 256b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 257b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum TII.get(Hexagon::CONST32_Int_Real), dstReg).addImm(Offset); 258b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum BuildMI(*MI.getParent(), II, MI.getDebugLoc(), 259b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum TII.get(Hexagon::ADD_rr), 260b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum dstReg).addReg(FrameReg).addReg(dstReg); 261b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // Can we delete MI??? r2 = add (r2, #0). 262108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier MI.getOperand(FIOperandNum).ChangeToRegister(dstReg, false, false,true); 263108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier MI.getOperand(FIOperandNum+1).ChangeToImmediate(0); 264b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 265b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } else { 266b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // If the offset is small enough to fit in the immediate field, directly 267b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // encode it. 268108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier MI.getOperand(FIOperandNum).ChangeToRegister(FrameReg, false); 269108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier MI.getOperand(FIOperandNum+1).ChangeToImmediate(Offset); 270b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 271b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 272b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 273b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 274b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 275b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumunsigned HexagonRegisterInfo::getRARegister() const { 276b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum return Hexagon::R31; 277b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 278b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 279b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumunsigned HexagonRegisterInfo::getFrameRegister(const MachineFunction 280b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum &MF) const { 281b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering(); 282b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum if (TFI->hasFP(MF)) { 283b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum return Hexagon::R30; 284b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 285b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 286b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum return Hexagon::R29; 287b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 288b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 289b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumunsigned HexagonRegisterInfo::getFrameRegister() const { 290b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum return Hexagon::R30; 291b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 292b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 293b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumunsigned HexagonRegisterInfo::getStackRegister() const { 294b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum return Hexagon::R29; 295b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 296b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 297d239ff67f210094c205be7e57332948caecf6a24Tony Linthicum#define GET_REGINFO_TARGET_DESC 298b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "HexagonGenRegisterInfo.inc" 299