X86InstrInfo.h revision 36b56886974eae4f9c5ebc96befd3e7bfe5de338
131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- X86InstrInfo.h - X86 Instruction Information ------------*- C++ -*-===// 20e0a7a45d3d0a8c865a078459d2e1c6d8967a100Misha Brukman// 3856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell// The LLVM Compiler Infrastructure 4856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 70e0a7a45d3d0a8c865a078459d2e1c6d8967a100Misha Brukman// 8856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell//===----------------------------------------------------------------------===// 9726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner// 103501feab811c86c9659248a4875fc31a3165f84dChris Lattner// This file contains the X86 implementation of the TargetInstrInfo class. 11726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner// 12726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner//===----------------------------------------------------------------------===// 13726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner 14726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner#ifndef X86INSTRUCTIONINFO_H 15726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner#define X86INSTRUCTIONINFO_H 16726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner 1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "MCTargetDesc/X86BaseInfo.h" 18726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner#include "X86RegisterInfo.h" 19d68a07650cdb2e18f18f362ba533459aa10e01b6Dan Gohman#include "llvm/ADT/DenseMap.h" 2079aa3417eb6f58d668aadfedf075240a41d35a26Craig Topper#include "llvm/Target/TargetInstrInfo.h" 21726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner 224db3cffe94a5285239cc0056f939c6b74a5ca0b6Evan Cheng#define GET_INSTRINFO_HEADER 234db3cffe94a5285239cc0056f939c6b74a5ca0b6Evan Cheng#include "X86GenInstrInfo.inc" 244db3cffe94a5285239cc0056f939c6b74a5ca0b6Evan Cheng 25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 2625ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng class X86RegisterInfo; 27aa3c1410b427909da350f2b5e8d4ec3db62a3618Evan Cheng class X86TargetMachine; 28d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 297fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattnernamespace X86 { 307fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner // X86 specific condition code. These correspond to X86_*_COND in 317fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner // X86InstrInfo.td. They must be kept in synch. 327fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner enum CondCode { 337fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner COND_A = 0, 347fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner COND_AE = 1, 357fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner COND_B = 2, 367fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner COND_BE = 3, 377fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner COND_E = 4, 387fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner COND_G = 5, 397fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner COND_GE = 6, 407fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner COND_L = 7, 417fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner COND_LE = 8, 427fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner COND_NE = 9, 437fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner COND_NO = 10, 447fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner COND_NP = 11, 457fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner COND_NS = 12, 46653456c351d9bf908ebd982f6ae9df3449c5f34bDan Gohman COND_O = 13, 47653456c351d9bf908ebd982f6ae9df3449c5f34bDan Gohman COND_P = 14, 48653456c351d9bf908ebd982f6ae9df3449c5f34bDan Gohman COND_S = 15, 49279c22e6da2612f024b70e5509ffb0cad32f38b2Dan Gohman 50279c22e6da2612f024b70e5509ffb0cad32f38b2Dan Gohman // Artificial condition codes. These are used by AnalyzeBranch 51279c22e6da2612f024b70e5509ffb0cad32f38b2Dan Gohman // to indicate a block terminated with two conditional branches to 52279c22e6da2612f024b70e5509ffb0cad32f38b2Dan Gohman // the same location. This occurs in code using FCMP_OEQ or FCMP_UNE, 53279c22e6da2612f024b70e5509ffb0cad32f38b2Dan Gohman // which can't be represented on x86 with a single condition. These 54279c22e6da2612f024b70e5509ffb0cad32f38b2Dan Gohman // are never used in MachineInstrs. 55279c22e6da2612f024b70e5509ffb0cad32f38b2Dan Gohman COND_NE_OR_P, 56279c22e6da2612f024b70e5509ffb0cad32f38b2Dan Gohman COND_NP_OR_E, 57279c22e6da2612f024b70e5509ffb0cad32f38b2Dan Gohman 587fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner COND_INVALID 597fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner }; 608d4a4225135f1f4647e675902359b64cc21af7efAndrew Trick 617fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner // Turn condition code into conditional branch opcode. 627fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner unsigned GetCondBranchFromCond(CondCode CC); 638d4a4225135f1f4647e675902359b64cc21af7efAndrew Trick 64b118a073d7434727a4ea5a5762f54e54e72bef4fMichael Liao // Turn CMov opcode into condition code. 65b118a073d7434727a4ea5a5762f54e54e72bef4fMichael Liao CondCode getCondFromCMovOpc(unsigned Opc); 66b118a073d7434727a4ea5a5762f54e54e72bef4fMichael Liao 679cd68759178f9fe25c72253d338e78e414f1d770Chris Lattner /// GetOppositeBranchCondition - Return the inverse of the specified cond, 689cd68759178f9fe25c72253d338e78e414f1d770Chris Lattner /// e.g. turning COND_E to COND_NE. 699cd68759178f9fe25c72253d338e78e414f1d770Chris Lattner CondCode GetOppositeBranchCondition(X86::CondCode CC); 708c3fee59038d8fd98db2a01b6a309a8941a16a3fEvan Cheng} // end namespace X86; 719cd68759178f9fe25c72253d338e78e414f1d770Chris Lattner 72281bada3b03b97dad0ac9890706a057ab31a5dd3Chris Lattner 733b6b36d6f54e780a2947cb1b9efe4eed7c40dc11Chris Lattner/// isGlobalStubReference - Return true if the specified TargetFlag operand is 74281bada3b03b97dad0ac9890706a057ab31a5dd3Chris Lattner/// a reference to a stub for a global, not the global itself. 753b6b36d6f54e780a2947cb1b9efe4eed7c40dc11Chris Lattnerinline static bool isGlobalStubReference(unsigned char TargetFlag) { 763b6b36d6f54e780a2947cb1b9efe4eed7c40dc11Chris Lattner switch (TargetFlag) { 77281bada3b03b97dad0ac9890706a057ab31a5dd3Chris Lattner case X86II::MO_DLLIMPORT: // dllimport stub. 78281bada3b03b97dad0ac9890706a057ab31a5dd3Chris Lattner case X86II::MO_GOTPCREL: // rip-relative GOT reference. 79281bada3b03b97dad0ac9890706a057ab31a5dd3Chris Lattner case X86II::MO_GOT: // normal GOT reference. 80281bada3b03b97dad0ac9890706a057ab31a5dd3Chris Lattner case X86II::MO_DARWIN_NONLAZY_PIC_BASE: // Normal $non_lazy_ptr ref. 81281bada3b03b97dad0ac9890706a057ab31a5dd3Chris Lattner case X86II::MO_DARWIN_NONLAZY: // Normal $non_lazy_ptr ref. 82281bada3b03b97dad0ac9890706a057ab31a5dd3Chris Lattner case X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE: // Hidden $non_lazy_ptr ref. 83281bada3b03b97dad0ac9890706a057ab31a5dd3Chris Lattner return true; 84281bada3b03b97dad0ac9890706a057ab31a5dd3Chris Lattner default: 85281bada3b03b97dad0ac9890706a057ab31a5dd3Chris Lattner return false; 86281bada3b03b97dad0ac9890706a057ab31a5dd3Chris Lattner } 87281bada3b03b97dad0ac9890706a057ab31a5dd3Chris Lattner} 887478ab8502a52815413d8b388898f719484ab1a9Chris Lattner 897478ab8502a52815413d8b388898f719484ab1a9Chris Lattner/// isGlobalRelativeToPICBase - Return true if the specified global value 907478ab8502a52815413d8b388898f719484ab1a9Chris Lattner/// reference is relative to a 32-bit PIC base (X86ISD::GlobalBaseReg). If this 917478ab8502a52815413d8b388898f719484ab1a9Chris Lattner/// is true, the addressing mode has the PIC base register added in (e.g. EBX). 927478ab8502a52815413d8b388898f719484ab1a9Chris Lattnerinline static bool isGlobalRelativeToPICBase(unsigned char TargetFlag) { 937478ab8502a52815413d8b388898f719484ab1a9Chris Lattner switch (TargetFlag) { 947478ab8502a52815413d8b388898f719484ab1a9Chris Lattner case X86II::MO_GOTOFF: // isPICStyleGOT: local global. 957478ab8502a52815413d8b388898f719484ab1a9Chris Lattner case X86II::MO_GOT: // isPICStyleGOT: other global. 967478ab8502a52815413d8b388898f719484ab1a9Chris Lattner case X86II::MO_PIC_BASE_OFFSET: // Darwin local global. 977478ab8502a52815413d8b388898f719484ab1a9Chris Lattner case X86II::MO_DARWIN_NONLAZY_PIC_BASE: // Darwin/32 external global. 987478ab8502a52815413d8b388898f719484ab1a9Chris Lattner case X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE: // Darwin/32 hidden global. 9930ef0e5658b0b8b04437f73f74162d5d72923f29Eric Christopher case X86II::MO_TLVP: // ??? Pretty sure.. 1007478ab8502a52815413d8b388898f719484ab1a9Chris Lattner return true; 1017478ab8502a52815413d8b388898f719484ab1a9Chris Lattner default: 1027478ab8502a52815413d8b388898f719484ab1a9Chris Lattner return false; 1037478ab8502a52815413d8b388898f719484ab1a9Chris Lattner } 1047478ab8502a52815413d8b388898f719484ab1a9Chris Lattner} 1058d4a4225135f1f4647e675902359b64cc21af7efAndrew Trick 1061c4b5eaa4628935c4db3e422aa10f2031e6d1679Anton Korobeynikovinline static bool isScale(const MachineOperand &MO) { 107d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman return MO.isImm() && 1081c4b5eaa4628935c4db3e422aa10f2031e6d1679Anton Korobeynikov (MO.getImm() == 1 || MO.getImm() == 2 || 1091c4b5eaa4628935c4db3e422aa10f2031e6d1679Anton Korobeynikov MO.getImm() == 4 || MO.getImm() == 8); 1101c4b5eaa4628935c4db3e422aa10f2031e6d1679Anton Korobeynikov} 1111c4b5eaa4628935c4db3e422aa10f2031e6d1679Anton Korobeynikov 112094fad37b90946c91a09eb9270a0dbe800f49d87Rafael Espindolainline static bool isLeaMem(const MachineInstr *MI, unsigned Op) { 113d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman if (MI->getOperand(Op).isFI()) return true; 11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Op+X86::AddrSegmentReg <= MI->getNumOperands() && 11536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MI->getOperand(Op+X86::AddrBaseReg).isReg() && 11636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines isScale(MI->getOperand(Op+X86::AddrScaleAmt)) && 11736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MI->getOperand(Op+X86::AddrIndexReg).isReg() && 11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines (MI->getOperand(Op+X86::AddrDisp).isImm() || 11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MI->getOperand(Op+X86::AddrDisp).isGlobal() || 12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MI->getOperand(Op+X86::AddrDisp).isCPI() || 12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MI->getOperand(Op+X86::AddrDisp).isJTI()); 1221c4b5eaa4628935c4db3e422aa10f2031e6d1679Anton Korobeynikov} 1231c4b5eaa4628935c4db3e422aa10f2031e6d1679Anton Korobeynikov 124094fad37b90946c91a09eb9270a0dbe800f49d87Rafael Espindolainline static bool isMem(const MachineInstr *MI, unsigned Op) { 125094fad37b90946c91a09eb9270a0dbe800f49d87Rafael Espindola if (MI->getOperand(Op).isFI()) return true; 12636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Op+X86::AddrNumOperands <= MI->getNumOperands() && 12736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MI->getOperand(Op+X86::AddrSegmentReg).isReg() && 128094fad37b90946c91a09eb9270a0dbe800f49d87Rafael Espindola isLeaMem(MI, Op); 129094fad37b90946c91a09eb9270a0dbe800f49d87Rafael Espindola} 130094fad37b90946c91a09eb9270a0dbe800f49d87Rafael Espindola 13136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass X86InstrInfo final : public X86GenInstrInfo { 132aa3c1410b427909da350f2b5e8d4ec3db62a3618Evan Cheng X86TargetMachine &TM; 133726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner const X86RegisterInfo RI; 1348d4a4225135f1f4647e675902359b64cc21af7efAndrew Trick 135241c15ffaa9fbe820d3aa55f17e0b569235691f3Craig Topper /// RegOp2MemOpTable3Addr, RegOp2MemOpTable0, RegOp2MemOpTable1, 136241c15ffaa9fbe820d3aa55f17e0b569235691f3Craig Topper /// RegOp2MemOpTable2, RegOp2MemOpTable3 - Load / store folding opcode maps. 13743dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson /// 138cbf479df8abe5e208f1438092a9632a145551cbcBruno Cardoso Lopes typedef DenseMap<unsigned, 139cbf479df8abe5e208f1438092a9632a145551cbcBruno Cardoso Lopes std::pair<unsigned, unsigned> > RegOp2MemOpTableType; 140cbf479df8abe5e208f1438092a9632a145551cbcBruno Cardoso Lopes RegOp2MemOpTableType RegOp2MemOpTable2Addr; 141cbf479df8abe5e208f1438092a9632a145551cbcBruno Cardoso Lopes RegOp2MemOpTableType RegOp2MemOpTable0; 142cbf479df8abe5e208f1438092a9632a145551cbcBruno Cardoso Lopes RegOp2MemOpTableType RegOp2MemOpTable1; 143cbf479df8abe5e208f1438092a9632a145551cbcBruno Cardoso Lopes RegOp2MemOpTableType RegOp2MemOpTable2; 144177cf1e1a3685209ab805f82897902a8d2b61661Elena Demikhovsky RegOp2MemOpTableType RegOp2MemOpTable3; 1458d4a4225135f1f4647e675902359b64cc21af7efAndrew Trick 14643dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson /// MemOp2RegOpTable - Load / store unfolding opcode map. 14743dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson /// 148cbf479df8abe5e208f1438092a9632a145551cbcBruno Cardoso Lopes typedef DenseMap<unsigned, 149cbf479df8abe5e208f1438092a9632a145551cbcBruno Cardoso Lopes std::pair<unsigned, unsigned> > MemOp2RegOpTableType; 150cbf479df8abe5e208f1438092a9632a145551cbcBruno Cardoso Lopes MemOp2RegOpTableType MemOp2RegOpTable; 151cbf479df8abe5e208f1438092a9632a145551cbcBruno Cardoso Lopes 152f318457547ade1ca210386fb69da97f070423998Craig Topper static void AddTableEntry(RegOp2MemOpTableType &R2MTable, 153f318457547ade1ca210386fb69da97f070423998Craig Topper MemOp2RegOpTableType &M2RTable, 154f318457547ade1ca210386fb69da97f070423998Craig Topper unsigned RegOp, unsigned MemOp, unsigned Flags); 155352aa503faee6c58e9cdb5054cc5ec1d90c696b4Jakob Stoklund Olesen 156354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzka virtual void anchor(); 157354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzka 158726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattnerpublic: 159950a4c40b823cd4f09dc71be635229246dfd6cacDan Gohman explicit X86InstrInfo(X86TargetMachine &tm); 160726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner 1613501feab811c86c9659248a4875fc31a3165f84dChris Lattner /// getRegisterInfo - TargetInstrInfo is a superset of MRegister info. As 162726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner /// such, whenever a client has an instance of instruction info, it should 163726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner /// always be able to get register info as well (through this method). 164726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner /// 16536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const X86RegisterInfo &getRegisterInfo() const { return RI; } 166726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner 1677da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng /// isCoalescableExtInstr - Return true if the instruction is a "coalescable" 1687da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng /// extension instruction. That is, it's like a copy where it's legal for the 1697da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng /// source to overlap the destination. e.g. X86::MOVSX64rr32. If this returns 1707da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng /// true, then it's expected the pre-extension value is available as a subreg 1717da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng /// of the result register. This also returns the sub-register index in 1727da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng /// SubIdx. 17336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isCoalescableExtInstr(const MachineInstr &MI, 17436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned &SrcReg, unsigned &DstReg, 17536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned &SubIdx) const override; 176a5a81d70720a4ce6ac7538927c2a874b0dfa8bd2Evan Cheng 17736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned isLoadFromStackSlot(const MachineInstr *MI, 17836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int &FrameIndex) const override; 179dda3978d7877d2d60390833c73ed24857295e89cDavid Greene /// isLoadFromStackSlotPostFE - Check for post-frame ptr elimination 180dda3978d7877d2d60390833c73ed24857295e89cDavid Greene /// stack locations as well. This uses a heuristic so it isn't 181dda3978d7877d2d60390833c73ed24857295e89cDavid Greene /// reliable for correctness. 182dda3978d7877d2d60390833c73ed24857295e89cDavid Greene unsigned isLoadFromStackSlotPostFE(const MachineInstr *MI, 18336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int &FrameIndex) const override; 184b87bc95db075dae3033a3c541b55b4cb711c332cDavid Greene 18536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned isStoreToStackSlot(const MachineInstr *MI, 18636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int &FrameIndex) const override; 187dda3978d7877d2d60390833c73ed24857295e89cDavid Greene /// isStoreToStackSlotPostFE - Check for post-frame ptr elimination 188dda3978d7877d2d60390833c73ed24857295e89cDavid Greene /// stack locations as well. This uses a heuristic so it isn't 189dda3978d7877d2d60390833c73ed24857295e89cDavid Greene /// reliable for correctness. 190dda3978d7877d2d60390833c73ed24857295e89cDavid Greene unsigned isStoreToStackSlotPostFE(const MachineInstr *MI, 19136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int &FrameIndex) const override; 192ca1267c02b025cc719190b05f9e1a5d174a9caf7Evan Cheng 1933731bc026cc6c4fb7deb7ac67e2c3be0c22498beDan Gohman bool isReallyTriviallyReMaterializable(const MachineInstr *MI, 19436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines AliasAnalysis *AA) const override; 195ca1267c02b025cc719190b05f9e1a5d174a9caf7Evan Cheng void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, 196378445303b10b092a898a75131141a8259cff50bEvan Cheng unsigned DestReg, unsigned SubIdx, 197d57cdd5683ea926e489067364fb7ffe5fd5d35eeEvan Cheng const MachineInstr *Orig, 19836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const TargetRegisterInfo &TRI) const override; 199ca1267c02b025cc719190b05f9e1a5d174a9caf7Evan Cheng 200e5609f37323b105c7720d5d423a9203d1e869c29Tim Northover /// Given an operand within a MachineInstr, insert preceding code to put it 201e5609f37323b105c7720d5d423a9203d1e869c29Tim Northover /// into the right format for a particular kind of LEA instruction. This may 202e5609f37323b105c7720d5d423a9203d1e869c29Tim Northover /// involve using an appropriate super-register instead (with an implicit use 203e5609f37323b105c7720d5d423a9203d1e869c29Tim Northover /// of the original) or creating a new virtual register and inserting COPY 204e5609f37323b105c7720d5d423a9203d1e869c29Tim Northover /// instructions to get the data into the right class. 205e5609f37323b105c7720d5d423a9203d1e869c29Tim Northover /// 206e5609f37323b105c7720d5d423a9203d1e869c29Tim Northover /// Reference parameters are set to indicate how caller should add this 207e5609f37323b105c7720d5d423a9203d1e869c29Tim Northover /// operand to the LEA instruction. 208e5609f37323b105c7720d5d423a9203d1e869c29Tim Northover bool classifyLEAReg(MachineInstr *MI, const MachineOperand &Src, 209e5609f37323b105c7720d5d423a9203d1e869c29Tim Northover unsigned LEAOpcode, bool AllowSP, 210e5609f37323b105c7720d5d423a9203d1e869c29Tim Northover unsigned &NewSrc, bool &isKill, 211e5609f37323b105c7720d5d423a9203d1e869c29Tim Northover bool &isUndef, MachineOperand &ImplicitOp) const; 212e5609f37323b105c7720d5d423a9203d1e869c29Tim Northover 213bcea4d6f283a5ae6f93dc8e10898311fe53d23a3Chris Lattner /// convertToThreeAddress - This method must be implemented by targets that 214bcea4d6f283a5ae6f93dc8e10898311fe53d23a3Chris Lattner /// set the M_CONVERTIBLE_TO_3_ADDR flag. When this flag is set, the target 215bcea4d6f283a5ae6f93dc8e10898311fe53d23a3Chris Lattner /// may be able to convert a two-address instruction into a true 216bcea4d6f283a5ae6f93dc8e10898311fe53d23a3Chris Lattner /// three-address instruction on demand. This allows the X86 target (for 217bcea4d6f283a5ae6f93dc8e10898311fe53d23a3Chris Lattner /// example) to convert ADD and SHL instructions into LEA instructions if they 218bcea4d6f283a5ae6f93dc8e10898311fe53d23a3Chris Lattner /// would require register copies due to two-addressness. 219bcea4d6f283a5ae6f93dc8e10898311fe53d23a3Chris Lattner /// 220bcea4d6f283a5ae6f93dc8e10898311fe53d23a3Chris Lattner /// This method returns a null pointer if the transformation cannot be 221bcea4d6f283a5ae6f93dc8e10898311fe53d23a3Chris Lattner /// performed, otherwise it returns the new instruction. 222bcea4d6f283a5ae6f93dc8e10898311fe53d23a3Chris Lattner /// 22336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineInstr *convertToThreeAddress(MachineFunction::iterator &MFI, 22436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineBasicBlock::iterator &MBBI, 22536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines LiveVariables *LV) const override; 226bcea4d6f283a5ae6f93dc8e10898311fe53d23a3Chris Lattner 22741e431ba045eb317ebf0ec45b563a5d96c212f5cChris Lattner /// commuteInstruction - We have a few instructions that must be hacked on to 22841e431ba045eb317ebf0ec45b563a5d96c212f5cChris Lattner /// commute them. 22941e431ba045eb317ebf0ec45b563a5d96c212f5cChris Lattner /// 23036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineInstr *commuteInstruction(MachineInstr *MI, bool NewMI) const override; 23136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 23236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool findCommutedOpIndices(MachineInstr *MI, unsigned &SrcOpIdx1, 23336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned &SrcOpIdx2) const override; 23441e431ba045eb317ebf0ec45b563a5d96c212f5cChris Lattner 2357fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner // Branch analysis. 23636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isUnpredicatedTerminator(const MachineInstr* MI) const override; 23736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool AnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, 23836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineBasicBlock *&FBB, 23936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<MachineOperand> &Cond, 24036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool AllowModify) const override; 24136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned RemoveBranch(MachineBasicBlock &MBB) const override; 24236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, 24336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineBasicBlock *FBB, 24436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const SmallVectorImpl<MachineOperand> &Cond, 24536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DebugLoc DL) const override; 24636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool canInsertSelect(const MachineBasicBlock&, 24736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const SmallVectorImpl<MachineOperand> &Cond, 24836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned, unsigned, int&, int&, int&) const override; 24936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void insertSelect(MachineBasicBlock &MBB, 25036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineBasicBlock::iterator MI, DebugLoc DL, 25136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned DstReg, 25236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const SmallVectorImpl<MachineOperand> &Cond, 25336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned TrueReg, unsigned FalseReg) const override; 25436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void copyPhysReg(MachineBasicBlock &MBB, 25536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineBasicBlock::iterator MI, DebugLoc DL, 25636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned DestReg, unsigned SrcReg, 25736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool KillSrc) const override; 25836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void storeRegToStackSlot(MachineBasicBlock &MBB, 25936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineBasicBlock::iterator MI, 26036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned SrcReg, bool isKill, int FrameIndex, 26136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const TargetRegisterClass *RC, 26236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const TargetRegisterInfo *TRI) const override; 26336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 26436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void storeRegToAddr(MachineFunction &MF, unsigned SrcReg, bool isKill, 26536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<MachineOperand> &Addr, 26636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const TargetRegisterClass *RC, 26736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineInstr::mmo_iterator MMOBegin, 26836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineInstr::mmo_iterator MMOEnd, 26936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<MachineInstr*> &NewMIs) const; 27036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 27136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void loadRegFromStackSlot(MachineBasicBlock &MBB, 27236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineBasicBlock::iterator MI, 27336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned DestReg, int FrameIndex, 27436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const TargetRegisterClass *RC, 27536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const TargetRegisterInfo *TRI) const override; 27636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 27736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void loadRegFromAddr(MachineFunction &MF, unsigned DestReg, 27836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<MachineOperand> &Addr, 27936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const TargetRegisterClass *RC, 28036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineInstr::mmo_iterator MMOBegin, 28136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineInstr::mmo_iterator MMOEnd, 28236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<MachineInstr*> &NewMIs) const; 28336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 28436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool expandPostRAPseudo(MachineBasicBlock::iterator MI) const override; 28592fb79b7a611ab4c1043f04e8acd08f963d073adJakob Stoklund Olesen 28643dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson /// foldMemoryOperand - If this target supports it, fold a load or store of 28743dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson /// the specified stack slot into the specified machine instruction for the 28843dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson /// specified operand(s). If this is possible, the target should perform the 28943dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson /// folding and return true, otherwise it should return false. If it folds 29043dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson /// the instruction, it is likely that the MachineInstruction the iterator 29143dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson /// references has been changed. 29236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineInstr* foldMemoryOperandImpl(MachineFunction &MF, 29336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineInstr* MI, 29436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const SmallVectorImpl<unsigned> &Ops, 29536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int FrameIndex) const override; 29643dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson 29743dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson /// foldMemoryOperand - Same as the previous version except it allows folding 29843dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson /// of any load and store from / to any address, not just from a specific 29943dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson /// stack slot. 30036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineInstr* foldMemoryOperandImpl(MachineFunction &MF, 30136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineInstr* MI, 30236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const SmallVectorImpl<unsigned> &Ops, 30336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineInstr* LoadMI) const override; 30443dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson 30543dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson /// canFoldMemoryOperand - Returns true if the specified load / store is 30643dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson /// folding is possible. 30736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool canFoldMemoryOperand(const MachineInstr*, 30836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const SmallVectorImpl<unsigned> &) const override; 30943dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson 31043dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson /// unfoldMemoryOperand - Separate a single instruction which folded a load or 31143dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson /// a store or a load and a store into two or more instruction. If this is 31243dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson /// possible, returns true as well as the new instructions by reference. 31336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool unfoldMemoryOperand(MachineFunction &MF, MachineInstr *MI, 31436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Reg, bool UnfoldLoad, bool UnfoldStore, 31536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<MachineInstr*> &NewMIs) const override; 31643dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson 31736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool unfoldMemoryOperand(SelectionDAG &DAG, SDNode *N, 31836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<SDNode*> &NewNodes) const override; 31943dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson 32043dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson /// getOpcodeAfterMemoryUnfold - Returns the opcode of the would be new 32143dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson /// instruction after load / store are unfolded from an instruction of the 32243dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson /// specified opcode. It returns zero if the specified unfolding is not 3230115e164bad632572e2cfbaf72f0f0882d5319deDan Gohman /// possible. If LoadRegIndex is non-null, it is filled in with the operand 3240115e164bad632572e2cfbaf72f0f0882d5319deDan Gohman /// index of the operand which will hold the register holding the loaded 3250115e164bad632572e2cfbaf72f0f0882d5319deDan Gohman /// value. 32636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getOpcodeAfterMemoryUnfold(unsigned Opc, 32736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool UnfoldLoad, bool UnfoldStore, 32836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned *LoadRegIndex = 0) const override; 3298d4a4225135f1f4647e675902359b64cc21af7efAndrew Trick 33096dc115ef3ee019cb91d7c112358a77536c38a53Evan Cheng /// areLoadsFromSameBasePtr - This is used by the pre-regalloc scheduler 33196dc115ef3ee019cb91d7c112358a77536c38a53Evan Cheng /// to determine if two loads are loading from the same base address. It 33296dc115ef3ee019cb91d7c112358a77536c38a53Evan Cheng /// should only return true if the base pointers are the same and the 33396dc115ef3ee019cb91d7c112358a77536c38a53Evan Cheng /// only differences between the two addresses are the offset. It also returns 33496dc115ef3ee019cb91d7c112358a77536c38a53Evan Cheng /// the offsets by reference. 33536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool areLoadsFromSameBasePtr(SDNode *Load1, SDNode *Load2, int64_t &Offset1, 33636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int64_t &Offset2) const override; 33796dc115ef3ee019cb91d7c112358a77536c38a53Evan Cheng 33896dc115ef3ee019cb91d7c112358a77536c38a53Evan Cheng /// shouldScheduleLoadsNear - This is a used by the pre-regalloc scheduler to 3397a2bdde0a0eebcd2125055e0eacaca040f0b766cChris Lattner /// determine (in conjunction with areLoadsFromSameBasePtr) if two loads should 34096dc115ef3ee019cb91d7c112358a77536c38a53Evan Cheng /// be scheduled togther. On some targets if two loads are loading from 34196dc115ef3ee019cb91d7c112358a77536c38a53Evan Cheng /// addresses in the same cache line, it's better if they are scheduled 34296dc115ef3ee019cb91d7c112358a77536c38a53Evan Cheng /// together. This function takes two integers that represent the load offsets 34396dc115ef3ee019cb91d7c112358a77536c38a53Evan Cheng /// from the common base address. It returns true if it decides it's desirable 34496dc115ef3ee019cb91d7c112358a77536c38a53Evan Cheng /// to schedule the two loads together. "NumLoads" is the number of loads that 34596dc115ef3ee019cb91d7c112358a77536c38a53Evan Cheng /// have already been scheduled after Load1. 34636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool shouldScheduleLoadsNear(SDNode *Load1, SDNode *Load2, 34736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int64_t Offset1, int64_t Offset2, 34836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned NumLoads) const override; 34996dc115ef3ee019cb91d7c112358a77536c38a53Evan Cheng 35036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool shouldScheduleAdjacent(MachineInstr* First, 35136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineInstr *Second) const override; 3520f2eec65fb9e9e1dee3f672d38d03d047936a62aAndrew Trick 35336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void getNoopForMachoTarget(MCInst &NopInst) const override; 354ee9eb411fffddbb8fe70418c05946a131889b487Chris Lattner 35536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool 35636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const override; 35741e431ba045eb317ebf0ec45b563a5d96c212f5cChris Lattner 3584350eb86a7cdc83fa6a5f4819a7f0534ace5cd58Evan Cheng /// isSafeToMoveRegClassDefs - Return true if it's safe to move a machine 3594350eb86a7cdc83fa6a5f4819a7f0534ace5cd58Evan Cheng /// instruction that defines the specified register class. 36036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isSafeToMoveRegClassDefs(const TargetRegisterClass *RC) const override; 36123066288fdf4867f53f208f9aaf2952b1c049394Evan Cheng 36239a612e6f9e63806af410a0ab0d81895391e4c79Chris Lattner static bool isX86_64ExtendedReg(const MachineOperand &MO) { 36339a612e6f9e63806af410a0ab0d81895391e4c79Chris Lattner if (!MO.isReg()) return false; 3648c3fee59038d8fd98db2a01b6a309a8941a16a3fEvan Cheng return X86II::isX86_64ExtendedReg(MO.getReg()); 36539a612e6f9e63806af410a0ab0d81895391e4c79Chris Lattner } 36652e724ad7e679ee590f4bd763d55280586a8f1bcNicolas Geoffray 36757c3dac0df7ac1b53ae7c0e5d2adc459fc7bd37cDan Gohman /// getGlobalBaseReg - Return a virtual register initialized with the 36857c3dac0df7ac1b53ae7c0e5d2adc459fc7bd37cDan Gohman /// the global base register value. Output instructions required to 36957c3dac0df7ac1b53ae7c0e5d2adc459fc7bd37cDan Gohman /// initialize the register in the function entry block, if necessary. 3708b746969baee26237e4c52de9862d06795eabcdaDan Gohman /// 37157c3dac0df7ac1b53ae7c0e5d2adc459fc7bd37cDan Gohman unsigned getGlobalBaseReg(MachineFunction *MF) const; 3728b746969baee26237e4c52de9862d06795eabcdaDan Gohman 37398e933f9ad3cc2ede3a0a337144a504265d614cdJakob Stoklund Olesen std::pair<uint16_t, uint16_t> 37436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getExecutionDomain(const MachineInstr *MI) const override; 375e4b94b4efb9a4670f25a5a80dd3b97f9583de202Jakob Stoklund Olesen 37636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void setExecutionDomain(MachineInstr *MI, unsigned Domain) const override; 377352aa503faee6c58e9cdb5054cc5ec1d90c696b4Jakob Stoklund Olesen 37836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned 37936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getPartialRegUpdateClearance(const MachineInstr *MI, unsigned OpNum, 38036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const TargetRegisterInfo *TRI) const override; 381a6a9ac5aa1092067e6e1546226d8bdd6a4bfcf99Andrew Trick unsigned getUndefRegClearance(const MachineInstr *MI, unsigned &OpNum, 38236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const TargetRegisterInfo *TRI) const override; 383c2ecf3efbf375fc82bb1cea6afd7448498f9ae75Jakob Stoklund Olesen void breakPartialRegDependency(MachineBasicBlock::iterator MI, unsigned OpNum, 38436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const TargetRegisterInfo *TRI) const override; 385c2ecf3efbf375fc82bb1cea6afd7448498f9ae75Jakob Stoklund Olesen 386beac75da3784929aee9f0357fc5cd76d49d6c3d7Chris Lattner MachineInstr* foldMemoryOperandImpl(MachineFunction &MF, 387beac75da3784929aee9f0357fc5cd76d49d6c3d7Chris Lattner MachineInstr* MI, 388beac75da3784929aee9f0357fc5cd76d49d6c3d7Chris Lattner unsigned OpNum, 389beac75da3784929aee9f0357fc5cd76d49d6c3d7Chris Lattner const SmallVectorImpl<MachineOperand> &MOs, 390beac75da3784929aee9f0357fc5cd76d49d6c3d7Chris Lattner unsigned Size, unsigned Alignment) const; 3912312842de0c641107dd04d7e056d02491cc781caEvan Cheng 39236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isHighLatencyDef(int opc) const override; 393e0ef509aeb47b396cf1bdc170ca4f468f799719fAndrew Trick 3942312842de0c641107dd04d7e056d02491cc781caEvan Cheng bool hasHighOperandLatency(const InstrItineraryData *ItinData, 3952312842de0c641107dd04d7e056d02491cc781caEvan Cheng const MachineRegisterInfo *MRI, 3962312842de0c641107dd04d7e056d02491cc781caEvan Cheng const MachineInstr *DefMI, unsigned DefIdx, 39736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MachineInstr *UseMI, 39836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned UseIdx) const override; 3998d4a4225135f1f4647e675902359b64cc21af7efAndrew Trick 4002af66dc51a7a0f3490c7e89c636e4015431195cdManman Ren /// analyzeCompare - For a comparison instruction, return the source registers 4012af66dc51a7a0f3490c7e89c636e4015431195cdManman Ren /// in SrcReg and SrcReg2 if having two register operands, and the value it 4022af66dc51a7a0f3490c7e89c636e4015431195cdManman Ren /// compares against in CmpValue. Return true if the comparison instruction 4032af66dc51a7a0f3490c7e89c636e4015431195cdManman Ren /// can be analyzed. 40436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool analyzeCompare(const MachineInstr *MI, unsigned &SrcReg, 40536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned &SrcReg2, int &CmpMask, 40636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int &CmpValue) const override; 4072af66dc51a7a0f3490c7e89c636e4015431195cdManman Ren 4082af66dc51a7a0f3490c7e89c636e4015431195cdManman Ren /// optimizeCompareInstr - Check if there exists an earlier instruction that 4092af66dc51a7a0f3490c7e89c636e4015431195cdManman Ren /// operates on the same source operands and sets flags in the same way as 4102af66dc51a7a0f3490c7e89c636e4015431195cdManman Ren /// Compare; remove Compare if possible. 41136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool optimizeCompareInstr(MachineInstr *CmpInstr, unsigned SrcReg, 41236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned SrcReg2, int CmpMask, int CmpValue, 41336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MachineRegisterInfo *MRI) const override; 4142af66dc51a7a0f3490c7e89c636e4015431195cdManman Ren 415d7d003c2b7b7f657eed364e4ac06f4ab32fc8c2dManman Ren /// optimizeLoadInstr - Try to remove the load by folding it to a register 416d7d003c2b7b7f657eed364e4ac06f4ab32fc8c2dManman Ren /// operand at the use. We fold the load instructions if and only if the 417127eea87d666ccc9fe7025f41148c33af0f8c84bManman Ren /// def and use are in the same BB. We only look at one load and see 418127eea87d666ccc9fe7025f41148c33af0f8c84bManman Ren /// whether it can be folded into MI. FoldAsLoadDefReg is the virtual register 419127eea87d666ccc9fe7025f41148c33af0f8c84bManman Ren /// defined by the load we are trying to fold. DefMI returns the machine 420127eea87d666ccc9fe7025f41148c33af0f8c84bManman Ren /// instruction that defines FoldAsLoadDefReg, and the function returns 421127eea87d666ccc9fe7025f41148c33af0f8c84bManman Ren /// the machine instruction generated due to folding. 42236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineInstr* optimizeLoadInstr(MachineInstr *MI, 42336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MachineRegisterInfo *MRI, 42436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned &FoldAsLoadDefReg, 42536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineInstr *&DefMI) const override; 426d7d003c2b7b7f657eed364e4ac06f4ab32fc8c2dManman Ren 42743dbe05279b753aabda571d9c83eaeb36987001aOwen Andersonprivate: 428656e51454ac70f5d500565fd33c883f6dea549f2Evan Cheng MachineInstr * convertToThreeAddressWithLEA(unsigned MIOpc, 429656e51454ac70f5d500565fd33c883f6dea549f2Evan Cheng MachineFunction::iterator &MFI, 430656e51454ac70f5d500565fd33c883f6dea549f2Evan Cheng MachineBasicBlock::iterator &MBBI, 431656e51454ac70f5d500565fd33c883f6dea549f2Evan Cheng LiveVariables *LV) const; 432656e51454ac70f5d500565fd33c883f6dea549f2Evan Cheng 433b87bc95db075dae3033a3c541b55b4cb711c332cDavid Greene /// isFrameOperand - Return true and the FrameIndex if the specified 434b87bc95db075dae3033a3c541b55b4cb711c332cDavid Greene /// operand and follow operands form a reference to the stack frame. 435b87bc95db075dae3033a3c541b55b4cb711c332cDavid Greene bool isFrameOperand(const MachineInstr *MI, unsigned int Op, 436b87bc95db075dae3033a3c541b55b4cb711c332cDavid Greene int &FrameIndex) const; 437726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner}; 438726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner 439d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 440d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 441726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner#endif 442