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
;
31 #define X86_INSTR_MRM_MAPPING \
97 // A clone of X86 since we can't depend on something that is generated.
111 MRMDestMem4VOp3CC
= 20,
120 MRMXmCC
= 30, MRMXm
= 31,
121 MRM0m
= 32, MRM1m
= 33, MRM2m
= 34, MRM3m
= 35,
122 MRM4m
= 36, MRM5m
= 37, MRM6m
= 38, MRM7m
= 39,
128 MRMXrCC
= 46, MRMXr
= 47,
129 MRM0r
= 48, MRM1r
= 49, MRM2r
= 50, MRM3r
= 51,
130 MRM4r
= 52, MRM5r
= 53, MRM6r
= 54, MRM7r
= 55,
131 MRM0X
= 56, MRM1X
= 57, MRM2X
= 58, MRM3X
= 59,
132 MRM4X
= 60, MRM5X
= 61, MRM6X
= 62, MRM7X
= 63,
133 #define MAP(from, to) MRM_##from = to,
134 X86_INSTR_MRM_MAPPING
139 OB
= 0, TB
= 1, T8
= 2, TA
= 3, XOP8
= 4, XOP9
= 5, XOPA
= 6, ThreeDNow
= 7,
140 T_MAP5
= 8, T_MAP6
= 9, T_MAP7
= 10
144 PD
= 1, XS
= 2, XD
= 3, PS
= 4
148 VEX
= 1, XOP
= 2, EVEX
= 3
152 OpSize16
= 1, OpSize32
= 2
156 AdSize16
= 1, AdSize32
= 2, AdSize64
= 3
160 namespace X86Disassembler
{
162 class DisassemblerTables
;
164 /// Extract common fields of a single X86 instruction from a CodeGenInstruction
165 struct RecognizableInstrBase
{
166 /// The OpPrefix field from the record
168 /// The OpMap field from the record
170 /// The opcode field from the record; this is the opcode used in the Intel
171 /// encoding and therefore distinct from the UID
173 /// The form field from the record
175 // The encoding field from the record
177 /// The OpSize field from the record
179 /// The AdSize field from the record
181 /// The hasREX_W field from the record
183 /// The hasVEX_4V field from the record
185 /// The IgnoresW field from the record
187 /// The hasVEX_L field from the record
189 /// The ignoreVEX_L field from the record
191 /// The hasEVEX_L2Prefix field from the record
193 /// The hasEVEX_K field from the record
195 /// The hasEVEX_KZ field from the record
197 /// The hasEVEX_B field from the record
199 /// Indicates that the instruction uses the L and L' fields for RC.
201 /// The isCodeGenOnly field from the record
203 /// The isAsmParserOnly field from the record
204 bool IsAsmParserOnly
;
205 /// The ForceDisassemble field from the record
206 bool ForceDisassemble
;
207 // The CD8_Scale field from the record
209 /// \param insn The CodeGenInstruction to extract information from.
210 RecognizableInstrBase(const CodeGenInstruction
&insn
);
211 /// \returns true if this instruction should be emitted
212 bool shouldBeEmitted() const;
215 /// RecognizableInstr - Encapsulates all information required to decode a single
216 /// instruction, as extracted from the LLVM instruction tables. Has methods
217 /// to interpret the information available in the LLVM tables, and to emit the
218 /// instruction into DisassemblerTables.
219 class RecognizableInstr
: public RecognizableInstrBase
{
221 /// The record from the .td files corresponding to this instruction
223 /// The instruction name as listed in the tables
225 // Whether the instruction has the predicate "In32BitMode"
227 // Whether the instruction has the predicate "In64BitMode"
229 /// The operands of the instruction, as listed in the CodeGenInstruction.
230 /// They are not one-to-one with operands listed in the MCInst; for example,
231 /// memory operands expand to 5 operands in the MCInst
232 const std::vector
<CGIOperandList::OperandInfo
>* Operands
;
234 /// The opcode of the instruction, as used in an MCInst
236 /// The description of the instruction that is emitted into the instruction
238 InstructionSpecifier
* Spec
;
240 /// insnContext - Returns the primary context in which the instruction is
243 /// @return - The context in which the instruction is valid.
244 InstructionContext
insnContext() const;
246 /// typeFromString - Translates an operand type from the string provided in
247 /// the LLVM tables to an OperandType for use in the operand specifier.
249 /// @param s - The string, as extracted by calling Rec->getName()
250 /// on a CodeGenInstruction::OperandInfo.
251 /// @param hasREX_W - Indicates whether the instruction has a REX.W
252 /// prefix. If it does, 32-bit register operands stay
253 /// 32-bit regardless of the operand size.
254 /// @param OpSize Indicates the operand size of the instruction.
255 /// If register size does not match OpSize, then
256 /// register sizes keep their size.
257 /// @return - The operand's type.
258 static OperandType
typeFromString(const std::string
& s
,
259 bool hasREX_W
, uint8_t OpSize
);
261 /// immediateEncodingFromString - Translates an immediate encoding from the
262 /// string provided in the LLVM tables to an OperandEncoding for use in
263 /// the operand specifier.
265 /// @param s - See typeFromString().
266 /// @param OpSize - Indicates whether this is an OpSize16 instruction.
267 /// If it is not, then 16-bit immediate operands stay 16-bit.
268 /// @return - The operand's encoding.
269 static OperandEncoding
immediateEncodingFromString(const std::string
&s
,
272 /// rmRegisterEncodingFromString - Like immediateEncodingFromString, but
273 /// handles operands that are in the REG field of the ModR/M byte.
274 static OperandEncoding
rmRegisterEncodingFromString(const std::string
&s
,
277 /// rmRegisterEncodingFromString - Like immediateEncodingFromString, but
278 /// handles operands that are in the REG field of the ModR/M byte.
279 static OperandEncoding
roRegisterEncodingFromString(const std::string
&s
,
281 static OperandEncoding
memoryEncodingFromString(const std::string
&s
,
283 static OperandEncoding
relocationEncodingFromString(const std::string
&s
,
285 static OperandEncoding
opcodeModifierEncodingFromString(const std::string
&s
,
287 static OperandEncoding
vvvvRegisterEncodingFromString(const std::string
&s
,
289 static OperandEncoding
writemaskRegisterEncodingFromString(const std::string
&s
,
292 /// Adjust the encoding type for an operand based on the instruction.
293 void adjustOperandEncoding(OperandEncoding
&encoding
);
295 /// handleOperand - Converts a single operand from the LLVM table format to
296 /// the emitted table format, handling any duplicate operands it encounters
297 /// and then one non-duplicate.
299 /// @param optional - Determines whether to assert that the
301 /// @param operandIndex - The index into the generated operand table.
302 /// Incremented by this function one or more
303 /// times to reflect possible duplicate
305 /// @param physicalOperandIndex - The index of the current operand into the
306 /// set of non-duplicate ('physical') operands.
307 /// Incremented by this function once.
308 /// @param numPhysicalOperands - The number of non-duplicate operands in the
310 /// @param operandMapping - The operand mapping, which has an entry for
311 /// each operand that indicates whether it is a
312 /// duplicate, and of what.
313 void handleOperand(bool optional
,
314 unsigned &operandIndex
,
315 unsigned &physicalOperandIndex
,
316 unsigned numPhysicalOperands
,
317 const unsigned *operandMapping
,
318 OperandEncoding (*encodingFromString
)
322 /// emitInstructionSpecifier - Loads the instruction specifier for the current
323 /// instruction into a DisassemblerTables.
325 void emitInstructionSpecifier();
327 /// emitDecodePath - Populates the proper fields in the decode tables
328 /// corresponding to the decode paths for this instruction.
330 /// \param tables The DisassemblerTables to populate with the decode
331 /// decode information for the current instruction.
332 void emitDecodePath(DisassemblerTables
&tables
) const;
335 /// Constructor - Initializes a RecognizableInstr with the appropriate fields
336 /// from a CodeGenInstruction.
338 /// \param tables The DisassemblerTables that the specifier will be added to.
339 /// \param insn The CodeGenInstruction to extract information from.
340 /// \param uid The unique ID of the current instruction.
341 RecognizableInstr(DisassemblerTables
&tables
,
342 const CodeGenInstruction
&insn
,
344 /// processInstr - Accepts a CodeGenInstruction and loads decode information
345 /// for it into a DisassemblerTables if appropriate.
347 /// \param tables The DiassemblerTables to be populated with decode
349 /// \param insn The CodeGenInstruction to be used as a source for this
351 /// \param uid The unique ID of the instruction.
352 static void processInstr(DisassemblerTables
&tables
,
353 const CodeGenInstruction
&insn
,
357 std::string
getMnemonic(const CodeGenInstruction
*I
, unsigned Variant
);
358 bool isRegisterOperand(const Record
*Rec
);
359 bool isMemoryOperand(const Record
*Rec
);
360 bool isImmediateOperand(const Record
*Rec
);
361 unsigned getRegOperandSize(const Record
*RegRec
);
362 unsigned getMemOperandSize(const Record
*MemRec
);
363 } // namespace X86Disassembler