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
) const override
;
41 unsigned isLoadFromStackSlot(const MachineInstr
&MI
,
42 int &FrameIndex
) const override
;
44 unsigned isLoadFromStackSlotPostFE(const MachineInstr
&MI
,
45 int &FrameIndex
) const override
;
47 unsigned isStoreToStackSlot(const MachineInstr
&MI
,
48 int &FrameIndex
) const override
;
50 void copyPhysReg(MachineBasicBlock
&MBB
, MachineBasicBlock::iterator Position
,
51 const DebugLoc
&DL
, unsigned DestinationRegister
,
52 unsigned SourceRegister
, bool KillSource
) const override
;
55 storeRegToStackSlot(MachineBasicBlock
&MBB
,
56 MachineBasicBlock::iterator Position
,
57 unsigned SourceRegister
, bool IsKill
, int FrameIndex
,
58 const TargetRegisterClass
*RegisterClass
,
59 const TargetRegisterInfo
*RegisterInfo
) const override
;
62 loadRegFromStackSlot(MachineBasicBlock
&MBB
,
63 MachineBasicBlock::iterator Position
,
64 unsigned DestinationRegister
, int FrameIndex
,
65 const TargetRegisterClass
*RegisterClass
,
66 const TargetRegisterInfo
*RegisterInfo
) const override
;
68 bool expandPostRAPseudo(MachineInstr
&MI
) const override
;
70 bool getMemOperandWithOffset(const MachineInstr
&LdSt
,
71 const MachineOperand
*&BaseOp
,
73 const TargetRegisterInfo
*TRI
) const override
;
75 bool getMemOperandWithOffsetWidth(const MachineInstr
&LdSt
,
76 const MachineOperand
*&BaseOp
,
77 int64_t &Offset
, unsigned &Width
,
78 const TargetRegisterInfo
*TRI
) const;
80 std::pair
<unsigned, unsigned>
81 decomposeMachineOperandsTargetFlags(unsigned TF
) const override
;
83 ArrayRef
<std::pair
<unsigned, const char *>>
84 getSerializableDirectMachineOperandTargetFlags() const override
;
86 bool analyzeBranch(MachineBasicBlock
&MBB
, MachineBasicBlock
*&TrueBlock
,
87 MachineBasicBlock
*&FalseBlock
,
88 SmallVectorImpl
<MachineOperand
> &Condition
,
89 bool AllowModify
) const override
;
91 unsigned removeBranch(MachineBasicBlock
&MBB
,
92 int *BytesRemoved
= nullptr) const override
;
94 // For a comparison instruction, return the source registers in SrcReg and
95 // SrcReg2 if having two register operands, and the value it compares against
96 // in CmpValue. Return true if the comparison instruction can be analyzed.
97 bool analyzeCompare(const MachineInstr
&MI
, unsigned &SrcReg
,
98 unsigned &SrcReg2
, int &CmpMask
,
99 int &CmpValue
) const override
;
101 // See if the comparison instruction can be converted into something more
102 // efficient. E.g., on Lanai register-register instructions can set the flag
103 // register, obviating the need for a separate compare.
104 bool optimizeCompareInstr(MachineInstr
&CmpInstr
, unsigned SrcReg
,
105 unsigned SrcReg2
, int CmpMask
, int CmpValue
,
106 const MachineRegisterInfo
*MRI
) const override
;
108 // Analyze the given select instruction, returning true if it cannot be
109 // understood. It is assumed that MI->isSelect() is true.
111 // When successful, return the controlling condition and the operands that
112 // determine the true and false result values.
114 // Result = SELECT Cond, TrueOp, FalseOp
116 // Lanai can optimize certain select instructions, for example by predicating
117 // the instruction defining one of the operands and sets Optimizable to true.
118 bool analyzeSelect(const MachineInstr
&MI
,
119 SmallVectorImpl
<MachineOperand
> &Cond
, unsigned &TrueOp
,
120 unsigned &FalseOp
, bool &Optimizable
) const override
;
122 // Given a select instruction that was understood by analyzeSelect and
123 // returned Optimizable = true, attempt to optimize MI by merging it with one
124 // of its operands. Returns NULL on failure.
126 // When successful, returns the new select instruction. The client is
127 // responsible for deleting MI.
129 // If both sides of the select can be optimized, the TrueOp is modifed.
130 // PreferFalse is not used.
131 MachineInstr
*optimizeSelect(MachineInstr
&MI
,
132 SmallPtrSetImpl
<MachineInstr
*> &SeenMIs
,
133 bool PreferFalse
) const override
;
135 bool reverseBranchCondition(
136 SmallVectorImpl
<MachineOperand
> &Condition
) const override
;
138 unsigned insertBranch(MachineBasicBlock
&MBB
, MachineBasicBlock
*TrueBlock
,
139 MachineBasicBlock
*FalseBlock
,
140 ArrayRef
<MachineOperand
> Condition
,
142 int *BytesAdded
= nullptr) const override
;
145 static inline bool isSPLSOpcode(unsigned Opcode
) {
159 static inline bool isRMOpcode(unsigned Opcode
) {
169 static inline bool isRRMOpcode(unsigned Opcode
) {
188 #endif // LLVM_LIB_TARGET_LANAI_LANAIINSTRINFO_H