LLVM 24.0.0git
MCInstrDesc.h
Go to the documentation of this file.
1//===-- llvm/MC/MCInstrDesc.h - Instruction Descriptors -*- C++ -*-===//
2//
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
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the MCOperandInfo and MCInstrDesc classes, which
10// are used to describe target instructions and their operands.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_MC_MCINSTRDESC_H
15#define LLVM_MC_MCINSTRDESC_H
16
17#include "llvm/ADT/ArrayRef.h"
19#include "llvm/MC/MCRegister.h"
21
22namespace llvm {
23class MCRegisterInfo;
24
25class MCInst;
26
27//===----------------------------------------------------------------------===//
28// Machine Operand Flags and Description
29//===----------------------------------------------------------------------===//
30
31namespace MCOI {
32/// Operand constraints. These are encoded in 16 bits with one of the
33/// low-order 3 bits specifying that a constraint is present and the
34/// corresponding high-order hex digit specifying the constraint value.
35/// This allows for a maximum of 3 constraints.
37 TIED_TO = 0, // Must be allocated the same register as specified value.
38 EARLY_CLOBBER // If present, operand is an early clobber register.
39};
40
41// Define a macro to produce each constraint value.
42#define MCOI_TIED_TO(op) \
43 ((1 << MCOI::TIED_TO) | ((op) << (4 + MCOI::TIED_TO * 4)))
44
45#define MCOI_EARLY_CLOBBER \
46 (1 << MCOI::EARLY_CLOBBER)
47
48/// These are flags set on operands, but should be considered
49/// private, all access should go through the MCOperandInfo accessors.
50/// See the accessors for a description of what these are.
57
58/// Operands are tagged with one of the values of this enum.
83
84} // namespace MCOI
85
86/// This holds information about one operand of a machine instruction,
87/// indicating the register class for register operands, etc.
89public:
90 /// This specifies the register class enumeration of the operand if the
91 /// operand is a register. If LookupRegClassByHwMode is set, then this is an
92 /// index into a table in TargetInstrInfo or MCInstrInfo which contains the
93 /// real register class ID.
94 int16_t RegClass;
95
96 /// These are flags from the MCOI::OperandFlags enum.
98
99 /// Information about the type of the operand.
101
102 /// Operand constraints (see OperandConstraint enum).
104
105 /// Set if this operand is a value that requires the current hwmode to look up
106 /// its register class.
108 return Flags & (1 << MCOI::LookupRegClassByHwMode);
109 }
110
111 /// Set if this is one of the operands that made up of the predicate
112 /// operand that controls an isPredicable() instruction.
113 bool isPredicate() const { return Flags & (1 << MCOI::Predicate); }
114
115 /// Set if this operand is a optional def.
116 bool isOptionalDef() const { return Flags & (1 << MCOI::OptionalDef); }
117
118 /// Set if this operand is a branch target.
119 bool isBranchTarget() const { return Flags & (1 << MCOI::BranchTarget); }
120
125
126 unsigned getGenericTypeIndex() const {
127 assert(isGenericType() && "non-generic types don't have an index");
129 }
130
135
136 unsigned getGenericImmIndex() const {
137 assert(isGenericImm() && "non-generic immediates don't have an index");
139 }
140};
141
142//===----------------------------------------------------------------------===//
143// Machine Instruction Flags and Description
144//===----------------------------------------------------------------------===//
145
195
196/// Describe properties that are true of each instruction in the target
197/// description file. This captures information about side effects, register
198/// use and many other things. There is one instance of this struct for each
199/// target instruction class, and the MachineInstr class points to this struct
200/// directly to describe itself.
202public:
203 // FIXME: Disable copies and moves.
204 // Do not allow MCInstrDescs to be copied or moved. They should only exist in
205 // the <Target>Insts table because they rely on knowing their own address to
206 // find other information elsewhere in the same table.
207
208 uint32_t Opcode; // The opcode number.
209 uint16_t NumOperands; // Num of args (may be more if variable_ops)
210 uint8_t NumDefs; // Num of args that are definitions
211 uint8_t Size; // Number of bytes in encoding.
212 uint16_t SchedClass; // enum identifying instr sched class
213 uint8_t NumImplicitUses; // Num of regs implicitly used
214 uint8_t NumImplicitDefs; // Num of regs implicitly defined
215 uint16_t OpInfoOffset; // Offset to info about operands
216 uint16_t ImplicitOffset; // Offset to start of implicit op list
217 uint64_t Flags; // Flags identifying machine instr class
218 uint64_t TSFlags; // Target Specific Flag values
219
220 /// Returns the value of the specified operand constraint if
221 /// it is present. Returns -1 if it is not present.
222 int getOperandConstraint(unsigned OpNum,
223 MCOI::OperandConstraint Constraint) const {
224 if (OpNum < NumOperands &&
225 (operands()[OpNum].Constraints & (1 << Constraint))) {
226 unsigned ValuePos = 4 + Constraint * 4;
227 return (int)(operands()[OpNum].Constraints >> ValuePos) & 0x0f;
228 }
229 return -1;
230 }
231
232 /// Return the opcode number for this descriptor.
233 unsigned getOpcode() const { return Opcode; }
234
235 /// Return the number of declared MachineOperands for this
236 /// MachineInstruction. Note that variadic (isVariadic() returns true)
237 /// instructions may have additional operands at the end of the list, and note
238 /// that the machine instruction may include implicit register def/uses as
239 /// well.
240 unsigned getNumOperands() const { return NumOperands; }
241
243 auto OpInfo = reinterpret_cast<const MCOperandInfo *>(this + Opcode + 1);
244 return ArrayRef(OpInfo + OpInfoOffset, NumOperands);
245 }
246
247 /// Return the number of MachineOperands that are register
248 /// definitions. Register definitions always occur at the start of the
249 /// machine operand list. This is the number of "outs" in the .td file,
250 /// and does not include implicit defs.
251 unsigned getNumDefs() const { return NumDefs; }
252
253 /// Return flags of this instruction.
254 uint64_t getFlags() const { return Flags; }
255
256 /// \returns true if this instruction is emitted before instruction selection
257 /// and should be legalized/regbankselected/selected.
258 bool isPreISelOpcode() const { return Flags & (1ULL << MCID::PreISelOpcode); }
259
260 /// Return true if this instruction can have a variable number of
261 /// operands. In this case, the variable operands will be after the normal
262 /// operands but before the implicit definitions and uses (if any are
263 /// present).
264 bool isVariadic() const { return Flags & (1ULL << MCID::Variadic); }
265
266 /// Set if this instruction has an optional definition, e.g.
267 /// ARM instructions which can set condition code if 's' bit is set.
268 bool hasOptionalDef() const { return Flags & (1ULL << MCID::HasOptionalDef); }
269
270 /// Return true if this is a pseudo instruction that doesn't
271 /// correspond to a real machine instruction.
272 bool isPseudo() const { return Flags & (1ULL << MCID::Pseudo); }
273
274 /// Return true if this is a meta instruction that doesn't
275 /// produce any output in the form of executable instructions.
276 bool isMetaInstruction() const { return Flags & (1ULL << MCID::Meta); }
277
278 /// Return true if the instruction is a return.
279 bool isReturn() const { return Flags & (1ULL << MCID::Return); }
280
281 /// Return true if the instruction is an add instruction.
282 bool isAdd() const { return Flags & (1ULL << MCID::Add); }
283
284 /// Return true if this instruction is a trap.
285 bool isTrap() const { return Flags & (1ULL << MCID::Trap); }
286
287 /// Return true if the instruction is a register to register move.
288 bool isMoveReg() const { return Flags & (1ULL << MCID::MoveReg); }
289
290 /// Return true if the instruction is a call.
291 bool isCall() const { return Flags & (1ULL << MCID::Call); }
292
293 /// Returns true if the specified instruction stops control flow
294 /// from executing the instruction immediately following it. Examples include
295 /// unconditional branches and return instructions.
296 bool isBarrier() const { return Flags & (1ULL << MCID::Barrier); }
297
298 /// Returns true if this instruction part of the terminator for
299 /// a basic block. Typically this is things like return and branch
300 /// instructions.
301 ///
302 /// Various passes use this to insert code into the bottom of a basic block,
303 /// but before control flow occurs.
304 bool isTerminator() const { return Flags & (1ULL << MCID::Terminator); }
305
306 /// Returns true if this is a conditional, unconditional, or
307 /// indirect branch. Predicates below can be used to discriminate between
308 /// these cases, and the TargetInstrInfo::analyzeBranch method can be used to
309 /// get more information.
310 bool isBranch() const { return Flags & (1ULL << MCID::Branch); }
311
312 /// Return true if this is an indirect branch, such as a
313 /// branch through a register.
314 bool isIndirectBranch() const { return Flags & (1ULL << MCID::IndirectBranch); }
315
316 /// Return true if this is a branch which may fall
317 /// through to the next instruction or may transfer control flow to some other
318 /// block. The TargetInstrInfo::analyzeBranch method can be used to get more
319 /// information about this branch.
320 bool isConditionalBranch() const {
321 return isBranch() && !isBarrier() && !isIndirectBranch();
322 }
323
324 /// Return true if this is a branch which always
325 /// transfers control flow to some other block. The
326 /// TargetInstrInfo::analyzeBranch method can be used to get more information
327 /// about this branch.
329 return isBranch() && isBarrier() && !isIndirectBranch();
330 }
331
332 /// Return true if this is a branch or an instruction which directly
333 /// writes to the program counter. Considered 'may' affect rather than
334 /// 'does' affect as things like predication are not taken into account.
336 const MCRegisterInfo &RI) const;
337
338 /// Return true if this instruction has a predicate operand
339 /// that controls execution. It may be set to 'always', or may be set to other
340 /// values. There are various methods in TargetInstrInfo that can be used to
341 /// control and modify the predicate in this instruction.
342 bool isPredicable() const { return Flags & (1ULL << MCID::Predicable); }
343
344 /// Return true if this instruction is a comparison.
345 bool isCompare() const { return Flags & (1ULL << MCID::Compare); }
346
347 /// Return true if this instruction is a move immediate
348 /// (including conditional moves) instruction.
349 bool isMoveImmediate() const { return Flags & (1ULL << MCID::MoveImm); }
350
351 /// Return true if this instruction is a bitcast instruction.
352 bool isBitcast() const { return Flags & (1ULL << MCID::Bitcast); }
353
354 /// Return true if this is a select instruction.
355 bool isSelect() const { return Flags & (1ULL << MCID::Select); }
356
357 /// Return true if this instruction cannot be safely
358 /// duplicated. For example, if the instruction has a unique labels attached
359 /// to it, duplicating it would cause multiple definition errors.
360 bool isNotDuplicable() const { return Flags & (1ULL << MCID::NotDuplicable); }
361
362 /// Returns true if the specified instruction has a delay slot which
363 /// must be filled by the code generator.
364 bool hasDelaySlot() const { return Flags & (1ULL << MCID::DelaySlot); }
365
366 /// Return true for instructions that can be folded as memory operands
367 /// in other instructions. The most common use for this is instructions that
368 /// are simple loads from memory that don't modify the loaded value in any
369 /// way, but it can also be used for instructions that can be expressed as
370 /// constant-pool loads, such as V_SETALLONES on x86, to allow them to be
371 /// folded when it is beneficial. This should only be set on instructions
372 /// that return a value in their only virtual register definition.
373 bool canFoldAsLoad() const { return Flags & (1ULL << MCID::FoldableAsLoad); }
374
375 /// Return true if this instruction behaves
376 /// the same way as the generic REG_SEQUENCE instructions.
377 /// E.g., on ARM,
378 /// dX VMOVDRR rY, rZ
379 /// is equivalent to
380 /// dX = REG_SEQUENCE rY, ssub_0, rZ, ssub_1.
381 ///
382 /// Note that for the optimizers to be able to take advantage of
383 /// this property, TargetInstrInfo::getRegSequenceLikeInputs has to be
384 /// override accordingly.
385 bool isRegSequenceLike() const { return Flags & (1ULL << MCID::RegSequence); }
386
387 /// Return true if this instruction behaves
388 /// the same way as the generic EXTRACT_SUBREG instructions.
389 /// E.g., on ARM,
390 /// rX, rY VMOVRRD dZ
391 /// is equivalent to two EXTRACT_SUBREG:
392 /// rX = EXTRACT_SUBREG dZ, ssub_0
393 /// rY = EXTRACT_SUBREG dZ, ssub_1
394 ///
395 /// Note that for the optimizers to be able to take advantage of
396 /// this property, TargetInstrInfo::getExtractSubregLikeInputs has to be
397 /// override accordingly.
398 bool isExtractSubregLike() const {
399 return Flags & (1ULL << MCID::ExtractSubreg);
400 }
401
402 /// Return true if this instruction behaves
403 /// the same way as the generic INSERT_SUBREG instructions.
404 /// E.g., on ARM,
405 /// dX = VSETLNi32 dY, rZ, Imm
406 /// is equivalent to a INSERT_SUBREG:
407 /// dX = INSERT_SUBREG dY, rZ, translateImmToSubIdx(Imm)
408 ///
409 /// Note that for the optimizers to be able to take advantage of
410 /// this property, TargetInstrInfo::getInsertSubregLikeInputs has to be
411 /// override accordingly.
412 bool isInsertSubregLike() const { return Flags & (1ULL << MCID::InsertSubreg); }
413
414
415 /// Return true if this instruction is convergent.
416 ///
417 /// Convergent instructions may not be made control-dependent on any
418 /// additional values.
419 bool isConvergent() const { return Flags & (1ULL << MCID::Convergent); }
420
421 /// Return true if variadic operands of this instruction are definitions.
422 bool variadicOpsAreDefs() const {
423 return Flags & (1ULL << MCID::VariadicOpsAreDefs);
424 }
425
426 /// Return true if this instruction authenticates a pointer (e.g. LDRAx/BRAx
427 /// from ARMv8.3, which perform loads/branches with authentication).
428 ///
429 /// An authenticated instruction may fail in an ABI-defined manner when
430 /// operating on an invalid signed pointer.
431 bool isAuthenticated() const {
432 return Flags & (1ULL << MCID::Authenticated);
433 }
434
435 //===--------------------------------------------------------------------===//
436 // Side Effect Analysis
437 //===--------------------------------------------------------------------===//
438
439 /// Return true if this instruction could possibly read memory.
440 /// Instructions with this flag set are not necessarily simple load
441 /// instructions, they may load a value and modify it, for example.
442 bool mayLoad() const { return Flags & (1ULL << MCID::MayLoad); }
443
444 /// Return true if this instruction could possibly modify memory.
445 /// Instructions with this flag set are not necessarily simple store
446 /// instructions, they may store a modified value based on their operands, or
447 /// may not actually modify anything, for example.
448 bool mayStore() const { return Flags & (1ULL << MCID::MayStore); }
449
450 /// Return true if this instruction may raise a floating-point exception.
451 bool mayRaiseFPException() const {
452 return Flags & (1ULL << MCID::MayRaiseFPException);
453 }
454
455 /// Return true if this instruction has side
456 /// effects that are not modeled by other flags. This does not return true
457 /// for instructions whose effects are captured by:
458 ///
459 /// 1. Their operand list and implicit definition/use list. Register use/def
460 /// info is explicit for instructions.
461 /// 2. Memory accesses. Use mayLoad/mayStore.
462 /// 3. Calling, branching, returning: use isCall/isReturn/isBranch.
463 ///
464 /// Examples of side effects would be modifying 'invisible' machine state like
465 /// a control register, flushing a cache, modifying a register invisible to
466 /// LLVM, etc.
468 return Flags & (1ULL << MCID::UnmodeledSideEffects);
469 }
470
471 //===--------------------------------------------------------------------===//
472 // Flags that indicate whether an instruction can be modified by a method.
473 //===--------------------------------------------------------------------===//
474
475 /// Return true if this may be a 2- or 3-address instruction (of the
476 /// form "X = op Y, Z, ..."), which produces the same result if Y and Z are
477 /// exchanged. If this flag is set, then the
478 /// TargetInstrInfo::commuteInstruction method may be used to hack on the
479 /// instruction.
480 ///
481 /// Note that this flag may be set on instructions that are only commutable
482 /// sometimes. In these cases, the call to commuteInstruction will fail.
483 /// Also note that some instructions require non-trivial modification to
484 /// commute them.
485 bool isCommutable() const { return Flags & (1ULL << MCID::Commutable); }
486
487 /// Return true if this is a 2-address instruction which can be changed
488 /// into a 3-address instruction if needed. Doing this transformation can be
489 /// profitable in the register allocator, because it means that the
490 /// instruction can use a 2-address form if possible, but degrade into a less
491 /// efficient form if the source and dest register cannot be assigned to the
492 /// same register. For example, this allows the x86 backend to turn a "shl
493 /// reg, 3" instruction into an LEA instruction, which is the same speed as
494 /// the shift but has bigger code size.
495 ///
496 /// If this returns true, then the target must implement the
497 /// TargetInstrInfo::convertToThreeAddress method for this instruction, which
498 /// is allowed to fail if the transformation isn't valid for this specific
499 /// instruction (e.g. shl reg, 4 on x86).
500 ///
501 bool isConvertibleTo3Addr() const {
502 return Flags & (1ULL << MCID::ConvertibleTo3Addr);
503 }
504
505 /// Return true if this instruction requires custom insertion support
506 /// when the DAG scheduler is inserting it into a machine basic block. If
507 /// this is true for the instruction, it basically means that it is a pseudo
508 /// instruction used at SelectionDAG time that is expanded out into magic code
509 /// by the target when MachineInstrs are formed.
510 ///
511 /// If this is true, the TargetLoweringInfo::InsertAtEndOfBasicBlock method
512 /// is used to insert this into the MachineBasicBlock.
514 return Flags & (1ULL << MCID::UsesCustomInserter);
515 }
516
517 /// Return true if this instruction requires *adjustment* after
518 /// instruction selection by calling a target hook. For example, this can be
519 /// used to fill in ARM 's' optional operand depending on whether the
520 /// conditional flag register is used.
521 bool hasPostISelHook() const { return Flags & (1ULL << MCID::HasPostISelHook); }
522
523 /// Returns true if this instruction is a candidate for remat. This
524 /// flag is only used in TargetInstrInfo method isTriviallyRematerializable.
525 ///
526 /// If this flag is set, the isReMaterializableImpl() method is
527 /// called to verify the instruction is really rematerializable.
528 bool isRematerializable() const {
529 return Flags & (1ULL << MCID::Rematerializable);
530 }
531
532 /// Returns true if this instruction has the same cost (or less) than a
533 /// move instruction. This is useful during certain types of optimizations
534 /// (e.g., remat during two-address conversion or machine licm) where we would
535 /// like to remat or hoist the instruction, but not if it costs more than
536 /// moving the instruction into the appropriate register. Note, we are not
537 /// marking copies from and to the same register class with this flag.
538 ///
539 /// This method could be called by interface TargetInstrInfo::isAsCheapAsAMove
540 /// for different subtargets.
541 bool isAsCheapAsAMove() const { return Flags & (1ULL << MCID::CheapAsAMove); }
542
543 /// Returns true if this instruction source operands have special
544 /// register allocation requirements that are not captured by the operand
545 /// register classes. e.g. ARM::STRD's two source registers must be an even /
546 /// odd pair, ARM::STM registers have to be in ascending order. Post-register
547 /// allocation passes should not attempt to change allocations for sources of
548 /// instructions with this flag.
550 return Flags & (1ULL << MCID::ExtraSrcRegAllocReq);
551 }
552
553 /// Returns true if this instruction def operands have special register
554 /// allocation requirements that are not captured by the operand register
555 /// classes. e.g. ARM::LDRD's two def registers must be an even / odd pair,
556 /// ARM::LDM registers have to be in ascending order. Post-register
557 /// allocation passes should not attempt to change allocations for definitions
558 /// of instructions with this flag.
560 return Flags & (1ULL << MCID::ExtraDefRegAllocReq);
561 }
562
563 /// Return a list of registers that are potentially read by any
564 /// instance of this machine instruction. For example, on X86, the "adc"
565 /// instruction adds two register operands and adds the carry bit in from the
566 /// flags register. In this case, the instruction is marked as implicitly
567 /// reading the flags. Likewise, the variable shift instruction on X86 is
568 /// marked as implicitly reading the 'CL' register, which it always does.
570 auto ImplicitOps =
571 reinterpret_cast<const MCPhysReg *>(this + Opcode + 1) + ImplicitOffset;
572 return {ImplicitOps, NumImplicitUses};
573 }
574
575 /// Return a list of registers that are potentially written by any
576 /// instance of this machine instruction. For example, on X86, many
577 /// instructions implicitly set the flags register. In this case, they are
578 /// marked as setting the FLAGS. Likewise, many instructions always deposit
579 /// their result in a physical register. For example, the X86 divide
580 /// instruction always deposits the quotient and remainder in the EAX/EDX
581 /// registers. For that instruction, this will return a list containing the
582 /// EAX/EDX/EFLAGS registers.
584 auto ImplicitOps =
585 reinterpret_cast<const MCPhysReg *>(this + Opcode + 1) + ImplicitOffset;
586 return {ImplicitOps + NumImplicitUses, NumImplicitDefs};
587 }
588
589 /// Return true if this instruction implicitly
590 /// uses the specified physical register.
594
595 /// Return true if this instruction implicitly
596 /// defines the specified physical register.
597 LLVM_ABI bool
599 const MCRegisterInfo *MRI = nullptr) const;
600
601 /// Return the scheduling class for this instruction. The
602 /// scheduling class is an index into the InstrItineraryData table. This
603 /// returns zero if there is no known scheduling information for the
604 /// instruction.
605 unsigned getSchedClass() const { return SchedClass; }
606
607 /// Return the number of bytes in the encoding of this instruction,
608 /// or zero if the encoding size cannot be known from the opcode.
609 unsigned getSize() const { return Size; }
610
611 /// Find the index of the first operand in the
612 /// operand list that is used to represent the predicate. It returns -1 if
613 /// none is found.
615 if (isPredicable()) {
616 for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
617 if (operands()[i].isPredicate())
618 return i;
619 }
620 return -1;
621 }
622
623 /// Return true if this instruction explicitly defines the specified physical
624 /// register.
626 const MCRegisterInfo &RI) const;
627
628 /// Return true if this instruction defines the specified physical
629 /// register, either explicitly or implicitly.
631 const MCRegisterInfo &RI) const;
632};
633
634} // end namespace llvm
635
636#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
unsigned uint64_t
#define LLVM_ABI
Definition Compiler.h:215
IRTranslator LLVM IR MI
Register Reg
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
Instances of this class represent a single low-level machine instruction.
Definition MCInst.h:188
Describe properties that are true of each instruction in the target description file.
unsigned getSchedClass() const
Return the scheduling class for this instruction.
uint64_t getFlags() const
Return flags of this instruction.
unsigned getNumOperands() const
Return the number of declared MachineOperands for this MachineInstruction.
ArrayRef< MCOperandInfo > operands() const
bool isInsertSubregLike() const
Return true if this instruction behaves the same way as the generic INSERT_SUBREG instructions.
bool mayStore() const
Return true if this instruction could possibly modify memory.
bool isBitcast() const
Return true if this instruction is a bitcast instruction.
uint8_t NumImplicitUses
bool isIndirectBranch() const
Return true if this is an indirect branch, such as a branch through a register.
int findFirstPredOperandIdx() const
Find the index of the first operand in the operand list that is used to represent the predicate.
bool usesCustomInsertionHook() const
Return true if this instruction requires custom insertion support when the DAG scheduler is inserting...
bool isBarrier() const
Returns true if the specified instruction stops control flow from executing the instruction immediate...
bool isSelect() const
Return true if this is a select instruction.
bool isAsCheapAsAMove() const
Returns true if this instruction has the same cost (or less) than a move instruction.
bool mayLoad() const
Return true if this instruction could possibly read memory.
bool hasOptionalDef() const
Set if this instruction has an optional definition, e.g.
unsigned getNumDefs() const
Return the number of MachineOperands that are register definitions.
bool isConvergent() const
Return true if this instruction is convergent.
bool canFoldAsLoad() const
Return true for instructions that can be folded as memory operands in other instructions.
bool isMoveReg() const
Return true if the instruction is a register to register move.
LLVM_ABI bool hasDefOfPhysReg(const MCInst &MI, MCRegister Reg, const MCRegisterInfo &RI) const
Return true if this instruction defines the specified physical register, either explicitly or implici...
LLVM_ABI bool mayAffectControlFlow(const MCInst &MI, const MCRegisterInfo &RI) const
Return true if this is a branch or an instruction which directly writes to the program counter.
bool isRematerializable() const
Returns true if this instruction is a candidate for remat.
bool isCompare() const
Return true if this instruction is a comparison.
bool isMetaInstruction() const
Return true if this is a meta instruction that doesn't produce any output in the form of executable i...
bool isBranch() const
Returns true if this is a conditional, unconditional, or indirect branch.
bool variadicOpsAreDefs() const
Return true if variadic operands of this instruction are definitions.
int getOperandConstraint(unsigned OpNum, MCOI::OperandConstraint Constraint) const
Returns the value of the specified operand constraint if it is present.
bool hasExtraDefRegAllocReq() const
Returns true if this instruction def operands have special register allocation requirements that are ...
bool mayRaiseFPException() const
Return true if this instruction may raise a floating-point exception.
ArrayRef< MCPhysReg > implicit_defs() const
Return a list of registers that are potentially written by any instance of this machine instruction.
bool isUnconditionalBranch() const
Return true if this is a branch which always transfers control flow to some other block.
bool isPredicable() const
Return true if this instruction has a predicate operand that controls execution.
bool isCommutable() const
Return true if this may be a 2- or 3-address instruction (of the form "X = op Y, Z,...
uint8_t NumImplicitDefs
bool isNotDuplicable() const
Return true if this instruction cannot be safely duplicated.
bool hasUnmodeledSideEffects() const
Return true if this instruction has side effects that are not modeled by other flags.
uint16_t ImplicitOffset
bool hasPostISelHook() const
Return true if this instruction requires adjustment after instruction selection by calling a target h...
bool isExtractSubregLike() const
Return true if this instruction behaves the same way as the generic EXTRACT_SUBREG instructions.
bool isCall() const
Return true if the instruction is a call.
bool isConvertibleTo3Addr() const
Return true if this is a 2-address instruction which can be changed into a 3-address instruction if n...
bool isTerminator() const
Returns true if this instruction part of the terminator for a basic block.
bool hasDelaySlot() const
Returns true if the specified instruction has a delay slot which must be filled by the code generator...
bool isReturn() const
Return true if the instruction is a return.
unsigned getSize() const
Return the number of bytes in the encoding of this instruction, or zero if the encoding size cannot b...
bool isAdd() const
Return true if the instruction is an add instruction.
uint16_t OpInfoOffset
bool isVariadic() const
Return true if this instruction can have a variable number of operands.
bool isTrap() const
Return true if this instruction is a trap.
bool hasImplicitUseOfPhysReg(MCRegister Reg) const
Return true if this instruction implicitly uses the specified physical register.
bool isMoveImmediate() const
Return true if this instruction is a move immediate (including conditional moves) instruction.
bool isPreISelOpcode() const
bool isConditionalBranch() const
Return true if this is a branch which may fall through to the next instruction or may transfer contro...
ArrayRef< MCPhysReg > implicit_uses() const
Return a list of registers that are potentially read by any instance of this machine instruction.
bool isAuthenticated() const
Return true if this instruction authenticates a pointer (e.g.
LLVM_ABI bool hasExplicitDefOfPhysReg(const MCInst &MI, MCRegister Reg, const MCRegisterInfo &RI) const
Return true if this instruction explicitly defines the specified physical register.
unsigned getOpcode() const
Return the opcode number for this descriptor.
bool isPseudo() const
Return true if this is a pseudo instruction that doesn't correspond to a real machine instruction.
bool isRegSequenceLike() const
Return true if this instruction behaves the same way as the generic REG_SEQUENCE instructions.
bool hasExtraSrcRegAllocReq() const
Returns true if this instruction source operands have special register allocation requirements that a...
LLVM_ABI bool hasImplicitDefOfPhysReg(MCRegister Reg, const MCRegisterInfo *MRI=nullptr) const
Return true if this instruction implicitly defines the specified physical register.
This holds information about one operand of a machine instruction, indicating the register class for ...
Definition MCInstrDesc.h:88
unsigned getGenericTypeIndex() const
bool isOptionalDef() const
Set if this operand is a optional def.
unsigned getGenericImmIndex() const
bool isBranchTarget() const
Set if this operand is a branch target.
uint16_t Constraints
Operand constraints (see OperandConstraint enum).
uint8_t OperandType
Information about the type of the operand.
bool isLookupRegClassByHwMode() const
Set if this operand is a value that requires the current hwmode to look up its register class.
uint8_t Flags
These are flags from the MCOI::OperandFlags enum.
Definition MCInstrDesc.h:97
bool isGenericImm() const
int16_t RegClass
This specifies the register class enumeration of the operand if the operand is a register.
Definition MCInstrDesc.h:94
bool isGenericType() const
bool isPredicate() const
Set if this is one of the operands that made up of the predicate operand that controls an isPredicabl...
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:41
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
Flag
These should be considered private to the implementation of the MCInstrDesc class.
@ ExtraDefRegAllocReq
@ MayRaiseFPException
@ ExtraSrcRegAllocReq
@ UnmodeledSideEffects
OperandFlags
These are flags set on operands, but should be considered private, all access should go through the M...
Definition MCInstrDesc.h:51
@ LookupRegClassByHwMode
Definition MCInstrDesc.h:52
OperandConstraint
Operand constraints.
Definition MCInstrDesc.h:36
OperandType
Operands are tagged with one of the values of this enum.
Definition MCInstrDesc.h:59
@ OPERAND_GENERIC_4
Definition MCInstrDesc.h:71
@ OPERAND_GENERIC_IMM_2
Definition MCInstrDesc.h:78
@ OPERAND_GENERIC_2
Definition MCInstrDesc.h:69
@ OPERAND_GENERIC_1
Definition MCInstrDesc.h:68
@ OPERAND_FIRST_TARGET
Definition MCInstrDesc.h:81
@ OPERAND_GENERIC_IMM_0
Definition MCInstrDesc.h:76
@ OPERAND_GENERIC_3
Definition MCInstrDesc.h:70
@ OPERAND_IMMEDIATE
Definition MCInstrDesc.h:61
@ OPERAND_LAST_GENERIC
Definition MCInstrDesc.h:73
@ OPERAND_FIRST_GENERIC
Definition MCInstrDesc.h:66
@ OPERAND_GENERIC_0
Definition MCInstrDesc.h:67
@ OPERAND_GENERIC_5
Definition MCInstrDesc.h:72
@ OPERAND_FIRST_GENERIC_IMM
Definition MCInstrDesc.h:75
@ OPERAND_GENERIC_IMM_1
Definition MCInstrDesc.h:77
@ OPERAND_LAST_GENERIC_IMM
Definition MCInstrDesc.h:79
This is an optimization pass for GlobalISel generic memory operations.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
ArrayRef(const T &OneElt) -> ArrayRef< T >
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1947