1 //===-- VEInstrInfo.h - VE Instruction Information --------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file contains the VE implementation of the TargetInstrInfo class. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_LIB_TARGET_VE_VEINSTRINFO_H 14 #define LLVM_LIB_TARGET_VE_VEINSTRINFO_H 15 16 #include "VERegisterInfo.h" 17 #include "llvm/CodeGen/TargetInstrInfo.h" 18 19 #define GET_INSTRINFO_HEADER 20 #include "VEGenInstrInfo.inc" 21 22 namespace llvm { 23 24 class VESubtarget; 25 26 /// VEII - This namespace holds all of the Aurora VE target-specific 27 /// per-instruction flags. These must match the corresponding definitions in 28 /// VEInstrFormats.td. 29 namespace VEII { 30 enum { 31 // Aurora VE Instruction Flags. These flags describe the characteristics of 32 // the Aurora VE instructions for vector handling. 33 34 /// VE_Vector - This instruction is Vector Instruction. 35 VE_Vector = 0x1, 36 37 /// VE_VLInUse - This instruction has a vector register in its operands. 38 VE_VLInUse = 0x2, 39 40 /// VE_VLMask/Shift - This is a bitmask that selects the index number where 41 /// an instruction holds vector length informatio (0 to 6, 7 means undef).n 42 VE_VLShift = 2, 43 VE_VLMask = 0x07 << VE_VLShift, 44 }; 45 46 #define HAS_VLINDEX(TSF) ((TSF)&VEII::VE_VLInUse) 47 #define GET_VLINDEX(TSF) \ 48 (HAS_VLINDEX(TSF) ? (int)(((TSF)&VEII::VE_VLMask) >> VEII::VE_VLShift) : -1) 49 } // end namespace VEII 50 51 class VEInstrInfo : public VEGenInstrInfo { 52 const VERegisterInfo RI; 53 virtual void anchor(); 54 55 public: 56 explicit VEInstrInfo(VESubtarget &ST); 57 58 /// getRegisterInfo - TargetInstrInfo is a superset of MRegister info. As 59 /// such, whenever a client has an instance of instruction info, it should 60 /// always be able to get register info as well (through this method). 61 /// getRegisterInfo()62 const VERegisterInfo &getRegisterInfo() const { return RI; } 63 64 /// Branch Analysis & Modification { 65 bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, 66 MachineBasicBlock *&FBB, 67 SmallVectorImpl<MachineOperand> &Cond, 68 bool AllowModify = false) const override; 69 70 unsigned removeBranch(MachineBasicBlock &MBB, 71 int *BytesRemoved = nullptr) const override; 72 73 unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, 74 MachineBasicBlock *FBB, ArrayRef<MachineOperand> Cond, 75 const DebugLoc &DL, 76 int *BytesAdded = nullptr) const override; 77 78 bool 79 reverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const override; 80 /// } Branch Analysis & Modification 81 82 void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, 83 const DebugLoc &DL, MCRegister DestReg, MCRegister SrcReg, 84 bool KillSrc) const override; 85 86 /// Stack Spill & Reload { 87 Register isLoadFromStackSlot(const MachineInstr &MI, 88 int &FrameIndex) const override; 89 Register isStoreToStackSlot(const MachineInstr &MI, 90 int &FrameIndex) const override; 91 void storeRegToStackSlot(MachineBasicBlock &MBB, 92 MachineBasicBlock::iterator MBBI, Register SrcReg, 93 bool isKill, int FrameIndex, 94 const TargetRegisterClass *RC, 95 const TargetRegisterInfo *TRI, 96 Register VReg) const override; 97 98 void loadRegFromStackSlot(MachineBasicBlock &MBB, 99 MachineBasicBlock::iterator MBBI, Register DestReg, 100 int FrameIndex, const TargetRegisterClass *RC, 101 const TargetRegisterInfo *TRI, 102 Register VReg) const override; 103 /// } Stack Spill & Reload 104 105 /// Optimization { 106 107 bool foldImmediate(MachineInstr &UseMI, MachineInstr &DefMI, Register Reg, 108 MachineRegisterInfo *MRI) const override; 109 110 /// } Optimization 111 112 Register getGlobalBaseReg(MachineFunction *MF) const; 113 114 // Lower pseudo instructions after register allocation. 115 bool expandPostRAPseudo(MachineInstr &MI) const override; 116 117 bool expandExtendStackPseudo(MachineInstr &MI) const; 118 bool expandGetStackTopPseudo(MachineInstr &MI) const; 119 }; 120 121 } // namespace llvm 122 123 #endif 124