xref: /llvm-project/llvm/lib/Target/LoongArch/LoongArchInstrInfo.h (revision f7d8336a2fb4fad4a6efe5af9b0a10ddd970f6d3)
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