1 //===- X86RecognizableInstr.h - Disassembler instruction spec ----*- 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 is part of the X86 Disassembler Emitter.
10 // It contains the interface of a single recognizable instruction.
11 // Documentation for the disassembler emitter in general can be found in
12 // X86DisassemblerEmitter.h.
14 //===----------------------------------------------------------------------===//
16 #ifndef LLVM_UTILS_TABLEGEN_X86RECOGNIZABLEINSTR_H
17 #define LLVM_UTILS_TABLEGEN_X86RECOGNIZABLEINSTR_H
19 #include "CodeGenInstruction.h"
20 #include "llvm/Support/X86DisassemblerDecoderCommon.h"
25 struct InstructionSpecifier
;
29 #define X86_INSTR_MRM_MAPPING \
95 // A clone of X86 since we can't depend on something that is generated.
109 MRMDestMem4VOp3CC
= 20,
151 #define MAP(from, to) MRM_##from = to,
152 X86_INSTR_MRM_MAPPING
171 enum { PD
= 1, XS
= 2, XD
= 3, PS
= 4 };
172 enum { VEX
= 1, XOP
= 2, EVEX
= 3 };
173 enum { OpSize16
= 1, OpSize32
= 2 };
174 enum { AdSize16
= 1, AdSize32
= 2, AdSize64
= 3 };
175 enum { ExplicitREX2
= 1, ExplicitEVEX
= 3 };
176 } // namespace X86Local
178 namespace X86Disassembler
{
179 class DisassemblerTables
;
180 /// Extract common fields of a single X86 instruction from a CodeGenInstruction
181 struct RecognizableInstrBase
{
182 /// The OpPrefix field from the record
184 /// The OpMap field from the record
186 /// The opcode field from the record; this is the opcode used in the Intel
187 /// encoding and therefore distinct from the UID
189 /// The form field from the record
191 // The encoding field from the record
193 /// The OpSize field from the record
195 /// The AdSize field from the record
197 /// The hasREX_W field from the record
199 /// The hasVEX_4V field from the record
201 /// The IgnoresW field from the record
203 /// The hasVEX_L field from the record
205 /// The ignoreVEX_L field from the record
207 /// The hasEVEX_L2Prefix field from the record
209 /// The hasEVEX_K field from the record
211 /// The hasEVEX_KZ field from the record
213 /// The hasEVEX_B field from the record
215 /// The hasEVEX_NF field from the record
217 /// Indicates that the instruction uses the L and L' fields for RC.
219 /// The isCodeGenOnly field from the record
221 /// The isAsmParserOnly field from the record
222 bool IsAsmParserOnly
;
223 /// The ForceDisassemble field from the record
224 bool ForceDisassemble
;
225 // The CD8_Scale field from the record
227 /// If explicitOpPrefix field from the record equals ExplicitREX2
228 bool ExplicitREX2Prefix
;
229 /// \param insn The CodeGenInstruction to extract information from.
230 RecognizableInstrBase(const CodeGenInstruction
&insn
);
231 /// \returns true if this instruction should be emitted
232 bool shouldBeEmitted() const;
235 /// RecognizableInstr - Encapsulates all information required to decode a single
236 /// instruction, as extracted from the LLVM instruction tables. Has methods
237 /// to interpret the information available in the LLVM tables, and to emit the
238 /// instruction into DisassemblerTables.
239 class RecognizableInstr
: public RecognizableInstrBase
{
241 /// The record from the .td files corresponding to this instruction
243 /// The instruction name as listed in the tables
245 // Whether the instruction has the predicate "In32BitMode"
247 // Whether the instruction has the predicate "In64BitMode"
249 /// The operands of the instruction, as listed in the CodeGenInstruction.
250 /// They are not one-to-one with operands listed in the MCInst; for example,
251 /// memory operands expand to 5 operands in the MCInst
252 const std::vector
<CGIOperandList::OperandInfo
> *Operands
;
254 /// The opcode of the instruction, as used in an MCInst
256 /// The description of the instruction that is emitted into the instruction
258 InstructionSpecifier
*Spec
;
260 /// insnContext - Returns the primary context in which the instruction is
263 /// @return - The context in which the instruction is valid.
264 InstructionContext
insnContext() const;
266 /// typeFromString - Translates an operand type from the string provided in
267 /// the LLVM tables to an OperandType for use in the operand specifier.
269 /// @param s - The string, as extracted by calling Rec->getName()
270 /// on a CodeGenInstruction::OperandInfo.
271 /// @param hasREX_W - Indicates whether the instruction has a REX.W
272 /// prefix. If it does, 32-bit register operands stay
273 /// 32-bit regardless of the operand size.
274 /// @param OpSize Indicates the operand size of the instruction.
275 /// If register size does not match OpSize, then
276 /// register sizes keep their size.
277 /// @return - The operand's type.
278 static OperandType
typeFromString(const std::string
&s
, bool hasREX_W
,
281 /// immediateEncodingFromString - Translates an immediate encoding from the
282 /// string provided in the LLVM tables to an OperandEncoding for use in
283 /// the operand specifier.
285 /// @param s - See typeFromString().
286 /// @param OpSize - Indicates whether this is an OpSize16 instruction.
287 /// If it is not, then 16-bit immediate operands stay 16-bit.
288 /// @return - The operand's encoding.
289 static OperandEncoding
immediateEncodingFromString(const std::string
&s
,
292 /// rmRegisterEncodingFromString - Like immediateEncodingFromString, but
293 /// handles operands that are in the REG field of the ModR/M byte.
294 static OperandEncoding
rmRegisterEncodingFromString(const std::string
&s
,
297 /// rmRegisterEncodingFromString - Like immediateEncodingFromString, but
298 /// handles operands that are in the REG field of the ModR/M byte.
299 static OperandEncoding
roRegisterEncodingFromString(const std::string
&s
,
301 static OperandEncoding
memoryEncodingFromString(const std::string
&s
,
303 static OperandEncoding
relocationEncodingFromString(const std::string
&s
,
305 static OperandEncoding
opcodeModifierEncodingFromString(const std::string
&s
,
307 static OperandEncoding
vvvvRegisterEncodingFromString(const std::string
&s
,
309 static OperandEncoding
310 writemaskRegisterEncodingFromString(const std::string
&s
, uint8_t OpSize
);
312 /// Adjust the encoding type for an operand based on the instruction.
313 void adjustOperandEncoding(OperandEncoding
&encoding
);
315 /// handleOperand - Converts a single operand from the LLVM table format to
316 /// the emitted table format, handling any duplicate operands it encounters
317 /// and then one non-duplicate.
319 /// @param optional - Determines whether to assert that the
321 /// @param operandIndex - The index into the generated operand table.
322 /// Incremented by this function one or more
323 /// times to reflect possible duplicate
325 /// @param physicalOperandIndex - The index of the current operand into the
326 /// set of non-duplicate ('physical') operands.
327 /// Incremented by this function once.
328 /// @param numPhysicalOperands - The number of non-duplicate operands in the
330 /// @param operandMapping - The operand mapping, which has an entry for
331 /// each operand that indicates whether it is a
332 /// duplicate, and of what.
333 void handleOperand(bool optional
, unsigned &operandIndex
,
334 unsigned &physicalOperandIndex
,
335 unsigned numPhysicalOperands
,
336 const unsigned *operandMapping
,
337 OperandEncoding (*encodingFromString
)(const std::string
&,
340 /// emitInstructionSpecifier - Loads the instruction specifier for the current
341 /// instruction into a DisassemblerTables.
343 void emitInstructionSpecifier();
345 /// emitDecodePath - Populates the proper fields in the decode tables
346 /// corresponding to the decode paths for this instruction.
348 /// \param tables The DisassemblerTables to populate with the decode
349 /// decode information for the current instruction.
350 void emitDecodePath(DisassemblerTables
&tables
) const;
353 /// Constructor - Initializes a RecognizableInstr with the appropriate fields
354 /// from a CodeGenInstruction.
356 /// \param tables The DisassemblerTables that the specifier will be added to.
357 /// \param insn The CodeGenInstruction to extract information from.
358 /// \param uid The unique ID of the current instruction.
359 RecognizableInstr(DisassemblerTables
&tables
, const CodeGenInstruction
&insn
,
361 /// processInstr - Accepts a CodeGenInstruction and loads decode information
362 /// for it into a DisassemblerTables if appropriate.
364 /// \param tables The DiassemblerTables to be populated with decode
366 /// \param insn The CodeGenInstruction to be used as a source for this
368 /// \param uid The unique ID of the instruction.
369 static void processInstr(DisassemblerTables
&tables
,
370 const CodeGenInstruction
&insn
, InstrUID uid
);
373 std::string
getMnemonic(const CodeGenInstruction
*I
, unsigned Variant
);
374 bool isRegisterOperand(const Record
*Rec
);
375 bool isMemoryOperand(const Record
*Rec
);
376 bool isImmediateOperand(const Record
*Rec
);
377 unsigned getRegOperandSize(const Record
*RegRec
);
378 unsigned getMemOperandSize(const Record
*MemRec
);
379 } // namespace X86Disassembler