131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- ARMBaseInstrInfo.h - ARM Base Instruction Information ---*- C++ -*-===// 2334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin// 3334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin// The LLVM Compiler Infrastructure 4334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin// 5334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin// This file is distributed under the University of Illinois Open Source 6334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin// License. See LICENSE.TXT for details. 7334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin// 8334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin//===----------------------------------------------------------------------===// 9334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin// 10334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin// This file contains the Base ARM implementation of the TargetInstrInfo class. 11334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin// 12334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin//===----------------------------------------------------------------------===// 13334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin 14334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin#ifndef ARMBASEINSTRUCTIONINFO_H 15334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin#define ARMBASEINSTRUCTIONINFO_H 16334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin 17334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin#include "ARM.h" 1848575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng#include "llvm/ADT/DenseMap.h" 1948575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng#include "llvm/ADT/SmallSet.h" 20a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/CodeGen/MachineInstrBuilder.h" 21a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/Target/TargetInstrInfo.h" 22334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin 234db3cffe94a5285239cc0056f939c6b74a5ca0b6Evan Cheng#define GET_INSTRINFO_HEADER 244db3cffe94a5285239cc0056f939c6b74a5ca0b6Evan Cheng#include "ARMGenInstrInfo.inc" 254db3cffe94a5285239cc0056f939c6b74a5ca0b6Evan Cheng 26334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwinnamespace llvm { 274dbbe3433f7339ed277af55037ff6847f484e5abChris Lattner class ARMSubtarget; 284dbbe3433f7339ed277af55037ff6847f484e5abChris Lattner class ARMBaseRegisterInfo; 29334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin 304db3cffe94a5285239cc0056f939c6b74a5ca0b6Evan Chengclass ARMBaseInstrInfo : public ARMGenInstrInfo { 314dbbe3433f7339ed277af55037ff6847f484e5abChris Lattner const ARMSubtarget &Subtarget; 3248575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng 33334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwinprotected: 34334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin // Can be only subclassed. 35f95215f551949d5e5adfbf4753aa833b9009b77aAnton Korobeynikov explicit ARMBaseInstrInfo(const ARMSubtarget &STI); 3648575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng 37334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwinpublic: 38c01810eeb7227010f73cb39e3c4fa0197a3c4ef0Jim Grosbach // Return whether the target has an explicit NOP encoding. 39c01810eeb7227010f73cb39e3c4fa0197a3c4ef0Jim Grosbach bool hasNOP() const; 40c01810eeb7227010f73cb39e3c4fa0197a3c4ef0Jim Grosbach 41334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin // Return the non-pre/post incrementing version of 'Opc'. Return 0 42334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin // if there is not such an opcode. 43334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin virtual unsigned getUnindexedOpcode(unsigned Opc) const =0; 44334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin 45334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin virtual MachineInstr *convertToThreeAddress(MachineFunction::iterator &MFI, 46334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin MachineBasicBlock::iterator &MBBI, 47334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin LiveVariables *LV) const; 48334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin 4957148c166ab232191098492633c924fad9c44ef3Bill Wendling virtual const ARMBaseRegisterInfo &getRegisterInfo() const = 0; 50f95215f551949d5e5adfbf4753aa833b9009b77aAnton Korobeynikov const ARMSubtarget &getSubtarget() const { return Subtarget; } 51334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin 5248575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng ScheduleHazardRecognizer * 532da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick CreateTargetHazardRecognizer(const TargetMachine *TM, 542da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick const ScheduleDAG *DAG) const; 552da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick 562da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick ScheduleHazardRecognizer * 572da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick CreateTargetPostRAHazardRecognizer(const InstrItineraryData *II, 582da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick const ScheduleDAG *DAG) const; 5948575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng 60334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin // Branch analysis. 61334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin virtual bool AnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, 62334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin MachineBasicBlock *&FBB, 63334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin SmallVectorImpl<MachineOperand> &Cond, 642062875a7d8f7dd94a20d9e3a298e9e216efb4b5Chris Lattner bool AllowModify = false) const; 65334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin virtual unsigned RemoveBranch(MachineBasicBlock &MBB) const; 66334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin virtual unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, 67334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin MachineBasicBlock *FBB, 683bf912593301152b65accb9d9c37a95172f1df5aStuart Hastings const SmallVectorImpl<MachineOperand> &Cond, 693bf912593301152b65accb9d9c37a95172f1df5aStuart Hastings DebugLoc DL) const; 70334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin 71334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin virtual 72334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const; 73334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin 74334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin // Predication support. 75ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng bool isPredicated(const MachineInstr *MI) const; 76334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin 77334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin ARMCC::CondCodes getPredicate(const MachineInstr *MI) const { 78334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin int PIdx = MI->findFirstPredOperandIdx(); 79334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin return PIdx != -1 ? (ARMCC::CondCodes)MI->getOperand(PIdx).getImm() 80334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin : ARMCC::AL; 81334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin } 82334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin 83334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin virtual 84334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin bool PredicateInstruction(MachineInstr *MI, 85334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin const SmallVectorImpl<MachineOperand> &Pred) const; 86334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin 87334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin virtual 88334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin bool SubsumesPredicate(const SmallVectorImpl<MachineOperand> &Pred1, 89334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin const SmallVectorImpl<MachineOperand> &Pred2) const; 90334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin 91334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin virtual bool DefinesPredicate(MachineInstr *MI, 92334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin std::vector<MachineOperand> &Pred) const; 93334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin 94ac0869dc8a7986855c5557cc67d4709600158ef5Evan Cheng virtual bool isPredicable(MachineInstr *MI) const; 95ac0869dc8a7986855c5557cc67d4709600158ef5Evan Cheng 96334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin /// GetInstSize - Returns the size of the specified MachineInstr. 97334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin /// 98334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin virtual unsigned GetInstSizeInBytes(const MachineInstr* MI) const; 99334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin 100334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin virtual unsigned isLoadFromStackSlot(const MachineInstr *MI, 101334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin int &FrameIndex) const; 102334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin virtual unsigned isStoreToStackSlot(const MachineInstr *MI, 103334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin int &FrameIndex) const; 10436ee0e640554b8cc6ad1658fc3049e05d9967160Jakob Stoklund Olesen virtual unsigned isLoadFromStackSlotPostFE(const MachineInstr *MI, 10536ee0e640554b8cc6ad1658fc3049e05d9967160Jakob Stoklund Olesen int &FrameIndex) const; 10636ee0e640554b8cc6ad1658fc3049e05d9967160Jakob Stoklund Olesen virtual unsigned isStoreToStackSlotPostFE(const MachineInstr *MI, 10736ee0e640554b8cc6ad1658fc3049e05d9967160Jakob Stoklund Olesen int &FrameIndex) const; 108334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin 109ac2736670034e8942939b9fccf8e4618a0bda908Jakob Stoklund Olesen virtual void copyPhysReg(MachineBasicBlock &MBB, 110ac2736670034e8942939b9fccf8e4618a0bda908Jakob Stoklund Olesen MachineBasicBlock::iterator I, DebugLoc DL, 111ac2736670034e8942939b9fccf8e4618a0bda908Jakob Stoklund Olesen unsigned DestReg, unsigned SrcReg, 112ac2736670034e8942939b9fccf8e4618a0bda908Jakob Stoklund Olesen bool KillSrc) const; 1135732ca084aaa0cd26149e50dd4b487efff37fe41Evan Cheng 114334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin virtual void storeRegToStackSlot(MachineBasicBlock &MBB, 115334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin MachineBasicBlock::iterator MBBI, 116334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin unsigned SrcReg, bool isKill, int FrameIndex, 117746ad69e088176819981b4b2c5ac8dcd49f5e60eEvan Cheng const TargetRegisterClass *RC, 118746ad69e088176819981b4b2c5ac8dcd49f5e60eEvan Cheng const TargetRegisterInfo *TRI) const; 119334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin 120334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin virtual void loadRegFromStackSlot(MachineBasicBlock &MBB, 121334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin MachineBasicBlock::iterator MBBI, 122334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin unsigned DestReg, int FrameIndex, 123746ad69e088176819981b4b2c5ac8dcd49f5e60eEvan Cheng const TargetRegisterClass *RC, 124746ad69e088176819981b4b2c5ac8dcd49f5e60eEvan Cheng const TargetRegisterInfo *TRI) const; 125334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin 126142bd1a54e93f3f66d420717ecba53539a556035Jakob Stoklund Olesen virtual bool expandPostRAPseudo(MachineBasicBlock::iterator MI) const; 127142bd1a54e93f3f66d420717ecba53539a556035Jakob Stoklund Olesen 128fdc834046efd427d474e3b899ec69354c05071e0Evan Cheng virtual void reMaterialize(MachineBasicBlock &MBB, 129fdc834046efd427d474e3b899ec69354c05071e0Evan Cheng MachineBasicBlock::iterator MI, 130fdc834046efd427d474e3b899ec69354c05071e0Evan Cheng unsigned DestReg, unsigned SubIdx, 131d57cdd5683ea926e489067364fb7ffe5fd5d35eeEvan Cheng const MachineInstr *Orig, 1329edf7deb37f0f97664f279040fa15d89f32e23d9Jakob Stoklund Olesen const TargetRegisterInfo &TRI) const; 133fdc834046efd427d474e3b899ec69354c05071e0Evan Cheng 13430ac0467ced4627a9b84d8a1d3ca5e8706ddad63Jakob Stoklund Olesen MachineInstr *duplicate(MachineInstr *Orig, MachineFunction &MF) const; 13530ac0467ced4627a9b84d8a1d3ca5e8706ddad63Jakob Stoklund Olesen 136c5041cac7d3aeaa7350abadf2a7ada92e8da27dcJakob Stoklund Olesen MachineInstr *commuteInstruction(MachineInstr*, bool=false) const; 137c5041cac7d3aeaa7350abadf2a7ada92e8da27dcJakob Stoklund Olesen 1384cc1407b84dc6dbbc0d62b1d1b8db7c0ddec86ccTim Northover const MachineInstrBuilder &AddDReg(MachineInstrBuilder &MIB, unsigned Reg, 1394cc1407b84dc6dbbc0d62b1d1b8db7c0ddec86ccTim Northover unsigned SubIdx, unsigned State, 1404cc1407b84dc6dbbc0d62b1d1b8db7c0ddec86ccTim Northover const TargetRegisterInfo *TRI) const; 1414cc1407b84dc6dbbc0d62b1d1b8db7c0ddec86ccTim Northover 142506049f29f4f202a8e45feb916cc0264440a7f6dEvan Cheng virtual bool produceSameValue(const MachineInstr *MI0, 1439fe2009956fc40f3aea46fb3c38dcfb61c4aca46Evan Cheng const MachineInstr *MI1, 1449fe2009956fc40f3aea46fb3c38dcfb61c4aca46Evan Cheng const MachineRegisterInfo *MRI) const; 14586050dc8cc0aaea8c9dfeb89de02cafbd7f48d92Evan Cheng 1464b722108e2cf8e77157e0879a23789cd44829933Bill Wendling /// areLoadsFromSameBasePtr - This is used by the pre-regalloc scheduler to 1474b722108e2cf8e77157e0879a23789cd44829933Bill Wendling /// determine if two loads are loading from the same base address. It should 1484b722108e2cf8e77157e0879a23789cd44829933Bill Wendling /// only return true if the base pointers are the same and the only 1494b722108e2cf8e77157e0879a23789cd44829933Bill Wendling /// differences between the two addresses is the offset. It also returns the 1504b722108e2cf8e77157e0879a23789cd44829933Bill Wendling /// offsets by reference. 1514b722108e2cf8e77157e0879a23789cd44829933Bill Wendling virtual bool areLoadsFromSameBasePtr(SDNode *Load1, SDNode *Load2, 1524b722108e2cf8e77157e0879a23789cd44829933Bill Wendling int64_t &Offset1, int64_t &Offset2)const; 1534b722108e2cf8e77157e0879a23789cd44829933Bill Wendling 1544b722108e2cf8e77157e0879a23789cd44829933Bill Wendling /// shouldScheduleLoadsNear - This is a used by the pre-regalloc scheduler to 155f921c0fe3418f96bd1e37beb582a368d3ac24295Jim Grosbach /// determine (in conjunction with areLoadsFromSameBasePtr) if two loads 156f921c0fe3418f96bd1e37beb582a368d3ac24295Jim Grosbach /// should be scheduled togther. On some targets if two loads are loading from 1574b722108e2cf8e77157e0879a23789cd44829933Bill Wendling /// addresses in the same cache line, it's better if they are scheduled 1584b722108e2cf8e77157e0879a23789cd44829933Bill Wendling /// together. This function takes two integers that represent the load offsets 1594b722108e2cf8e77157e0879a23789cd44829933Bill Wendling /// from the common base address. It returns true if it decides it's desirable 1604b722108e2cf8e77157e0879a23789cd44829933Bill Wendling /// to schedule the two loads together. "NumLoads" is the number of loads that 1614b722108e2cf8e77157e0879a23789cd44829933Bill Wendling /// have already been scheduled after Load1. 1624b722108e2cf8e77157e0879a23789cd44829933Bill Wendling virtual bool shouldScheduleLoadsNear(SDNode *Load1, SDNode *Load2, 1634b722108e2cf8e77157e0879a23789cd44829933Bill Wendling int64_t Offset1, int64_t Offset2, 1644b722108e2cf8e77157e0879a23789cd44829933Bill Wendling unsigned NumLoads) const; 1654b722108e2cf8e77157e0879a23789cd44829933Bill Wendling 16686050dc8cc0aaea8c9dfeb89de02cafbd7f48d92Evan Cheng virtual bool isSchedulingBoundary(const MachineInstr *MI, 16786050dc8cc0aaea8c9dfeb89de02cafbd7f48d92Evan Cheng const MachineBasicBlock *MBB, 16886050dc8cc0aaea8c9dfeb89de02cafbd7f48d92Evan Cheng const MachineFunction &MF) const; 16913151432edace19ee867a93b5c14573df4f75d24Evan Cheng 17013151432edace19ee867a93b5c14573df4f75d24Evan Cheng virtual bool isProfitableToIfCvt(MachineBasicBlock &MBB, 1715876db7a66fcc4ec4444a9f3e387c1cdc8baf9e5Cameron Zwarich unsigned NumCycles, unsigned ExtraPredCycles, 172f81b7f6069b27c0a515070dcb392f6828437412fJakub Staszak const BranchProbability &Probability) const; 17313151432edace19ee867a93b5c14573df4f75d24Evan Cheng 1748239daf7c83a65a189c352cce3191cdc3bbfe151Evan Cheng virtual bool isProfitableToIfCvt(MachineBasicBlock &TMBB, 1758239daf7c83a65a189c352cce3191cdc3bbfe151Evan Cheng unsigned NumT, unsigned ExtraT, 1768239daf7c83a65a189c352cce3191cdc3bbfe151Evan Cheng MachineBasicBlock &FMBB, 1778239daf7c83a65a189c352cce3191cdc3bbfe151Evan Cheng unsigned NumF, unsigned ExtraF, 178f81b7f6069b27c0a515070dcb392f6828437412fJakub Staszak const BranchProbability &Probability) const; 17913151432edace19ee867a93b5c14573df4f75d24Evan Cheng 18013151432edace19ee867a93b5c14573df4f75d24Evan Cheng virtual bool isProfitableToDupForIfCvt(MachineBasicBlock &MBB, 1815876db7a66fcc4ec4444a9f3e387c1cdc8baf9e5Cameron Zwarich unsigned NumCycles, 182f81b7f6069b27c0a515070dcb392f6828437412fJakub Staszak const BranchProbability 183154418cdd82b3d8dcf23efd65f5647833e43bc45Bob Wilson &Probability) const { 1845876db7a66fcc4ec4444a9f3e387c1cdc8baf9e5Cameron Zwarich return NumCycles == 1; 18513151432edace19ee867a93b5c14573df4f75d24Evan Cheng } 186e4ddbdfd3cf031034020671d03626f0373fbd5caBill Wendling 187eb1641d54a7eda7717304bc4d55d059208d8ebedBob Wilson virtual bool isProfitableToUnpredicate(MachineBasicBlock &TMBB, 188eb1641d54a7eda7717304bc4d55d059208d8ebedBob Wilson MachineBasicBlock &FMBB) const; 189eb1641d54a7eda7717304bc4d55d059208d8ebedBob Wilson 190de7266c611b37ec050efb53b73166081a98cea13Manman Ren /// analyzeCompare - For a comparison instruction, return the source registers 191de7266c611b37ec050efb53b73166081a98cea13Manman Ren /// in SrcReg and SrcReg2 if having two register operands, and the value it 192de7266c611b37ec050efb53b73166081a98cea13Manman Ren /// compares against in CmpValue. Return true if the comparison instruction 193de7266c611b37ec050efb53b73166081a98cea13Manman Ren /// can be analyzed. 194de7266c611b37ec050efb53b73166081a98cea13Manman Ren virtual bool analyzeCompare(const MachineInstr *MI, unsigned &SrcReg, 195de7266c611b37ec050efb53b73166081a98cea13Manman Ren unsigned &SrcReg2, int &CmpMask, 196de7266c611b37ec050efb53b73166081a98cea13Manman Ren int &CmpValue) const; 197de7266c611b37ec050efb53b73166081a98cea13Manman Ren 198de7266c611b37ec050efb53b73166081a98cea13Manman Ren /// optimizeCompareInstr - Convert the instruction to set the zero flag so 199de7266c611b37ec050efb53b73166081a98cea13Manman Ren /// that we can remove a "comparison with zero"; Remove a redundant CMP 200de7266c611b37ec050efb53b73166081a98cea13Manman Ren /// instruction if the flags can be updated in the same way by an earlier 201de7266c611b37ec050efb53b73166081a98cea13Manman Ren /// instruction such as SUB. 202de7266c611b37ec050efb53b73166081a98cea13Manman Ren virtual bool optimizeCompareInstr(MachineInstr *CmpInstr, unsigned SrcReg, 203de7266c611b37ec050efb53b73166081a98cea13Manman Ren unsigned SrcReg2, int CmpMask, int CmpValue, 204eb96a2f6c03c0ec97c56a3493ac38024afacc774Evan Cheng const MachineRegisterInfo *MRI) const; 2055f54ce347368105260be2cec497b6a4199dc5789Evan Cheng 206053b5b0b3c34d4763511b6dcd8e0150f8e9dd083Jakob Stoklund Olesen virtual bool analyzeSelect(const MachineInstr *MI, 207053b5b0b3c34d4763511b6dcd8e0150f8e9dd083Jakob Stoklund Olesen SmallVectorImpl<MachineOperand> &Cond, 208053b5b0b3c34d4763511b6dcd8e0150f8e9dd083Jakob Stoklund Olesen unsigned &TrueOp, unsigned &FalseOp, 209053b5b0b3c34d4763511b6dcd8e0150f8e9dd083Jakob Stoklund Olesen bool &Optimizable) const; 210053b5b0b3c34d4763511b6dcd8e0150f8e9dd083Jakob Stoklund Olesen 211053b5b0b3c34d4763511b6dcd8e0150f8e9dd083Jakob Stoklund Olesen virtual MachineInstr *optimizeSelect(MachineInstr *MI, bool) const; 212053b5b0b3c34d4763511b6dcd8e0150f8e9dd083Jakob Stoklund Olesen 213c4af4638dfdab0dc3b6257276cfad2ee45053060Evan Cheng /// FoldImmediate - 'Reg' is known to be defined by a move immediate 214c4af4638dfdab0dc3b6257276cfad2ee45053060Evan Cheng /// instruction, try to fold the immediate into the use instruction. 215c4af4638dfdab0dc3b6257276cfad2ee45053060Evan Cheng virtual bool FoldImmediate(MachineInstr *UseMI, MachineInstr *DefMI, 216c4af4638dfdab0dc3b6257276cfad2ee45053060Evan Cheng unsigned Reg, MachineRegisterInfo *MRI) const; 217c4af4638dfdab0dc3b6257276cfad2ee45053060Evan Cheng 2188239daf7c83a65a189c352cce3191cdc3bbfe151Evan Cheng virtual unsigned getNumMicroOps(const InstrItineraryData *ItinData, 2198239daf7c83a65a189c352cce3191cdc3bbfe151Evan Cheng const MachineInstr *MI) const; 220a0792de66c8364d47b0a688c7f408efb7b10f31bEvan Cheng 221a0792de66c8364d47b0a688c7f408efb7b10f31bEvan Cheng virtual 222a0792de66c8364d47b0a688c7f408efb7b10f31bEvan Cheng int getOperandLatency(const InstrItineraryData *ItinData, 223a0792de66c8364d47b0a688c7f408efb7b10f31bEvan Cheng const MachineInstr *DefMI, unsigned DefIdx, 224a0792de66c8364d47b0a688c7f408efb7b10f31bEvan Cheng const MachineInstr *UseMI, unsigned UseIdx) const; 225a0792de66c8364d47b0a688c7f408efb7b10f31bEvan Cheng virtual 226a0792de66c8364d47b0a688c7f408efb7b10f31bEvan Cheng int getOperandLatency(const InstrItineraryData *ItinData, 227a0792de66c8364d47b0a688c7f408efb7b10f31bEvan Cheng SDNode *DefNode, unsigned DefIdx, 228a0792de66c8364d47b0a688c7f408efb7b10f31bEvan Cheng SDNode *UseNode, unsigned UseIdx) const; 22913fd601e0f1c6d8558c4c2b027dacd148f19e6afJakob Stoklund Olesen 23013fd601e0f1c6d8558c4c2b027dacd148f19e6afJakob Stoklund Olesen /// VFP/NEON execution domains. 23113fd601e0f1c6d8558c4c2b027dacd148f19e6afJakob Stoklund Olesen std::pair<uint16_t, uint16_t> 23213fd601e0f1c6d8558c4c2b027dacd148f19e6afJakob Stoklund Olesen getExecutionDomain(const MachineInstr *MI) const; 23313fd601e0f1c6d8558c4c2b027dacd148f19e6afJakob Stoklund Olesen void setExecutionDomain(MachineInstr *MI, unsigned Domain) const; 23413fd601e0f1c6d8558c4c2b027dacd148f19e6afJakob Stoklund Olesen 235eb1641d54a7eda7717304bc4d55d059208d8ebedBob Wilson unsigned getPartialRegUpdateClearance(const MachineInstr*, unsigned, 236eb1641d54a7eda7717304bc4d55d059208d8ebedBob Wilson const TargetRegisterInfo*) const; 237eb1641d54a7eda7717304bc4d55d059208d8ebedBob Wilson void breakPartialRegDependency(MachineBasicBlock::iterator, unsigned, 238eb1641d54a7eda7717304bc4d55d059208d8ebedBob Wilson const TargetRegisterInfo *TRI) const; 2399eed53379f19f836769a0c4a14042eeb1b587769Andrew Trick /// Get the number of addresses by LDM or VLDM or zero for unknown. 2409eed53379f19f836769a0c4a14042eeb1b587769Andrew Trick unsigned getNumLDMAddresses(const MachineInstr *MI) const; 2419eed53379f19f836769a0c4a14042eeb1b587769Andrew Trick 242a0792de66c8364d47b0a688c7f408efb7b10f31bEvan Chengprivate: 243ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng unsigned getInstBundleLength(const MachineInstr *MI) const; 244ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 245344d9db97062736cd66da6c07baa9108b6cfa419Evan Cheng int getVLDMDefCycle(const InstrItineraryData *ItinData, 246e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &DefMCID, 247344d9db97062736cd66da6c07baa9108b6cfa419Evan Cheng unsigned DefClass, 248344d9db97062736cd66da6c07baa9108b6cfa419Evan Cheng unsigned DefIdx, unsigned DefAlign) const; 249344d9db97062736cd66da6c07baa9108b6cfa419Evan Cheng int getLDMDefCycle(const InstrItineraryData *ItinData, 250e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &DefMCID, 251344d9db97062736cd66da6c07baa9108b6cfa419Evan Cheng unsigned DefClass, 252344d9db97062736cd66da6c07baa9108b6cfa419Evan Cheng unsigned DefIdx, unsigned DefAlign) const; 253344d9db97062736cd66da6c07baa9108b6cfa419Evan Cheng int getVSTMUseCycle(const InstrItineraryData *ItinData, 254e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &UseMCID, 255344d9db97062736cd66da6c07baa9108b6cfa419Evan Cheng unsigned UseClass, 256344d9db97062736cd66da6c07baa9108b6cfa419Evan Cheng unsigned UseIdx, unsigned UseAlign) const; 257344d9db97062736cd66da6c07baa9108b6cfa419Evan Cheng int getSTMUseCycle(const InstrItineraryData *ItinData, 258e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &UseMCID, 259344d9db97062736cd66da6c07baa9108b6cfa419Evan Cheng unsigned UseClass, 260344d9db97062736cd66da6c07baa9108b6cfa419Evan Cheng unsigned UseIdx, unsigned UseAlign) const; 261a0792de66c8364d47b0a688c7f408efb7b10f31bEvan Cheng int getOperandLatency(const InstrItineraryData *ItinData, 262e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &DefMCID, 263a0792de66c8364d47b0a688c7f408efb7b10f31bEvan Cheng unsigned DefIdx, unsigned DefAlign, 264e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &UseMCID, 265a0792de66c8364d47b0a688c7f408efb7b10f31bEvan Cheng unsigned UseIdx, unsigned UseAlign) const; 2662312842de0c641107dd04d7e056d02491cc781caEvan Cheng 267b7e0289fb320c8440ba5eed121a8b932dbd806a2Andrew Trick unsigned getInstrLatency(const InstrItineraryData *ItinData, 268b7e0289fb320c8440ba5eed121a8b932dbd806a2Andrew Trick const MachineInstr *MI, 269b7e0289fb320c8440ba5eed121a8b932dbd806a2Andrew Trick unsigned *PredCost = 0) const; 2708239daf7c83a65a189c352cce3191cdc3bbfe151Evan Cheng 2718239daf7c83a65a189c352cce3191cdc3bbfe151Evan Cheng int getInstrLatency(const InstrItineraryData *ItinData, 2728239daf7c83a65a189c352cce3191cdc3bbfe151Evan Cheng SDNode *Node) const; 2738239daf7c83a65a189c352cce3191cdc3bbfe151Evan Cheng 2742312842de0c641107dd04d7e056d02491cc781caEvan Cheng bool hasHighOperandLatency(const InstrItineraryData *ItinData, 2752312842de0c641107dd04d7e056d02491cc781caEvan Cheng const MachineRegisterInfo *MRI, 2762312842de0c641107dd04d7e056d02491cc781caEvan Cheng const MachineInstr *DefMI, unsigned DefIdx, 2772312842de0c641107dd04d7e056d02491cc781caEvan Cheng const MachineInstr *UseMI, unsigned UseIdx) const; 278c8141dfc7f983cb04e65d8acd6bcbdc8e4b8a0aeEvan Cheng bool hasLowDefLatency(const InstrItineraryData *ItinData, 279c8141dfc7f983cb04e65d8acd6bcbdc8e4b8a0aeEvan Cheng const MachineInstr *DefMI, unsigned DefIdx) const; 28048575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng 2813be654f8082dcbdff011a6716a7c90486e28fc9eAndrew Trick /// verifyInstruction - Perform target specific instruction verification. 2823be654f8082dcbdff011a6716a7c90486e28fc9eAndrew Trick bool verifyInstruction(const MachineInstr *MI, StringRef &ErrInfo) const; 2833be654f8082dcbdff011a6716a7c90486e28fc9eAndrew Trick 28448575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Chengprivate: 28548575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng /// Modeling special VFP / NEON fp MLA / MLS hazards. 28648575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng 28748575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng /// MLxEntryMap - Map fp MLA / MLS to the corresponding entry in the internal 28848575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng /// MLx table. 28948575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng DenseMap<unsigned, unsigned> MLxEntryMap; 29048575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng 29148575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng /// MLxHazardOpcodes - Set of add / sub and multiply opcodes that would cause 29248575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng /// stalls when scheduled together with fp MLA / MLS opcodes. 29348575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng SmallSet<unsigned, 16> MLxHazardOpcodes; 29448575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng 29548575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Chengpublic: 29648575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng /// isFpMLxInstruction - Return true if the specified opcode is a fp MLA / MLS 29748575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng /// instruction. 29848575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng bool isFpMLxInstruction(unsigned Opcode) const { 29948575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng return MLxEntryMap.count(Opcode); 30048575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng } 30148575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng 30248575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng /// isFpMLxInstruction - This version also returns the multiply opcode and the 30348575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng /// addition / subtraction opcode to expand to. Return true for 'HasLane' for 30448575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng /// the MLX instructions with an extra lane operand. 30548575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng bool isFpMLxInstruction(unsigned Opcode, unsigned &MulOpc, 30648575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng unsigned &AddSubOpc, bool &NegAcc, 30748575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng bool &HasLane) const; 30848575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng 30948575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng /// canCauseFpMLxStall - Return true if an instruction of the specified opcode 31048575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng /// will cause stalls when scheduled after (within 4-cycle window) a fp 31148575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng /// MLA / MLS instruction. 31248575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng bool canCauseFpMLxStall(unsigned Opcode) const { 31348575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng return MLxHazardOpcodes.count(Opcode); 31448575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng } 31508da4865576056f997a9c8013240d716018f7edfArnold Schwaighofer 31608da4865576056f997a9c8013240d716018f7edfArnold Schwaighofer /// Returns true if the instruction has a shift by immediate that can be 31708da4865576056f997a9c8013240d716018f7edfArnold Schwaighofer /// executed in one cycle less. 31808da4865576056f997a9c8013240d716018f7edfArnold Schwaighofer bool isSwiftFastImmShift(const MachineInstr *MI) const; 3196495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng}; 3205ca53a7ad821613d324e4189ddbb0d468a326146Evan Cheng 3216495f63945e8dbde81f03a1dc2ab421993b9a495Evan Chengstatic inline 3226495f63945e8dbde81f03a1dc2ab421993b9a495Evan Chengconst MachineInstrBuilder &AddDefaultPred(const MachineInstrBuilder &MIB) { 3236495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng return MIB.addImm((int64_t)ARMCC::AL).addReg(0); 3246495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng} 3255ca53a7ad821613d324e4189ddbb0d468a326146Evan Cheng 3266495f63945e8dbde81f03a1dc2ab421993b9a495Evan Chengstatic inline 3276495f63945e8dbde81f03a1dc2ab421993b9a495Evan Chengconst MachineInstrBuilder &AddDefaultCC(const MachineInstrBuilder &MIB) { 3286495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng return MIB.addReg(0); 3296495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng} 33083e0e36be8390fee1235783731f6c64aa604b7eeEvan Cheng 3316495f63945e8dbde81f03a1dc2ab421993b9a495Evan Chengstatic inline 332e8af1f9afe5e70e1d4ec4d00a6870428dba88692Evan Chengconst MachineInstrBuilder &AddDefaultT1CC(const MachineInstrBuilder &MIB, 333e8af1f9afe5e70e1d4ec4d00a6870428dba88692Evan Cheng bool isDead = false) { 334e8af1f9afe5e70e1d4ec4d00a6870428dba88692Evan Cheng return MIB.addReg(ARM::CPSR, getDefRegState(true) | getDeadRegState(isDead)); 3356495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng} 3366495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng 3376495f63945e8dbde81f03a1dc2ab421993b9a495Evan Chengstatic inline 338bc9b754091ea281e769e487f396b40f6675b9edbEvan Chengconst MachineInstrBuilder &AddNoT1CC(const MachineInstrBuilder &MIB) { 339bc9b754091ea281e769e487f396b40f6675b9edbEvan Cheng return MIB.addReg(0); 340bc9b754091ea281e769e487f396b40f6675b9edbEvan Cheng} 341bc9b754091ea281e769e487f396b40f6675b9edbEvan Cheng 342bc9b754091ea281e769e487f396b40f6675b9edbEvan Chengstatic inline 3436495f63945e8dbde81f03a1dc2ab421993b9a495Evan Chengbool isUncondBranchOpcode(int Opc) { 3446495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng return Opc == ARM::B || Opc == ARM::tB || Opc == ARM::t2B; 345334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin} 346334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin 3476495f63945e8dbde81f03a1dc2ab421993b9a495Evan Chengstatic inline 3486495f63945e8dbde81f03a1dc2ab421993b9a495Evan Chengbool isCondBranchOpcode(int Opc) { 3496495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng return Opc == ARM::Bcc || Opc == ARM::tBcc || Opc == ARM::t2Bcc; 3506495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng} 3516495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng 3526495f63945e8dbde81f03a1dc2ab421993b9a495Evan Chengstatic inline 3536495f63945e8dbde81f03a1dc2ab421993b9a495Evan Chengbool isJumpTableBranchOpcode(int Opc) { 3546495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng return Opc == ARM::BR_JTr || Opc == ARM::BR_JTm || Opc == ARM::BR_JTadd || 3556495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng Opc == ARM::tBR_JTr || Opc == ARM::t2BR_JT; 3566495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng} 3576495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng 3588d4de5abfa1bcd974554ea14904ebf7af289e84dBob Wilsonstatic inline 3598d4de5abfa1bcd974554ea14904ebf7af289e84dBob Wilsonbool isIndirectBranchOpcode(int Opc) { 3606e46d84eea97792a66c0bb64f26aad3976a23365Bill Wendling return Opc == ARM::BX || Opc == ARM::MOVPCRX || Opc == ARM::tBRIND; 3618d4de5abfa1bcd974554ea14904ebf7af289e84dBob Wilson} 3628d4de5abfa1bcd974554ea14904ebf7af289e84dBob Wilson 3638fb903604e83dfd63659c919042bf2bfed3c940fEvan Cheng/// getInstrPredicate - If instruction is predicated, returns its predicate 3648fb903604e83dfd63659c919042bf2bfed3c940fEvan Cheng/// condition, otherwise returns AL. It also returns the condition code 3658fb903604e83dfd63659c919042bf2bfed3c940fEvan Cheng/// register by reference. 3665adb66a646e2ec32265263739f5b01c3f50c176aEvan ChengARMCC::CondCodes getInstrPredicate(const MachineInstr *MI, unsigned &PredReg); 3678fb903604e83dfd63659c919042bf2bfed3c940fEvan Cheng 3686495f63945e8dbde81f03a1dc2ab421993b9a495Evan Chengint getMatchingCondBranchOpcode(int Opc); 3696495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng 3702860b7ea3a1d60213ee7228bd274bc4f8b170772Jakob Stoklund Olesen/// Determine if MI can be folded into an ARM MOVCC instruction, and return the 3712860b7ea3a1d60213ee7228bd274bc4f8b170772Jakob Stoklund Olesen/// opcode of the SSA instruction representing the conditional MI. 3722860b7ea3a1d60213ee7228bd274bc4f8b170772Jakob Stoklund Olesenunsigned canFoldARMInstrIntoMOVCC(unsigned Reg, 3732860b7ea3a1d60213ee7228bd274bc4f8b170772Jakob Stoklund Olesen MachineInstr *&MI, 3742860b7ea3a1d60213ee7228bd274bc4f8b170772Jakob Stoklund Olesen const MachineRegisterInfo &MRI); 3753be654f8082dcbdff011a6716a7c90486e28fc9eAndrew Trick 3763be654f8082dcbdff011a6716a7c90486e28fc9eAndrew Trick/// Map pseudo instructions that imply an 'S' bit onto real opcodes. Whether 3773be654f8082dcbdff011a6716a7c90486e28fc9eAndrew Trick/// the instruction is encoded with an 'S' bit is determined by the optional 3783be654f8082dcbdff011a6716a7c90486e28fc9eAndrew Trick/// CPSR def operand. 3793be654f8082dcbdff011a6716a7c90486e28fc9eAndrew Trickunsigned convertAddSubFlagsOpcode(unsigned OldOpc); 3803be654f8082dcbdff011a6716a7c90486e28fc9eAndrew Trick 3816495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng/// emitARMRegPlusImmediate / emitT2RegPlusImmediate - Emits a series of 3826495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng/// instructions to materializea destreg = basereg + immediate in ARM / Thumb2 3836495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng/// code. 3846495f63945e8dbde81f03a1dc2ab421993b9a495Evan Chengvoid emitARMRegPlusImmediate(MachineBasicBlock &MBB, 3856495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng MachineBasicBlock::iterator &MBBI, DebugLoc dl, 3866495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng unsigned DestReg, unsigned BaseReg, int NumBytes, 3876495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng ARMCC::CondCodes Pred, unsigned PredReg, 38857caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov const ARMBaseInstrInfo &TII, unsigned MIFlags = 0); 3896495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng 3906495f63945e8dbde81f03a1dc2ab421993b9a495Evan Chengvoid emitT2RegPlusImmediate(MachineBasicBlock &MBB, 3916495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng MachineBasicBlock::iterator &MBBI, DebugLoc dl, 3926495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng unsigned DestReg, unsigned BaseReg, int NumBytes, 3936495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng ARMCC::CondCodes Pred, unsigned PredReg, 39457caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov const ARMBaseInstrInfo &TII, unsigned MIFlags = 0); 395e4ad387a5a88dae20f0f7578e55170bbc8eee2a9Jim Grosbachvoid emitThumbRegPlusImmediate(MachineBasicBlock &MBB, 39657caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov MachineBasicBlock::iterator &MBBI, DebugLoc dl, 397e4ad387a5a88dae20f0f7578e55170bbc8eee2a9Jim Grosbach unsigned DestReg, unsigned BaseReg, 398e4ad387a5a88dae20f0f7578e55170bbc8eee2a9Jim Grosbach int NumBytes, const TargetInstrInfo &TII, 399e4ad387a5a88dae20f0f7578e55170bbc8eee2a9Jim Grosbach const ARMBaseRegisterInfo& MRI, 40057caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov unsigned MIFlags = 0); 4016495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng 4026495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng 403764ab52dd80310a205c9888bf166d09dab858f90Jim Grosbach/// rewriteARMFrameIndex / rewriteT2FrameIndex - 404cdbb3f5d3311e0f46d22bc8daa211b2fab3541cbEvan Cheng/// Rewrite MI to access 'Offset' bytes from the FP. Return false if the 405cdbb3f5d3311e0f46d22bc8daa211b2fab3541cbEvan Cheng/// offset could not be handled directly in MI, and return the left-over 406cdbb3f5d3311e0f46d22bc8daa211b2fab3541cbEvan Cheng/// portion by reference. 407cdbb3f5d3311e0f46d22bc8daa211b2fab3541cbEvan Chengbool rewriteARMFrameIndex(MachineInstr &MI, unsigned FrameRegIdx, 408cdbb3f5d3311e0f46d22bc8daa211b2fab3541cbEvan Cheng unsigned FrameReg, int &Offset, 409cdbb3f5d3311e0f46d22bc8daa211b2fab3541cbEvan Cheng const ARMBaseInstrInfo &TII); 410cdbb3f5d3311e0f46d22bc8daa211b2fab3541cbEvan Cheng 411cdbb3f5d3311e0f46d22bc8daa211b2fab3541cbEvan Chengbool rewriteT2FrameIndex(MachineInstr &MI, unsigned FrameRegIdx, 412cdbb3f5d3311e0f46d22bc8daa211b2fab3541cbEvan Cheng unsigned FrameReg, int &Offset, 413cdbb3f5d3311e0f46d22bc8daa211b2fab3541cbEvan Cheng const ARMBaseInstrInfo &TII); 4146495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng 4156495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng} // End llvm namespace 4166495f63945e8dbde81f03a1dc2ab421993b9a495Evan Cheng 417334c26473bba3ad8b88341bb0d25d0ac2008bb8dDavid Goodwin#endif 418