33#define DEBUG_TYPE "asm-printer"
36#define PRINT_ALIAS_INSTR
37#include "X86GenAsmWriter.inc"
46 MAI.printExpr(SOS, E);
49 OS <<
'(' << S <<
')';
73 if (
MI->getOpcode() == X86::CALLpcrel32 &&
83 else if (
MI->getOpcode() == X86::DATA16_PREFIX &&
97 if (
MI->getNumOperands() == 0 ||
98 !
MI->getOperand(
MI->getNumOperands() - 1).isImm())
101 int64_t Imm =
MI->getOperand(
MI->getNumOperands() - 1).getImm();
107 switch (
MI->getOpcode()) {
108 case X86::CMPPDrmi:
case X86::CMPPDrri:
109 case X86::CMPPSrmi:
case X86::CMPPSrri:
110 case X86::CMPSDrmi:
case X86::CMPSDrri:
111 case X86::CMPSDrmi_Int:
case X86::CMPSDrri_Int:
112 case X86::CMPSSrmi:
case X86::CMPSSrri:
113 case X86::CMPSSrmi_Int:
case X86::CMPSSrri_Int:
114 if (Imm >= 0 && Imm <= 7) {
136 case X86::VCMPPDrmi:
case X86::VCMPPDrri:
137 case X86::VCMPPDYrmi:
case X86::VCMPPDYrri:
138 case X86::VCMPPDZ128rmi:
case X86::VCMPPDZ128rri:
139 case X86::VCMPPDZ256rmi:
case X86::VCMPPDZ256rri:
140 case X86::VCMPPDZrmi:
case X86::VCMPPDZrri:
141 case X86::VCMPPSrmi:
case X86::VCMPPSrri:
142 case X86::VCMPPSYrmi:
case X86::VCMPPSYrri:
143 case X86::VCMPPSZ128rmi:
case X86::VCMPPSZ128rri:
144 case X86::VCMPPSZ256rmi:
case X86::VCMPPSZ256rri:
145 case X86::VCMPPSZrmi:
case X86::VCMPPSZrri:
146 case X86::VCMPSDrmi:
case X86::VCMPSDrri:
147 case X86::VCMPSDZrmi:
case X86::VCMPSDZrri:
148 case X86::VCMPSDrmi_Int:
case X86::VCMPSDrri_Int:
149 case X86::VCMPSDZrmi_Int:
case X86::VCMPSDZrri_Int:
150 case X86::VCMPSSrmi:
case X86::VCMPSSrri:
151 case X86::VCMPSSZrmi:
case X86::VCMPSSZrri:
152 case X86::VCMPSSrmi_Int:
case X86::VCMPSSrri_Int:
153 case X86::VCMPSSZrmi_Int:
case X86::VCMPSSZrri_Int:
154 case X86::VCMPPDZ128rmik:
case X86::VCMPPDZ128rrik:
155 case X86::VCMPPDZ256rmik:
case X86::VCMPPDZ256rrik:
156 case X86::VCMPPDZrmik:
case X86::VCMPPDZrrik:
157 case X86::VCMPPSZ128rmik:
case X86::VCMPPSZ128rrik:
158 case X86::VCMPPSZ256rmik:
case X86::VCMPPSZ256rrik:
159 case X86::VCMPPSZrmik:
case X86::VCMPPSZrrik:
160 case X86::VCMPSDZrmik_Int:
case X86::VCMPSDZrrik_Int:
161 case X86::VCMPSSZrmik_Int:
case X86::VCMPSSZrrik_Int:
162 case X86::VCMPPDZ128rmbi:
case X86::VCMPPDZ128rmbik:
163 case X86::VCMPPDZ256rmbi:
case X86::VCMPPDZ256rmbik:
164 case X86::VCMPPDZrmbi:
case X86::VCMPPDZrmbik:
165 case X86::VCMPPSZ128rmbi:
case X86::VCMPPSZ128rmbik:
166 case X86::VCMPPSZ256rmbi:
case X86::VCMPPSZ256rmbik:
167 case X86::VCMPPSZrmbi:
case X86::VCMPPSZrmbik:
168 case X86::VCMPPDZrrib:
case X86::VCMPPDZrribk:
169 case X86::VCMPPSZrrib:
case X86::VCMPPSZrribk:
170 case X86::VCMPSDZrrib_Int:
case X86::VCMPSDZrribk_Int:
171 case X86::VCMPSSZrrib_Int:
case X86::VCMPSSZrribk_Int:
172 case X86::VCMPPHZ128rmi:
case X86::VCMPPHZ128rri:
173 case X86::VCMPPHZ256rmi:
case X86::VCMPPHZ256rri:
174 case X86::VCMPPHZrmi:
case X86::VCMPPHZrri:
175 case X86::VCMPSHZrmi:
case X86::VCMPSHZrri:
176 case X86::VCMPSHZrmi_Int:
case X86::VCMPSHZrri_Int:
177 case X86::VCMPPHZ128rmik:
case X86::VCMPPHZ128rrik:
178 case X86::VCMPPHZ256rmik:
case X86::VCMPPHZ256rrik:
179 case X86::VCMPPHZrmik:
case X86::VCMPPHZrrik:
180 case X86::VCMPSHZrmik_Int:
case X86::VCMPSHZrrik_Int:
181 case X86::VCMPPHZ128rmbi:
case X86::VCMPPHZ128rmbik:
182 case X86::VCMPPHZ256rmbi:
case X86::VCMPPHZ256rmbik:
183 case X86::VCMPPHZrmbi:
case X86::VCMPPHZrmbik:
184 case X86::VCMPPHZrrib:
case X86::VCMPPHZrribk:
185 case X86::VCMPSHZrrib_Int:
case X86::VCMPSHZrribk_Int:
186 case X86::VCMPBF16Z128rmi:
case X86::VCMPBF16Z128rri:
187 case X86::VCMPBF16Z256rmi:
case X86::VCMPBF16Z256rri:
188 case X86::VCMPBF16Zrmi:
case X86::VCMPBF16Zrri:
189 case X86::VCMPBF16Z128rmik:
case X86::VCMPBF16Z128rrik:
190 case X86::VCMPBF16Z256rmik:
case X86::VCMPBF16Z256rrik:
191 case X86::VCMPBF16Zrmik:
case X86::VCMPBF16Zrrik:
192 case X86::VCMPBF16Z128rmbi:
case X86::VCMPBF16Z128rmbik:
193 case X86::VCMPBF16Z256rmbi:
case X86::VCMPBF16Z256rmbik:
194 case X86::VCMPBF16Zrmbi:
case X86::VCMPBF16Zrmbik:
195 if (Imm >= 0 && Imm <= 31) {
226 OS <<
"{1to" << NumElts <<
"}";
265 case X86::VPCOMBmi:
case X86::VPCOMBri:
266 case X86::VPCOMDmi:
case X86::VPCOMDri:
267 case X86::VPCOMQmi:
case X86::VPCOMQri:
268 case X86::VPCOMUBmi:
case X86::VPCOMUBri:
269 case X86::VPCOMUDmi:
case X86::VPCOMUDri:
270 case X86::VPCOMUQmi:
case X86::VPCOMUQri:
271 case X86::VPCOMUWmi:
case X86::VPCOMUWri:
272 case X86::VPCOMWmi:
case X86::VPCOMWri:
273 if (Imm >= 0 && Imm <= 7) {
290 case X86::VPCMPBZ128rmi:
case X86::VPCMPBZ128rri:
291 case X86::VPCMPBZ256rmi:
case X86::VPCMPBZ256rri:
292 case X86::VPCMPBZrmi:
case X86::VPCMPBZrri:
293 case X86::VPCMPDZ128rmi:
case X86::VPCMPDZ128rri:
294 case X86::VPCMPDZ256rmi:
case X86::VPCMPDZ256rri:
295 case X86::VPCMPDZrmi:
case X86::VPCMPDZrri:
296 case X86::VPCMPQZ128rmi:
case X86::VPCMPQZ128rri:
297 case X86::VPCMPQZ256rmi:
case X86::VPCMPQZ256rri:
298 case X86::VPCMPQZrmi:
case X86::VPCMPQZrri:
299 case X86::VPCMPUBZ128rmi:
case X86::VPCMPUBZ128rri:
300 case X86::VPCMPUBZ256rmi:
case X86::VPCMPUBZ256rri:
301 case X86::VPCMPUBZrmi:
case X86::VPCMPUBZrri:
302 case X86::VPCMPUDZ128rmi:
case X86::VPCMPUDZ128rri:
303 case X86::VPCMPUDZ256rmi:
case X86::VPCMPUDZ256rri:
304 case X86::VPCMPUDZrmi:
case X86::VPCMPUDZrri:
305 case X86::VPCMPUQZ128rmi:
case X86::VPCMPUQZ128rri:
306 case X86::VPCMPUQZ256rmi:
case X86::VPCMPUQZ256rri:
307 case X86::VPCMPUQZrmi:
case X86::VPCMPUQZrri:
308 case X86::VPCMPUWZ128rmi:
case X86::VPCMPUWZ128rri:
309 case X86::VPCMPUWZ256rmi:
case X86::VPCMPUWZ256rri:
310 case X86::VPCMPUWZrmi:
case X86::VPCMPUWZrri:
311 case X86::VPCMPWZ128rmi:
case X86::VPCMPWZ128rri:
312 case X86::VPCMPWZ256rmi:
case X86::VPCMPWZ256rri:
313 case X86::VPCMPWZrmi:
case X86::VPCMPWZrri:
314 case X86::VPCMPBZ128rmik:
case X86::VPCMPBZ128rrik:
315 case X86::VPCMPBZ256rmik:
case X86::VPCMPBZ256rrik:
316 case X86::VPCMPBZrmik:
case X86::VPCMPBZrrik:
317 case X86::VPCMPDZ128rmik:
case X86::VPCMPDZ128rrik:
318 case X86::VPCMPDZ256rmik:
case X86::VPCMPDZ256rrik:
319 case X86::VPCMPDZrmik:
case X86::VPCMPDZrrik:
320 case X86::VPCMPQZ128rmik:
case X86::VPCMPQZ128rrik:
321 case X86::VPCMPQZ256rmik:
case X86::VPCMPQZ256rrik:
322 case X86::VPCMPQZrmik:
case X86::VPCMPQZrrik:
323 case X86::VPCMPUBZ128rmik:
case X86::VPCMPUBZ128rrik:
324 case X86::VPCMPUBZ256rmik:
case X86::VPCMPUBZ256rrik:
325 case X86::VPCMPUBZrmik:
case X86::VPCMPUBZrrik:
326 case X86::VPCMPUDZ128rmik:
case X86::VPCMPUDZ128rrik:
327 case X86::VPCMPUDZ256rmik:
case X86::VPCMPUDZ256rrik:
328 case X86::VPCMPUDZrmik:
case X86::VPCMPUDZrrik:
329 case X86::VPCMPUQZ128rmik:
case X86::VPCMPUQZ128rrik:
330 case X86::VPCMPUQZ256rmik:
case X86::VPCMPUQZ256rrik:
331 case X86::VPCMPUQZrmik:
case X86::VPCMPUQZrrik:
332 case X86::VPCMPUWZ128rmik:
case X86::VPCMPUWZ128rrik:
333 case X86::VPCMPUWZ256rmik:
case X86::VPCMPUWZ256rrik:
334 case X86::VPCMPUWZrmik:
case X86::VPCMPUWZrrik:
335 case X86::VPCMPWZ128rmik:
case X86::VPCMPWZ128rrik:
336 case X86::VPCMPWZ256rmik:
case X86::VPCMPWZ256rrik:
337 case X86::VPCMPWZrmik:
case X86::VPCMPWZrrik:
338 case X86::VPCMPDZ128rmbi:
case X86::VPCMPDZ128rmbik:
339 case X86::VPCMPDZ256rmbi:
case X86::VPCMPDZ256rmbik:
340 case X86::VPCMPDZrmbi:
case X86::VPCMPDZrmbik:
341 case X86::VPCMPQZ128rmbi:
case X86::VPCMPQZ128rmbik:
342 case X86::VPCMPQZ256rmbi:
case X86::VPCMPQZ256rmbik:
343 case X86::VPCMPQZrmbi:
case X86::VPCMPQZrmbik:
344 case X86::VPCMPUDZ128rmbi:
case X86::VPCMPUDZ128rmbik:
345 case X86::VPCMPUDZ256rmbi:
case X86::VPCMPUDZ256rmbik:
346 case X86::VPCMPUDZrmbi:
case X86::VPCMPUDZrmbik:
347 case X86::VPCMPUQZ128rmbi:
case X86::VPCMPUQZ128rmbik:
348 case X86::VPCMPUQZ256rmbi:
case X86::VPCMPUQZ256rmbik:
349 case X86::VPCMPUQZrmbi:
case X86::VPCMPUQZrmbik:
350 if ((Imm >= 0 && Imm <= 2) || (Imm >= 4 && Imm <= 6)) {
373 OS <<
"{1to" << NumElts <<
"}";
410 }
else if (
Op.isImm()) {
412 int64_t Imm =
Op.getImm();
421 if (
CommentStream && !HasCustomInstComment && (Imm > 255 || Imm < -256)) {
423 if (Imm == (int16_t)(Imm))
425 else if (Imm == (int32_t)(Imm))
431 assert(
Op.isExpr() &&
"unknown operand kind in printOperand");
434 MAI.printExpr(O, *
Op.getExpr());
446 if (
MIA->evaluateMemoryOperandAddress(*
MI,
nullptr, 0, 0))
459 if (DispSpec.
isImm()) {
460 int64_t DispVal = DispSpec.
getImm();
461 if (DispVal || (!IndexReg.
getReg() && !BaseReg.getReg()))
464 assert(DispSpec.
isExpr() &&
"non-immediate displacement for LEA?");
468 if (IndexReg.
getReg() || BaseReg.getReg()) {
470 if (BaseReg.getReg())
516 if (DispSpec.
isImm()) {
519 assert(DispSpec.
isExpr() &&
"non-immediate displacement?");
526 if (
MI->getOperand(
Op).isExpr())
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the SmallString class.
Base class for the full range of assembler expressions which are needed for parsing.
WithMarkup markup(raw_ostream &OS, Markup M)
raw_ostream * CommentStream
A stream that comments can be emitted to if desired.
bool SymbolizeOperands
If true, symbolize branch target and memory reference operands.
void printAnnotation(raw_ostream &OS, StringRef Annot)
Utility function for printing annotations.
format_object< int64_t > formatImm(int64_t Value) const
Utility function to print immediates in decimal or hex.
const MCInstrAnalysis * MIA
Instances of this class represent a single low-level machine instruction.
Describe properties that are true of each instruction in the target description file.
Instances of this class represent operands of the MCInst class.
MCRegister getReg() const
Returns the register number.
const MCExpr * getExpr() const
Wrapper class representing physical registers. Should be passed by value.
Generic base class for all target subtargets.
bool hasFeature(unsigned Feature) const
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
bool starts_with(StringRef Prefix) const
starts_with - Check if this string starts with the given Prefix.
StringRef - Represent a constant reference to a string, i.e.
Target - Wrapper for Target specific information.
static const char * getRegisterName(MCRegister Reg)
void printInstruction(const MCInst *MI, uint64_t Address, raw_ostream &OS)
void printSrcIdx(const MCInst *MI, unsigned Op, raw_ostream &O)
void printSTiRegOperand(const MCInst *MI, unsigned OpNo, raw_ostream &OS)
bool printAliasInstr(const MCInst *MI, uint64_t Address, raw_ostream &OS)
void printdwordmem(const MCInst *MI, unsigned OpNo, raw_ostream &O)
void printExprOperand(raw_ostream &OS, const MCExpr &E) override
void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &OS) override
void printMemOffset(const MCInst *MI, unsigned OpNo, raw_ostream &OS)
void printqwordmem(const MCInst *MI, unsigned OpNo, raw_ostream &O)
bool printVecCompareInstr(const MCInst *MI, raw_ostream &OS)
void printymmwordmem(const MCInst *MI, unsigned OpNo, raw_ostream &O)
void printMemReference(const MCInst *MI, unsigned Op, raw_ostream &OS)
void printInst(const MCInst *MI, uint64_t Address, StringRef Annot, const MCSubtargetInfo &STI, raw_ostream &OS) override
Print the specified MCInst to the specified raw_ostream.
void printRegName(raw_ostream &OS, MCRegister Reg) override
Print the assembler register name.
void printxmmwordmem(const MCInst *MI, unsigned OpNo, raw_ostream &O)
void printwordmem(const MCInst *MI, unsigned OpNo, raw_ostream &O)
void printU8Imm(const MCInst *MI, unsigned Op, raw_ostream &OS)
void printzmmwordmem(const MCInst *MI, unsigned OpNo, raw_ostream &O)
void printDstIdx(const MCInst *MI, unsigned Op, raw_ostream &O)
void printPCRelImm(const MCInst *MI, uint64_t Address, unsigned OpNo, raw_ostream &O)
value (e.g.
void printOptionalSegReg(const MCInst *MI, unsigned OpNo, raw_ostream &O)
void printVPCOMMnemonic(const MCInst *MI, raw_ostream &OS)
void printCMPMnemonic(const MCInst *MI, bool IsVCmp, raw_ostream &OS)
void printInstFlags(const MCInst *MI, raw_ostream &O, const MCSubtargetInfo &STI)
void printVPCMPMnemonic(const MCInst *MI, raw_ostream &OS)
This class implements an extremely fast bulk output stream that can only output to a stream.
A raw_ostream that writes to an SmallVector or SmallString.
@ MRMSrcMem
MRMSrcMem - This form is used for instructions that use the Mod/RM byte to specify a source,...
@ XS
XS, XD - These prefix codes are for single and double precision scalar floating point operations perf...
This is an optimization pass for GlobalISel generic memory operations.
bool EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS, const MCInstrInfo &MCII)
EmitAnyX86InstComments - This function decodes x86 instructions and prints newline terminated strings...
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
DWARFExpression::Operation Op