1 //===-- X86MCTargetDesc.h - X86 Target Descriptions -------------*- 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 provides X86 specific target descriptions.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_LIB_TARGET_X86_MCTARGETDESC_X86MCTARGETDESC_H
14 #define LLVM_LIB_TARGET_X86_MCTARGETDESC_X86MCTARGETDESC_H
16 #include "llvm/ADT/SmallVector.h"
21 class formatted_raw_ostream
;
28 class MCObjectStreamer
;
29 class MCObjectTargetWriter
;
34 class MCSubtargetInfo
;
35 class MCTargetOptions
;
36 class MCTargetStreamer
;
41 /// Flavour of dwarf regnumbers
43 namespace DWARFFlavour
{
45 X86_64
= 0, X86_32_DarwinEH
= 1, X86_32_Generic
= 2
49 /// Native X86 register numbers
53 EAX
= 0, ECX
= 1, EDX
= 2, EBX
= 3, ESP
= 4, EBP
= 5, ESI
= 6, EDI
= 7
58 std::string
ParseX86Triple(const Triple
&TT
);
60 unsigned getDwarfRegFlavour(const Triple
&TT
, bool isEH
);
62 void initLLVMToSEHAndCVRegMapping(MCRegisterInfo
*MRI
);
65 /// Returns true if this instruction has a LOCK prefix.
66 bool hasLockPrefix(const MCInst
&MI
);
68 /// \param Op operand # of the memory operand.
70 /// \returns true if the specified instruction has a 16-bit memory operand.
71 bool is16BitMemOperand(const MCInst
&MI
, unsigned Op
,
72 const MCSubtargetInfo
&STI
);
74 /// \param Op operand # of the memory operand.
76 /// \returns true if the specified instruction has a 32-bit memory operand.
77 bool is32BitMemOperand(const MCInst
&MI
, unsigned Op
);
79 /// \param Op operand # of the memory operand.
81 /// \returns true if the specified instruction has a 64-bit memory operand.
83 bool is64BitMemOperand(const MCInst
&MI
, unsigned Op
);
86 /// Returns true if this instruction needs an Address-Size override prefix.
87 bool needsAddressSizeOverride(const MCInst
&MI
, const MCSubtargetInfo
&STI
,
88 int MemoryOperand
, uint64_t TSFlags
);
90 /// Create a X86 MCSubtargetInfo instance. This is exposed so Asm parser, etc.
91 /// do not need to go through TargetRegistry.
92 MCSubtargetInfo
*createX86MCSubtargetInfo(const Triple
&TT
, StringRef CPU
,
95 void emitInstruction(MCObjectStreamer
&, const MCInst
&Inst
,
96 const MCSubtargetInfo
&STI
);
98 void emitPrefix(MCCodeEmitter
&MCE
, const MCInst
&MI
, SmallVectorImpl
<char> &CB
,
99 const MCSubtargetInfo
&STI
);
102 MCCodeEmitter
*createX86MCCodeEmitter(const MCInstrInfo
&MCII
,
105 MCAsmBackend
*createX86_32AsmBackend(const Target
&T
,
106 const MCSubtargetInfo
&STI
,
107 const MCRegisterInfo
&MRI
,
108 const MCTargetOptions
&Options
);
109 MCAsmBackend
*createX86_64AsmBackend(const Target
&T
,
110 const MCSubtargetInfo
&STI
,
111 const MCRegisterInfo
&MRI
,
112 const MCTargetOptions
&Options
);
114 /// Implements X86-only directives for assembly emission.
115 MCTargetStreamer
*createX86AsmTargetStreamer(MCStreamer
&S
,
116 formatted_raw_ostream
&OS
,
117 MCInstPrinter
*InstPrinter
);
119 /// Implements X86-only directives for object files.
120 MCTargetStreamer
*createX86ObjectTargetStreamer(MCStreamer
&S
,
121 const MCSubtargetInfo
&STI
);
123 /// Construct an X86 Windows COFF machine code streamer which will generate
124 /// PE/COFF format object files.
126 /// Takes ownership of \p AB and \p CE.
127 MCStreamer
*createX86WinCOFFStreamer(MCContext
&C
,
128 std::unique_ptr
<MCAsmBackend
> &&AB
,
129 std::unique_ptr
<MCObjectWriter
> &&OW
,
130 std::unique_ptr
<MCCodeEmitter
> &&CE
);
132 MCStreamer
*createX86ELFStreamer(const Triple
&T
, MCContext
&Context
,
133 std::unique_ptr
<MCAsmBackend
> &&MAB
,
134 std::unique_ptr
<MCObjectWriter
> &&MOW
,
135 std::unique_ptr
<MCCodeEmitter
> &&MCE
);
137 /// Construct an X86 Mach-O object writer.
138 std::unique_ptr
<MCObjectTargetWriter
>
139 createX86MachObjectWriter(bool Is64Bit
, uint32_t CPUType
, uint32_t CPUSubtype
);
141 /// Construct an X86 ELF object writer.
142 std::unique_ptr
<MCObjectTargetWriter
>
143 createX86ELFObjectWriter(bool IsELF64
, uint8_t OSABI
, uint16_t EMachine
);
144 /// Construct an X86 Win COFF object writer.
145 std::unique_ptr
<MCObjectTargetWriter
>
146 createX86WinCOFFObjectWriter(bool Is64Bit
);
148 /// \param Reg speicifed register.
149 /// \param Size the bit size of returned register.
150 /// \param High requires the high register.
152 /// \returns the sub or super register of a specific X86 register.
153 MCRegister
getX86SubSuperRegister(MCRegister Reg
, unsigned Size
,
155 } // End llvm namespace
158 // Defines symbolic names for X86 registers. This defines a mapping from
159 // register name to register number.
161 #define GET_REGINFO_ENUM
162 #include "X86GenRegisterInfo.inc"
164 // Defines symbolic names for the X86 instructions.
166 #define GET_INSTRINFO_ENUM
167 #define GET_INSTRINFO_MC_HELPER_DECLS
168 #include "X86GenInstrInfo.inc"
170 #define GET_SUBTARGETINFO_ENUM
171 #include "X86GenSubtargetInfo.inc"
173 #define GET_X86_MNEMONIC_TABLES_H
174 #include "X86GenMnemonicTables.inc"