1 //===- LanaiInstrInfo.h - Lanai Instruction Information ---------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // This file contains the Lanai implementation of the TargetInstrInfo class.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_LIB_TARGET_LANAI_LANAIINSTRINFO_H
14 #define LLVM_LIB_TARGET_LANAI_LANAIINSTRINFO_H
16 #include "LanaiRegisterInfo.h"
17 #include "MCTargetDesc/LanaiMCTargetDesc.h"
18 #include "llvm/CodeGen/TargetInstrInfo.h"
20 #define GET_INSTRINFO_HEADER
21 #include "LanaiGenInstrInfo.inc"
25 class LanaiInstrInfo
: public LanaiGenInstrInfo
{
26 const LanaiRegisterInfo RegisterInfo
;
31 // getRegisterInfo - TargetInstrInfo is a superset of MRegister info. As
32 // such, whenever a client has an instance of instruction info, it should
33 // always be able to get register info as well (through this method).
34 virtual const LanaiRegisterInfo
&getRegisterInfo() const {
38 bool areMemAccessesTriviallyDisjoint(const MachineInstr
&MIa
,
39 const MachineInstr
&MIb
,
40 AliasAnalysis
*AA
) const override
;
42 unsigned isLoadFromStackSlot(const MachineInstr
&MI
,
43 int &FrameIndex
) const override
;
45 unsigned isLoadFromStackSlotPostFE(const MachineInstr
&MI
,
46 int &FrameIndex
) const override
;
48 unsigned isStoreToStackSlot(const MachineInstr
&MI
,
49 int &FrameIndex
) const override
;
51 void copyPhysReg(MachineBasicBlock
&MBB
, MachineBasicBlock::iterator Position
,
52 const DebugLoc
&DL
, unsigned DestinationRegister
,
53 unsigned SourceRegister
, bool KillSource
) const override
;
56 storeRegToStackSlot(MachineBasicBlock
&MBB
,
57 MachineBasicBlock::iterator Position
,
58 unsigned SourceRegister
, bool IsKill
, int FrameIndex
,
59 const TargetRegisterClass
*RegisterClass
,
60 const TargetRegisterInfo
*RegisterInfo
) const override
;
63 loadRegFromStackSlot(MachineBasicBlock
&MBB
,
64 MachineBasicBlock::iterator Position
,
65 unsigned DestinationRegister
, int FrameIndex
,
66 const TargetRegisterClass
*RegisterClass
,
67 const TargetRegisterInfo
*RegisterInfo
) const override
;
69 bool expandPostRAPseudo(MachineInstr
&MI
) const override
;
71 bool getMemOperandWithOffset(const MachineInstr
&LdSt
,
72 const MachineOperand
*&BaseOp
,
74 const TargetRegisterInfo
*TRI
) const override
;
76 bool getMemOperandWithOffsetWidth(const MachineInstr
&LdSt
,
77 const MachineOperand
*&BaseOp
,
78 int64_t &Offset
, unsigned &Width
,
79 const TargetRegisterInfo
*TRI
) const;
81 std::pair
<unsigned, unsigned>
82 decomposeMachineOperandsTargetFlags(unsigned TF
) const override
;
84 ArrayRef
<std::pair
<unsigned, const char *>>
85 getSerializableDirectMachineOperandTargetFlags() const override
;
87 bool analyzeBranch(MachineBasicBlock
&MBB
, MachineBasicBlock
*&TrueBlock
,
88 MachineBasicBlock
*&FalseBlock
,
89 SmallVectorImpl
<MachineOperand
> &Condition
,
90 bool AllowModify
) const override
;
92 unsigned removeBranch(MachineBasicBlock
&MBB
,
93 int *BytesRemoved
= nullptr) const override
;
95 // For a comparison instruction, return the source registers in SrcReg and
96 // SrcReg2 if having two register operands, and the value it compares against
97 // in CmpValue. Return true if the comparison instruction can be analyzed.
98 bool analyzeCompare(const MachineInstr
&MI
, unsigned &SrcReg
,
99 unsigned &SrcReg2
, int &CmpMask
,
100 int &CmpValue
) const override
;
102 // See if the comparison instruction can be converted into something more
103 // efficient. E.g., on Lanai register-register instructions can set the flag
104 // register, obviating the need for a separate compare.
105 bool optimizeCompareInstr(MachineInstr
&CmpInstr
, unsigned SrcReg
,
106 unsigned SrcReg2
, int CmpMask
, int CmpValue
,
107 const MachineRegisterInfo
*MRI
) const override
;
109 // Analyze the given select instruction, returning true if it cannot be
110 // understood. It is assumed that MI->isSelect() is true.
112 // When successful, return the controlling condition and the operands that
113 // determine the true and false result values.
115 // Result = SELECT Cond, TrueOp, FalseOp
117 // Lanai can optimize certain select instructions, for example by predicating
118 // the instruction defining one of the operands and sets Optimizable to true.
119 bool analyzeSelect(const MachineInstr
&MI
,
120 SmallVectorImpl
<MachineOperand
> &Cond
, unsigned &TrueOp
,
121 unsigned &FalseOp
, bool &Optimizable
) const override
;
123 // Given a select instruction that was understood by analyzeSelect and
124 // returned Optimizable = true, attempt to optimize MI by merging it with one
125 // of its operands. Returns NULL on failure.
127 // When successful, returns the new select instruction. The client is
128 // responsible for deleting MI.
130 // If both sides of the select can be optimized, the TrueOp is modifed.
131 // PreferFalse is not used.
132 MachineInstr
*optimizeSelect(MachineInstr
&MI
,
133 SmallPtrSetImpl
<MachineInstr
*> &SeenMIs
,
134 bool PreferFalse
) const override
;
136 bool reverseBranchCondition(
137 SmallVectorImpl
<MachineOperand
> &Condition
) const override
;
139 unsigned insertBranch(MachineBasicBlock
&MBB
, MachineBasicBlock
*TrueBlock
,
140 MachineBasicBlock
*FalseBlock
,
141 ArrayRef
<MachineOperand
> Condition
,
143 int *BytesAdded
= nullptr) const override
;
146 static inline bool isSPLSOpcode(unsigned Opcode
) {
160 static inline bool isRMOpcode(unsigned Opcode
) {
170 static inline bool isRRMOpcode(unsigned Opcode
) {
189 #endif // LLVM_LIB_TARGET_LANAI_LANAIINSTRINFO_H