PPCInstrInfo.h revision 4a66e9a57e679b4f3243bf2061daf53c70102030
1c16257f05391b8aeccef62d6b543f1cb5a8185feChris Lattner//===- PPCInstrInfo.h - PowerPC Instruction Information ---------*- C++ -*-===// 2b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman// 3f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman// The LLVM Compiler Infrastructure 4f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman// 8f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//===----------------------------------------------------------------------===// 9f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman// 10f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman// This file contains the PowerPC implementation of the TargetInstrInfo class. 11f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman// 12f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//===----------------------------------------------------------------------===// 13f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman 14f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman#ifndef POWERPC32_INSTRUCTIONINFO_H 15f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman#define POWERPC32_INSTRUCTIONINFO_H 16f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman 172668959b8879097db368aec7d76c455260abc75bChris Lattner#include "PPC.h" 18617742b1b8b7fbb07b4ab5db7c292bff78d709f6Chris Lattner#include "llvm/Target/TargetInstrInfo.h" 1916e71f2f70811c69c56052dd146324fe20e31db5Chris Lattner#include "PPCRegisterInfo.h" 20f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman 21f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukmannamespace llvm { 2288d211f82304e53694ece666d4a2507b170e4582Chris Lattner 2388d211f82304e53694ece666d4a2507b170e4582Chris Lattner/// PPCII - This namespace holds all of the PowerPC target-specific 2488d211f82304e53694ece666d4a2507b170e4582Chris Lattner/// per-instruction flags. These must match the corresponding definitions in 2588d211f82304e53694ece666d4a2507b170e4582Chris Lattner/// PPC.td and PPCInstrFormats.td. 2688d211f82304e53694ece666d4a2507b170e4582Chris Lattnernamespace PPCII { 2788d211f82304e53694ece666d4a2507b170e4582Chris Lattnerenum { 2888d211f82304e53694ece666d4a2507b170e4582Chris Lattner // PPC970 Instruction Flags. These flags describe the characteristics of the 2988d211f82304e53694ece666d4a2507b170e4582Chris Lattner // PowerPC 970 (aka G5) dispatch groups and how they are formed out of 3088d211f82304e53694ece666d4a2507b170e4582Chris Lattner // raw machine instructions. 3188d211f82304e53694ece666d4a2507b170e4582Chris Lattner 3288d211f82304e53694ece666d4a2507b170e4582Chris Lattner /// PPC970_First - This instruction starts a new dispatch group, so it will 3388d211f82304e53694ece666d4a2507b170e4582Chris Lattner /// always be the first one in the group. 3488d211f82304e53694ece666d4a2507b170e4582Chris Lattner PPC970_First = 0x1, 3588d211f82304e53694ece666d4a2507b170e4582Chris Lattner 3688d211f82304e53694ece666d4a2507b170e4582Chris Lattner /// PPC970_Single - This instruction starts a new dispatch group and 3788d211f82304e53694ece666d4a2507b170e4582Chris Lattner /// terminates it, so it will be the sole instruction in the group. 3888d211f82304e53694ece666d4a2507b170e4582Chris Lattner PPC970_Single = 0x2, 3988d211f82304e53694ece666d4a2507b170e4582Chris Lattner 40fd97734f3636f54a86890918096d3d692df0b939Chris Lattner /// PPC970_Cracked - This instruction is cracked into two pieces, requiring 41fd97734f3636f54a86890918096d3d692df0b939Chris Lattner /// two dispatch pipes to be available to issue. 42fd97734f3636f54a86890918096d3d692df0b939Chris Lattner PPC970_Cracked = 0x4, 43fd97734f3636f54a86890918096d3d692df0b939Chris Lattner 4488d211f82304e53694ece666d4a2507b170e4582Chris Lattner /// PPC970_Mask/Shift - This is a bitmask that selects the pipeline type that 4588d211f82304e53694ece666d4a2507b170e4582Chris Lattner /// an instruction is issued to. 46fd97734f3636f54a86890918096d3d692df0b939Chris Lattner PPC970_Shift = 3, 47d74ea2bbd8bb630331f35ead42d385249bd42af8Chris Lattner PPC970_Mask = 0x07 << PPC970_Shift 4888d211f82304e53694ece666d4a2507b170e4582Chris Lattner}; 4988d211f82304e53694ece666d4a2507b170e4582Chris Lattnerenum PPC970_Unit { 5088d211f82304e53694ece666d4a2507b170e4582Chris Lattner /// These are the various PPC970 execution unit pipelines. Each instruction 5188d211f82304e53694ece666d4a2507b170e4582Chris Lattner /// is one of these. 5288d211f82304e53694ece666d4a2507b170e4582Chris Lattner PPC970_Pseudo = 0 << PPC970_Shift, // Pseudo instruction 5388d211f82304e53694ece666d4a2507b170e4582Chris Lattner PPC970_FXU = 1 << PPC970_Shift, // Fixed Point (aka Integer/ALU) Unit 5488d211f82304e53694ece666d4a2507b170e4582Chris Lattner PPC970_LSU = 2 << PPC970_Shift, // Load Store Unit 5588d211f82304e53694ece666d4a2507b170e4582Chris Lattner PPC970_FPU = 3 << PPC970_Shift, // Floating Point Unit 5688d211f82304e53694ece666d4a2507b170e4582Chris Lattner PPC970_CRU = 4 << PPC970_Shift, // Control Register Unit 5788d211f82304e53694ece666d4a2507b170e4582Chris Lattner PPC970_VALU = 5 << PPC970_Shift, // Vector ALU 5888d211f82304e53694ece666d4a2507b170e4582Chris Lattner PPC970_VPERM = 6 << PPC970_Shift, // Vector Permute Unit 59d74ea2bbd8bb630331f35ead42d385249bd42af8Chris Lattner PPC970_BRU = 7 << PPC970_Shift // Branch Unit 6088d211f82304e53694ece666d4a2507b170e4582Chris Lattner}; 6188d211f82304e53694ece666d4a2507b170e4582Chris Lattner} 6288d211f82304e53694ece666d4a2507b170e4582Chris Lattner 63617742b1b8b7fbb07b4ab5db7c292bff78d709f6Chris Lattner 64641055225092833197efe8e5bce01d50bcf1daaeChris Lattnerclass PPCInstrInfo : public TargetInstrInfoImpl { 65b1d26f66658cff3ceb7d44a72fbc8c8e975532f9Chris Lattner PPCTargetMachine &TM; 6621e463b2bf864671a87ebe386cb100ef9349a540Nate Begeman const PPCRegisterInfo RI; 674a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendling 684a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendling bool StoreRegToStackSlot(unsigned SrcReg, bool isKill, int FrameIdx, 694a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendling const TargetRegisterClass *RC, 704a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendling SmallVectorImpl<MachineInstr*> &NewMIs) const; 714a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendling void LoadRegFromStackSlot(unsigned DestReg, int FrameIdx, 724a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendling const TargetRegisterClass *RC, 734a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendling SmallVectorImpl<MachineInstr*> &NewMIs) const; 74f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukmanpublic: 75b1d26f66658cff3ceb7d44a72fbc8c8e975532f9Chris Lattner PPCInstrInfo(PPCTargetMachine &TM); 76f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman 77f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman /// getRegisterInfo - TargetInstrInfo is a superset of MRegister info. As 78f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman /// such, whenever a client has an instance of instruction info, it should 79f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman /// always be able to get register info as well (through this method). 80f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman /// 816f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman virtual const TargetRegisterInfo &getRegisterInfo() const { return RI; } 82f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman 83b1d26f66658cff3ceb7d44a72fbc8c8e975532f9Chris Lattner /// getPointerRegClass - Return the register class to use to hold pointers. 84b1d26f66658cff3ceb7d44a72fbc8c8e975532f9Chris Lattner /// This is used for addressing modes. 85b1d26f66658cff3ceb7d44a72fbc8c8e975532f9Chris Lattner virtual const TargetRegisterClass *getPointerRegClass() const; 86b1d26f66658cff3ceb7d44a72fbc8c8e975532f9Chris Lattner 87f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman // Return true if the instruction is a register to register move and 88f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman // leave the source and dest operands in the passed parameters. 89f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman // 90f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman virtual bool isMoveInstr(const MachineInstr& MI, 91f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman unsigned& sourceReg, 92f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman unsigned& destReg) const; 93f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman 94408396014742a05cad1c91949d2226169e3f9d80Chris Lattner unsigned isLoadFromStackSlot(MachineInstr *MI, int &FrameIndex) const; 956524287c53cf727a8ef33517403fcb1bbd7adff9Chris Lattner unsigned isStoreToStackSlot(MachineInstr *MI, int &FrameIndex) const; 96408396014742a05cad1c91949d2226169e3f9d80Chris Lattner 97043870dd85ea41e8972c304b122070a417c8a4bcChris Lattner // commuteInstruction - We can commute rlwimi instructions, but only if the 98043870dd85ea41e8972c304b122070a417c8a4bcChris Lattner // rotate amt is zero. We also have to munge the immediates a bit. 99043870dd85ea41e8972c304b122070a417c8a4bcChris Lattner virtual MachineInstr *commuteInstruction(MachineInstr *MI) const; 100043870dd85ea41e8972c304b122070a417c8a4bcChris Lattner 101bbf1c72d51a77bf54c9c684b90a78e59f0b70b2fChris Lattner virtual void insertNoop(MachineBasicBlock &MBB, 102bbf1c72d51a77bf54c9c684b90a78e59f0b70b2fChris Lattner MachineBasicBlock::iterator MI) const; 103bbf1c72d51a77bf54c9c684b90a78e59f0b70b2fChris Lattner 104c50e2bcdf7bff1f9681ab80e52691f274950fab5Chris Lattner 105c50e2bcdf7bff1f9681ab80e52691f274950fab5Chris Lattner // Branch analysis. 106c50e2bcdf7bff1f9681ab80e52691f274950fab5Chris Lattner virtual bool AnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, 107c50e2bcdf7bff1f9681ab80e52691f274950fab5Chris Lattner MachineBasicBlock *&FBB, 108c50e2bcdf7bff1f9681ab80e52691f274950fab5Chris Lattner std::vector<MachineOperand> &Cond) const; 109b5cdaa257e167a08a8a54ea9249d847ccc415ce0Evan Cheng virtual unsigned RemoveBranch(MachineBasicBlock &MBB) const; 110b5cdaa257e167a08a8a54ea9249d847ccc415ce0Evan Cheng virtual unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, 111b5cdaa257e167a08a8a54ea9249d847ccc415ce0Evan Cheng MachineBasicBlock *FBB, 112b5cdaa257e167a08a8a54ea9249d847ccc415ce0Evan Cheng const std::vector<MachineOperand> &Cond) const; 113f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson virtual void copyRegToReg(MachineBasicBlock &MBB, 114f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson MachineBasicBlock::iterator MI, 115f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson unsigned DestReg, unsigned SrcReg, 116f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson const TargetRegisterClass *DestRC, 117f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson const TargetRegisterClass *SrcRC) const; 118f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson 119f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson virtual void storeRegToStackSlot(MachineBasicBlock &MBB, 120f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson MachineBasicBlock::iterator MBBI, 121f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson unsigned SrcReg, bool isKill, int FrameIndex, 122f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson const TargetRegisterClass *RC) const; 123f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson 124f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson virtual void storeRegToAddr(MachineFunction &MF, unsigned SrcReg, bool isKill, 125f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson SmallVectorImpl<MachineOperand> &Addr, 126f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson const TargetRegisterClass *RC, 127f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson SmallVectorImpl<MachineInstr*> &NewMIs) const; 128f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson 129f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson virtual void loadRegFromStackSlot(MachineBasicBlock &MBB, 130f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson MachineBasicBlock::iterator MBBI, 131f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson unsigned DestReg, int FrameIndex, 132f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson const TargetRegisterClass *RC) const; 133f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson 134f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson virtual void loadRegFromAddr(MachineFunction &MF, unsigned DestReg, 135f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson SmallVectorImpl<MachineOperand> &Addr, 136f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson const TargetRegisterClass *RC, 137f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson SmallVectorImpl<MachineInstr*> &NewMIs) const; 138f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson 13943dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson /// foldMemoryOperand - PowerPC (like most RISC's) can only fold spills into 14043dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson /// copy instructions, turning them into load/store instructions. 1415fd79d0560570fed977788a86fa038b898564dfaEvan Cheng virtual MachineInstr* foldMemoryOperand(MachineFunction &MF, 1425fd79d0560570fed977788a86fa038b898564dfaEvan Cheng MachineInstr* MI, 14343dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson SmallVectorImpl<unsigned> &Ops, 14443dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson int FrameIndex) const; 14543dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson 1465fd79d0560570fed977788a86fa038b898564dfaEvan Cheng virtual MachineInstr* foldMemoryOperand(MachineFunction &MF, 1475fd79d0560570fed977788a86fa038b898564dfaEvan Cheng MachineInstr* MI, 14843dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson SmallVectorImpl<unsigned> &Ops, 14943dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson MachineInstr* LoadMI) const { 15043dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson return 0; 15143dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson } 15243dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson 15343dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson virtual bool canFoldMemoryOperand(MachineInstr *MI, 15443dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson SmallVectorImpl<unsigned> &Ops) const; 15543dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson 156ef13982aa7f3e57e82cd48370e79033dff0da295Chris Lattner virtual bool BlockHasNoFallThrough(MachineBasicBlock &MBB) const; 157c50e2bcdf7bff1f9681ab80e52691f274950fab5Chris Lattner virtual bool ReverseBranchCondition(std::vector<MachineOperand> &Cond) const; 158f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman}; 159f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman 160f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman} 161f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman 162f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman#endif 163