0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1 //===-- SystemZInstrInfo.h - SystemZ instruction information ----*- C++ -*-===//
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 //
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 // The LLVM Compiler Infrastructure
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 //
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5 // This file is distributed under the University of Illinois Open Source
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 // License. See LICENSE.TXT for details.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 //
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 //===----------------------------------------------------------------------===//
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9 //
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
10 // This file contains the SystemZ implementation of the TargetInstrInfo class.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11 //
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
12 //===----------------------------------------------------------------------===//
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
13
|
77
|
14 #ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZINSTRINFO_H
|
|
15 #define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZINSTRINFO_H
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
17 #include "SystemZ.h"
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
18 #include "SystemZRegisterInfo.h"
|
121
|
19 #include "llvm/ADT/ArrayRef.h"
|
|
20 #include "llvm/CodeGen/MachineBasicBlock.h"
|
|
21 #include "llvm/CodeGen/MachineFunction.h"
|
|
22 #include "llvm/CodeGen/MachineInstrBuilder.h"
|
134
|
23 #include "llvm/CodeGen/TargetInstrInfo.h"
|
121
|
24 #include <cstdint>
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
25
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
26 #define GET_INSTRINFO_HEADER
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27 #include "SystemZGenInstrInfo.inc"
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
28
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
29 namespace llvm {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
30
|
121
|
31 class SystemZSubtarget;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
32
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
33 namespace SystemZII {
|
121
|
34
|
77
|
35 enum {
|
|
36 // See comments in SystemZInstrFormats.td.
|
|
37 SimpleBDXLoad = (1 << 0),
|
|
38 SimpleBDXStore = (1 << 1),
|
|
39 Has20BitOffset = (1 << 2),
|
|
40 HasIndex = (1 << 3),
|
|
41 Is128Bit = (1 << 4),
|
|
42 AccessSizeMask = (31 << 5),
|
|
43 AccessSizeShift = 5,
|
|
44 CCValuesMask = (15 << 10),
|
|
45 CCValuesShift = 10,
|
|
46 CompareZeroCCMaskMask = (15 << 14),
|
|
47 CompareZeroCCMaskShift = 14,
|
|
48 CCMaskFirst = (1 << 18),
|
|
49 CCMaskLast = (1 << 19),
|
|
50 IsLogical = (1 << 20)
|
|
51 };
|
121
|
52
|
77
|
53 static inline unsigned getAccessSize(unsigned int Flags) {
|
|
54 return (Flags & AccessSizeMask) >> AccessSizeShift;
|
|
55 }
|
121
|
56
|
77
|
57 static inline unsigned getCCValues(unsigned int Flags) {
|
|
58 return (Flags & CCValuesMask) >> CCValuesShift;
|
|
59 }
|
121
|
60
|
77
|
61 static inline unsigned getCompareZeroCCMask(unsigned int Flags) {
|
|
62 return (Flags & CompareZeroCCMaskMask) >> CompareZeroCCMaskShift;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
63 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
64
|
77
|
65 // SystemZ MachineOperand target flags.
|
|
66 enum {
|
|
67 // Masks out the bits for the access model.
|
95
|
68 MO_SYMBOL_MODIFIER = (3 << 0),
|
77
|
69
|
|
70 // @GOT (aka @GOTENT)
|
95
|
71 MO_GOT = (1 << 0),
|
|
72
|
|
73 // @INDNTPOFF
|
|
74 MO_INDNTPOFF = (2 << 0)
|
77
|
75 };
|
121
|
76
|
77
|
77 // Classifies a branch.
|
|
78 enum BranchType {
|
|
79 // An instruction that branches on the current value of CC.
|
|
80 BranchNormal,
|
|
81
|
|
82 // An instruction that peforms a 32-bit signed comparison and branches
|
|
83 // on the result.
|
|
84 BranchC,
|
|
85
|
|
86 // An instruction that peforms a 32-bit unsigned comparison and branches
|
|
87 // on the result.
|
|
88 BranchCL,
|
|
89
|
|
90 // An instruction that peforms a 64-bit signed comparison and branches
|
|
91 // on the result.
|
|
92 BranchCG,
|
|
93
|
|
94 // An instruction that peforms a 64-bit unsigned comparison and branches
|
|
95 // on the result.
|
|
96 BranchCLG,
|
|
97
|
|
98 // An instruction that decrements a 32-bit register and branches if
|
|
99 // the result is nonzero.
|
|
100 BranchCT,
|
|
101
|
|
102 // An instruction that decrements a 64-bit register and branches if
|
|
103 // the result is nonzero.
|
|
104 BranchCTG
|
|
105 };
|
121
|
106
|
77
|
107 // Information about a branch instruction.
|
|
108 struct Branch {
|
|
109 // The type of the branch.
|
|
110 BranchType Type;
|
|
111
|
|
112 // CCMASK_<N> is set if CC might be equal to N.
|
|
113 unsigned CCValid;
|
|
114
|
|
115 // CCMASK_<N> is set if the branch should be taken when CC == N.
|
|
116 unsigned CCMask;
|
|
117
|
|
118 // The target of the branch.
|
|
119 const MachineOperand *Target;
|
|
120
|
|
121 Branch(BranchType type, unsigned ccValid, unsigned ccMask,
|
|
122 const MachineOperand *target)
|
|
123 : Type(type), CCValid(ccValid), CCMask(ccMask), Target(target) {}
|
|
124 };
|
121
|
125
|
120
|
126 // Kinds of fused compares in compare-and-* instructions. Together with type
|
|
127 // of the converted compare, this identifies the compare-and-*
|
|
128 // instruction.
|
|
129 enum FusedCompareType {
|
|
130 // Relative branch - CRJ etc.
|
|
131 CompareAndBranch,
|
|
132
|
|
133 // Indirect branch, used for return - CRBReturn etc.
|
|
134 CompareAndReturn,
|
|
135
|
|
136 // Indirect branch, used for sibcall - CRBCall etc.
|
|
137 CompareAndSibcall,
|
|
138
|
|
139 // Trap
|
|
140 CompareAndTrap
|
|
141 };
|
121
|
142
|
77
|
143 } // end namespace SystemZII
|
|
144
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
145 class SystemZInstrInfo : public SystemZGenInstrInfo {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
146 const SystemZRegisterInfo RI;
|
77
|
147 SystemZSubtarget &STI;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
148
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
149 void splitMove(MachineBasicBlock::iterator MI, unsigned NewOpcode) const;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
150 void splitAdjDynAlloc(MachineBasicBlock::iterator MI) const;
|
120
|
151 void expandRIPseudo(MachineInstr &MI, unsigned LowOpcode, unsigned HighOpcode,
|
|
152 bool ConvertHigh) const;
|
|
153 void expandRIEPseudo(MachineInstr &MI, unsigned LowOpcode,
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
154 unsigned LowOpcodeK, unsigned HighOpcode) const;
|
120
|
155 void expandRXYPseudo(MachineInstr &MI, unsigned LowOpcode,
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
156 unsigned HighOpcode) const;
|
121
|
157 void expandLOCPseudo(MachineInstr &MI, unsigned LowOpcode,
|
|
158 unsigned HighOpcode) const;
|
|
159 void expandLOCRPseudo(MachineInstr &MI, unsigned LowOpcode,
|
|
160 unsigned HighOpcode) const;
|
120
|
161 void expandZExtPseudo(MachineInstr &MI, unsigned LowOpcode,
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
162 unsigned Size) const;
|
120
|
163 void expandLoadStackGuard(MachineInstr *MI) const;
|
121
|
164
|
|
165 MachineInstrBuilder
|
|
166 emitGRX32Move(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
|
|
167 const DebugLoc &DL, unsigned DestReg, unsigned SrcReg,
|
|
168 unsigned LowLowOpcode, unsigned Size, bool KillSrc,
|
|
169 bool UndefSrc) const;
|
|
170
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
171 virtual void anchor();
|
121
|
172
|
|
173 protected:
|
|
174 /// Commutes the operands in the given instruction by changing the operands
|
|
175 /// order and/or changing the instruction's opcode and/or the immediate value
|
|
176 /// operand.
|
|
177 ///
|
|
178 /// The arguments 'CommuteOpIdx1' and 'CommuteOpIdx2' specify the operands
|
|
179 /// to be commuted.
|
|
180 ///
|
|
181 /// Do not call this method for a non-commutable instruction or
|
|
182 /// non-commutable operands.
|
|
183 /// Even though the instruction is commutable, the method may still
|
|
184 /// fail to commute the operands, null pointer is returned in such cases.
|
|
185 MachineInstr *commuteInstructionImpl(MachineInstr &MI, bool NewMI,
|
|
186 unsigned CommuteOpIdx1,
|
|
187 unsigned CommuteOpIdx2) const override;
|
|
188
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
189 public:
|
77
|
190 explicit SystemZInstrInfo(SystemZSubtarget &STI);
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
191
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
192 // Override TargetInstrInfo.
|
120
|
193 unsigned isLoadFromStackSlot(const MachineInstr &MI,
|
77
|
194 int &FrameIndex) const override;
|
120
|
195 unsigned isStoreToStackSlot(const MachineInstr &MI,
|
77
|
196 int &FrameIndex) const override;
|
120
|
197 bool isStackSlotCopy(const MachineInstr &MI, int &DestFrameIndex,
|
77
|
198 int &SrcFrameIndex) const override;
|
120
|
199 bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB,
|
77
|
200 MachineBasicBlock *&FBB,
|
|
201 SmallVectorImpl<MachineOperand> &Cond,
|
|
202 bool AllowModify) const override;
|
120
|
203 unsigned removeBranch(MachineBasicBlock &MBB,
|
|
204 int *BytesRemoved = nullptr) const override;
|
|
205 unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
|
95
|
206 MachineBasicBlock *FBB, ArrayRef<MachineOperand> Cond,
|
120
|
207 const DebugLoc &DL,
|
|
208 int *BytesAdded = nullptr) const override;
|
|
209 bool analyzeCompare(const MachineInstr &MI, unsigned &SrcReg,
|
77
|
210 unsigned &SrcReg2, int &Mask, int &Value) const override;
|
120
|
211 bool optimizeCompareInstr(MachineInstr &CmpInstr, unsigned SrcReg,
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
212 unsigned SrcReg2, int Mask, int Value,
|
77
|
213 const MachineRegisterInfo *MRI) const override;
|
121
|
214 bool canInsertSelect(const MachineBasicBlock&, ArrayRef<MachineOperand> Cond,
|
|
215 unsigned, unsigned, int&, int&, int&) const override;
|
|
216 void insertSelect(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
|
|
217 const DebugLoc &DL, unsigned DstReg,
|
|
218 ArrayRef<MachineOperand> Cond, unsigned TrueReg,
|
|
219 unsigned FalseReg) const override;
|
|
220 bool FoldImmediate(MachineInstr &UseMI, MachineInstr &DefMI, unsigned Reg,
|
|
221 MachineRegisterInfo *MRI) const override;
|
|
222 bool isPredicable(const MachineInstr &MI) const override;
|
77
|
223 bool isProfitableToIfCvt(MachineBasicBlock &MBB, unsigned NumCycles,
|
|
224 unsigned ExtraPredCycles,
|
95
|
225 BranchProbability Probability) const override;
|
77
|
226 bool isProfitableToIfCvt(MachineBasicBlock &TMBB,
|
|
227 unsigned NumCyclesT, unsigned ExtraPredCyclesT,
|
|
228 MachineBasicBlock &FMBB,
|
|
229 unsigned NumCyclesF, unsigned ExtraPredCyclesF,
|
95
|
230 BranchProbability Probability) const override;
|
120
|
231 bool isProfitableToDupForIfCvt(MachineBasicBlock &MBB, unsigned NumCycles,
|
|
232 BranchProbability Probability) const override;
|
|
233 bool PredicateInstruction(MachineInstr &MI,
|
95
|
234 ArrayRef<MachineOperand> Pred) const override;
|
77
|
235 void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
|
120
|
236 const DebugLoc &DL, unsigned DestReg, unsigned SrcReg,
|
77
|
237 bool KillSrc) const override;
|
|
238 void storeRegToStackSlot(MachineBasicBlock &MBB,
|
|
239 MachineBasicBlock::iterator MBBI,
|
|
240 unsigned SrcReg, bool isKill, int FrameIndex,
|
|
241 const TargetRegisterClass *RC,
|
|
242 const TargetRegisterInfo *TRI) const override;
|
|
243 void loadRegFromStackSlot(MachineBasicBlock &MBB,
|
|
244 MachineBasicBlock::iterator MBBI,
|
|
245 unsigned DestReg, int FrameIdx,
|
|
246 const TargetRegisterClass *RC,
|
|
247 const TargetRegisterInfo *TRI) const override;
|
|
248 MachineInstr *convertToThreeAddress(MachineFunction::iterator &MFI,
|
120
|
249 MachineInstr &MI,
|
77
|
250 LiveVariables *LV) const override;
|
120
|
251 MachineInstr *
|
|
252 foldMemoryOperandImpl(MachineFunction &MF, MachineInstr &MI,
|
|
253 ArrayRef<unsigned> Ops,
|
|
254 MachineBasicBlock::iterator InsertPt, int FrameIndex,
|
|
255 LiveIntervals *LIS = nullptr) const override;
|
|
256 MachineInstr *foldMemoryOperandImpl(
|
|
257 MachineFunction &MF, MachineInstr &MI, ArrayRef<unsigned> Ops,
|
|
258 MachineBasicBlock::iterator InsertPt, MachineInstr &LoadMI,
|
|
259 LiveIntervals *LIS = nullptr) const override;
|
|
260 bool expandPostRAPseudo(MachineInstr &MBBI) const override;
|
|
261 bool reverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const
|
77
|
262 override;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
263
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
264 // Return the SystemZRegisterInfo, which this class owns.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
265 const SystemZRegisterInfo &getRegisterInfo() const { return RI; }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
266
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
267 // Return the size in bytes of MI.
|
120
|
268 unsigned getInstSizeInBytes(const MachineInstr &MI) const override;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
269
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
270 // Return true if MI is a conditional or unconditional branch.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
271 // When returning true, set Cond to the mask of condition-code
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
272 // values on which the instruction will branch, and set Target
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
273 // to the operand that contains the branch target. This target
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
274 // can be a register or a basic block.
|
120
|
275 SystemZII::Branch getBranchInfo(const MachineInstr &MI) const;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
276
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
277 // Get the load and store opcodes for a given register class.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
278 void getLoadStoreOpcodes(const TargetRegisterClass *RC,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
279 unsigned &LoadOpcode, unsigned &StoreOpcode) const;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
280
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
281 // Opcode is the opcode of an instruction that has an address operand,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
282 // and the caller wants to perform that instruction's operation on an
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
283 // address that has displacement Offset. Return the opcode of a suitable
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
284 // instruction (which might be Opcode itself) or 0 if no such instruction
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
285 // exists.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
286 unsigned getOpcodeForOffset(unsigned Opcode, int64_t Offset) const;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
287
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
288 // If Opcode is a load instruction that has a LOAD AND TEST form,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
289 // return the opcode for the testing form, otherwise return 0.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
290 unsigned getLoadAndTest(unsigned Opcode) const;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
291
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
292 // Return true if ROTATE AND ... SELECTED BITS can be used to select bits
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
293 // Mask of the R2 operand, given that only the low BitSize bits of Mask are
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
294 // significant. Set Start and End to the I3 and I4 operands if so.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
295 bool isRxSBGMask(uint64_t Mask, unsigned BitSize,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
296 unsigned &Start, unsigned &End) const;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
297
|
120
|
298 // If Opcode is a COMPARE opcode for which an associated fused COMPARE AND *
|
|
299 // operation exists, return the opcode for the latter, otherwise return 0.
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
300 // MI, if nonnull, is the compare instruction.
|
120
|
301 unsigned getFusedCompare(unsigned Opcode,
|
|
302 SystemZII::FusedCompareType Type,
|
|
303 const MachineInstr *MI = nullptr) const;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
304
|
121
|
305 // If Opcode is a LOAD opcode for with an associated LOAD AND TRAP
|
|
306 // operation exists, returh the opcode for the latter, otherwise return 0.
|
|
307 unsigned getLoadAndTrap(unsigned Opcode) const;
|
|
308
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
309 // Emit code before MBBI in MI to move immediate value Value into
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
310 // physical register Reg.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
311 void loadImmediate(MachineBasicBlock &MBB,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
312 MachineBasicBlock::iterator MBBI,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
313 unsigned Reg, uint64_t Value) const;
|
120
|
314
|
|
315 // Sometimes, it is possible for the target to tell, even without
|
|
316 // aliasing information, that two MIs access different memory
|
|
317 // addresses. This function returns true if two MIs access different
|
|
318 // memory addresses and false otherwise.
|
|
319 bool
|
|
320 areMemAccessesTriviallyDisjoint(MachineInstr &MIa, MachineInstr &MIb,
|
|
321 AliasAnalysis *AA = nullptr) const override;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
322 };
|
121
|
323
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
324 } // end namespace llvm
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
325
|
121
|
326 #endif // LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZINSTRINFO_H
|