LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
X86BaseInfo.h
Go to the documentation of this file.
1 //===-- X86BaseInfo.h - Top level definitions for X86 -------- --*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains small standalone helper functions and enum definitions for
11 // the X86 target useful for the compiler back-end and the MC libraries.
12 // As such, it deliberately does not include references to LLVM core
13 // code gen types, passes, etc..
14 //
15 //===----------------------------------------------------------------------===//
16 
17 #ifndef X86BASEINFO_H
18 #define X86BASEINFO_H
19 
20 #include "X86MCTargetDesc.h"
21 #include "llvm/Support/DataTypes.h"
23 #include "llvm/MC/MCInstrInfo.h"
24 
25 namespace llvm {
26 
27 namespace X86 {
28  // Enums for memory operand decoding. Each memory operand is represented with
29  // a 5 operand sequence in the form:
30  // [BaseReg, ScaleAmt, IndexReg, Disp, Segment]
31  // These enums help decode this.
32  enum {
36  AddrDisp = 3,
37 
38  /// AddrSegmentReg - The operand # of the segment in the memory operand.
40 
41  /// AddrNumOperands - Total number of operands in a memory reference.
43  };
44 } // end namespace X86;
45 
46 /// X86II - This namespace holds all of the target specific flags that
47 /// instruction info tracks.
48 ///
49 namespace X86II {
50  /// Target Operand Flag enum.
51  enum TOF {
52  //===------------------------------------------------------------------===//
53  // X86 Specific MachineOperand flags.
54 
56 
57  /// MO_GOT_ABSOLUTE_ADDRESS - On a symbol operand, this represents a
58  /// relocation of:
59  /// SYMBOL_LABEL + [. - PICBASELABEL]
61 
62  /// MO_PIC_BASE_OFFSET - On a symbol operand this indicates that the
63  /// immediate should get the value of the symbol minus the PIC base label:
64  /// SYMBOL_LABEL - PICBASELABEL
66 
67  /// MO_GOT - On a symbol operand this indicates that the immediate is the
68  /// offset to the GOT entry for the symbol name from the base of the GOT.
69  ///
70  /// See the X86-64 ELF ABI supplement for more details.
71  /// SYMBOL_LABEL @GOT
73 
74  /// MO_GOTOFF - On a symbol operand this indicates that the immediate is
75  /// the offset to the location of the symbol name from the base of the GOT.
76  ///
77  /// See the X86-64 ELF ABI supplement for more details.
78  /// SYMBOL_LABEL @GOTOFF
80 
81  /// MO_GOTPCREL - On a symbol operand this indicates that the immediate is
82  /// offset to the GOT entry for the symbol name from the current code
83  /// location.
84  ///
85  /// See the X86-64 ELF ABI supplement for more details.
86  /// SYMBOL_LABEL @GOTPCREL
88 
89  /// MO_PLT - On a symbol operand this indicates that the immediate is
90  /// offset to the PLT entry of symbol name from the current code location.
91  ///
92  /// See the X86-64 ELF ABI supplement for more details.
93  /// SYMBOL_LABEL @PLT
95 
96  /// MO_TLSGD - On a symbol operand this indicates that the immediate is
97  /// the offset of the GOT entry with the TLS index structure that contains
98  /// the module number and variable offset for the symbol. Used in the
99  /// general dynamic TLS access model.
100  ///
101  /// See 'ELF Handling for Thread-Local Storage' for more details.
102  /// SYMBOL_LABEL @TLSGD
104 
105  /// MO_TLSLD - On a symbol operand this indicates that the immediate is
106  /// the offset of the GOT entry with the TLS index for the module that
107  /// contains the symbol. When this index is passed to a call to
108  /// __tls_get_addr, the function will return the base address of the TLS
109  /// block for the symbol. Used in the x86-64 local dynamic TLS access model.
110  ///
111  /// See 'ELF Handling for Thread-Local Storage' for more details.
112  /// SYMBOL_LABEL @TLSLD
114 
115  /// MO_TLSLDM - On a symbol operand this indicates that the immediate is
116  /// the offset of the GOT entry with the TLS index for the module that
117  /// contains the symbol. When this index is passed to a call to
118  /// ___tls_get_addr, the function will return the base address of the TLS
119  /// block for the symbol. Used in the IA32 local dynamic TLS access model.
120  ///
121  /// See 'ELF Handling for Thread-Local Storage' for more details.
122  /// SYMBOL_LABEL @TLSLDM
124 
125  /// MO_GOTTPOFF - On a symbol operand this indicates that the immediate is
126  /// the offset of the GOT entry with the thread-pointer offset for the
127  /// symbol. Used in the x86-64 initial exec TLS access model.
128  ///
129  /// See 'ELF Handling for Thread-Local Storage' for more details.
130  /// SYMBOL_LABEL @GOTTPOFF
132 
133  /// MO_INDNTPOFF - On a symbol operand this indicates that the immediate is
134  /// the absolute address of the GOT entry with the negative thread-pointer
135  /// offset for the symbol. Used in the non-PIC IA32 initial exec TLS access
136  /// model.
137  ///
138  /// See 'ELF Handling for Thread-Local Storage' for more details.
139  /// SYMBOL_LABEL @INDNTPOFF
141 
142  /// MO_TPOFF - On a symbol operand this indicates that the immediate is
143  /// the thread-pointer offset for the symbol. Used in the x86-64 local
144  /// exec TLS access model.
145  ///
146  /// See 'ELF Handling for Thread-Local Storage' for more details.
147  /// SYMBOL_LABEL @TPOFF
149 
150  /// MO_DTPOFF - On a symbol operand this indicates that the immediate is
151  /// the offset of the GOT entry with the TLS offset of the symbol. Used
152  /// in the local dynamic TLS access model.
153  ///
154  /// See 'ELF Handling for Thread-Local Storage' for more details.
155  /// SYMBOL_LABEL @DTPOFF
157 
158  /// MO_NTPOFF - On a symbol operand this indicates that the immediate is
159  /// the negative thread-pointer offset for the symbol. Used in the IA32
160  /// local exec TLS access model.
161  ///
162  /// See 'ELF Handling for Thread-Local Storage' for more details.
163  /// SYMBOL_LABEL @NTPOFF
165 
166  /// MO_GOTNTPOFF - On a symbol operand this indicates that the immediate is
167  /// the offset of the GOT entry with the negative thread-pointer offset for
168  /// the symbol. Used in the PIC IA32 initial exec TLS access model.
169  ///
170  /// See 'ELF Handling for Thread-Local Storage' for more details.
171  /// SYMBOL_LABEL @GOTNTPOFF
173 
174  /// MO_DLLIMPORT - On a symbol operand "FOO", this indicates that the
175  /// reference is actually to the "__imp_FOO" symbol. This is used for
176  /// dllimport linkage on windows.
178 
179  /// MO_DARWIN_STUB - On a symbol operand "FOO", this indicates that the
180  /// reference is actually to the "FOO$stub" symbol. This is used for calls
181  /// and jumps to external functions on Tiger and earlier.
183 
184  /// MO_DARWIN_NONLAZY - On a symbol operand "FOO", this indicates that the
185  /// reference is actually to the "FOO$non_lazy_ptr" symbol, which is a
186  /// non-PIC-base-relative reference to a non-hidden dyld lazy pointer stub.
188 
189  /// MO_DARWIN_NONLAZY_PIC_BASE - On a symbol operand "FOO", this indicates
190  /// that the reference is actually to "FOO$non_lazy_ptr - PICBASE", which is
191  /// a PIC-base-relative reference to a non-hidden dyld lazy pointer stub.
193 
194  /// MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE - On a symbol operand "FOO", this
195  /// indicates that the reference is actually to "FOO$non_lazy_ptr -PICBASE",
196  /// which is a PIC-base-relative reference to a hidden dyld lazy pointer
197  /// stub.
199 
200  /// MO_TLVP - On a symbol operand this indicates that the immediate is
201  /// some TLS offset.
202  ///
203  /// This is the TLS offset for the Darwin TLS mechanism.
205 
206  /// MO_TLVP_PIC_BASE - On a symbol operand this indicates that the immediate
207  /// is some TLS offset from the picbase.
208  ///
209  /// This is the 32-bit TLS offset for Darwin TLS in PIC mode.
211 
212  /// MO_SECREL - On a symbol operand this indicates that the immediate is
213  /// the offset from beginning of section.
214  ///
215  /// This is the TLS offset for the COFF/Windows TLS mechanism.
217  };
218 
219  enum {
220  //===------------------------------------------------------------------===//
221  // Instruction encodings. These are the standard/most common forms for X86
222  // instructions.
223  //
224 
225  // PseudoFrm - This represents an instruction that is a pseudo instruction
226  // or one that has not been implemented yet. It is illegal to code generate
227  // it, but tolerated for intermediate implementation stages.
228  Pseudo = 0,
229 
230  /// Raw - This form is for instructions that don't have any operands, so
231  /// they are just a fixed opcode value, like 'leave'.
232  RawFrm = 1,
233 
234  /// AddRegFrm - This form is used for instructions like 'push r32' that have
235  /// their one register operand added to their opcode.
237 
238  /// MRMDestReg - This form is used for instructions that use the Mod/RM byte
239  /// to specify a destination, which in this case is a register.
240  ///
242 
243  /// MRMDestMem - This form is used for instructions that use the Mod/RM byte
244  /// to specify a destination, which in this case is memory.
245  ///
247 
248  /// MRMSrcReg - This form is used for instructions that use the Mod/RM byte
249  /// to specify a source, which in this case is a register.
250  ///
252 
253  /// MRMSrcMem - This form is used for instructions that use the Mod/RM byte
254  /// to specify a source, which in this case is memory.
255  ///
257 
258  /// MRM[0-7][rm] - These forms are used to represent instructions that use
259  /// a Mod/RM byte, and use the middle field to hold extended opcode
260  /// information. In the intel manual these are represented as /0, /1, ...
261  ///
262 
263  // First, instructions that operate on a register r/m operand...
264  MRM0r = 16, MRM1r = 17, MRM2r = 18, MRM3r = 19, // Format /0 /1 /2 /3
265  MRM4r = 20, MRM5r = 21, MRM6r = 22, MRM7r = 23, // Format /4 /5 /6 /7
266 
267  // Next, instructions that operate on a memory r/m operand...
268  MRM0m = 24, MRM1m = 25, MRM2m = 26, MRM3m = 27, // Format /0 /1 /2 /3
269  MRM4m = 28, MRM5m = 29, MRM6m = 30, MRM7m = 31, // Format /4 /5 /6 /7
270 
271  // MRMInitReg - This form is used for instructions whose source and
272  // destinations are the same register.
274 
275  //// MRM_XX - A mod/rm byte of exactly 0xXX.
276  MRM_C1 = 33, MRM_C2 = 34, MRM_C3 = 35, MRM_C4 = 36,
277  MRM_C8 = 37, MRM_C9 = 38, MRM_CA = 39, MRM_CB = 40,
278  MRM_E8 = 41, MRM_F0 = 42, MRM_F8 = 45, MRM_F9 = 46,
279  MRM_D0 = 47, MRM_D1 = 48, MRM_D4 = 49, MRM_D5 = 50,
280  MRM_D6 = 51, MRM_D8 = 52, MRM_D9 = 53, MRM_DA = 54,
281  MRM_DB = 55, MRM_DC = 56, MRM_DD = 57, MRM_DE = 58,
282  MRM_DF = 59,
283 
284  /// RawFrmImm8 - This is used for the ENTER instruction, which has two
285  /// immediates, the first of which is a 16-bit immediate (specified by
286  /// the imm encoding) and the second is a 8-bit fixed value.
288 
289  /// RawFrmImm16 - This is used for CALL FAR instructions, which have two
290  /// immediates, the first of which is a 16 or 32-bit immediate (specified by
291  /// the imm encoding) and the second is a 16-bit fixed value. In the AMD
292  /// manual, this operand is described as pntr16:32 and pntr16:16
294 
295  FormMask = 63,
296 
297  //===------------------------------------------------------------------===//
298  // Actual flags...
299 
300  // OpSize - Set if this instruction requires an operand size prefix (0x66),
301  // which most often indicates that the instruction operates on 16 bit data
302  // instead of 32 bit data.
303  OpSize = 1 << 6,
304 
305  // AsSize - Set if this instruction requires an operand size prefix (0x67),
306  // which most often indicates that the instruction address 16 bit address
307  // instead of 32 bit address (or 32 bit address in 64 bit mode).
308  AdSize = 1 << 7,
309 
310  //===------------------------------------------------------------------===//
311  // Op0Mask - There are several prefix bytes that are used to form two byte
312  // opcodes. These are currently 0x0F, 0xF3, and 0xD8-0xDF. This mask is
313  // used to obtain the setting of this field. If no bits in this field is
314  // set, there is no prefix byte for obtaining a multibyte opcode.
315  //
316  Op0Shift = 8,
317  Op0Mask = 0x1F << Op0Shift,
318 
319  // TB - TwoByte - Set if this instruction has a two byte opcode, which
320  // starts with a 0x0F byte before the real opcode.
321  TB = 1 << Op0Shift,
322 
323  // REP - The 0xF3 prefix byte indicating repetition of the following
324  // instruction.
325  REP = 2 << Op0Shift,
326 
327  // D8-DF - These escape opcodes are used by the floating point unit. These
328  // values must remain sequential.
329  D8 = 3 << Op0Shift, D9 = 4 << Op0Shift,
330  DA = 5 << Op0Shift, DB = 6 << Op0Shift,
331  DC = 7 << Op0Shift, DD = 8 << Op0Shift,
332  DE = 9 << Op0Shift, DF = 10 << Op0Shift,
333 
334  // XS, XD - These prefix codes are for single and double precision scalar
335  // floating point operations performed in the SSE registers.
336  XD = 11 << Op0Shift, XS = 12 << Op0Shift,
337 
338  // T8, TA, A6, A7 - Prefix after the 0x0F prefix.
339  T8 = 13 << Op0Shift, TA = 14 << Op0Shift,
340  A6 = 15 << Op0Shift, A7 = 16 << Op0Shift,
341 
342  // T8XD - Prefix before and after 0x0F. Combination of T8 and XD.
343  T8XD = 17 << Op0Shift,
344 
345  // T8XS - Prefix before and after 0x0F. Combination of T8 and XS.
346  T8XS = 18 << Op0Shift,
347 
348  // TAXD - Prefix before and after 0x0F. Combination of TA and XD.
349  TAXD = 19 << Op0Shift,
350 
351  // XOP8 - Prefix to include use of imm byte.
352  XOP8 = 20 << Op0Shift,
353 
354  // XOP9 - Prefix to exclude use of imm byte.
355  XOP9 = 21 << Op0Shift,
356 
357  // XOPA - Prefix to encode 0xA in VEX.MMMM of XOP instructions.
358  XOPA = 22 << Op0Shift,
359 
360  //===------------------------------------------------------------------===//
361  // REX_W - REX prefixes are instruction prefixes used in 64-bit mode.
362  // They are used to specify GPRs and SSE registers, 64-bit operand size,
363  // etc. We only cares about REX.W and REX.R bits and only the former is
364  // statically determined.
365  //
367  REX_W = 1 << REXShift,
368 
369  //===------------------------------------------------------------------===//
370  // This three-bit field describes the size of an immediate operand. Zero is
371  // unused so that we can tell if we forgot to set a value.
374  Imm8 = 1 << ImmShift,
376  Imm16 = 3 << ImmShift,
378  Imm32 = 5 << ImmShift,
380  Imm64 = 7 << ImmShift,
381 
382  //===------------------------------------------------------------------===//
383  // FP Instruction Classification... Zero is non-fp instruction.
384 
385  // FPTypeMask - Mask for all of the FP types...
388 
389  // NotFP - The default, set for instructions that do not use FP registers.
391 
392  // ZeroArgFP - 0 arg FP instruction which implicitly pushes ST(0), f.e. fld0
394 
395  // OneArgFP - 1 arg FP instructions which implicitly read ST(0), such as fst
397 
398  // OneArgFPRW - 1 arg FP instruction which implicitly read ST(0) and write a
399  // result back to ST(0). For example, fcos, fsqrt, etc.
400  //
402 
403  // TwoArgFP - 2 arg FP instructions which implicitly read ST(0), and an
404  // explicit argument, storing the result to either ST(0) or the implicit
405  // argument. For example: fadd, fsub, fmul, etc...
407 
408  // CompareFP - 2 arg FP instructions which implicitly read ST(0) and an
409  // explicit argument, but have no destination. Example: fucom, fucomi, ...
411 
412  // CondMovFP - "2 operand" floating point conditional move instructions.
414 
415  // SpecialFP - Special instruction forms. Dispatch by opcode explicitly.
417 
418  // Lock prefix
420  LOCK = 1 << LOCKShift,
421 
422  // Segment override prefixes. Currently we just need ability to address
423  // stuff in gs and fs segments.
426  FS = 1 << SegOvrShift,
427  GS = 2 << SegOvrShift,
428 
429  // Execution domain for SSE instructions in bits 23, 24.
430  // 0 in bits 23-24 means normal, non-SSE instruction.
432 
434 
435  //===------------------------------------------------------------------===//
436  /// VEX - The opcode prefix used by AVX instructions
438  VEX = 1U << 0,
439 
440  /// VEX_W - Has a opcode specific functionality, but is used in the same
441  /// way as REX_W is for regular SSE instructions.
442  VEX_W = 1U << 1,
443 
444  /// VEX_4V - Used to specify an additional AVX/SSE register. Several 2
445  /// address instructions in SSE are represented as 3 address ones in AVX
446  /// and the additional register is encoded in VEX_VVVV prefix.
447  VEX_4V = 1U << 2,
448 
449  /// VEX_4VOp3 - Similar to VEX_4V, but used on instructions that encode
450  /// operand 3 with VEX.vvvv.
451  VEX_4VOp3 = 1U << 3,
452 
453  /// VEX_I8IMM - Specifies that the last register used in a AVX instruction,
454  /// must be encoded in the i8 immediate field. This usually happens in
455  /// instructions with 4 operands.
456  VEX_I8IMM = 1U << 4,
457 
458  /// VEX_L - Stands for a bit in the VEX opcode prefix meaning the current
459  /// instruction uses 256-bit wide registers. This is usually auto detected
460  /// if a VR256 register is used, but some AVX instructions also have this
461  /// field marked when using a f256 memory references.
462  VEX_L = 1U << 5,
463 
464  // VEX_LIG - Specifies that this instruction ignores the L-bit in the VEX
465  // prefix. Usually used for scalar instructions. Needed by disassembler.
466  VEX_LIG = 1U << 6,
467 
468  // TODO: we should combine VEX_L and VEX_LIG together to form a 2-bit field
469  // with following encoding:
470  // - 00 V128
471  // - 01 V256
472  // - 10 V512
473  // - 11 LIG (but, in insn encoding, leave VEX.L and EVEX.L in zeros.
474  // this will save 1 tsflag bit
475 
476  // VEX_EVEX - Specifies that this instruction use EVEX form which provides
477  // syntax support up to 32 512-bit register operands and up to 7 16-bit
478  // mask operands as well as source operand data swizzling/memory operand
479  // conversion, eviction hint, and rounding mode.
480  EVEX = 1U << 7,
481 
482  // EVEX_K - Set if this instruction requires masking
483  EVEX_K = 1U << 8,
484 
485  // EVEX_Z - Set if this instruction has EVEX.Z field set.
486  EVEX_Z = 1U << 9,
487 
488  // EVEX_L2 - Set if this instruction has EVEX.L' field set.
489  EVEX_L2 = 1U << 10,
490 
491  // EVEX_B - Set if this instruction has EVEX.B field set.
492  EVEX_B = 1U << 11,
493 
494  // EVEX_CD8E - compressed disp8 form, element-size
497 
498  // EVEX_CD8V - compressed disp8 form, vector-width
501 
502  /// Has3DNow0F0FOpcode - This flag indicates that the instruction uses the
503  /// wacky 0x0F 0x0F prefix for 3DNow! instructions. The manual documents
504  /// this as having a 0x0F prefix with a 0x0F opcode, and each instruction
505  /// storing a classifier in the imm8 field. To simplify our implementation,
506  /// we handle this by storeing the classifier in the opcode field and using
507  /// this flag to indicate that the encoder should do the wacky 3DNow! thing.
508  Has3DNow0F0FOpcode = 1U << 17,
509 
510  /// MemOp4 - Used to indicate swapping of operand 3 and 4 to be encoded in
511  /// ModRM or I8IMM. This is used for FMA4 and XOP instructions.
512  MemOp4 = 1U << 18,
513 
514  /// XOP - Opcode prefix used by XOP instructions.
515  XOP = 1U << 19
516 
517  };
518 
519  // getBaseOpcodeFor - This function returns the "base" X86 opcode for the
520  // specified machine instruction.
521  //
522  inline unsigned char getBaseOpcodeFor(uint64_t TSFlags) {
523  return TSFlags >> X86II::OpcodeShift;
524  }
525 
526  inline bool hasImm(uint64_t TSFlags) {
527  return (TSFlags & X86II::ImmMask) != 0;
528  }
529 
530  /// getSizeOfImm - Decode the "size of immediate" field from the TSFlags field
531  /// of the specified instruction.
532  inline unsigned getSizeOfImm(uint64_t TSFlags) {
533  switch (TSFlags & X86II::ImmMask) {
534  default: llvm_unreachable("Unknown immediate size");
535  case X86II::Imm8:
536  case X86II::Imm8PCRel: return 1;
537  case X86II::Imm16:
538  case X86II::Imm16PCRel: return 2;
539  case X86II::Imm32:
540  case X86II::Imm32PCRel: return 4;
541  case X86II::Imm64: return 8;
542  }
543  }
544 
545  /// isImmPCRel - Return true if the immediate of the specified instruction's
546  /// TSFlags indicates that it is pc relative.
547  inline unsigned isImmPCRel(uint64_t TSFlags) {
548  switch (TSFlags & X86II::ImmMask) {
549  default: llvm_unreachable("Unknown immediate size");
550  case X86II::Imm8PCRel:
551  case X86II::Imm16PCRel:
552  case X86II::Imm32PCRel:
553  return true;
554  case X86II::Imm8:
555  case X86II::Imm16:
556  case X86II::Imm32:
557  case X86II::Imm64:
558  return false;
559  }
560  }
561 
562  /// getOperandBias - compute any additional adjustment needed to
563  /// the offset to the start of the memory operand
564  /// in this instruction.
565  /// If this is a two-address instruction,skip one of the register operands.
566  /// FIXME: This should be handled during MCInst lowering.
567  inline int getOperandBias(const MCInstrDesc& Desc)
568  {
569  unsigned NumOps = Desc.getNumOperands();
570  unsigned CurOp = 0;
571  if (NumOps > 1 && Desc.getOperandConstraint(1, MCOI::TIED_TO) == 0)
572  ++CurOp;
573  else if (NumOps > 3 && Desc.getOperandConstraint(2, MCOI::TIED_TO) == 0 &&
574  Desc.getOperandConstraint(3, MCOI::TIED_TO) == 1)
575  // Special case for AVX-512 GATHER with 2 TIED_TO operands
576  // Skip the first 2 operands: dst, mask_wb
577  CurOp += 2;
578  else if (NumOps > 3 && Desc.getOperandConstraint(2, MCOI::TIED_TO) == 0 &&
579  Desc.getOperandConstraint(NumOps - 1, MCOI::TIED_TO) == 1)
580  // Special case for GATHER with 2 TIED_TO operands
581  // Skip the first 2 operands: dst, mask_wb
582  CurOp += 2;
583  else if (NumOps > 2 && Desc.getOperandConstraint(NumOps - 2, MCOI::TIED_TO) == 0)
584  // SCATTER
585  ++CurOp;
586  return CurOp;
587  }
588 
589  /// getMemoryOperandNo - The function returns the MCInst operand # for the
590  /// first field of the memory operand. If the instruction doesn't have a
591  /// memory operand, this returns -1.
592  ///
593  /// Note that this ignores tied operands. If there is a tied register which
594  /// is duplicated in the MCInst (e.g. "EAX = addl EAX, [mem]") it is only
595  /// counted as one operand.
596  ///
597  inline int getMemoryOperandNo(uint64_t TSFlags, unsigned Opcode) {
598  switch (TSFlags & X86II::FormMask) {
599  case X86II::MRMInitReg:
600  // FIXME: Remove this form.
601  return -1;
602  default: llvm_unreachable("Unknown FormMask value in getMemoryOperandNo!");
603  case X86II::Pseudo:
604  case X86II::RawFrm:
605  case X86II::AddRegFrm:
606  case X86II::MRMDestReg:
607  case X86II::MRMSrcReg:
608  case X86II::RawFrmImm8:
609  case X86II::RawFrmImm16:
610  return -1;
611  case X86II::MRMDestMem:
612  return 0;
613  case X86II::MRMSrcMem: {
614  bool HasVEX_4V = (TSFlags >> X86II::VEXShift) & X86II::VEX_4V;
615  bool HasMemOp4 = (TSFlags >> X86II::VEXShift) & X86II::MemOp4;
616  bool HasEVEX = (TSFlags >> X86II::VEXShift) & X86II::EVEX;
617  bool HasEVEX_K = HasEVEX && ((TSFlags >> X86II::VEXShift) & X86II::EVEX_K);
618  unsigned FirstMemOp = 1;
619  if (HasVEX_4V)
620  ++FirstMemOp;// Skip the register source (which is encoded in VEX_VVVV).
621  if (HasMemOp4)
622  ++FirstMemOp;// Skip the register source (which is encoded in I8IMM).
623  if (HasEVEX_K)
624  ++FirstMemOp;// Skip the mask register
625  // FIXME: Maybe lea should have its own form? This is a horrible hack.
626  //if (Opcode == X86::LEA64r || Opcode == X86::LEA64_32r ||
627  // Opcode == X86::LEA16r || Opcode == X86::LEA32r)
628  return FirstMemOp;
629  }
630  case X86II::MRM0r: case X86II::MRM1r:
631  case X86II::MRM2r: case X86II::MRM3r:
632  case X86II::MRM4r: case X86II::MRM5r:
633  case X86II::MRM6r: case X86II::MRM7r:
634  return -1;
635  case X86II::MRM0m: case X86II::MRM1m:
636  case X86II::MRM2m: case X86II::MRM3m:
637  case X86II::MRM4m: case X86II::MRM5m:
638  case X86II::MRM6m: case X86II::MRM7m: {
639  bool HasVEX_4V = (TSFlags >> X86II::VEXShift) & X86II::VEX_4V;
640  unsigned FirstMemOp = 0;
641  if (HasVEX_4V)
642  ++FirstMemOp;// Skip the register dest (which is encoded in VEX_VVVV).
643  return FirstMemOp;
644  }
645  case X86II::MRM_C1: case X86II::MRM_C2: case X86II::MRM_C3:
646  case X86II::MRM_C4: case X86II::MRM_C8: case X86II::MRM_C9:
647  case X86II::MRM_CA: case X86II::MRM_CB: case X86II::MRM_E8:
648  case X86II::MRM_F0: case X86II::MRM_F8: case X86II::MRM_F9:
649  case X86II::MRM_D0: case X86II::MRM_D1: case X86II::MRM_D4:
650  case X86II::MRM_D5: case X86II::MRM_D6: case X86II::MRM_D8:
651  case X86II::MRM_D9: case X86II::MRM_DA: case X86II::MRM_DB:
652  case X86II::MRM_DC: case X86II::MRM_DD: case X86II::MRM_DE:
653  case X86II::MRM_DF:
654  return -1;
655  }
656  }
657 
658  /// isX86_64ExtendedReg - Is the MachineOperand a x86-64 extended (r8 or
659  /// higher) register? e.g. r8, xmm8, xmm13, etc.
660  inline bool isX86_64ExtendedReg(unsigned RegNo) {
661  if ((RegNo > X86::XMM7 && RegNo <= X86::XMM15) ||
662  (RegNo > X86::XMM23 && RegNo <= X86::XMM31) ||
663  (RegNo > X86::YMM7 && RegNo <= X86::YMM15) ||
664  (RegNo > X86::YMM23 && RegNo <= X86::YMM31) ||
665  (RegNo > X86::ZMM7 && RegNo <= X86::ZMM15) ||
666  (RegNo > X86::ZMM23 && RegNo <= X86::ZMM31))
667  return true;
668 
669  switch (RegNo) {
670  default: break;
671  case X86::R8: case X86::R9: case X86::R10: case X86::R11:
672  case X86::R12: case X86::R13: case X86::R14: case X86::R15:
673  case X86::R8D: case X86::R9D: case X86::R10D: case X86::R11D:
674  case X86::R12D: case X86::R13D: case X86::R14D: case X86::R15D:
675  case X86::R8W: case X86::R9W: case X86::R10W: case X86::R11W:
676  case X86::R12W: case X86::R13W: case X86::R14W: case X86::R15W:
677  case X86::R8B: case X86::R9B: case X86::R10B: case X86::R11B:
678  case X86::R12B: case X86::R13B: case X86::R14B: case X86::R15B:
679  case X86::CR8: case X86::CR9: case X86::CR10: case X86::CR11:
680  case X86::CR12: case X86::CR13: case X86::CR14: case X86::CR15:
681  return true;
682  }
683  return false;
684  }
685 
686  /// is32ExtendedReg - Is the MemoryOperand a 32 extended (zmm16 or higher)
687  /// registers? e.g. zmm21, etc.
688  static inline bool is32ExtendedReg(unsigned RegNo) {
689  return ((RegNo > X86::XMM15 && RegNo <= X86::XMM31) ||
690  (RegNo > X86::YMM15 && RegNo <= X86::YMM31) ||
691  (RegNo > X86::ZMM15 && RegNo <= X86::ZMM31));
692  }
693 
694 
695  inline bool isX86_64NonExtLowByteReg(unsigned reg) {
696  return (reg == X86::SPL || reg == X86::BPL ||
697  reg == X86::SIL || reg == X86::DIL);
698  }
699 }
700 
701 } // end namespace llvm;
702 
703 #endif
AddrSegmentReg - The operand # of the segment in the memory operand.
Definition: X86BaseInfo.h:39
bool isX86_64NonExtLowByteReg(unsigned reg)
Definition: X86BaseInfo.h:695
int getOperandBias(const MCInstrDesc &Desc)
Definition: X86BaseInfo.h:567
unsigned isImmPCRel(uint64_t TSFlags)
Definition: X86BaseInfo.h:547
#define llvm_unreachable(msg)
bool hasImm(uint64_t TSFlags)
Definition: X86BaseInfo.h:526
bool isX86_64ExtendedReg(unsigned RegNo)
Definition: X86BaseInfo.h:660
AddrNumOperands - Total number of operands in a memory reference.
Definition: X86BaseInfo.h:42
int getOperandConstraint(unsigned OpNum, MCOI::OperandConstraint Constraint) const
Returns the value of the specific constraint if it is set. Returns -1 if it is not set...
Definition: MCInstrDesc.h:156
static bool is32ExtendedReg(unsigned RegNo)
Definition: X86BaseInfo.h:688
unsigned char getBaseOpcodeFor(uint64_t TSFlags)
Definition: X86BaseInfo.h:522
VEX - The opcode prefix used by AVX instructions.
Definition: X86BaseInfo.h:437
unsigned getSizeOfImm(uint64_t TSFlags)
Definition: X86BaseInfo.h:532
TOF
Target Operand Flag enum.
Definition: X86BaseInfo.h:51
int getMemoryOperandNo(uint64_t TSFlags, unsigned Opcode)
Definition: X86BaseInfo.h:597
XOP - Opcode prefix used by XOP instructions.
Definition: X86BaseInfo.h:515
unsigned getNumOperands() const
Return the number of declared MachineOperands for this MachineInstruction. Note that variadic (isVari...
Definition: MCInstrDesc.h:190