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