133388ae8SLu Weining //=- LoongArchInstrInfo.h - LoongArch Instruction Information ---*- C++ -*-===// 233388ae8SLu Weining // 333388ae8SLu Weining // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 433388ae8SLu Weining // See https://llvm.org/LICENSE.txt for license information. 533388ae8SLu Weining // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 633388ae8SLu Weining // 733388ae8SLu Weining //===----------------------------------------------------------------------===// 833388ae8SLu Weining // 933388ae8SLu Weining // This file contains the LoongArch implementation of the TargetInstrInfo class. 1033388ae8SLu Weining // 1133388ae8SLu Weining //===----------------------------------------------------------------------===// 1233388ae8SLu Weining 1333388ae8SLu Weining #ifndef LLVM_LIB_TARGET_LOONGARCH_LOONGARCHINSTRINFO_H 1433388ae8SLu Weining #define LLVM_LIB_TARGET_LOONGARCH_LOONGARCHINSTRINFO_H 1533388ae8SLu Weining 16a1c67439Swanglei #include "LoongArchRegisterInfo.h" 1733388ae8SLu Weining #include "llvm/CodeGen/TargetInstrInfo.h" 1833388ae8SLu Weining 1933388ae8SLu Weining #define GET_INSTRINFO_HEADER 2033388ae8SLu Weining #include "LoongArchGenInstrInfo.inc" 2133388ae8SLu Weining 2233388ae8SLu Weining namespace llvm { 2333388ae8SLu Weining 2433388ae8SLu Weining class LoongArchSubtarget; 2533388ae8SLu Weining 2633388ae8SLu Weining class LoongArchInstrInfo : public LoongArchGenInstrInfo { 2733388ae8SLu Weining public: 2833388ae8SLu Weining explicit LoongArchInstrInfo(LoongArchSubtarget &STI); 29a1c67439Swanglei 30db5dfec9SWANG Xuerui MCInst getNop() const override; 31db5dfec9SWANG Xuerui 32a1c67439Swanglei void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, 33a1c67439Swanglei const DebugLoc &DL, MCRegister DstReg, MCRegister SrcReg, 34b01c006fSPiyou Chen bool KillSrc, bool RenamableDest = false, 35b01c006fSPiyou Chen bool RenamableSrc = false) const override; 363610d5f5Swanglei 37*f7d8336aSVenkata Ramanaiah Nalamothu void storeRegToStackSlot( 38*f7d8336aSVenkata Ramanaiah Nalamothu MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register SrcReg, 39*f7d8336aSVenkata Ramanaiah Nalamothu bool IsKill, int FrameIndex, const TargetRegisterClass *RC, 40*f7d8336aSVenkata Ramanaiah Nalamothu const TargetRegisterInfo *TRI, Register VReg, 41*f7d8336aSVenkata Ramanaiah Nalamothu MachineInstr::MIFlag Flags = MachineInstr::NoFlags) const override; 42*f7d8336aSVenkata Ramanaiah Nalamothu void loadRegFromStackSlot( 43*f7d8336aSVenkata Ramanaiah Nalamothu MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register DstReg, 443610d5f5Swanglei int FrameIndex, const TargetRegisterClass *RC, 45*f7d8336aSVenkata Ramanaiah Nalamothu const TargetRegisterInfo *TRI, Register VReg, 46*f7d8336aSVenkata Ramanaiah Nalamothu MachineInstr::MIFlag Flags = MachineInstr::NoFlags) const override; 478716513eSwanglei 48c2a44b59SWANG Xuerui // Materializes the given integer Val into DstReg. 49c2a44b59SWANG Xuerui void movImm(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, 50c2a44b59SWANG Xuerui const DebugLoc &DL, Register DstReg, uint64_t Val, 51c2a44b59SWANG Xuerui MachineInstr::MIFlag Flag = MachineInstr::NoFlags) const; 52c2a44b59SWANG Xuerui 538716513eSwanglei unsigned getInstSizeInBytes(const MachineInstr &MI) const override; 548716513eSwanglei 552b6c2346Shev bool isAsCheapAsAMove(const MachineInstr &MI) const override; 562b6c2346Shev 578716513eSwanglei MachineBasicBlock *getBranchDestBlock(const MachineInstr &MI) const override; 588716513eSwanglei 598716513eSwanglei bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, 608716513eSwanglei MachineBasicBlock *&FBB, 618716513eSwanglei SmallVectorImpl<MachineOperand> &Cond, 628716513eSwanglei bool AllowModify) const override; 638716513eSwanglei 6457ad3f1dSXiaodong Liu bool isBranchOffsetInRange(unsigned BranchOpc, 6557ad3f1dSXiaodong Liu int64_t BrOffset) const override; 6657ad3f1dSXiaodong Liu 670e6f64cdShev bool isSchedulingBoundary(const MachineInstr &MI, 680e6f64cdShev const MachineBasicBlock *MBB, 690e6f64cdShev const MachineFunction &MF) const override; 700e6f64cdShev 718716513eSwanglei unsigned removeBranch(MachineBasicBlock &MBB, 728716513eSwanglei int *BytesRemoved = nullptr) const override; 738716513eSwanglei 748716513eSwanglei unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, 758716513eSwanglei MachineBasicBlock *FBB, ArrayRef<MachineOperand> Cond, 768716513eSwanglei const DebugLoc &dl, 778716513eSwanglei int *BytesAdded = nullptr) const override; 788716513eSwanglei 7957ad3f1dSXiaodong Liu void insertIndirectBranch(MachineBasicBlock &MBB, 8057ad3f1dSXiaodong Liu MachineBasicBlock &NewDestBB, 8157ad3f1dSXiaodong Liu MachineBasicBlock &RestoreBB, const DebugLoc &DL, 8257ad3f1dSXiaodong Liu int64_t BrOffset, RegScavenger *RS) const override; 8357ad3f1dSXiaodong Liu 848716513eSwanglei bool 858716513eSwanglei reverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const override; 86c2a44b59SWANG Xuerui 870436cf5fSwanglei std::pair<unsigned, unsigned> 880436cf5fSwanglei decomposeMachineOperandsTargetFlags(unsigned TF) const override; 890436cf5fSwanglei 900436cf5fSwanglei ArrayRef<std::pair<unsigned, const char *>> 910436cf5fSwanglei getSerializableDirectMachineOperandTargetFlags() const override; 920436cf5fSwanglei 930288d065SZhaoQi ArrayRef<std::pair<unsigned, const char *>> 940288d065SZhaoQi getSerializableBitmaskMachineOperandTargetFlags() const override; 950288d065SZhaoQi 96c2a44b59SWANG Xuerui protected: 97c2a44b59SWANG Xuerui const LoongArchSubtarget &STI; 9833388ae8SLu Weining }; 9933388ae8SLu Weining 100419f90e9SWeining Lu namespace LoongArch { 101419f90e9SWeining Lu 102e9bcd2bfShev // Returns true if this is the sext.w pattern, addi.w rd, rs, 0. 103e9bcd2bfShev bool isSEXT_W(const MachineInstr &MI); 104e9bcd2bfShev 105419f90e9SWeining Lu // Mask assignments for floating-point. 106419f90e9SWeining Lu static constexpr unsigned FClassMaskSignalingNaN = 0x001; 107419f90e9SWeining Lu static constexpr unsigned FClassMaskQuietNaN = 0x002; 108419f90e9SWeining Lu static constexpr unsigned FClassMaskNegativeInfinity = 0x004; 109419f90e9SWeining Lu static constexpr unsigned FClassMaskNegativeNormal = 0x008; 110419f90e9SWeining Lu static constexpr unsigned FClassMaskNegativeSubnormal = 0x010; 111419f90e9SWeining Lu static constexpr unsigned FClassMaskNegativeZero = 0x020; 112419f90e9SWeining Lu static constexpr unsigned FClassMaskPositiveInfinity = 0x040; 113419f90e9SWeining Lu static constexpr unsigned FClassMaskPositiveNormal = 0x080; 114419f90e9SWeining Lu static constexpr unsigned FClassMaskPositiveSubnormal = 0x100; 115419f90e9SWeining Lu static constexpr unsigned FClassMaskPositiveZero = 0x200; 116419f90e9SWeining Lu } // namespace LoongArch 117419f90e9SWeining Lu 11833388ae8SLu Weining } // end namespace llvm 11933388ae8SLu Weining #endif // LLVM_LIB_TARGET_LOONGARCH_LOONGARCHINSTRINFO_H 120