blob: ae4b1e79c5454410a4fc86ae956265f7d51b0ea3 [file] [log] [blame]
Chris Lattner74f4ca72009-09-02 17:35:12 +00001//===-- X86MCInstLower.cpp - Convert X86 MachineInstr to an MCInst --------===//
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 code to lower X86 MachineInstrs to their corresponding
11// MCInst records.
12//
13//===----------------------------------------------------------------------===//
14
Craig Topperb25fda92012-03-17 18:46:09 +000015#include "InstPrinter/X86ATTInstPrinter.h"
Gadi Haber19c4fc52016-12-28 10:12:48 +000016#include "InstPrinter/X86InstComments.h"
Craig Topperc6d4efa2014-03-19 06:53:25 +000017#include "MCTargetDesc/X86BaseInfo.h"
Reid Kleckner9cdd4df2017-10-11 21:24:33 +000018#include "MCTargetDesc/X86TargetStreamer.h"
Chandler Carruth185cc182014-07-25 23:47:11 +000019#include "Utils/X86ShuffleDecode.h"
Chandler Carruth6bda14b2017-06-06 11:49:48 +000020#include "X86AsmPrinter.h"
21#include "X86RegisterInfo.h"
22#include "X86ShuffleDecodeConstantPool.h"
Sanjoy Das2d869b22015-06-15 18:44:01 +000023#include "llvm/ADT/Optional.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000024#include "llvm/ADT/SmallString.h"
Sanjoy Dasc0441c22016-04-19 05:24:47 +000025#include "llvm/ADT/iterator_range.h"
Chandler Carruth185cc182014-07-25 23:47:11 +000026#include "llvm/CodeGen/MachineConstantPool.h"
Chandler Carruth6bda14b2017-06-06 11:49:48 +000027#include "llvm/CodeGen/MachineFunction.h"
Chris Lattner05f40392009-09-16 06:25:03 +000028#include "llvm/CodeGen/MachineModuleInfoImpls.h"
Chandler Carruth6bda14b2017-06-06 11:49:48 +000029#include "llvm/CodeGen/MachineOperand.h"
Andrew Trick153ebe62013-10-31 22:11:56 +000030#include "llvm/CodeGen/StackMaps.h"
Craig Topperc6d4efa2014-03-19 06:53:25 +000031#include "llvm/IR/DataLayout.h"
32#include "llvm/IR/GlobalValue.h"
Rafael Espindola894843c2014-01-07 21:19:40 +000033#include "llvm/IR/Mangler.h"
Evan Cheng1705ab02011-07-14 23:50:31 +000034#include "llvm/MC/MCAsmInfo.h"
Lang Hamesf49bc3f2014-07-24 20:40:55 +000035#include "llvm/MC/MCCodeEmitter.h"
Chris Lattner74f4ca72009-09-02 17:35:12 +000036#include "llvm/MC/MCContext.h"
37#include "llvm/MC/MCExpr.h"
Pete Cooper81902a32015-05-15 22:19:42 +000038#include "llvm/MC/MCFixup.h"
Chris Lattner74f4ca72009-09-02 17:35:12 +000039#include "llvm/MC/MCInst.h"
Benjamin Kramer4e629f72012-11-26 13:34:22 +000040#include "llvm/MC/MCInstBuilder.h"
Dean Michael Berris52735fc2016-07-14 04:06:33 +000041#include "llvm/MC/MCSection.h"
Chandler Carruth6bda14b2017-06-06 11:49:48 +000042#include "llvm/MC/MCSectionELF.h"
Chris Lattner74f4ca72009-09-02 17:35:12 +000043#include "llvm/MC/MCStreamer.h"
Chris Lattnere397df72010-03-12 19:42:40 +000044#include "llvm/MC/MCSymbol.h"
Dean Michael Berris52735fc2016-07-14 04:06:33 +000045#include "llvm/MC/MCSymbolELF.h"
David Blaikie6054e652018-03-23 23:58:19 +000046#include "llvm/Target/TargetLoweringObjectFile.h"
Dean Michael Berris52735fc2016-07-14 04:06:33 +000047
Chris Lattner74f4ca72009-09-02 17:35:12 +000048using namespace llvm;
49
Craig Topper2a3f7752012-10-16 06:01:50 +000050namespace {
51
52/// X86MCInstLower - This class is used to lower an MachineInstr into an MCInst.
53class X86MCInstLower {
54 MCContext &Ctx;
Craig Topper2a3f7752012-10-16 06:01:50 +000055 const MachineFunction &MF;
56 const TargetMachine &TM;
57 const MCAsmInfo &MAI;
58 X86AsmPrinter &AsmPrinter;
Keith Wyss3d868232018-04-17 21:30:29 +000059
Craig Topper2a3f7752012-10-16 06:01:50 +000060public:
Rafael Espindola38c2e652013-10-29 16:11:22 +000061 X86MCInstLower(const MachineFunction &MF, X86AsmPrinter &asmprinter);
Craig Topper2a3f7752012-10-16 06:01:50 +000062
Sanjoy Das2d869b22015-06-15 18:44:01 +000063 Optional<MCOperand> LowerMachineOperand(const MachineInstr *MI,
64 const MachineOperand &MO) const;
Craig Topper2a3f7752012-10-16 06:01:50 +000065 void Lower(const MachineInstr *MI, MCInst &OutMI) const;
66
67 MCSymbol *GetSymbolFromOperand(const MachineOperand &MO) const;
68 MCOperand LowerSymbolOperand(const MachineOperand &MO, MCSymbol *Sym) const;
69
70private:
71 MachineModuleInfoMachO &getMachOMMI() const;
72};
73
74} // end anonymous namespace
75
Lang Hamesf49bc3f2014-07-24 20:40:55 +000076// Emit a minimal sequence of nops spanning NumBytes bytes.
77static void EmitNops(MCStreamer &OS, unsigned NumBytes, bool Is64Bit,
Sanjoy Das6ecfae62016-04-19 18:48:13 +000078 const MCSubtargetInfo &STI);
Lang Hamesf49bc3f2014-07-24 20:40:55 +000079
Sanjoy Das2effffd2016-04-19 18:48:16 +000080void X86AsmPrinter::StackMapShadowTracker::count(MCInst &Inst,
81 const MCSubtargetInfo &STI,
82 MCCodeEmitter *CodeEmitter) {
83 if (InShadow) {
84 SmallString<256> Code;
85 SmallVector<MCFixup, 4> Fixups;
86 raw_svector_ostream VecOS(Code);
87 CodeEmitter->encodeInstruction(Inst, VecOS, Fixups, STI);
88 CurrentShadowSize += Code.size();
89 if (CurrentShadowSize >= RequiredShadowSize)
90 InShadow = false; // The shadow is big enough. Stop counting.
Lang Hamesf49bc3f2014-07-24 20:40:55 +000091 }
Sanjoy Das2effffd2016-04-19 18:48:16 +000092}
Lang Hamesf49bc3f2014-07-24 20:40:55 +000093
Sanjoy Das2effffd2016-04-19 18:48:16 +000094void X86AsmPrinter::StackMapShadowTracker::emitShadowPadding(
Lang Hamesf49bc3f2014-07-24 20:40:55 +000095 MCStreamer &OutStreamer, const MCSubtargetInfo &STI) {
Sanjoy Das2effffd2016-04-19 18:48:16 +000096 if (InShadow && CurrentShadowSize < RequiredShadowSize) {
97 InShadow = false;
98 EmitNops(OutStreamer, RequiredShadowSize - CurrentShadowSize,
99 MF->getSubtarget<X86Subtarget>().is64Bit(), STI);
Lang Hamesf49bc3f2014-07-24 20:40:55 +0000100 }
Sanjoy Das2effffd2016-04-19 18:48:16 +0000101}
Lang Hamesf49bc3f2014-07-24 20:40:55 +0000102
Sanjoy Das2effffd2016-04-19 18:48:16 +0000103void X86AsmPrinter::EmitAndCountInstruction(MCInst &Inst) {
Andrew V. Tischenko22f07422017-12-15 18:13:05 +0000104 OutStreamer->EmitInstruction(Inst, getSubtargetInfo(),
105 EnablePrintSchedInfo &&
106 !(Inst.getFlags() & X86::NO_SCHED_INFO));
Sanjoy Das2effffd2016-04-19 18:48:16 +0000107 SMShadowTracker.count(Inst, getSubtargetInfo(), CodeEmitter.get());
108}
Lang Hamesf49bc3f2014-07-24 20:40:55 +0000109
Rafael Espindola38c2e652013-10-29 16:11:22 +0000110X86MCInstLower::X86MCInstLower(const MachineFunction &mf,
Chris Lattnerb3f608b2010-07-22 21:10:04 +0000111 X86AsmPrinter &asmprinter)
Eric Christopher05b81972015-02-02 17:38:43 +0000112 : Ctx(mf.getContext()), MF(mf), TM(mf.getTarget()), MAI(*TM.getMCAsmInfo()),
113 AsmPrinter(asmprinter) {}
Chris Lattner31722082009-09-12 20:34:57 +0000114
Chris Lattner05f40392009-09-16 06:25:03 +0000115MachineModuleInfoMachO &X86MCInstLower::getMachOMMI() const {
Chris Lattner7fbdd7c2010-07-20 22:26:07 +0000116 return MF.getMMI().getObjFileInfo<MachineModuleInfoMachO>();
Chris Lattner05f40392009-09-16 06:25:03 +0000117}
118
Chris Lattnerd9d71862010-02-08 23:03:41 +0000119/// GetSymbolFromOperand - Lower an MO_GlobalAddress or MO_ExternalSymbol
120/// operand to an MCSymbol.
Keith Wyss3d868232018-04-17 21:30:29 +0000121MCSymbol *X86MCInstLower::GetSymbolFromOperand(const MachineOperand &MO) const {
Mehdi Aminibd7287e2015-07-16 06:11:10 +0000122 const DataLayout &DL = MF.getDataLayout();
Keith Wyss3d868232018-04-17 21:30:29 +0000123 assert((MO.isGlobal() || MO.isSymbol() || MO.isMBB()) &&
124 "Isn't a symbol reference");
Chris Lattnerd9d71862010-02-08 23:03:41 +0000125
Rafael Espindola9aa3ab32015-06-03 00:02:40 +0000126 MCSymbol *Sym = nullptr;
Chris Lattner35ed98a2009-09-11 05:58:44 +0000127 SmallString<128> Name;
Rafael Espindolad5bd5a42013-11-28 20:12:44 +0000128 StringRef Suffix;
129
130 switch (MO.getTargetFlags()) {
Reid Klecknerc35e7f52015-06-11 01:31:48 +0000131 case X86II::MO_DLLIMPORT:
132 // Handle dllimport linkage.
133 Name += "__imp_";
134 break;
Rafael Espindolad5bd5a42013-11-28 20:12:44 +0000135 case X86II::MO_DARWIN_NONLAZY:
136 case X86II::MO_DARWIN_NONLAZY_PIC_BASE:
Rafael Espindolad5bd5a42013-11-28 20:12:44 +0000137 Suffix = "$non_lazy_ptr";
138 break;
139 }
Chad Rosier24c19d22012-08-01 18:39:17 +0000140
Rafael Espindola01d19d022013-12-05 05:19:12 +0000141 if (!Suffix.empty())
Mehdi Aminibd7287e2015-07-16 06:11:10 +0000142 Name += DL.getPrivateGlobalPrefix();
Rafael Espindola01d19d022013-12-05 05:19:12 +0000143
Michael Liao6f720612012-10-17 02:22:27 +0000144 if (MO.isGlobal()) {
Chris Lattnere397df72010-03-12 19:42:40 +0000145 const GlobalValue *GV = MO.getGlobal();
Rafael Espindoladaeafb42014-02-19 17:23:20 +0000146 AsmPrinter.getNameWithPrefix(Name, GV);
Michael Liao6f720612012-10-17 02:22:27 +0000147 } else if (MO.isSymbol()) {
Mehdi Aminibd7287e2015-07-16 06:11:10 +0000148 Mangler::getNameWithPrefix(Name, MO.getSymbolName(), DL);
Michael Liao6f720612012-10-17 02:22:27 +0000149 } else if (MO.isMBB()) {
Rafael Espindola9aa3ab32015-06-03 00:02:40 +0000150 assert(Suffix.empty());
151 Sym = MO.getMBB()->getSymbol();
Chris Lattner17ec6b12009-09-20 06:45:52 +0000152 }
Chris Lattnerd9d71862010-02-08 23:03:41 +0000153
Rafael Espindolad5bd5a42013-11-28 20:12:44 +0000154 Name += Suffix;
Rafael Espindola9aa3ab32015-06-03 00:02:40 +0000155 if (!Sym)
156 Sym = Ctx.getOrCreateSymbol(Name);
Rafael Espindola01d19d022013-12-05 05:19:12 +0000157
Chris Lattnerd9d71862010-02-08 23:03:41 +0000158 // If the target flags on the operand changes the name of the symbol, do that
159 // before we return the symbol.
Chris Lattner74f4ca72009-09-02 17:35:12 +0000160 switch (MO.getTargetFlags()) {
Keith Wyss3d868232018-04-17 21:30:29 +0000161 default:
162 break;
Chris Lattner954b9cd2009-09-03 05:06:07 +0000163 case X86II::MO_DARWIN_NONLAZY:
Chris Lattner446d5892009-09-11 06:59:18 +0000164 case X86II::MO_DARWIN_NONLAZY_PIC_BASE: {
Bill Wendlinga810bdf2010-03-10 22:34:10 +0000165 MachineModuleInfoImpl::StubValueTy &StubSym =
Keith Wyss3d868232018-04-17 21:30:29 +0000166 getMachOMMI().getGVStubEntry(Sym);
Craig Topper062a2ba2014-04-25 05:30:21 +0000167 if (!StubSym.getPointer()) {
Chris Lattnerd9d71862010-02-08 23:03:41 +0000168 assert(MO.isGlobal() && "Extern symbol not handled yet");
Keith Wyss3d868232018-04-17 21:30:29 +0000169 StubSym = MachineModuleInfoImpl::StubValueTy(
170 AsmPrinter.getSymbol(MO.getGlobal()),
171 !MO.getGlobal()->hasInternalLinkage());
Chris Lattnerd9d71862010-02-08 23:03:41 +0000172 }
Rafael Espindolad5bd5a42013-11-28 20:12:44 +0000173 break;
Chris Lattner446d5892009-09-11 06:59:18 +0000174 }
Chris Lattnerc5a95c52009-09-09 00:10:14 +0000175 }
Chris Lattnerd9d71862010-02-08 23:03:41 +0000176
Rafael Espindolad5bd5a42013-11-28 20:12:44 +0000177 return Sym;
Chris Lattner74f4ca72009-09-02 17:35:12 +0000178}
179
Chris Lattner31722082009-09-12 20:34:57 +0000180MCOperand X86MCInstLower::LowerSymbolOperand(const MachineOperand &MO,
181 MCSymbol *Sym) const {
Chris Lattnerc7b00732009-09-03 07:30:56 +0000182 // FIXME: We would like an efficient form for this, so we don't have to do a
183 // lot of extra uniquing.
Craig Topper062a2ba2014-04-25 05:30:21 +0000184 const MCExpr *Expr = nullptr;
Daniel Dunbar55992562010-03-15 23:51:06 +0000185 MCSymbolRefExpr::VariantKind RefKind = MCSymbolRefExpr::VK_None;
Chad Rosier24c19d22012-08-01 18:39:17 +0000186
Chris Lattner6370d562009-09-03 04:56:20 +0000187 switch (MO.getTargetFlags()) {
Keith Wyss3d868232018-04-17 21:30:29 +0000188 default:
189 llvm_unreachable("Unknown target flag on GV operand");
190 case X86II::MO_NO_FLAG: // No flag.
Chris Lattner954b9cd2009-09-03 05:06:07 +0000191 // These affect the name of the symbol, not any suffix.
192 case X86II::MO_DARWIN_NONLAZY:
Chris Lattner954b9cd2009-09-03 05:06:07 +0000193 case X86II::MO_DLLIMPORT:
Chris Lattner954b9cd2009-09-03 05:06:07 +0000194 break;
Chad Rosier24c19d22012-08-01 18:39:17 +0000195
Keith Wyss3d868232018-04-17 21:30:29 +0000196 case X86II::MO_TLVP:
197 RefKind = MCSymbolRefExpr::VK_TLVP;
198 break;
Eric Christopherb0e1a452010-06-03 04:07:48 +0000199 case X86II::MO_TLVP_PIC_BASE:
Jim Grosbach13760bd2015-05-30 01:25:56 +0000200 Expr = MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_TLVP, Ctx);
Chris Lattner769aedd2010-07-14 23:04:59 +0000201 // Subtract the pic base.
Keith Wyss3d868232018-04-17 21:30:29 +0000202 Expr = MCBinaryExpr::createSub(
203 Expr, MCSymbolRefExpr::create(MF.getPICBaseSymbol(), Ctx), Ctx);
Chris Lattner769aedd2010-07-14 23:04:59 +0000204 break;
Keith Wyss3d868232018-04-17 21:30:29 +0000205 case X86II::MO_SECREL:
206 RefKind = MCSymbolRefExpr::VK_SECREL;
207 break;
208 case X86II::MO_TLSGD:
209 RefKind = MCSymbolRefExpr::VK_TLSGD;
210 break;
211 case X86II::MO_TLSLD:
212 RefKind = MCSymbolRefExpr::VK_TLSLD;
213 break;
214 case X86II::MO_TLSLDM:
215 RefKind = MCSymbolRefExpr::VK_TLSLDM;
216 break;
217 case X86II::MO_GOTTPOFF:
218 RefKind = MCSymbolRefExpr::VK_GOTTPOFF;
219 break;
220 case X86II::MO_INDNTPOFF:
221 RefKind = MCSymbolRefExpr::VK_INDNTPOFF;
222 break;
223 case X86II::MO_TPOFF:
224 RefKind = MCSymbolRefExpr::VK_TPOFF;
225 break;
226 case X86II::MO_DTPOFF:
227 RefKind = MCSymbolRefExpr::VK_DTPOFF;
228 break;
229 case X86II::MO_NTPOFF:
230 RefKind = MCSymbolRefExpr::VK_NTPOFF;
231 break;
232 case X86II::MO_GOTNTPOFF:
233 RefKind = MCSymbolRefExpr::VK_GOTNTPOFF;
234 break;
235 case X86II::MO_GOTPCREL:
236 RefKind = MCSymbolRefExpr::VK_GOTPCREL;
237 break;
238 case X86II::MO_GOT:
239 RefKind = MCSymbolRefExpr::VK_GOT;
240 break;
241 case X86II::MO_GOTOFF:
242 RefKind = MCSymbolRefExpr::VK_GOTOFF;
243 break;
244 case X86II::MO_PLT:
245 RefKind = MCSymbolRefExpr::VK_PLT;
246 break;
247 case X86II::MO_ABS8:
248 RefKind = MCSymbolRefExpr::VK_X86_ABS8;
249 break;
Chris Lattner954b9cd2009-09-03 05:06:07 +0000250 case X86II::MO_PIC_BASE_OFFSET:
251 case X86II::MO_DARWIN_NONLAZY_PIC_BASE:
Jim Grosbach13760bd2015-05-30 01:25:56 +0000252 Expr = MCSymbolRefExpr::create(Sym, Ctx);
Chris Lattner954b9cd2009-09-03 05:06:07 +0000253 // Subtract the pic base.
Keith Wyss3d868232018-04-17 21:30:29 +0000254 Expr = MCBinaryExpr::createSub(
255 Expr, MCSymbolRefExpr::create(MF.getPICBaseSymbol(), Ctx), Ctx);
Rafael Espindolac606bfe2014-10-21 01:17:30 +0000256 if (MO.isJTI()) {
Joerg Sonnenberger22982032016-06-18 23:25:37 +0000257 assert(MAI.doesSetDirectiveSuppressReloc());
Evan Chengd0d8e332010-04-12 23:07:17 +0000258 // If .set directive is supported, use it to reduce the number of
259 // relocations the assembler will generate for differences between
260 // local labels. This is only safe when the symbols are in the same
261 // section so we are restricting it to jumptable references.
Jim Grosbach6f482002015-05-18 18:43:14 +0000262 MCSymbol *Label = Ctx.createTempSymbol();
Lang Hames9ff69c82015-04-24 19:11:51 +0000263 AsmPrinter.OutStreamer->EmitAssignment(Label, Expr);
Jim Grosbach13760bd2015-05-30 01:25:56 +0000264 Expr = MCSymbolRefExpr::create(Label, Ctx);
Evan Chengd0d8e332010-04-12 23:07:17 +0000265 }
Chris Lattner954b9cd2009-09-03 05:06:07 +0000266 break;
Chris Lattnerc7b00732009-09-03 07:30:56 +0000267 }
Chad Rosier24c19d22012-08-01 18:39:17 +0000268
Craig Topper062a2ba2014-04-25 05:30:21 +0000269 if (!Expr)
Jim Grosbach13760bd2015-05-30 01:25:56 +0000270 Expr = MCSymbolRefExpr::create(Sym, RefKind, Ctx);
Chad Rosier24c19d22012-08-01 18:39:17 +0000271
Michael Liao6f720612012-10-17 02:22:27 +0000272 if (!MO.isJTI() && !MO.isMBB() && MO.getOffset())
Keith Wyss3d868232018-04-17 21:30:29 +0000273 Expr = MCBinaryExpr::createAdd(
274 Expr, MCConstantExpr::create(MO.getOffset(), Ctx), Ctx);
Jim Grosbache9119e42015-05-13 18:37:00 +0000275 return MCOperand::createExpr(Expr);
Chris Lattner5daf6192009-09-03 04:44:53 +0000276}
277
Adrian Prantl5f8f34e42018-05-01 15:54:18 +0000278/// Simplify FOO $imm, %{al,ax,eax,rax} to FOO $imm, for instruction with
Daniel Dunbara4820fc2010-05-18 17:22:24 +0000279/// a short fixed-register form.
280static void SimplifyShortImmForm(MCInst &Inst, unsigned Opcode) {
281 unsigned ImmOp = Inst.getNumOperands() - 1;
Anton Korobeynikovc6b40172012-02-11 17:26:53 +0000282 assert(Inst.getOperand(0).isReg() &&
283 (Inst.getOperand(ImmOp).isImm() || Inst.getOperand(ImmOp).isExpr()) &&
Daniel Dunbara4820fc2010-05-18 17:22:24 +0000284 ((Inst.getNumOperands() == 3 && Inst.getOperand(1).isReg() &&
285 Inst.getOperand(0).getReg() == Inst.getOperand(1).getReg()) ||
Keith Wyss3d868232018-04-17 21:30:29 +0000286 Inst.getNumOperands() == 2) &&
287 "Unexpected instruction!");
Daniel Dunbara4820fc2010-05-18 17:22:24 +0000288
289 // Check whether the destination register can be fixed.
290 unsigned Reg = Inst.getOperand(0).getReg();
291 if (Reg != X86::AL && Reg != X86::AX && Reg != X86::EAX && Reg != X86::RAX)
292 return;
293
294 // If so, rewrite the instruction.
Daniel Dunbar4f6c7c62010-05-19 06:20:44 +0000295 MCOperand Saved = Inst.getOperand(ImmOp);
296 Inst = MCInst();
297 Inst.setOpcode(Opcode);
298 Inst.addOperand(Saved);
299}
300
Adrian Prantl5f8f34e42018-05-01 15:54:18 +0000301/// If a movsx instruction has a shorter encoding for the used register
Benjamin Kramer068a2252013-07-12 18:06:44 +0000302/// simplify the instruction to use it instead.
303static void SimplifyMOVSX(MCInst &Inst) {
304 unsigned NewOpcode = 0;
305 unsigned Op0 = Inst.getOperand(0).getReg(), Op1 = Inst.getOperand(1).getReg();
306 switch (Inst.getOpcode()) {
307 default:
308 llvm_unreachable("Unexpected instruction!");
Keith Wyss3d868232018-04-17 21:30:29 +0000309 case X86::MOVSX16rr8: // movsbw %al, %ax --> cbtw
Benjamin Kramer068a2252013-07-12 18:06:44 +0000310 if (Op0 == X86::AX && Op1 == X86::AL)
311 NewOpcode = X86::CBW;
312 break;
313 case X86::MOVSX32rr16: // movswl %ax, %eax --> cwtl
314 if (Op0 == X86::EAX && Op1 == X86::AX)
315 NewOpcode = X86::CWDE;
316 break;
317 case X86::MOVSX64rr32: // movslq %eax, %rax --> cltq
318 if (Op0 == X86::RAX && Op1 == X86::EAX)
319 NewOpcode = X86::CDQE;
320 break;
321 }
322
323 if (NewOpcode != 0) {
324 Inst = MCInst();
325 Inst.setOpcode(NewOpcode);
326 }
327}
328
Adrian Prantl5f8f34e42018-05-01 15:54:18 +0000329/// Simplify things like MOV32rm to MOV32o32a.
Eli Friedman51ec7452010-08-16 21:03:32 +0000330static void SimplifyShortMoveForm(X86AsmPrinter &Printer, MCInst &Inst,
331 unsigned Opcode) {
332 // Don't make these simplifications in 64-bit mode; other assemblers don't
333 // perform them because they make the code larger.
334 if (Printer.getSubtarget().is64Bit())
335 return;
336
Daniel Dunbar4f6c7c62010-05-19 06:20:44 +0000337 bool IsStore = Inst.getOperand(0).isReg() && Inst.getOperand(1).isReg();
338 unsigned AddrBase = IsStore;
339 unsigned RegOp = IsStore ? 0 : 5;
340 unsigned AddrOp = AddrBase + 3;
Keith Wyss3d868232018-04-17 21:30:29 +0000341 assert(
342 Inst.getNumOperands() == 6 && Inst.getOperand(RegOp).isReg() &&
343 Inst.getOperand(AddrBase + X86::AddrBaseReg).isReg() &&
344 Inst.getOperand(AddrBase + X86::AddrScaleAmt).isImm() &&
345 Inst.getOperand(AddrBase + X86::AddrIndexReg).isReg() &&
346 Inst.getOperand(AddrBase + X86::AddrSegmentReg).isReg() &&
347 (Inst.getOperand(AddrOp).isExpr() || Inst.getOperand(AddrOp).isImm()) &&
348 "Unexpected instruction!");
Daniel Dunbar4f6c7c62010-05-19 06:20:44 +0000349
350 // Check whether the destination register can be fixed.
351 unsigned Reg = Inst.getOperand(RegOp).getReg();
352 if (Reg != X86::AL && Reg != X86::AX && Reg != X86::EAX && Reg != X86::RAX)
353 return;
354
355 // Check whether this is an absolute address.
Chad Rosier24c19d22012-08-01 18:39:17 +0000356 // FIXME: We know TLVP symbol refs aren't, but there should be a better way
Eric Christopher29b58af2010-06-17 00:51:48 +0000357 // to do this here.
358 bool Absolute = true;
359 if (Inst.getOperand(AddrOp).isExpr()) {
360 const MCExpr *MCE = Inst.getOperand(AddrOp).getExpr();
361 if (const MCSymbolRefExpr *SRE = dyn_cast<MCSymbolRefExpr>(MCE))
362 if (SRE->getKind() == MCSymbolRefExpr::VK_TLVP)
363 Absolute = false;
364 }
Chad Rosier24c19d22012-08-01 18:39:17 +0000365
Eric Christopher29b58af2010-06-17 00:51:48 +0000366 if (Absolute &&
Manuel Jacobdcb78db2014-03-18 16:14:11 +0000367 (Inst.getOperand(AddrBase + X86::AddrBaseReg).getReg() != 0 ||
368 Inst.getOperand(AddrBase + X86::AddrScaleAmt).getImm() != 1 ||
369 Inst.getOperand(AddrBase + X86::AddrIndexReg).getReg() != 0))
Daniel Dunbar4f6c7c62010-05-19 06:20:44 +0000370 return;
371
372 // If so, rewrite the instruction.
373 MCOperand Saved = Inst.getOperand(AddrOp);
Manuel Jacobdcb78db2014-03-18 16:14:11 +0000374 MCOperand Seg = Inst.getOperand(AddrBase + X86::AddrSegmentReg);
Daniel Dunbar4f6c7c62010-05-19 06:20:44 +0000375 Inst = MCInst();
376 Inst.setOpcode(Opcode);
377 Inst.addOperand(Saved);
Craig Toppera9d2c672014-01-16 07:57:45 +0000378 Inst.addOperand(Seg);
Daniel Dunbara4820fc2010-05-18 17:22:24 +0000379}
Chris Lattner31722082009-09-12 20:34:57 +0000380
Michael Liao5bf95782014-12-04 05:20:33 +0000381static unsigned getRetOpcode(const X86Subtarget &Subtarget) {
382 return Subtarget.is64Bit() ? X86::RETQ : X86::RETL;
David Woodhouse79dd5052014-01-08 12:58:07 +0000383}
384
Sanjoy Das2d869b22015-06-15 18:44:01 +0000385Optional<MCOperand>
386X86MCInstLower::LowerMachineOperand(const MachineInstr *MI,
387 const MachineOperand &MO) const {
388 switch (MO.getType()) {
389 default:
Matthias Braun8c209aa2017-01-28 02:02:38 +0000390 MI->print(errs());
Sanjoy Das2d869b22015-06-15 18:44:01 +0000391 llvm_unreachable("unknown operand type");
392 case MachineOperand::MO_Register:
393 // Ignore all implicit register operands.
394 if (MO.isImplicit())
395 return None;
396 return MCOperand::createReg(MO.getReg());
397 case MachineOperand::MO_Immediate:
398 return MCOperand::createImm(MO.getImm());
399 case MachineOperand::MO_MachineBasicBlock:
400 case MachineOperand::MO_GlobalAddress:
401 case MachineOperand::MO_ExternalSymbol:
402 return LowerSymbolOperand(MO, GetSymbolFromOperand(MO));
Rafael Espindola36b718f2015-06-22 17:46:53 +0000403 case MachineOperand::MO_MCSymbol:
404 return LowerSymbolOperand(MO, MO.getMCSymbol());
Sanjoy Das2d869b22015-06-15 18:44:01 +0000405 case MachineOperand::MO_JumpTableIndex:
406 return LowerSymbolOperand(MO, AsmPrinter.GetJTISymbol(MO.getIndex()));
407 case MachineOperand::MO_ConstantPoolIndex:
408 return LowerSymbolOperand(MO, AsmPrinter.GetCPISymbol(MO.getIndex()));
409 case MachineOperand::MO_BlockAddress:
410 return LowerSymbolOperand(
411 MO, AsmPrinter.GetBlockAddressSymbol(MO.getBlockAddress()));
412 case MachineOperand::MO_RegisterMask:
413 // Ignore call clobbers.
414 return None;
415 }
416}
417
Chris Lattner31722082009-09-12 20:34:57 +0000418void X86MCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const {
419 OutMI.setOpcode(MI->getOpcode());
Chad Rosier24c19d22012-08-01 18:39:17 +0000420
Sanjoy Das2d869b22015-06-15 18:44:01 +0000421 for (const MachineOperand &MO : MI->operands())
422 if (auto MaybeMCOp = LowerMachineOperand(MI, MO))
423 OutMI.addOperand(MaybeMCOp.getValue());
Chad Rosier24c19d22012-08-01 18:39:17 +0000424
Chris Lattner31722082009-09-12 20:34:57 +0000425 // Handle a few special cases to eliminate operand modifiers.
Chris Lattner626656a2010-10-08 03:54:52 +0000426ReSimplify:
Chris Lattner31722082009-09-12 20:34:57 +0000427 switch (OutMI.getOpcode()) {
Tim Northover6833e3f2013-06-10 20:43:49 +0000428 case X86::LEA64_32r:
Chris Lattnerf4693072010-07-08 23:46:44 +0000429 case X86::LEA64r:
430 case X86::LEA16r:
431 case X86::LEA32r:
432 // LEA should have a segment register, but it must be empty.
Keith Wyss3d868232018-04-17 21:30:29 +0000433 assert(OutMI.getNumOperands() == 1 + X86::AddrNumOperands &&
Chris Lattnerf4693072010-07-08 23:46:44 +0000434 "Unexpected # of LEA operands");
Keith Wyss3d868232018-04-17 21:30:29 +0000435 assert(OutMI.getOperand(1 + X86::AddrSegmentReg).getReg() == 0 &&
Chris Lattnerf4693072010-07-08 23:46:44 +0000436 "LEA has segment specified!");
Chris Lattner31722082009-09-12 20:34:57 +0000437 break;
Chris Lattnere96d5342010-02-05 21:30:49 +0000438
Craig Toppera66d81d2013-03-14 07:09:57 +0000439 // Commute operands to get a smaller encoding by using VEX.R instead of VEX.B
440 // if one of the registers is extended, but other isn't.
Craig Topperd6b661d2015-10-12 04:57:59 +0000441 case X86::VMOVZPQILo2PQIrr:
Craig Toppera66d81d2013-03-14 07:09:57 +0000442 case X86::VMOVAPDrr:
443 case X86::VMOVAPDYrr:
444 case X86::VMOVAPSrr:
445 case X86::VMOVAPSYrr:
446 case X86::VMOVDQArr:
447 case X86::VMOVDQAYrr:
448 case X86::VMOVDQUrr:
449 case X86::VMOVDQUYrr:
Craig Toppera66d81d2013-03-14 07:09:57 +0000450 case X86::VMOVUPDrr:
451 case X86::VMOVUPDYrr:
452 case X86::VMOVUPSrr:
453 case X86::VMOVUPSYrr: {
Craig Topper612f7bf2013-03-16 03:44:31 +0000454 if (!X86II::isX86_64ExtendedReg(OutMI.getOperand(0).getReg()) &&
455 X86II::isX86_64ExtendedReg(OutMI.getOperand(1).getReg())) {
456 unsigned NewOpc;
457 switch (OutMI.getOpcode()) {
Keith Wyss3d868232018-04-17 21:30:29 +0000458 default:
459 llvm_unreachable("Invalid opcode");
460 case X86::VMOVZPQILo2PQIrr:
461 NewOpc = X86::VMOVPQI2QIrr;
462 break;
463 case X86::VMOVAPDrr:
464 NewOpc = X86::VMOVAPDrr_REV;
465 break;
466 case X86::VMOVAPDYrr:
467 NewOpc = X86::VMOVAPDYrr_REV;
468 break;
469 case X86::VMOVAPSrr:
470 NewOpc = X86::VMOVAPSrr_REV;
471 break;
472 case X86::VMOVAPSYrr:
473 NewOpc = X86::VMOVAPSYrr_REV;
474 break;
475 case X86::VMOVDQArr:
476 NewOpc = X86::VMOVDQArr_REV;
477 break;
478 case X86::VMOVDQAYrr:
479 NewOpc = X86::VMOVDQAYrr_REV;
480 break;
481 case X86::VMOVDQUrr:
482 NewOpc = X86::VMOVDQUrr_REV;
483 break;
484 case X86::VMOVDQUYrr:
485 NewOpc = X86::VMOVDQUYrr_REV;
486 break;
487 case X86::VMOVUPDrr:
488 NewOpc = X86::VMOVUPDrr_REV;
489 break;
490 case X86::VMOVUPDYrr:
491 NewOpc = X86::VMOVUPDYrr_REV;
492 break;
493 case X86::VMOVUPSrr:
494 NewOpc = X86::VMOVUPSrr_REV;
495 break;
496 case X86::VMOVUPSYrr:
497 NewOpc = X86::VMOVUPSYrr_REV;
498 break;
Craig Topper612f7bf2013-03-16 03:44:31 +0000499 }
500 OutMI.setOpcode(NewOpc);
Craig Toppera66d81d2013-03-14 07:09:57 +0000501 }
Craig Topper612f7bf2013-03-16 03:44:31 +0000502 break;
503 }
504 case X86::VMOVSDrr:
505 case X86::VMOVSSrr: {
506 if (!X86II::isX86_64ExtendedReg(OutMI.getOperand(0).getReg()) &&
507 X86II::isX86_64ExtendedReg(OutMI.getOperand(2).getReg())) {
508 unsigned NewOpc;
509 switch (OutMI.getOpcode()) {
Keith Wyss3d868232018-04-17 21:30:29 +0000510 default:
511 llvm_unreachable("Invalid opcode");
512 case X86::VMOVSDrr:
513 NewOpc = X86::VMOVSDrr_REV;
514 break;
515 case X86::VMOVSSrr:
516 NewOpc = X86::VMOVSSrr_REV;
517 break;
Craig Topper612f7bf2013-03-16 03:44:31 +0000518 }
519 OutMI.setOpcode(NewOpc);
520 }
Craig Toppera66d81d2013-03-14 07:09:57 +0000521 break;
522 }
523
Jakob Stoklund Olesen97e31152012-02-16 17:56:02 +0000524 // TAILJMPr64, CALL64r, CALL64pcrel32 - These instructions have register
525 // inputs modeled as normal uses instead of implicit uses. As such, truncate
526 // off all but the first operand (the callee). FIXME: Change isel.
Daniel Dunbarb243dfb2010-05-19 08:07:12 +0000527 case X86::TAILJMPr64:
Reid Klecknera580b6e2015-01-30 21:03:31 +0000528 case X86::TAILJMPr64_REX:
Daniel Dunbar45ace402010-05-19 04:31:36 +0000529 case X86::CALL64r:
Jakob Stoklund Olesen97e31152012-02-16 17:56:02 +0000530 case X86::CALL64pcrel32: {
Daniel Dunbar45ace402010-05-19 04:31:36 +0000531 unsigned Opcode = OutMI.getOpcode();
Chris Lattner9f465392010-05-18 21:40:18 +0000532 MCOperand Saved = OutMI.getOperand(0);
533 OutMI = MCInst();
Daniel Dunbar45ace402010-05-19 04:31:36 +0000534 OutMI.setOpcode(Opcode);
Chris Lattner9f465392010-05-18 21:40:18 +0000535 OutMI.addOperand(Saved);
536 break;
537 }
Daniel Dunbar45ace402010-05-19 04:31:36 +0000538
Rafael Espindolad94f3b42010-10-26 18:09:55 +0000539 case X86::EH_RETURN:
540 case X86::EH_RETURN64: {
541 OutMI = MCInst();
David Woodhouse79dd5052014-01-08 12:58:07 +0000542 OutMI.setOpcode(getRetOpcode(AsmPrinter.getSubtarget()));
Rafael Espindolad94f3b42010-10-26 18:09:55 +0000543 break;
544 }
545
David Majnemerf828a0c2015-10-01 18:44:59 +0000546 case X86::CLEANUPRET: {
547 // Replace CATCHRET with the appropriate RET.
548 OutMI = MCInst();
549 OutMI.setOpcode(getRetOpcode(AsmPrinter.getSubtarget()));
550 break;
551 }
552
553 case X86::CATCHRET: {
554 // Replace CATCHRET with the appropriate RET.
555 const X86Subtarget &Subtarget = AsmPrinter.getSubtarget();
556 unsigned ReturnReg = Subtarget.is64Bit() ? X86::RAX : X86::EAX;
557 OutMI = MCInst();
558 OutMI.setOpcode(getRetOpcode(Subtarget));
559 OutMI.addOperand(MCOperand::createReg(ReturnReg));
560 break;
561 }
562
Keith Wyss3d868232018-04-17 21:30:29 +0000563 // TAILJMPd, TAILJMPd64, TailJMPd_cc - Lower to the correct jump
564 // instruction.
565 {
566 unsigned Opcode;
567 case X86::TAILJMPr:
568 Opcode = X86::JMP32r;
569 goto SetTailJmpOpcode;
570 case X86::TAILJMPd:
571 case X86::TAILJMPd64:
572 Opcode = X86::JMP_1;
573 goto SetTailJmpOpcode;
574 case X86::TAILJMPd_CC:
575 case X86::TAILJMPd64_CC:
576 Opcode = X86::GetCondBranchFromCond(
577 static_cast<X86::CondCode>(MI->getOperand(1).getImm()));
578 goto SetTailJmpOpcode;
Chad Rosier24c19d22012-08-01 18:39:17 +0000579
Keith Wyss3d868232018-04-17 21:30:29 +0000580 SetTailJmpOpcode:
581 MCOperand Saved = OutMI.getOperand(0);
582 OutMI = MCInst();
583 OutMI.setOpcode(Opcode);
584 OutMI.addOperand(Saved);
585 break;
586 }
Daniel Dunbard2f78e72010-05-19 15:26:43 +0000587
Craig Topperddbf51f2015-01-06 07:35:50 +0000588 case X86::DEC16r:
589 case X86::DEC32r:
590 case X86::INC16r:
591 case X86::INC32r:
592 // If we aren't in 64-bit mode we can use the 1-byte inc/dec instructions.
593 if (!AsmPrinter.getSubtarget().is64Bit()) {
594 unsigned Opcode;
595 switch (OutMI.getOpcode()) {
Keith Wyss3d868232018-04-17 21:30:29 +0000596 default:
597 llvm_unreachable("Invalid opcode");
598 case X86::DEC16r:
599 Opcode = X86::DEC16r_alt;
600 break;
601 case X86::DEC32r:
602 Opcode = X86::DEC32r_alt;
603 break;
604 case X86::INC16r:
605 Opcode = X86::INC16r_alt;
606 break;
607 case X86::INC32r:
608 Opcode = X86::INC32r_alt;
609 break;
Craig Topperddbf51f2015-01-06 07:35:50 +0000610 }
611 OutMI.setOpcode(Opcode);
612 }
613 break;
614
Chris Lattner626656a2010-10-08 03:54:52 +0000615 // These are pseudo-ops for OR to help with the OR->ADD transformation. We do
616 // this with an ugly goto in case the resultant OR uses EAX and needs the
617 // short form.
Keith Wyss3d868232018-04-17 21:30:29 +0000618 case X86::ADD16rr_DB:
619 OutMI.setOpcode(X86::OR16rr);
620 goto ReSimplify;
621 case X86::ADD32rr_DB:
622 OutMI.setOpcode(X86::OR32rr);
623 goto ReSimplify;
624 case X86::ADD64rr_DB:
625 OutMI.setOpcode(X86::OR64rr);
626 goto ReSimplify;
627 case X86::ADD16ri_DB:
628 OutMI.setOpcode(X86::OR16ri);
629 goto ReSimplify;
630 case X86::ADD32ri_DB:
631 OutMI.setOpcode(X86::OR32ri);
632 goto ReSimplify;
633 case X86::ADD64ri32_DB:
634 OutMI.setOpcode(X86::OR64ri32);
635 goto ReSimplify;
636 case X86::ADD16ri8_DB:
637 OutMI.setOpcode(X86::OR16ri8);
638 goto ReSimplify;
639 case X86::ADD32ri8_DB:
640 OutMI.setOpcode(X86::OR32ri8);
641 goto ReSimplify;
642 case X86::ADD64ri8_DB:
643 OutMI.setOpcode(X86::OR64ri8);
644 goto ReSimplify;
Chad Rosier24c19d22012-08-01 18:39:17 +0000645
Eli Friedman02f2f892011-09-07 18:48:32 +0000646 // Atomic load and store require a separate pseudo-inst because Acquire
647 // implies mayStore and Release implies mayLoad; fix these to regular MOV
648 // instructions here
Keith Wyss3d868232018-04-17 21:30:29 +0000649 case X86::ACQUIRE_MOV8rm:
650 OutMI.setOpcode(X86::MOV8rm);
651 goto ReSimplify;
652 case X86::ACQUIRE_MOV16rm:
653 OutMI.setOpcode(X86::MOV16rm);
654 goto ReSimplify;
655 case X86::ACQUIRE_MOV32rm:
656 OutMI.setOpcode(X86::MOV32rm);
657 goto ReSimplify;
658 case X86::ACQUIRE_MOV64rm:
659 OutMI.setOpcode(X86::MOV64rm);
660 goto ReSimplify;
661 case X86::RELEASE_MOV8mr:
662 OutMI.setOpcode(X86::MOV8mr);
663 goto ReSimplify;
664 case X86::RELEASE_MOV16mr:
665 OutMI.setOpcode(X86::MOV16mr);
666 goto ReSimplify;
667 case X86::RELEASE_MOV32mr:
668 OutMI.setOpcode(X86::MOV32mr);
669 goto ReSimplify;
670 case X86::RELEASE_MOV64mr:
671 OutMI.setOpcode(X86::MOV64mr);
672 goto ReSimplify;
673 case X86::RELEASE_MOV8mi:
674 OutMI.setOpcode(X86::MOV8mi);
675 goto ReSimplify;
676 case X86::RELEASE_MOV16mi:
677 OutMI.setOpcode(X86::MOV16mi);
678 goto ReSimplify;
679 case X86::RELEASE_MOV32mi:
680 OutMI.setOpcode(X86::MOV32mi);
681 goto ReSimplify;
682 case X86::RELEASE_MOV64mi32:
683 OutMI.setOpcode(X86::MOV64mi32);
684 goto ReSimplify;
685 case X86::RELEASE_ADD8mi:
686 OutMI.setOpcode(X86::ADD8mi);
687 goto ReSimplify;
688 case X86::RELEASE_ADD8mr:
689 OutMI.setOpcode(X86::ADD8mr);
690 goto ReSimplify;
691 case X86::RELEASE_ADD32mi:
692 OutMI.setOpcode(X86::ADD32mi);
693 goto ReSimplify;
694 case X86::RELEASE_ADD32mr:
695 OutMI.setOpcode(X86::ADD32mr);
696 goto ReSimplify;
697 case X86::RELEASE_ADD64mi32:
698 OutMI.setOpcode(X86::ADD64mi32);
699 goto ReSimplify;
700 case X86::RELEASE_ADD64mr:
701 OutMI.setOpcode(X86::ADD64mr);
702 goto ReSimplify;
703 case X86::RELEASE_AND8mi:
704 OutMI.setOpcode(X86::AND8mi);
705 goto ReSimplify;
706 case X86::RELEASE_AND8mr:
707 OutMI.setOpcode(X86::AND8mr);
708 goto ReSimplify;
709 case X86::RELEASE_AND32mi:
710 OutMI.setOpcode(X86::AND32mi);
711 goto ReSimplify;
712 case X86::RELEASE_AND32mr:
713 OutMI.setOpcode(X86::AND32mr);
714 goto ReSimplify;
715 case X86::RELEASE_AND64mi32:
716 OutMI.setOpcode(X86::AND64mi32);
717 goto ReSimplify;
718 case X86::RELEASE_AND64mr:
719 OutMI.setOpcode(X86::AND64mr);
720 goto ReSimplify;
721 case X86::RELEASE_OR8mi:
722 OutMI.setOpcode(X86::OR8mi);
723 goto ReSimplify;
724 case X86::RELEASE_OR8mr:
725 OutMI.setOpcode(X86::OR8mr);
726 goto ReSimplify;
727 case X86::RELEASE_OR32mi:
728 OutMI.setOpcode(X86::OR32mi);
729 goto ReSimplify;
730 case X86::RELEASE_OR32mr:
731 OutMI.setOpcode(X86::OR32mr);
732 goto ReSimplify;
733 case X86::RELEASE_OR64mi32:
734 OutMI.setOpcode(X86::OR64mi32);
735 goto ReSimplify;
736 case X86::RELEASE_OR64mr:
737 OutMI.setOpcode(X86::OR64mr);
738 goto ReSimplify;
739 case X86::RELEASE_XOR8mi:
740 OutMI.setOpcode(X86::XOR8mi);
741 goto ReSimplify;
742 case X86::RELEASE_XOR8mr:
743 OutMI.setOpcode(X86::XOR8mr);
744 goto ReSimplify;
745 case X86::RELEASE_XOR32mi:
746 OutMI.setOpcode(X86::XOR32mi);
747 goto ReSimplify;
748 case X86::RELEASE_XOR32mr:
749 OutMI.setOpcode(X86::XOR32mr);
750 goto ReSimplify;
751 case X86::RELEASE_XOR64mi32:
752 OutMI.setOpcode(X86::XOR64mi32);
753 goto ReSimplify;
754 case X86::RELEASE_XOR64mr:
755 OutMI.setOpcode(X86::XOR64mr);
756 goto ReSimplify;
757 case X86::RELEASE_INC8m:
758 OutMI.setOpcode(X86::INC8m);
759 goto ReSimplify;
760 case X86::RELEASE_INC16m:
761 OutMI.setOpcode(X86::INC16m);
762 goto ReSimplify;
763 case X86::RELEASE_INC32m:
764 OutMI.setOpcode(X86::INC32m);
765 goto ReSimplify;
766 case X86::RELEASE_INC64m:
767 OutMI.setOpcode(X86::INC64m);
768 goto ReSimplify;
769 case X86::RELEASE_DEC8m:
770 OutMI.setOpcode(X86::DEC8m);
771 goto ReSimplify;
772 case X86::RELEASE_DEC16m:
773 OutMI.setOpcode(X86::DEC16m);
774 goto ReSimplify;
775 case X86::RELEASE_DEC32m:
776 OutMI.setOpcode(X86::DEC32m);
777 goto ReSimplify;
778 case X86::RELEASE_DEC64m:
779 OutMI.setOpcode(X86::DEC64m);
780 goto ReSimplify;
Eli Friedman02f2f892011-09-07 18:48:32 +0000781
Daniel Dunbara4820fc2010-05-18 17:22:24 +0000782 // We don't currently select the correct instruction form for instructions
783 // which have a short %eax, etc. form. Handle this by custom lowering, for
784 // now.
785 //
786 // Note, we are currently not handling the following instructions:
Daniel Dunbar4f6c7c62010-05-19 06:20:44 +0000787 // MOV64ao8, MOV64o8a
Daniel Dunbara4820fc2010-05-18 17:22:24 +0000788 // XCHG16ar, XCHG32ar, XCHG64ar
Craig Topperc16a47292017-09-27 20:34:17 +0000789 case X86::MOV8mr_NOREX:
Craig Topper184310d2016-04-29 00:51:30 +0000790 case X86::MOV8mr:
Craig Topperc16a47292017-09-27 20:34:17 +0000791 case X86::MOV8rm_NOREX:
Craig Topper184310d2016-04-29 00:51:30 +0000792 case X86::MOV8rm:
793 case X86::MOV16mr:
794 case X86::MOV16rm:
795 case X86::MOV32mr:
796 case X86::MOV32rm: {
797 unsigned NewOpc;
798 switch (OutMI.getOpcode()) {
Keith Wyss3d868232018-04-17 21:30:29 +0000799 default:
800 llvm_unreachable("Invalid opcode");
Craig Topperc16a47292017-09-27 20:34:17 +0000801 case X86::MOV8mr_NOREX:
Keith Wyss3d868232018-04-17 21:30:29 +0000802 case X86::MOV8mr:
803 NewOpc = X86::MOV8o32a;
804 break;
Craig Topperc16a47292017-09-27 20:34:17 +0000805 case X86::MOV8rm_NOREX:
Keith Wyss3d868232018-04-17 21:30:29 +0000806 case X86::MOV8rm:
807 NewOpc = X86::MOV8ao32;
808 break;
809 case X86::MOV16mr:
810 NewOpc = X86::MOV16o32a;
811 break;
812 case X86::MOV16rm:
813 NewOpc = X86::MOV16ao32;
814 break;
815 case X86::MOV32mr:
816 NewOpc = X86::MOV32o32a;
817 break;
818 case X86::MOV32rm:
819 NewOpc = X86::MOV32ao32;
820 break;
Craig Topper184310d2016-04-29 00:51:30 +0000821 }
822 SimplifyShortMoveForm(AsmPrinter, OutMI, NewOpc);
823 break;
824 }
Daniel Dunbar4f6c7c62010-05-19 06:20:44 +0000825
Keith Wyss3d868232018-04-17 21:30:29 +0000826 case X86::ADC8ri:
827 case X86::ADC16ri:
828 case X86::ADC32ri:
829 case X86::ADC64ri32:
830 case X86::ADD8ri:
831 case X86::ADD16ri:
832 case X86::ADD32ri:
833 case X86::ADD64ri32:
834 case X86::AND8ri:
835 case X86::AND16ri:
836 case X86::AND32ri:
837 case X86::AND64ri32:
838 case X86::CMP8ri:
839 case X86::CMP16ri:
840 case X86::CMP32ri:
841 case X86::CMP64ri32:
842 case X86::OR8ri:
843 case X86::OR16ri:
844 case X86::OR32ri:
845 case X86::OR64ri32:
846 case X86::SBB8ri:
847 case X86::SBB16ri:
848 case X86::SBB32ri:
849 case X86::SBB64ri32:
850 case X86::SUB8ri:
851 case X86::SUB16ri:
852 case X86::SUB32ri:
853 case X86::SUB64ri32:
854 case X86::TEST8ri:
855 case X86::TEST16ri:
856 case X86::TEST32ri:
857 case X86::TEST64ri32:
858 case X86::XOR8ri:
859 case X86::XOR16ri:
860 case X86::XOR32ri:
861 case X86::XOR64ri32: {
Craig Topper184310d2016-04-29 00:51:30 +0000862 unsigned NewOpc;
863 switch (OutMI.getOpcode()) {
Keith Wyss3d868232018-04-17 21:30:29 +0000864 default:
865 llvm_unreachable("Invalid opcode");
866 case X86::ADC8ri:
867 NewOpc = X86::ADC8i8;
868 break;
869 case X86::ADC16ri:
870 NewOpc = X86::ADC16i16;
871 break;
872 case X86::ADC32ri:
873 NewOpc = X86::ADC32i32;
874 break;
875 case X86::ADC64ri32:
876 NewOpc = X86::ADC64i32;
877 break;
878 case X86::ADD8ri:
879 NewOpc = X86::ADD8i8;
880 break;
881 case X86::ADD16ri:
882 NewOpc = X86::ADD16i16;
883 break;
884 case X86::ADD32ri:
885 NewOpc = X86::ADD32i32;
886 break;
887 case X86::ADD64ri32:
888 NewOpc = X86::ADD64i32;
889 break;
890 case X86::AND8ri:
891 NewOpc = X86::AND8i8;
892 break;
893 case X86::AND16ri:
894 NewOpc = X86::AND16i16;
895 break;
896 case X86::AND32ri:
897 NewOpc = X86::AND32i32;
898 break;
899 case X86::AND64ri32:
900 NewOpc = X86::AND64i32;
901 break;
902 case X86::CMP8ri:
903 NewOpc = X86::CMP8i8;
904 break;
905 case X86::CMP16ri:
906 NewOpc = X86::CMP16i16;
907 break;
908 case X86::CMP32ri:
909 NewOpc = X86::CMP32i32;
910 break;
911 case X86::CMP64ri32:
912 NewOpc = X86::CMP64i32;
913 break;
914 case X86::OR8ri:
915 NewOpc = X86::OR8i8;
916 break;
917 case X86::OR16ri:
918 NewOpc = X86::OR16i16;
919 break;
920 case X86::OR32ri:
921 NewOpc = X86::OR32i32;
922 break;
923 case X86::OR64ri32:
924 NewOpc = X86::OR64i32;
925 break;
926 case X86::SBB8ri:
927 NewOpc = X86::SBB8i8;
928 break;
929 case X86::SBB16ri:
930 NewOpc = X86::SBB16i16;
931 break;
932 case X86::SBB32ri:
933 NewOpc = X86::SBB32i32;
934 break;
935 case X86::SBB64ri32:
936 NewOpc = X86::SBB64i32;
937 break;
938 case X86::SUB8ri:
939 NewOpc = X86::SUB8i8;
940 break;
941 case X86::SUB16ri:
942 NewOpc = X86::SUB16i16;
943 break;
944 case X86::SUB32ri:
945 NewOpc = X86::SUB32i32;
946 break;
947 case X86::SUB64ri32:
948 NewOpc = X86::SUB64i32;
949 break;
950 case X86::TEST8ri:
951 NewOpc = X86::TEST8i8;
952 break;
953 case X86::TEST16ri:
954 NewOpc = X86::TEST16i16;
955 break;
956 case X86::TEST32ri:
957 NewOpc = X86::TEST32i32;
958 break;
959 case X86::TEST64ri32:
960 NewOpc = X86::TEST64i32;
961 break;
962 case X86::XOR8ri:
963 NewOpc = X86::XOR8i8;
964 break;
965 case X86::XOR16ri:
966 NewOpc = X86::XOR16i16;
967 break;
968 case X86::XOR32ri:
969 NewOpc = X86::XOR32i32;
970 break;
971 case X86::XOR64ri32:
972 NewOpc = X86::XOR64i32;
973 break;
Craig Topper184310d2016-04-29 00:51:30 +0000974 }
975 SimplifyShortImmForm(OutMI, NewOpc);
976 break;
977 }
Rafael Espindola66393c12011-10-26 21:12:27 +0000978
Benjamin Kramer068a2252013-07-12 18:06:44 +0000979 // Try to shrink some forms of movsx.
980 case X86::MOVSX16rr8:
981 case X86::MOVSX32rr16:
982 case X86::MOVSX64rr32:
983 SimplifyMOVSX(OutMI);
984 break;
Rafael Espindola66393c12011-10-26 21:12:27 +0000985 }
Chris Lattner31722082009-09-12 20:34:57 +0000986}
987
Lang Hamesf49bc3f2014-07-24 20:40:55 +0000988void X86AsmPrinter::LowerTlsAddr(X86MCInstLower &MCInstLowering,
989 const MachineInstr &MI) {
Hans Wennborg789acfb2012-06-01 16:27:21 +0000990
991 bool is64Bits = MI.getOpcode() == X86::TLS_addr64 ||
992 MI.getOpcode() == X86::TLS_base_addr64;
993
994 bool needsPadding = MI.getOpcode() == X86::TLS_addr64;
995
Lang Hames9ff69c82015-04-24 19:11:51 +0000996 MCContext &context = OutStreamer->getContext();
Rafael Espindolac4774792010-11-28 21:16:39 +0000997
Benjamin Kramer4e629f72012-11-26 13:34:22 +0000998 if (needsPadding)
Lang Hamesf49bc3f2014-07-24 20:40:55 +0000999 EmitAndCountInstruction(MCInstBuilder(X86::DATA16_PREFIX));
Hans Wennborg789acfb2012-06-01 16:27:21 +00001000
1001 MCSymbolRefExpr::VariantKind SRVK;
1002 switch (MI.getOpcode()) {
Keith Wyss3d868232018-04-17 21:30:29 +00001003 case X86::TLS_addr32:
1004 case X86::TLS_addr64:
1005 SRVK = MCSymbolRefExpr::VK_TLSGD;
1006 break;
1007 case X86::TLS_base_addr32:
1008 SRVK = MCSymbolRefExpr::VK_TLSLDM;
1009 break;
1010 case X86::TLS_base_addr64:
1011 SRVK = MCSymbolRefExpr::VK_TLSLD;
1012 break;
1013 default:
1014 llvm_unreachable("unexpected opcode");
Hans Wennborg789acfb2012-06-01 16:27:21 +00001015 }
1016
Rafael Espindolac4774792010-11-28 21:16:39 +00001017 MCSymbol *sym = MCInstLowering.GetSymbolFromOperand(MI.getOperand(3));
Jim Grosbach13760bd2015-05-30 01:25:56 +00001018 const MCSymbolRefExpr *symRef = MCSymbolRefExpr::create(sym, SRVK, context);
Rafael Espindolac4774792010-11-28 21:16:39 +00001019
1020 MCInst LEA;
1021 if (is64Bits) {
1022 LEA.setOpcode(X86::LEA64r);
Jim Grosbache9119e42015-05-13 18:37:00 +00001023 LEA.addOperand(MCOperand::createReg(X86::RDI)); // dest
1024 LEA.addOperand(MCOperand::createReg(X86::RIP)); // base
1025 LEA.addOperand(MCOperand::createImm(1)); // scale
1026 LEA.addOperand(MCOperand::createReg(0)); // index
1027 LEA.addOperand(MCOperand::createExpr(symRef)); // disp
1028 LEA.addOperand(MCOperand::createReg(0)); // seg
Rafael Espindola55d11452012-06-07 18:39:19 +00001029 } else if (SRVK == MCSymbolRefExpr::VK_TLSLDM) {
1030 LEA.setOpcode(X86::LEA32r);
Jim Grosbache9119e42015-05-13 18:37:00 +00001031 LEA.addOperand(MCOperand::createReg(X86::EAX)); // dest
1032 LEA.addOperand(MCOperand::createReg(X86::EBX)); // base
1033 LEA.addOperand(MCOperand::createImm(1)); // scale
1034 LEA.addOperand(MCOperand::createReg(0)); // index
1035 LEA.addOperand(MCOperand::createExpr(symRef)); // disp
1036 LEA.addOperand(MCOperand::createReg(0)); // seg
Rafael Espindolac4774792010-11-28 21:16:39 +00001037 } else {
1038 LEA.setOpcode(X86::LEA32r);
Jim Grosbache9119e42015-05-13 18:37:00 +00001039 LEA.addOperand(MCOperand::createReg(X86::EAX)); // dest
1040 LEA.addOperand(MCOperand::createReg(0)); // base
1041 LEA.addOperand(MCOperand::createImm(1)); // scale
1042 LEA.addOperand(MCOperand::createReg(X86::EBX)); // index
1043 LEA.addOperand(MCOperand::createExpr(symRef)); // disp
1044 LEA.addOperand(MCOperand::createReg(0)); // seg
Rafael Espindolac4774792010-11-28 21:16:39 +00001045 }
Lang Hamesf49bc3f2014-07-24 20:40:55 +00001046 EmitAndCountInstruction(LEA);
Rafael Espindolac4774792010-11-28 21:16:39 +00001047
Hans Wennborg789acfb2012-06-01 16:27:21 +00001048 if (needsPadding) {
Lang Hamesf49bc3f2014-07-24 20:40:55 +00001049 EmitAndCountInstruction(MCInstBuilder(X86::DATA16_PREFIX));
1050 EmitAndCountInstruction(MCInstBuilder(X86::DATA16_PREFIX));
1051 EmitAndCountInstruction(MCInstBuilder(X86::REX64_PREFIX));
Rafael Espindolac4774792010-11-28 21:16:39 +00001052 }
1053
Rafael Espindolac4774792010-11-28 21:16:39 +00001054 StringRef name = is64Bits ? "__tls_get_addr" : "___tls_get_addr";
Jim Grosbach6f482002015-05-18 18:43:14 +00001055 MCSymbol *tlsGetAddr = context.getOrCreateSymbol(name);
Rafael Espindolac4774792010-11-28 21:16:39 +00001056 const MCSymbolRefExpr *tlsRef =
Keith Wyss3d868232018-04-17 21:30:29 +00001057 MCSymbolRefExpr::create(tlsGetAddr, MCSymbolRefExpr::VK_PLT, context);
Rafael Espindolac4774792010-11-28 21:16:39 +00001058
Keith Wyss3d868232018-04-17 21:30:29 +00001059 EmitAndCountInstruction(
1060 MCInstBuilder(is64Bits ? X86::CALL64pcrel32 : X86::CALLpcrel32)
1061 .addExpr(tlsRef));
Rafael Espindolac4774792010-11-28 21:16:39 +00001062}
Devang Patel50c94312010-04-28 01:39:28 +00001063
Adrian Prantl5f8f34e42018-05-01 15:54:18 +00001064/// Emit the largest nop instruction smaller than or equal to \p NumBytes
Sanjoy Das6ecfae62016-04-19 18:48:13 +00001065/// bytes. Return the size of nop emitted.
1066static unsigned EmitNop(MCStreamer &OS, unsigned NumBytes, bool Is64Bit,
1067 const MCSubtargetInfo &STI) {
Juergen Ributzka17e0d9e2013-12-04 00:39:08 +00001068 // This works only for 64bit. For 32bit we have to do additional checking if
1069 // the CPU supports multi-byte nops.
1070 assert(Is64Bit && "EmitNops only supports X86-64");
Sanjoy Das6ecfae62016-04-19 18:48:13 +00001071
1072 unsigned NopSize;
1073 unsigned Opc, BaseReg, ScaleVal, IndexReg, Displacement, SegmentReg;
1074 Opc = IndexReg = Displacement = SegmentReg = 0;
1075 BaseReg = X86::RAX;
1076 ScaleVal = 1;
1077 switch (NumBytes) {
Keith Wyss3d868232018-04-17 21:30:29 +00001078 case 0:
1079 llvm_unreachable("Zero nops?");
1080 break;
1081 case 1:
1082 NopSize = 1;
1083 Opc = X86::NOOP;
1084 break;
1085 case 2:
1086 NopSize = 2;
1087 Opc = X86::XCHG16ar;
1088 break;
1089 case 3:
1090 NopSize = 3;
1091 Opc = X86::NOOPL;
1092 break;
1093 case 4:
1094 NopSize = 4;
1095 Opc = X86::NOOPL;
1096 Displacement = 8;
1097 break;
1098 case 5:
1099 NopSize = 5;
1100 Opc = X86::NOOPL;
1101 Displacement = 8;
1102 IndexReg = X86::RAX;
1103 break;
1104 case 6:
1105 NopSize = 6;
1106 Opc = X86::NOOPW;
1107 Displacement = 8;
1108 IndexReg = X86::RAX;
1109 break;
1110 case 7:
1111 NopSize = 7;
1112 Opc = X86::NOOPL;
1113 Displacement = 512;
1114 break;
1115 case 8:
1116 NopSize = 8;
1117 Opc = X86::NOOPL;
1118 Displacement = 512;
1119 IndexReg = X86::RAX;
1120 break;
1121 case 9:
1122 NopSize = 9;
1123 Opc = X86::NOOPW;
1124 Displacement = 512;
1125 IndexReg = X86::RAX;
1126 break;
1127 default:
1128 NopSize = 10;
1129 Opc = X86::NOOPW;
1130 Displacement = 512;
1131 IndexReg = X86::RAX;
1132 SegmentReg = X86::CS;
1133 break;
Sanjoy Das6ecfae62016-04-19 18:48:13 +00001134 }
1135
1136 unsigned NumPrefixes = std::min(NumBytes - NopSize, 5U);
1137 NopSize += NumPrefixes;
1138 for (unsigned i = 0; i != NumPrefixes; ++i)
1139 OS.EmitBytes("\x66");
1140
1141 switch (Opc) {
1142 default:
1143 llvm_unreachable("Unexpected opcode");
1144 break;
1145 case X86::NOOP:
1146 OS.EmitInstruction(MCInstBuilder(Opc), STI);
1147 break;
1148 case X86::XCHG16ar:
Craig Topperebf52e82018-04-18 22:07:53 +00001149 OS.EmitInstruction(MCInstBuilder(Opc).addReg(X86::AX).addReg(X86::AX), STI);
Sanjoy Das6ecfae62016-04-19 18:48:13 +00001150 break;
1151 case X86::NOOPL:
1152 case X86::NOOPW:
1153 OS.EmitInstruction(MCInstBuilder(Opc)
1154 .addReg(BaseReg)
1155 .addImm(ScaleVal)
1156 .addReg(IndexReg)
1157 .addImm(Displacement)
1158 .addReg(SegmentReg),
1159 STI);
1160 break;
1161 }
1162 assert(NopSize <= NumBytes && "We overemitted?");
1163 return NopSize;
1164}
1165
Adrian Prantl5f8f34e42018-05-01 15:54:18 +00001166/// Emit the optimal amount of multi-byte nops on X86.
Sanjoy Das6ecfae62016-04-19 18:48:13 +00001167static void EmitNops(MCStreamer &OS, unsigned NumBytes, bool Is64Bit,
1168 const MCSubtargetInfo &STI) {
Davide Italiano8a8f24b2016-04-20 17:53:21 +00001169 unsigned NopsToEmit = NumBytes;
Davide Italianobf4df852016-04-20 18:45:31 +00001170 (void)NopsToEmit;
Juergen Ributzka17e0d9e2013-12-04 00:39:08 +00001171 while (NumBytes) {
Sanjoy Das6ecfae62016-04-19 18:48:13 +00001172 NumBytes -= EmitNop(OS, NumBytes, Is64Bit, STI);
Davide Italiano8a8f24b2016-04-20 17:53:21 +00001173 assert(NopsToEmit >= NumBytes && "Emitted more than I asked for!");
Sanjoy Das6ecfae62016-04-19 18:48:13 +00001174 }
Juergen Ributzka17e0d9e2013-12-04 00:39:08 +00001175}
1176
Sanjoy Das2e0d29f2015-05-06 23:53:26 +00001177void X86AsmPrinter::LowerSTATEPOINT(const MachineInstr &MI,
1178 X86MCInstLower &MCIL) {
1179 assert(Subtarget->is64Bit() && "Statepoint currently only supports X86-64");
Philip Reames0365f1a2014-12-01 22:52:56 +00001180
Sanjoy Dasa1d39ba2015-05-12 23:52:24 +00001181 StatepointOpers SOpers(&MI);
Sanjoy Dasa1d39ba2015-05-12 23:52:24 +00001182 if (unsigned PatchBytes = SOpers.getNumPatchBytes()) {
1183 EmitNops(*OutStreamer, PatchBytes, Subtarget->is64Bit(),
1184 getSubtargetInfo());
1185 } else {
1186 // Lower call target and choose correct opcode
1187 const MachineOperand &CallTarget = SOpers.getCallTarget();
1188 MCOperand CallTargetMCOp;
1189 unsigned CallOpcode;
1190 switch (CallTarget.getType()) {
1191 case MachineOperand::MO_GlobalAddress:
1192 case MachineOperand::MO_ExternalSymbol:
1193 CallTargetMCOp = MCIL.LowerSymbolOperand(
1194 CallTarget, MCIL.GetSymbolFromOperand(CallTarget));
1195 CallOpcode = X86::CALL64pcrel32;
1196 // Currently, we only support relative addressing with statepoints.
1197 // Otherwise, we'll need a scratch register to hold the target
1198 // address. You'll fail asserts during load & relocation if this
1199 // symbol is to far away. (TODO: support non-relative addressing)
1200 break;
1201 case MachineOperand::MO_Immediate:
Jim Grosbache9119e42015-05-13 18:37:00 +00001202 CallTargetMCOp = MCOperand::createImm(CallTarget.getImm());
Sanjoy Dasa1d39ba2015-05-12 23:52:24 +00001203 CallOpcode = X86::CALL64pcrel32;
1204 // Currently, we only support relative addressing with statepoints.
1205 // Otherwise, we'll need a scratch register to hold the target
1206 // immediate. You'll fail asserts during load & relocation if this
1207 // address is to far away. (TODO: support non-relative addressing)
1208 break;
1209 case MachineOperand::MO_Register:
Chandler Carruthc58f2162018-01-22 22:05:25 +00001210 // FIXME: Add retpoline support and remove this.
1211 if (Subtarget->useRetpoline())
1212 report_fatal_error("Lowering register statepoints with retpoline not "
1213 "yet implemented.");
Jim Grosbache9119e42015-05-13 18:37:00 +00001214 CallTargetMCOp = MCOperand::createReg(CallTarget.getReg());
Sanjoy Dasa1d39ba2015-05-12 23:52:24 +00001215 CallOpcode = X86::CALL64r;
1216 break;
1217 default:
1218 llvm_unreachable("Unsupported operand type in statepoint call target");
1219 break;
1220 }
1221
1222 // Emit call
1223 MCInst CallInst;
1224 CallInst.setOpcode(CallOpcode);
1225 CallInst.addOperand(CallTargetMCOp);
1226 OutStreamer->EmitInstruction(CallInst, getSubtargetInfo());
1227 }
Philip Reames0365f1a2014-12-01 22:52:56 +00001228
1229 // Record our statepoint node in the same section used by STACKMAP
1230 // and PATCHPOINT
Michael Liao5bf95782014-12-04 05:20:33 +00001231 SM.recordStatepoint(MI);
Philip Reames0365f1a2014-12-01 22:52:56 +00001232}
1233
Sanjoy Das2f63cbc2017-02-07 19:19:49 +00001234void X86AsmPrinter::LowerFAULTING_OP(const MachineInstr &FaultingMI,
1235 X86MCInstLower &MCIL) {
1236 // FAULTING_LOAD_OP <def>, <faltinf type>, <MBB handler>,
1237 // <opcode>, <operands>
Sanjoy Dasc63244d2015-06-15 18:44:08 +00001238
Sanjoy Das2f63cbc2017-02-07 19:19:49 +00001239 unsigned DefRegister = FaultingMI.getOperand(0).getReg();
1240 FaultMaps::FaultKind FK =
1241 static_cast<FaultMaps::FaultKind>(FaultingMI.getOperand(1).getImm());
1242 MCSymbol *HandlerLabel = FaultingMI.getOperand(2).getMBB()->getSymbol();
1243 unsigned Opcode = FaultingMI.getOperand(3).getImm();
1244 unsigned OperandsBeginIdx = 4;
Sanjoy Dasc63244d2015-06-15 18:44:08 +00001245
Sanjoy Das2f63cbc2017-02-07 19:19:49 +00001246 assert(FK < FaultMaps::FaultKindMax && "Invalid Faulting Kind!");
1247 FM.recordFaultingOp(FK, HandlerLabel);
Sanjoy Dasc63244d2015-06-15 18:44:08 +00001248
Sanjoy Das2f63cbc2017-02-07 19:19:49 +00001249 MCInst MI;
1250 MI.setOpcode(Opcode);
Sanjoy Das93d608c2015-07-20 20:31:39 +00001251
Sanjoy Das2f63cbc2017-02-07 19:19:49 +00001252 if (DefRegister != X86::NoRegister)
1253 MI.addOperand(MCOperand::createReg(DefRegister));
Sanjoy Das93d608c2015-07-20 20:31:39 +00001254
Sanjoy Das2f63cbc2017-02-07 19:19:49 +00001255 for (auto I = FaultingMI.operands_begin() + OperandsBeginIdx,
1256 E = FaultingMI.operands_end();
Sanjoy Dasc63244d2015-06-15 18:44:08 +00001257 I != E; ++I)
Sanjoy Das2f63cbc2017-02-07 19:19:49 +00001258 if (auto MaybeOperand = MCIL.LowerMachineOperand(&FaultingMI, *I))
1259 MI.addOperand(MaybeOperand.getValue());
Sanjoy Dasc63244d2015-06-15 18:44:08 +00001260
Sanjoy Das2f63cbc2017-02-07 19:19:49 +00001261 OutStreamer->EmitInstruction(MI, getSubtargetInfo());
Sanjoy Dasc63244d2015-06-15 18:44:08 +00001262}
Philip Reames0365f1a2014-12-01 22:52:56 +00001263
Nirav Davea7c041d2017-01-31 17:00:27 +00001264void X86AsmPrinter::LowerFENTRY_CALL(const MachineInstr &MI,
1265 X86MCInstLower &MCIL) {
1266 bool Is64Bits = Subtarget->is64Bit();
1267 MCContext &Ctx = OutStreamer->getContext();
1268 MCSymbol *fentry = Ctx.getOrCreateSymbol("__fentry__");
1269 const MCSymbolRefExpr *Op =
1270 MCSymbolRefExpr::create(fentry, MCSymbolRefExpr::VK_None, Ctx);
1271
1272 EmitAndCountInstruction(
1273 MCInstBuilder(Is64Bits ? X86::CALL64pcrel32 : X86::CALLpcrel32)
1274 .addExpr(Op));
1275}
1276
Sanjoy Dasc0441c22016-04-19 05:24:47 +00001277void X86AsmPrinter::LowerPATCHABLE_OP(const MachineInstr &MI,
1278 X86MCInstLower &MCIL) {
1279 // PATCHABLE_OP minsize, opcode, operands
1280
1281 unsigned MinSize = MI.getOperand(0).getImm();
1282 unsigned Opcode = MI.getOperand(1).getImm();
1283
1284 MCInst MCI;
1285 MCI.setOpcode(Opcode);
1286 for (auto &MO : make_range(MI.operands_begin() + 2, MI.operands_end()))
1287 if (auto MaybeOperand = MCIL.LowerMachineOperand(&MI, MO))
1288 MCI.addOperand(MaybeOperand.getValue());
1289
1290 SmallString<256> Code;
1291 SmallVector<MCFixup, 4> Fixups;
1292 raw_svector_ostream VecOS(Code);
1293 CodeEmitter->encodeInstruction(MCI, VecOS, Fixups, getSubtargetInfo());
1294
1295 if (Code.size() < MinSize) {
1296 if (MinSize == 2 && Opcode == X86::PUSH64r) {
1297 // This is an optimization that lets us get away without emitting a nop in
1298 // many cases.
1299 //
Francis Visoiu Mistrih9d7bb0c2017-11-28 17:15:09 +00001300 // NB! In some cases the encoding for PUSH64r (e.g. PUSH64r %r9) takes two
Sanjoy Dasc0441c22016-04-19 05:24:47 +00001301 // bytes too, so the check on MinSize is important.
1302 MCI.setOpcode(X86::PUSH64rmr);
1303 } else {
Sanjoy Das6ecfae62016-04-19 18:48:13 +00001304 unsigned NopSize = EmitNop(*OutStreamer, MinSize, Subtarget->is64Bit(),
1305 getSubtargetInfo());
1306 assert(NopSize == MinSize && "Could not implement MinSize!");
Keith Wyss3d868232018-04-17 21:30:29 +00001307 (void)NopSize;
Sanjoy Dasc0441c22016-04-19 05:24:47 +00001308 }
1309 }
1310
1311 OutStreamer->EmitInstruction(MCI, getSubtargetInfo());
1312}
1313
Andrew Trickd4e3dc62013-11-19 03:29:56 +00001314// Lower a stackmap of the form:
1315// <id>, <shadowBytes>, ...
Lang Hamesf49bc3f2014-07-24 20:40:55 +00001316void X86AsmPrinter::LowerSTACKMAP(const MachineInstr &MI) {
Lang Hames9ff69c82015-04-24 19:11:51 +00001317 SMShadowTracker.emitShadowPadding(*OutStreamer, getSubtargetInfo());
Andrew Trickd4e3dc62013-11-19 03:29:56 +00001318 SM.recordStackMap(MI);
Lang Hamesf49bc3f2014-07-24 20:40:55 +00001319 unsigned NumShadowBytes = MI.getOperand(1).getImm();
1320 SMShadowTracker.reset(NumShadowBytes);
Andrew Trick153ebe62013-10-31 22:11:56 +00001321}
1322
Andrew Trick561f2212013-11-14 06:54:10 +00001323// Lower a patchpoint of the form:
Andrew Trickd4e3dc62013-11-19 03:29:56 +00001324// [<def>], <id>, <numBytes>, <target>, <numArgs>, <cc>, ...
Lang Hames65613a62015-04-22 06:02:31 +00001325void X86AsmPrinter::LowerPATCHPOINT(const MachineInstr &MI,
1326 X86MCInstLower &MCIL) {
Lang Hamesf49bc3f2014-07-24 20:40:55 +00001327 assert(Subtarget->is64Bit() && "Patchpoint currently only supports X86-64");
1328
Lang Hames9ff69c82015-04-24 19:11:51 +00001329 SMShadowTracker.emitShadowPadding(*OutStreamer, getSubtargetInfo());
Lang Hamesf49bc3f2014-07-24 20:40:55 +00001330
Andrew Trickd4e3dc62013-11-19 03:29:56 +00001331 SM.recordPatchPoint(MI);
Juergen Ributzka9969d3e2013-11-08 23:28:16 +00001332
Andrew Trickd4e3dc62013-11-19 03:29:56 +00001333 PatchPointOpers opers(&MI);
1334 unsigned ScratchIdx = opers.getNextScratchIdx();
Andrew Trick561f2212013-11-14 06:54:10 +00001335 unsigned EncodedBytes = 0;
Philip Reamese83c4b32016-08-23 23:33:29 +00001336 const MachineOperand &CalleeMO = opers.getCallTarget();
Lang Hames65613a62015-04-22 06:02:31 +00001337
1338 // Check for null target. If target is non-null (i.e. is non-zero or is
1339 // symbolic) then emit a call.
1340 if (!(CalleeMO.isImm() && !CalleeMO.getImm())) {
1341 MCOperand CalleeMCOp;
1342 switch (CalleeMO.getType()) {
1343 default:
1344 /// FIXME: Add a verifier check for bad callee types.
1345 llvm_unreachable("Unrecognized callee operand type.");
1346 case MachineOperand::MO_Immediate:
1347 if (CalleeMO.getImm())
Jim Grosbache9119e42015-05-13 18:37:00 +00001348 CalleeMCOp = MCOperand::createImm(CalleeMO.getImm());
Lang Hames65613a62015-04-22 06:02:31 +00001349 break;
1350 case MachineOperand::MO_ExternalSymbol:
1351 case MachineOperand::MO_GlobalAddress:
Keith Wyss3d868232018-04-17 21:30:29 +00001352 CalleeMCOp = MCIL.LowerSymbolOperand(CalleeMO,
1353 MCIL.GetSymbolFromOperand(CalleeMO));
Lang Hames65613a62015-04-22 06:02:31 +00001354 break;
1355 }
1356
Andrew Trick561f2212013-11-14 06:54:10 +00001357 // Emit MOV to materialize the target address and the CALL to target.
1358 // This is encoded with 12-13 bytes, depending on which register is used.
Juergen Ributzka17e0d9e2013-12-04 00:39:08 +00001359 unsigned ScratchReg = MI.getOperand(ScratchIdx).getReg();
1360 if (X86II::isX86_64ExtendedReg(ScratchReg))
1361 EncodedBytes = 13;
1362 else
1363 EncodedBytes = 12;
Lang Hames65613a62015-04-22 06:02:31 +00001364
1365 EmitAndCountInstruction(
1366 MCInstBuilder(X86::MOV64ri).addReg(ScratchReg).addOperand(CalleeMCOp));
Chandler Carruthc58f2162018-01-22 22:05:25 +00001367 // FIXME: Add retpoline support and remove this.
1368 if (Subtarget->useRetpoline())
1369 report_fatal_error(
1370 "Lowering patchpoint with retpoline not yet implemented.");
Lang Hamesf49bc3f2014-07-24 20:40:55 +00001371 EmitAndCountInstruction(MCInstBuilder(X86::CALL64r).addReg(ScratchReg));
Andrew Trick561f2212013-11-14 06:54:10 +00001372 }
Lang Hames65613a62015-04-22 06:02:31 +00001373
Andrew Trick153ebe62013-10-31 22:11:56 +00001374 // Emit padding.
Philip Reamese83c4b32016-08-23 23:33:29 +00001375 unsigned NumBytes = opers.getNumPatchBytes();
Andrew Trickd4e3dc62013-11-19 03:29:56 +00001376 assert(NumBytes >= EncodedBytes &&
Andrew Trick153ebe62013-10-31 22:11:56 +00001377 "Patchpoint can't request size less than the length of a call.");
1378
Lang Hames9ff69c82015-04-24 19:11:51 +00001379 EmitNops(*OutStreamer, NumBytes - EncodedBytes, Subtarget->is64Bit(),
Lang Hamesf49bc3f2014-07-24 20:40:55 +00001380 getSubtargetInfo());
Andrew Trick153ebe62013-10-31 22:11:56 +00001381}
1382
Dean Michael Berris9bcaed82017-05-08 05:45:21 +00001383void X86AsmPrinter::LowerPATCHABLE_EVENT_CALL(const MachineInstr &MI,
1384 X86MCInstLower &MCIL) {
Hiroshi Inouebb703e82017-07-02 03:24:54 +00001385 assert(Subtarget->is64Bit() && "XRay custom events only supports X86-64");
Dean Michael Berris9bcaed82017-05-08 05:45:21 +00001386
1387 // We want to emit the following pattern, which follows the x86 calling
1388 // convention to prepare for the trampoline call to be patched in.
1389 //
Dean Michael Berris9bcaed82017-05-08 05:45:21 +00001390 // .p2align 1, ...
1391 // .Lxray_event_sled_N:
Dean Michael Berrisebc16592017-09-04 05:34:58 +00001392 // jmp +N // jump across the instrumentation sled
1393 // ... // set up arguments in register
1394 // callq __xray_CustomEvent@plt // force dependency to symbol
1395 // ...
1396 // <jump here>
Dean Michael Berris9bcaed82017-05-08 05:45:21 +00001397 //
1398 // After patching, it would look something like:
1399 //
1400 // nopw (2-byte nop)
Dean Michael Berrisebc16592017-09-04 05:34:58 +00001401 // ...
Dean Michael Berris9bcaed82017-05-08 05:45:21 +00001402 // callq __xrayCustomEvent // already lowered
Dean Michael Berrisebc16592017-09-04 05:34:58 +00001403 // ...
Dean Michael Berris9bcaed82017-05-08 05:45:21 +00001404 //
1405 // ---
1406 // First we emit the label and the jump.
1407 auto CurSled = OutContext.createTempSymbol("xray_event_sled_", true);
1408 OutStreamer->AddComment("# XRay Custom Event Log");
1409 OutStreamer->EmitCodeAlignment(2);
1410 OutStreamer->EmitLabel(CurSled);
1411
1412 // Use a two-byte `jmp`. This version of JMP takes an 8-bit relative offset as
1413 // an operand (computed as an offset from the jmp instruction).
1414 // FIXME: Find another less hacky way do force the relative jump.
Dean Michael Berrisebc16592017-09-04 05:34:58 +00001415 OutStreamer->EmitBinaryData("\xeb\x0f");
Dean Michael Berris9bcaed82017-05-08 05:45:21 +00001416
1417 // The default C calling convention will place two arguments into %rcx and
1418 // %rdx -- so we only work with those.
Keith Wyss3d868232018-04-17 21:30:29 +00001419 unsigned DestRegs[] = {X86::RDI, X86::RSI};
Dean Michael Berrisebc16592017-09-04 05:34:58 +00001420 bool UsedMask[] = {false, false};
Keith Wyss3d868232018-04-17 21:30:29 +00001421 // Filled out in loop.
1422 unsigned SrcRegs[] = {0, 0};
Dean Michael Berris9bcaed82017-05-08 05:45:21 +00001423
Dean Michael Berrisebc16592017-09-04 05:34:58 +00001424 // Then we put the operands in the %rdi and %rsi registers. We spill the
1425 // values in the register before we clobber them, and mark them as used in
1426 // UsedMask. In case the arguments are already in the correct register, we use
1427 // emit nops appropriately sized to keep the sled the same size in every
1428 // situation.
Dean Michael Berris9bcaed82017-05-08 05:45:21 +00001429 for (unsigned I = 0; I < MI.getNumOperands(); ++I)
1430 if (auto Op = MCIL.LowerMachineOperand(&MI, MI.getOperand(I))) {
Dean Michael Berrisebc16592017-09-04 05:34:58 +00001431 assert(Op->isReg() && "Only support arguments in registers");
Keith Wyss3d868232018-04-17 21:30:29 +00001432 SrcRegs[I] = Op->getReg();
1433 if (SrcRegs[I] != DestRegs[I]) {
Dean Michael Berrisebc16592017-09-04 05:34:58 +00001434 UsedMask[I] = true;
1435 EmitAndCountInstruction(
Keith Wyss3d868232018-04-17 21:30:29 +00001436 MCInstBuilder(X86::PUSH64r).addReg(DestRegs[I]));
Dean Michael Berrisebc16592017-09-04 05:34:58 +00001437 } else {
1438 EmitNops(*OutStreamer, 4, Subtarget->is64Bit(), getSubtargetInfo());
Dean Michael Berris9bcaed82017-05-08 05:45:21 +00001439 }
1440 }
1441
Keith Wyss3d868232018-04-17 21:30:29 +00001442 // Now that the register values are stashed, mov arguments into place.
1443 for (unsigned I = 0; I < MI.getNumOperands(); ++I)
1444 if (SrcRegs[I] != DestRegs[I])
1445 EmitAndCountInstruction(
1446 MCInstBuilder(X86::MOV64rr).addReg(DestRegs[I]).addReg(SrcRegs[I]));
1447
Dean Michael Berris9bcaed82017-05-08 05:45:21 +00001448 // We emit a hard dependency on the __xray_CustomEvent symbol, which is the
Dean Michael Berrisebc16592017-09-04 05:34:58 +00001449 // name of the trampoline to be implemented by the XRay runtime.
Dean Michael Berris9bcaed82017-05-08 05:45:21 +00001450 auto TSym = OutContext.getOrCreateSymbol("__xray_CustomEvent");
1451 MachineOperand TOp = MachineOperand::CreateMCSymbol(TSym);
Dean Michael Berrisebc16592017-09-04 05:34:58 +00001452 if (isPositionIndependent())
1453 TOp.setTargetFlags(X86II::MO_PLT);
Dean Michael Berris9bcaed82017-05-08 05:45:21 +00001454
Daniel Jasperc0a976d2017-08-31 15:17:17 +00001455 // Emit the call instruction.
Dean Michael Berrisebc16592017-09-04 05:34:58 +00001456 EmitAndCountInstruction(MCInstBuilder(X86::CALL64pcrel32)
1457 .addOperand(MCIL.LowerSymbolOperand(TOp, TSym)));
Daniel Jasperc0a976d2017-08-31 15:17:17 +00001458
Dean Michael Berris9bcaed82017-05-08 05:45:21 +00001459 // Restore caller-saved and used registers.
Dean Michael Berrisebc16592017-09-04 05:34:58 +00001460 for (unsigned I = sizeof UsedMask; I-- > 0;)
1461 if (UsedMask[I])
Keith Wyss3d868232018-04-17 21:30:29 +00001462 EmitAndCountInstruction(MCInstBuilder(X86::POP64r).addReg(DestRegs[I]));
Dean Michael Berrisebc16592017-09-04 05:34:58 +00001463 else
1464 EmitNops(*OutStreamer, 1, Subtarget->is64Bit(), getSubtargetInfo());
Dean Michael Berris0884b732017-08-23 04:49:41 +00001465
Dean Michael Berrisebc16592017-09-04 05:34:58 +00001466 OutStreamer->AddComment("xray custom event end.");
1467
1468 // Record the sled version. Older versions of this sled were spelled
1469 // differently, so we let the runtime handle the different offsets we're
1470 // using.
1471 recordSled(CurSled, MI, SledKind::CUSTOM_EVENT, 1);
Dean Michael Berris9bcaed82017-05-08 05:45:21 +00001472}
1473
Keith Wyss3d868232018-04-17 21:30:29 +00001474void X86AsmPrinter::LowerPATCHABLE_TYPED_EVENT_CALL(const MachineInstr &MI,
1475 X86MCInstLower &MCIL) {
1476 assert(Subtarget->is64Bit() && "XRay typed events only supports X86-64");
1477
1478 // We want to emit the following pattern, which follows the x86 calling
1479 // convention to prepare for the trampoline call to be patched in.
1480 //
1481 // .p2align 1, ...
1482 // .Lxray_event_sled_N:
1483 // jmp +N // jump across the instrumentation sled
1484 // ... // set up arguments in register
1485 // callq __xray_TypedEvent@plt // force dependency to symbol
1486 // ...
1487 // <jump here>
1488 //
1489 // After patching, it would look something like:
1490 //
1491 // nopw (2-byte nop)
1492 // ...
1493 // callq __xrayTypedEvent // already lowered
1494 // ...
1495 //
1496 // ---
1497 // First we emit the label and the jump.
1498 auto CurSled = OutContext.createTempSymbol("xray_typed_event_sled_", true);
1499 OutStreamer->AddComment("# XRay Typed Event Log");
1500 OutStreamer->EmitCodeAlignment(2);
1501 OutStreamer->EmitLabel(CurSled);
1502
1503 // Use a two-byte `jmp`. This version of JMP takes an 8-bit relative offset as
1504 // an operand (computed as an offset from the jmp instruction).
1505 // FIXME: Find another less hacky way do force the relative jump.
1506 OutStreamer->EmitBinaryData("\xeb\x14");
1507
1508 // An x86-64 convention may place three arguments into %rcx, %rdx, and R8,
1509 // so we'll work with those. Or we may be called via SystemV, in which case
1510 // we don't have to do any translation.
1511 unsigned DestRegs[] = {X86::RDI, X86::RSI, X86::RDX};
1512 bool UsedMask[] = {false, false, false};
1513
1514 // Will fill out src regs in the loop.
1515 unsigned SrcRegs[] = {0, 0, 0};
1516
1517 // Then we put the operands in the SystemV registers. We spill the values in
1518 // the registers before we clobber them, and mark them as used in UsedMask.
1519 // In case the arguments are already in the correct register, we emit nops
1520 // appropriately sized to keep the sled the same size in every situation.
1521 for (unsigned I = 0; I < MI.getNumOperands(); ++I)
1522 if (auto Op = MCIL.LowerMachineOperand(&MI, MI.getOperand(I))) {
1523 // TODO: Is register only support adequate?
1524 assert(Op->isReg() && "Only supports arguments in registers");
1525 SrcRegs[I] = Op->getReg();
1526 if (SrcRegs[I] != DestRegs[I]) {
1527 UsedMask[I] = true;
1528 EmitAndCountInstruction(
1529 MCInstBuilder(X86::PUSH64r).addReg(DestRegs[I]));
1530 } else {
1531 EmitNops(*OutStreamer, 4, Subtarget->is64Bit(), getSubtargetInfo());
1532 }
1533 }
1534
1535 // In the above loop we only stash all of the destination registers or emit
1536 // nops if the arguments are already in the right place. Doing the actually
1537 // moving is postponed until after all the registers are stashed so nothing
1538 // is clobbers. We've already added nops to account for the size of mov and
1539 // push if the register is in the right place, so we only have to worry about
1540 // emitting movs.
1541 for (unsigned I = 0; I < MI.getNumOperands(); ++I)
1542 if (UsedMask[I])
1543 EmitAndCountInstruction(
1544 MCInstBuilder(X86::MOV64rr).addReg(DestRegs[I]).addReg(SrcRegs[I]));
1545
1546 // We emit a hard dependency on the __xray_TypedEvent symbol, which is the
1547 // name of the trampoline to be implemented by the XRay runtime.
1548 auto TSym = OutContext.getOrCreateSymbol("__xray_TypedEvent");
1549 MachineOperand TOp = MachineOperand::CreateMCSymbol(TSym);
1550 if (isPositionIndependent())
1551 TOp.setTargetFlags(X86II::MO_PLT);
1552
1553 // Emit the call instruction.
1554 EmitAndCountInstruction(MCInstBuilder(X86::CALL64pcrel32)
1555 .addOperand(MCIL.LowerSymbolOperand(TOp, TSym)));
1556
1557 // Restore caller-saved and used registers.
1558 for (unsigned I = sizeof UsedMask; I-- > 0;)
1559 if (UsedMask[I])
1560 EmitAndCountInstruction(MCInstBuilder(X86::POP64r).addReg(DestRegs[I]));
1561 else
1562 EmitNops(*OutStreamer, 1, Subtarget->is64Bit(), getSubtargetInfo());
1563
1564 OutStreamer->AddComment("xray typed event end.");
1565
1566 // Record the sled version.
1567 recordSled(CurSled, MI, SledKind::TYPED_EVENT, 0);
1568}
1569
Dean Michael Berris52735fc2016-07-14 04:06:33 +00001570void X86AsmPrinter::LowerPATCHABLE_FUNCTION_ENTER(const MachineInstr &MI,
1571 X86MCInstLower &MCIL) {
1572 // We want to emit the following pattern:
1573 //
Dean Michael Berris7e9abea2016-08-04 07:37:28 +00001574 // .p2align 1, ...
Dean Michael Berris52735fc2016-07-14 04:06:33 +00001575 // .Lxray_sled_N:
Dean Michael Berris52735fc2016-07-14 04:06:33 +00001576 // jmp .tmpN
1577 // # 9 bytes worth of noops
Dean Michael Berris52735fc2016-07-14 04:06:33 +00001578 //
1579 // We need the 9 bytes because at runtime, we'd be patching over the full 11
1580 // bytes with the following pattern:
1581 //
1582 // mov %r10, <function id, 32-bit> // 6 bytes
1583 // call <relative offset, 32-bits> // 5 bytes
1584 //
1585 auto CurSled = OutContext.createTempSymbol("xray_sled_", true);
Dean Michael Berris7e9abea2016-08-04 07:37:28 +00001586 OutStreamer->EmitCodeAlignment(2);
Dean Michael Berris52735fc2016-07-14 04:06:33 +00001587 OutStreamer->EmitLabel(CurSled);
Dean Michael Berris52735fc2016-07-14 04:06:33 +00001588
1589 // Use a two-byte `jmp`. This version of JMP takes an 8-bit relative offset as
1590 // an operand (computed as an offset from the jmp instruction).
1591 // FIXME: Find another less hacky way do force the relative jump.
1592 OutStreamer->EmitBytes("\xeb\x09");
1593 EmitNops(*OutStreamer, 9, Subtarget->is64Bit(), getSubtargetInfo());
Dean Michael Berris52735fc2016-07-14 04:06:33 +00001594 recordSled(CurSled, MI, SledKind::FUNCTION_ENTER);
1595}
1596
1597void X86AsmPrinter::LowerPATCHABLE_RET(const MachineInstr &MI,
1598 X86MCInstLower &MCIL) {
1599 // Since PATCHABLE_RET takes the opcode of the return statement as an
1600 // argument, we use that to emit the correct form of the RET that we want.
1601 // i.e. when we see this:
1602 //
1603 // PATCHABLE_RET X86::RET ...
1604 //
1605 // We should emit the RET followed by sleds.
1606 //
Dean Michael Berris7e9abea2016-08-04 07:37:28 +00001607 // .p2align 1, ...
Dean Michael Berris52735fc2016-07-14 04:06:33 +00001608 // .Lxray_sled_N:
1609 // ret # or equivalent instruction
1610 // # 10 bytes worth of noops
1611 //
1612 // This just makes sure that the alignment for the next instruction is 2.
1613 auto CurSled = OutContext.createTempSymbol("xray_sled_", true);
Dean Michael Berris7e9abea2016-08-04 07:37:28 +00001614 OutStreamer->EmitCodeAlignment(2);
Dean Michael Berris52735fc2016-07-14 04:06:33 +00001615 OutStreamer->EmitLabel(CurSled);
1616 unsigned OpCode = MI.getOperand(0).getImm();
1617 MCInst Ret;
1618 Ret.setOpcode(OpCode);
1619 for (auto &MO : make_range(MI.operands_begin() + 1, MI.operands_end()))
1620 if (auto MaybeOperand = MCIL.LowerMachineOperand(&MI, MO))
1621 Ret.addOperand(MaybeOperand.getValue());
1622 OutStreamer->EmitInstruction(Ret, getSubtargetInfo());
1623 EmitNops(*OutStreamer, 10, Subtarget->is64Bit(), getSubtargetInfo());
1624 recordSled(CurSled, MI, SledKind::FUNCTION_EXIT);
1625}
1626
Keith Wyss3d868232018-04-17 21:30:29 +00001627void X86AsmPrinter::LowerPATCHABLE_TAIL_CALL(const MachineInstr &MI,
1628 X86MCInstLower &MCIL) {
Dean Michael Berrise8ae5ba2016-09-01 01:29:13 +00001629 // Like PATCHABLE_RET, we have the actual instruction in the operands to this
1630 // instruction so we lower that particular instruction and its operands.
1631 // Unlike PATCHABLE_RET though, we put the sled before the JMP, much like how
1632 // we do it for PATCHABLE_FUNCTION_ENTER. The sled should be very similar to
1633 // the PATCHABLE_FUNCTION_ENTER case, followed by the lowering of the actual
1634 // tail call much like how we have it in PATCHABLE_RET.
1635 auto CurSled = OutContext.createTempSymbol("xray_sled_", true);
1636 OutStreamer->EmitCodeAlignment(2);
1637 OutStreamer->EmitLabel(CurSled);
1638 auto Target = OutContext.createTempSymbol();
1639
1640 // Use a two-byte `jmp`. This version of JMP takes an 8-bit relative offset as
1641 // an operand (computed as an offset from the jmp instruction).
1642 // FIXME: Find another less hacky way do force the relative jump.
1643 OutStreamer->EmitBytes("\xeb\x09");
1644 EmitNops(*OutStreamer, 9, Subtarget->is64Bit(), getSubtargetInfo());
1645 OutStreamer->EmitLabel(Target);
1646 recordSled(CurSled, MI, SledKind::TAIL_CALL);
1647
1648 unsigned OpCode = MI.getOperand(0).getImm();
1649 MCInst TC;
1650 TC.setOpcode(OpCode);
1651
1652 // Before emitting the instruction, add a comment to indicate that this is
1653 // indeed a tail call.
1654 OutStreamer->AddComment("TAILCALL");
1655 for (auto &MO : make_range(MI.operands_begin() + 1, MI.operands_end()))
1656 if (auto MaybeOperand = MCIL.LowerMachineOperand(&MI, MO))
1657 TC.addOperand(MaybeOperand.getValue());
1658 OutStreamer->EmitInstruction(TC, getSubtargetInfo());
1659}
1660
Reid Klecknere7040102014-08-04 21:05:27 +00001661// Returns instruction preceding MBBI in MachineFunction.
1662// If MBBI is the first instruction of the first basic block, returns null.
1663static MachineBasicBlock::const_iterator
1664PrevCrossBBInst(MachineBasicBlock::const_iterator MBBI) {
1665 const MachineBasicBlock *MBB = MBBI->getParent();
1666 while (MBBI == MBB->begin()) {
Duncan P. N. Exon Smithe9bc5792016-02-21 20:39:50 +00001667 if (MBB == &MBB->getParent()->front())
Duncan P. N. Exon Smith7b4c18e2016-07-12 03:18:50 +00001668 return MachineBasicBlock::const_iterator();
Reid Klecknere7040102014-08-04 21:05:27 +00001669 MBB = MBB->getPrevNode();
1670 MBBI = MBB->end();
1671 }
1672 return --MBBI;
1673}
1674
Chandler Carruthe7e9c042014-09-24 09:39:41 +00001675static const Constant *getConstantFromPool(const MachineInstr &MI,
1676 const MachineOperand &Op) {
1677 if (!Op.isCPI())
Chandler Carruth7b688c62014-09-24 03:06:37 +00001678 return nullptr;
Chandler Carruth0b682d42014-09-24 02:16:12 +00001679
Chandler Carruth7b688c62014-09-24 03:06:37 +00001680 ArrayRef<MachineConstantPoolEntry> Constants =
1681 MI.getParent()->getParent()->getConstantPool()->getConstants();
Keith Wyss3d868232018-04-17 21:30:29 +00001682 const MachineConstantPoolEntry &ConstantEntry = Constants[Op.getIndex()];
Chandler Carruth0b682d42014-09-24 02:16:12 +00001683
1684 // Bail if this is a machine constant pool entry, we won't be able to dig out
1685 // anything useful.
Chandler Carruthe7e9c042014-09-24 09:39:41 +00001686 if (ConstantEntry.isMachineConstantPoolEntry())
Chandler Carruth7b688c62014-09-24 03:06:37 +00001687 return nullptr;
Chandler Carruth0b682d42014-09-24 02:16:12 +00001688
Chandler Carruthe7e9c042014-09-24 09:39:41 +00001689 auto *C = dyn_cast<Constant>(ConstantEntry.Val.ConstVal);
1690 assert((!C || ConstantEntry.getType() == C->getType()) &&
Chandler Carruth0b682d42014-09-24 02:16:12 +00001691 "Expected a constant of the same type!");
Chandler Carruth7b688c62014-09-24 03:06:37 +00001692 return C;
1693}
Chandler Carruth0b682d42014-09-24 02:16:12 +00001694
Keith Wyss3d868232018-04-17 21:30:29 +00001695static std::string getShuffleComment(const MachineInstr *MI, unsigned SrcOp1Idx,
1696 unsigned SrcOp2Idx, ArrayRef<int> Mask) {
Chandler Carruth7b688c62014-09-24 03:06:37 +00001697 std::string Comment;
Chandler Carruth0b682d42014-09-24 02:16:12 +00001698
1699 // Compute the name for a register. This is really goofy because we have
1700 // multiple instruction printers that could (in theory) use different
1701 // names. Fortunately most people use the ATT style (outside of Windows)
1702 // and they actually agree on register naming here. Ultimately, this is
1703 // a comment, and so its OK if it isn't perfect.
1704 auto GetRegisterName = [](unsigned RegNum) -> StringRef {
1705 return X86ATTInstPrinter::getRegisterName(RegNum);
1706 };
1707
Simon Pilgrimca3072a2016-10-18 15:45:37 +00001708 const MachineOperand &DstOp = MI->getOperand(0);
1709 const MachineOperand &SrcOp1 = MI->getOperand(SrcOp1Idx);
1710 const MachineOperand &SrcOp2 = MI->getOperand(SrcOp2Idx);
1711
Chandler Carruth0b682d42014-09-24 02:16:12 +00001712 StringRef DstName = DstOp.isReg() ? GetRegisterName(DstOp.getReg()) : "mem";
Simon Pilgrim1cc57122016-04-09 14:51:26 +00001713 StringRef Src1Name =
1714 SrcOp1.isReg() ? GetRegisterName(SrcOp1.getReg()) : "mem";
1715 StringRef Src2Name =
1716 SrcOp2.isReg() ? GetRegisterName(SrcOp2.getReg()) : "mem";
1717
1718 // One source operand, fix the mask to print all elements in one span.
1719 SmallVector<int, 8> ShuffleMask(Mask.begin(), Mask.end());
1720 if (Src1Name == Src2Name)
1721 for (int i = 0, e = ShuffleMask.size(); i != e; ++i)
1722 if (ShuffleMask[i] >= e)
1723 ShuffleMask[i] -= e;
Chandler Carruth0b682d42014-09-24 02:16:12 +00001724
1725 raw_string_ostream CS(Comment);
Simon Pilgrimca3072a2016-10-18 15:45:37 +00001726 CS << DstName;
1727
1728 // Handle AVX512 MASK/MASXZ write mask comments.
1729 // MASK: zmmX {%kY}
1730 // MASKZ: zmmX {%kY} {z}
1731 if (SrcOp1Idx > 1) {
1732 assert((SrcOp1Idx == 2 || SrcOp1Idx == 3) && "Unexpected writemask");
1733
1734 const MachineOperand &WriteMaskOp = MI->getOperand(SrcOp1Idx - 1);
1735 if (WriteMaskOp.isReg()) {
1736 CS << " {%" << GetRegisterName(WriteMaskOp.getReg()) << "}";
1737
1738 if (SrcOp1Idx == 2) {
1739 CS << " {z}";
1740 }
1741 }
1742 }
1743
1744 CS << " = ";
1745
Simon Pilgrim1cc57122016-04-09 14:51:26 +00001746 for (int i = 0, e = ShuffleMask.size(); i != e; ++i) {
1747 if (i != 0)
Chandler Carruth0b682d42014-09-24 02:16:12 +00001748 CS << ",";
Simon Pilgrim1cc57122016-04-09 14:51:26 +00001749 if (ShuffleMask[i] == SM_SentinelZero) {
Chandler Carruth0b682d42014-09-24 02:16:12 +00001750 CS << "zero";
Simon Pilgrim1cc57122016-04-09 14:51:26 +00001751 continue;
1752 }
1753
1754 // Otherwise, it must come from src1 or src2. Print the span of elements
1755 // that comes from this src.
1756 bool isSrc1 = ShuffleMask[i] < (int)e;
1757 CS << (isSrc1 ? Src1Name : Src2Name) << '[';
1758
1759 bool IsFirst = true;
1760 while (i != e && ShuffleMask[i] != SM_SentinelZero &&
1761 (ShuffleMask[i] < (int)e) == isSrc1) {
1762 if (!IsFirst)
1763 CS << ',';
1764 else
1765 IsFirst = false;
1766 if (ShuffleMask[i] == SM_SentinelUndef)
Chandler Carruth0b682d42014-09-24 02:16:12 +00001767 CS << "u";
1768 else
Simon Pilgrim1cc57122016-04-09 14:51:26 +00001769 CS << ShuffleMask[i] % (int)e;
1770 ++i;
Chandler Carruth0b682d42014-09-24 02:16:12 +00001771 }
Simon Pilgrim1cc57122016-04-09 14:51:26 +00001772 CS << ']';
1773 --i; // For loop increments element #.
Chandler Carruth0b682d42014-09-24 02:16:12 +00001774 }
Chandler Carruth0b682d42014-09-24 02:16:12 +00001775 CS.flush();
1776
1777 return Comment;
1778}
1779
Craig Topperad140cf2017-07-04 05:46:11 +00001780static void printConstant(const Constant *COp, raw_ostream &CS) {
1781 if (isa<UndefValue>(COp)) {
1782 CS << "u";
1783 } else if (auto *CI = dyn_cast<ConstantInt>(COp)) {
1784 if (CI->getBitWidth() <= 64) {
1785 CS << CI->getZExtValue();
1786 } else {
1787 // print multi-word constant as (w0,w1)
1788 const auto &Val = CI->getValue();
1789 CS << "(";
1790 for (int i = 0, N = Val.getNumWords(); i < N; ++i) {
1791 if (i > 0)
1792 CS << ",";
1793 CS << Val.getRawData()[i];
1794 }
1795 CS << ")";
1796 }
1797 } else if (auto *CF = dyn_cast<ConstantFP>(COp)) {
1798 SmallString<32> Str;
1799 CF->getValueAPF().toString(Str);
1800 CS << Str;
1801 } else {
1802 CS << "?";
1803 }
1804}
1805
Reid Kleckner9cdd4df2017-10-11 21:24:33 +00001806void X86AsmPrinter::EmitSEHInstruction(const MachineInstr *MI) {
1807 assert(MF->hasWinCFI() && "SEH_ instruction in function without WinCFI?");
1808 assert(getSubtarget().isOSWindows() && "SEH_ instruction Windows only");
1809 const X86RegisterInfo *RI =
1810 MF->getSubtarget<X86Subtarget>().getRegisterInfo();
1811
1812 // Use the .cv_fpo directives if we're emitting CodeView on 32-bit x86.
1813 if (EmitFPOData) {
1814 X86TargetStreamer *XTS =
1815 static_cast<X86TargetStreamer *>(OutStreamer->getTargetStreamer());
1816 switch (MI->getOpcode()) {
1817 case X86::SEH_PushReg:
1818 XTS->emitFPOPushReg(MI->getOperand(0).getImm());
1819 break;
1820 case X86::SEH_StackAlloc:
1821 XTS->emitFPOStackAlloc(MI->getOperand(0).getImm());
1822 break;
1823 case X86::SEH_SetFrame:
1824 assert(MI->getOperand(1).getImm() == 0 &&
1825 ".cv_fpo_setframe takes no offset");
1826 XTS->emitFPOSetFrame(MI->getOperand(0).getImm());
1827 break;
1828 case X86::SEH_EndPrologue:
1829 XTS->emitFPOEndPrologue();
1830 break;
1831 case X86::SEH_SaveReg:
1832 case X86::SEH_SaveXMM:
1833 case X86::SEH_PushFrame:
1834 llvm_unreachable("SEH_ directive incompatible with FPO");
1835 break;
1836 default:
1837 llvm_unreachable("expected SEH_ instruction");
1838 }
1839 return;
1840 }
1841
1842 // Otherwise, use the .seh_ directives for all other Windows platforms.
1843 switch (MI->getOpcode()) {
1844 case X86::SEH_PushReg:
1845 OutStreamer->EmitWinCFIPushReg(
1846 RI->getSEHRegNum(MI->getOperand(0).getImm()));
1847 break;
1848
1849 case X86::SEH_SaveReg:
1850 OutStreamer->EmitWinCFISaveReg(RI->getSEHRegNum(MI->getOperand(0).getImm()),
1851 MI->getOperand(1).getImm());
1852 break;
1853
1854 case X86::SEH_SaveXMM:
1855 OutStreamer->EmitWinCFISaveXMM(RI->getSEHRegNum(MI->getOperand(0).getImm()),
1856 MI->getOperand(1).getImm());
1857 break;
1858
1859 case X86::SEH_StackAlloc:
1860 OutStreamer->EmitWinCFIAllocStack(MI->getOperand(0).getImm());
1861 break;
1862
1863 case X86::SEH_SetFrame:
1864 OutStreamer->EmitWinCFISetFrame(
1865 RI->getSEHRegNum(MI->getOperand(0).getImm()),
1866 MI->getOperand(1).getImm());
1867 break;
1868
1869 case X86::SEH_PushFrame:
1870 OutStreamer->EmitWinCFIPushFrame(MI->getOperand(0).getImm());
1871 break;
1872
1873 case X86::SEH_EndPrologue:
1874 OutStreamer->EmitWinCFIEndProlog();
1875 break;
1876
1877 default:
1878 llvm_unreachable("expected SEH_ instruction");
1879 }
1880}
1881
Chris Lattner94a946c2010-01-28 01:02:27 +00001882void X86AsmPrinter::EmitInstruction(const MachineInstr *MI) {
Rafael Espindola38c2e652013-10-29 16:11:22 +00001883 X86MCInstLower MCInstLowering(*MF, *this);
Keith Wyss3d868232018-04-17 21:30:29 +00001884 const X86RegisterInfo *RI =
1885 MF->getSubtarget<X86Subtarget>().getRegisterInfo();
NAKAMURA Takumi1db59952014-06-25 12:41:52 +00001886
Gadi Haber19c4fc52016-12-28 10:12:48 +00001887 // Add a comment about EVEX-2-VEX compression for AVX-512 instrs that
1888 // are compressed from EVEX encoding to VEX encoding.
1889 if (TM.Options.MCOptions.ShowMCEncoding) {
Craig Topperf27016f2018-03-10 05:15:22 +00001890 if (MI->getAsmPrinterFlags() & X86::AC_EVEX_2_VEX)
Gadi Haber19c4fc52016-12-28 10:12:48 +00001891 OutStreamer->AddComment("EVEX TO VEX Compression ", false);
1892 }
1893
Chris Lattner74f4ca72009-09-02 17:35:12 +00001894 switch (MI->getOpcode()) {
Dale Johannesenb36c7092010-04-06 22:45:26 +00001895 case TargetOpcode::DBG_VALUE:
David Blaikieb735b4d2013-06-16 20:34:27 +00001896 llvm_unreachable("Should be handled target independently");
Dale Johannesen5d7f0a02010-04-07 01:15:14 +00001897
Eric Christopher4abffad2010-08-05 18:34:30 +00001898 // Emit nothing here but a comment if we can.
1899 case X86::Int_MemBarrier:
Lang Hames9ff69c82015-04-24 19:11:51 +00001900 OutStreamer->emitRawComment("MEMBARRIER");
Eric Christopher4abffad2010-08-05 18:34:30 +00001901 return;
Owen Anderson0ca562e2011-10-04 23:26:17 +00001902
Rafael Espindolad94f3b42010-10-26 18:09:55 +00001903 case X86::EH_RETURN:
1904 case X86::EH_RETURN64: {
1905 // Lower these as normal, but add some comments.
1906 unsigned Reg = MI->getOperand(0).getReg();
Lang Hames9ff69c82015-04-24 19:11:51 +00001907 OutStreamer->AddComment(StringRef("eh_return, addr: %") +
1908 X86ATTInstPrinter::getRegisterName(Reg));
Rafael Espindolad94f3b42010-10-26 18:09:55 +00001909 break;
1910 }
David Majnemerf828a0c2015-10-01 18:44:59 +00001911 case X86::CLEANUPRET: {
1912 // Lower these as normal, but add some comments.
1913 OutStreamer->AddComment("CLEANUPRET");
1914 break;
1915 }
1916
1917 case X86::CATCHRET: {
1918 // Lower these as normal, but add some comments.
1919 OutStreamer->AddComment("CATCHRET");
1920 break;
1921 }
1922
Chris Lattner88c18562010-07-09 00:49:41 +00001923 case X86::TAILJMPr:
Reid Klecknera580b6e2015-01-30 21:03:31 +00001924 case X86::TAILJMPm:
Chris Lattner88c18562010-07-09 00:49:41 +00001925 case X86::TAILJMPd:
Hans Wennborga4686012017-02-16 00:04:05 +00001926 case X86::TAILJMPd_CC:
Reid Klecknera580b6e2015-01-30 21:03:31 +00001927 case X86::TAILJMPr64:
1928 case X86::TAILJMPm64:
Chris Lattner88c18562010-07-09 00:49:41 +00001929 case X86::TAILJMPd64:
Hans Wennborga4686012017-02-16 00:04:05 +00001930 case X86::TAILJMPd64_CC:
Reid Klecknera580b6e2015-01-30 21:03:31 +00001931 case X86::TAILJMPr64_REX:
1932 case X86::TAILJMPm64_REX:
Chris Lattner88c18562010-07-09 00:49:41 +00001933 // Lower these as normal, but add some comments.
Lang Hames9ff69c82015-04-24 19:11:51 +00001934 OutStreamer->AddComment("TAILCALL");
Chris Lattner88c18562010-07-09 00:49:41 +00001935 break;
Rafael Espindolac4774792010-11-28 21:16:39 +00001936
1937 case X86::TLS_addr32:
1938 case X86::TLS_addr64:
Hans Wennborg789acfb2012-06-01 16:27:21 +00001939 case X86::TLS_base_addr32:
1940 case X86::TLS_base_addr64:
Lang Hamesf49bc3f2014-07-24 20:40:55 +00001941 return LowerTlsAddr(MCInstLowering, *MI);
Rafael Espindolac4774792010-11-28 21:16:39 +00001942
Chris Lattner74f4ca72009-09-02 17:35:12 +00001943 case X86::MOVPC32r: {
1944 // This is a pseudo op for a two instruction sequence with a label, which
1945 // looks like:
1946 // call "L1$pb"
1947 // "L1$pb":
1948 // popl %esi
Chad Rosier24c19d22012-08-01 18:39:17 +00001949
Chris Lattner74f4ca72009-09-02 17:35:12 +00001950 // Emit the call.
Chris Lattner7077efe2010-11-14 22:48:15 +00001951 MCSymbol *PICBase = MF->getPICBaseSymbol();
Chris Lattner74f4ca72009-09-02 17:35:12 +00001952 // FIXME: We would like an efficient form for this, so we don't have to do a
1953 // lot of extra uniquing.
Keith Wyss3d868232018-04-17 21:30:29 +00001954 EmitAndCountInstruction(
1955 MCInstBuilder(X86::CALLpcrel32)
1956 .addExpr(MCSymbolRefExpr::create(PICBase, OutContext)));
Chad Rosier24c19d22012-08-01 18:39:17 +00001957
Keith Wyss3d868232018-04-17 21:30:29 +00001958 const X86FrameLowering *FrameLowering =
Petar Jovanovic99fba3c2015-11-05 17:19:59 +00001959 MF->getSubtarget<X86Subtarget>().getFrameLowering();
1960 bool hasFP = FrameLowering->hasFP(*MF);
Keith Wyss3d868232018-04-17 21:30:29 +00001961
Michael Kuperstein77ce9d32015-12-06 13:06:20 +00001962 // TODO: This is needed only if we require precise CFA.
Michael Kuperstein53946bf2015-12-15 18:50:32 +00001963 bool HasActiveDwarfFrame = OutStreamer->getNumFrameInfos() &&
1964 !OutStreamer->getDwarfFrameInfos().back().End;
1965
Petar Jovanovic99fba3c2015-11-05 17:19:59 +00001966 int stackGrowth = -RI->getSlotSize();
1967
Michael Kuperstein53946bf2015-12-15 18:50:32 +00001968 if (HasActiveDwarfFrame && !hasFP) {
Petar Jovanovic99fba3c2015-11-05 17:19:59 +00001969 OutStreamer->EmitCFIAdjustCfaOffset(-stackGrowth);
1970 }
1971
Chris Lattner74f4ca72009-09-02 17:35:12 +00001972 // Emit the label.
Lang Hames9ff69c82015-04-24 19:11:51 +00001973 OutStreamer->EmitLabel(PICBase);
Chad Rosier24c19d22012-08-01 18:39:17 +00001974
Chris Lattner74f4ca72009-09-02 17:35:12 +00001975 // popl $reg
Keith Wyss3d868232018-04-17 21:30:29 +00001976 EmitAndCountInstruction(
1977 MCInstBuilder(X86::POP32r).addReg(MI->getOperand(0).getReg()));
Petar Jovanovic99fba3c2015-11-05 17:19:59 +00001978
Michael Kuperstein53946bf2015-12-15 18:50:32 +00001979 if (HasActiveDwarfFrame && !hasFP) {
Petar Jovanovic99fba3c2015-11-05 17:19:59 +00001980 OutStreamer->EmitCFIAdjustCfaOffset(stackGrowth);
1981 }
Chris Lattner74f4ca72009-09-02 17:35:12 +00001982 return;
Chris Lattner6ccf7ed2009-09-12 21:01:20 +00001983 }
Chad Rosier24c19d22012-08-01 18:39:17 +00001984
Chris Lattner6ccf7ed2009-09-12 21:01:20 +00001985 case X86::ADD32ri: {
1986 // Lower the MO_GOT_ABSOLUTE_ADDRESS form of ADD32ri.
1987 if (MI->getOperand(2).getTargetFlags() != X86II::MO_GOT_ABSOLUTE_ADDRESS)
1988 break;
Chad Rosier24c19d22012-08-01 18:39:17 +00001989
Chris Lattner6ccf7ed2009-09-12 21:01:20 +00001990 // Okay, we have something like:
1991 // EAX = ADD32ri EAX, MO_GOT_ABSOLUTE_ADDRESS(@MYGLOBAL)
Chad Rosier24c19d22012-08-01 18:39:17 +00001992
Chris Lattner6ccf7ed2009-09-12 21:01:20 +00001993 // For this, we want to print something like:
1994 // MYGLOBAL + (. - PICBASE)
1995 // However, we can't generate a ".", so just emit a new label here and refer
Chris Lattnerd7581392010-03-12 18:47:50 +00001996 // to it.
Jim Grosbach6f482002015-05-18 18:43:14 +00001997 MCSymbol *DotSym = OutContext.createTempSymbol();
Lang Hames9ff69c82015-04-24 19:11:51 +00001998 OutStreamer->EmitLabel(DotSym);
Chad Rosier24c19d22012-08-01 18:39:17 +00001999
Chris Lattner6ccf7ed2009-09-12 21:01:20 +00002000 // Now that we have emitted the label, lower the complex operand expression.
Chris Lattnerd9d71862010-02-08 23:03:41 +00002001 MCSymbol *OpSym = MCInstLowering.GetSymbolFromOperand(MI->getOperand(2));
Chad Rosier24c19d22012-08-01 18:39:17 +00002002
Jim Grosbach13760bd2015-05-30 01:25:56 +00002003 const MCExpr *DotExpr = MCSymbolRefExpr::create(DotSym, OutContext);
Chris Lattner6ccf7ed2009-09-12 21:01:20 +00002004 const MCExpr *PICBase =
Keith Wyss3d868232018-04-17 21:30:29 +00002005 MCSymbolRefExpr::create(MF->getPICBaseSymbol(), OutContext);
Jim Grosbach13760bd2015-05-30 01:25:56 +00002006 DotExpr = MCBinaryExpr::createSub(DotExpr, PICBase, OutContext);
Chad Rosier24c19d22012-08-01 18:39:17 +00002007
Keith Wyss3d868232018-04-17 21:30:29 +00002008 DotExpr = MCBinaryExpr::createAdd(
2009 MCSymbolRefExpr::create(OpSym, OutContext), DotExpr, OutContext);
Chad Rosier24c19d22012-08-01 18:39:17 +00002010
Lang Hamesf49bc3f2014-07-24 20:40:55 +00002011 EmitAndCountInstruction(MCInstBuilder(X86::ADD32ri)
Keith Wyss3d868232018-04-17 21:30:29 +00002012 .addReg(MI->getOperand(0).getReg())
2013 .addReg(MI->getOperand(1).getReg())
2014 .addExpr(DotExpr));
Chris Lattner6ccf7ed2009-09-12 21:01:20 +00002015 return;
2016 }
Philip Reames0365f1a2014-12-01 22:52:56 +00002017 case TargetOpcode::STATEPOINT:
Sanjoy Das2e0d29f2015-05-06 23:53:26 +00002018 return LowerSTATEPOINT(*MI, MCInstLowering);
Michael Liao5bf95782014-12-04 05:20:33 +00002019
Sanjoy Das2f63cbc2017-02-07 19:19:49 +00002020 case TargetOpcode::FAULTING_OP:
2021 return LowerFAULTING_OP(*MI, MCInstLowering);
Sanjoy Dasc63244d2015-06-15 18:44:08 +00002022
Nirav Davea7c041d2017-01-31 17:00:27 +00002023 case TargetOpcode::FENTRY_CALL:
2024 return LowerFENTRY_CALL(*MI, MCInstLowering);
2025
Sanjoy Dasc0441c22016-04-19 05:24:47 +00002026 case TargetOpcode::PATCHABLE_OP:
2027 return LowerPATCHABLE_OP(*MI, MCInstLowering);
2028
Andrew Trick153ebe62013-10-31 22:11:56 +00002029 case TargetOpcode::STACKMAP:
Lang Hamesf49bc3f2014-07-24 20:40:55 +00002030 return LowerSTACKMAP(*MI);
Andrew Trick153ebe62013-10-31 22:11:56 +00002031
2032 case TargetOpcode::PATCHPOINT:
Lang Hames65613a62015-04-22 06:02:31 +00002033 return LowerPATCHPOINT(*MI, MCInstLowering);
Lang Hamesc2b77232013-11-11 23:00:41 +00002034
Dean Michael Berris52735fc2016-07-14 04:06:33 +00002035 case TargetOpcode::PATCHABLE_FUNCTION_ENTER:
2036 return LowerPATCHABLE_FUNCTION_ENTER(*MI, MCInstLowering);
2037
2038 case TargetOpcode::PATCHABLE_RET:
2039 return LowerPATCHABLE_RET(*MI, MCInstLowering);
2040
Dean Michael Berrise8ae5ba2016-09-01 01:29:13 +00002041 case TargetOpcode::PATCHABLE_TAIL_CALL:
2042 return LowerPATCHABLE_TAIL_CALL(*MI, MCInstLowering);
Keith Wyss3d868232018-04-17 21:30:29 +00002043
Dean Michael Berris9bcaed82017-05-08 05:45:21 +00002044 case TargetOpcode::PATCHABLE_EVENT_CALL:
2045 return LowerPATCHABLE_EVENT_CALL(*MI, MCInstLowering);
Dean Michael Berrise8ae5ba2016-09-01 01:29:13 +00002046
Keith Wyss3d868232018-04-17 21:30:29 +00002047 case TargetOpcode::PATCHABLE_TYPED_EVENT_CALL:
2048 return LowerPATCHABLE_TYPED_EVENT_CALL(*MI, MCInstLowering);
2049
Lang Hamesc2b77232013-11-11 23:00:41 +00002050 case X86::MORESTACK_RET:
Lang Hamesf49bc3f2014-07-24 20:40:55 +00002051 EmitAndCountInstruction(MCInstBuilder(getRetOpcode(*Subtarget)));
Lang Hamesc2b77232013-11-11 23:00:41 +00002052 return;
2053
2054 case X86::MORESTACK_RET_RESTORE_R10:
2055 // Return, then restore R10.
Lang Hamesf49bc3f2014-07-24 20:40:55 +00002056 EmitAndCountInstruction(MCInstBuilder(getRetOpcode(*Subtarget)));
Keith Wyss3d868232018-04-17 21:30:29 +00002057 EmitAndCountInstruction(
2058 MCInstBuilder(X86::MOV64rr).addReg(X86::R10).addReg(X86::RAX));
Lang Hamesc2b77232013-11-11 23:00:41 +00002059 return;
NAKAMURA Takumi1db59952014-06-25 12:41:52 +00002060
2061 case X86::SEH_PushReg:
NAKAMURA Takumi1db59952014-06-25 12:41:52 +00002062 case X86::SEH_SaveReg:
Lang Hames9ff69c82015-04-24 19:11:51 +00002063 case X86::SEH_SaveXMM:
Lang Hames9ff69c82015-04-24 19:11:51 +00002064 case X86::SEH_StackAlloc:
Lang Hames9ff69c82015-04-24 19:11:51 +00002065 case X86::SEH_SetFrame:
NAKAMURA Takumi1db59952014-06-25 12:41:52 +00002066 case X86::SEH_PushFrame:
NAKAMURA Takumi1db59952014-06-25 12:41:52 +00002067 case X86::SEH_EndPrologue:
Reid Kleckner9cdd4df2017-10-11 21:24:33 +00002068 EmitSEHInstruction(MI);
NAKAMURA Takumi1db59952014-06-25 12:41:52 +00002069 return;
Chandler Carruth185cc182014-07-25 23:47:11 +00002070
Reid Klecknere7040102014-08-04 21:05:27 +00002071 case X86::SEH_Epilogue: {
Hans Wennborgc4b1d202016-09-22 19:50:05 +00002072 assert(MF->hasWinCFI() && "SEH_ instruction in function without WinCFI?");
Reid Klecknere7040102014-08-04 21:05:27 +00002073 MachineBasicBlock::const_iterator MBBI(MI);
2074 // Check if preceded by a call and emit nop if so.
Duncan P. N. Exon Smith7b4c18e2016-07-12 03:18:50 +00002075 for (MBBI = PrevCrossBBInst(MBBI);
2076 MBBI != MachineBasicBlock::const_iterator();
2077 MBBI = PrevCrossBBInst(MBBI)) {
Reid Klecknere7040102014-08-04 21:05:27 +00002078 // Conservatively assume that pseudo instructions don't emit code and keep
2079 // looking for a call. We may emit an unnecessary nop in some cases.
2080 if (!MBBI->isPseudo()) {
2081 if (MBBI->isCall())
2082 EmitAndCountInstruction(MCInstBuilder(X86::NOOP));
2083 break;
2084 }
2085 }
2086 return;
2087 }
2088
Craig Topper7e3ba152015-12-26 19:48:43 +00002089 // Lower PSHUFB and VPERMILP normally but add a comment if we can find
2090 // a constant shuffle mask. We won't be able to do this at the MC layer
2091 // because the mask isn't an immediate.
Chandler Carruth185cc182014-07-25 23:47:11 +00002092 case X86::PSHUFBrm:
Chandler Carruth98443d82014-09-25 00:24:19 +00002093 case X86::VPSHUFBrm:
Craig Topper7e3ba152015-12-26 19:48:43 +00002094 case X86::VPSHUFBYrm:
2095 case X86::VPSHUFBZ128rm:
2096 case X86::VPSHUFBZ128rmk:
2097 case X86::VPSHUFBZ128rmkz:
2098 case X86::VPSHUFBZ256rm:
2099 case X86::VPSHUFBZ256rmk:
2100 case X86::VPSHUFBZ256rmkz:
2101 case X86::VPSHUFBZrm:
2102 case X86::VPSHUFBZrmk:
2103 case X86::VPSHUFBZrmkz: {
Lang Hames9ff69c82015-04-24 19:11:51 +00002104 if (!OutStreamer->isVerboseAsm())
Chandler Carruthedf50212014-09-24 03:06:34 +00002105 break;
Craig Topper7e3ba152015-12-26 19:48:43 +00002106 unsigned SrcIdx, MaskIdx;
2107 switch (MI->getOpcode()) {
Keith Wyss3d868232018-04-17 21:30:29 +00002108 default:
2109 llvm_unreachable("Invalid opcode");
Craig Topper7e3ba152015-12-26 19:48:43 +00002110 case X86::PSHUFBrm:
2111 case X86::VPSHUFBrm:
2112 case X86::VPSHUFBYrm:
2113 case X86::VPSHUFBZ128rm:
2114 case X86::VPSHUFBZ256rm:
2115 case X86::VPSHUFBZrm:
Keith Wyss3d868232018-04-17 21:30:29 +00002116 SrcIdx = 1;
2117 MaskIdx = 5;
2118 break;
Craig Topper7e3ba152015-12-26 19:48:43 +00002119 case X86::VPSHUFBZ128rmkz:
2120 case X86::VPSHUFBZ256rmkz:
2121 case X86::VPSHUFBZrmkz:
Keith Wyss3d868232018-04-17 21:30:29 +00002122 SrcIdx = 2;
2123 MaskIdx = 6;
2124 break;
Craig Topper7e3ba152015-12-26 19:48:43 +00002125 case X86::VPSHUFBZ128rmk:
2126 case X86::VPSHUFBZ256rmk:
2127 case X86::VPSHUFBZrmk:
Keith Wyss3d868232018-04-17 21:30:29 +00002128 SrcIdx = 3;
2129 MaskIdx = 7;
2130 break;
Craig Topper7e3ba152015-12-26 19:48:43 +00002131 }
2132
2133 assert(MI->getNumOperands() >= 6 &&
2134 "We should always have at least 6 operands!");
Chandler Carruthab8b37a2014-09-24 02:24:41 +00002135
Simon Pilgrimca3072a2016-10-18 15:45:37 +00002136 const MachineOperand &MaskOp = MI->getOperand(MaskIdx);
Chandler Carruthe7e9c042014-09-24 09:39:41 +00002137 if (auto *C = getConstantFromPool(*MI, MaskOp)) {
Craig Toppera4693612016-11-25 02:29:21 +00002138 SmallVector<int, 64> Mask;
David Majnemer14141f92015-01-11 07:29:51 +00002139 DecodePSHUFBMask(C, Mask);
Chandler Carruth7b688c62014-09-24 03:06:37 +00002140 if (!Mask.empty())
Andrew V. Tischenko75745d02017-04-14 07:44:23 +00002141 OutStreamer->AddComment(getShuffleComment(MI, SrcIdx, SrcIdx, Mask),
2142 !EnablePrintSchedInfo);
Chandler Carruth7b688c62014-09-24 03:06:37 +00002143 }
2144 break;
2145 }
Simon Pilgrima99368f2016-07-13 15:45:36 +00002146
Simon Pilgrima99368f2016-07-13 15:45:36 +00002147 case X86::VPERMILPSrm:
2148 case X86::VPERMILPSYrm:
2149 case X86::VPERMILPSZ128rm:
Craig Topper175a4152016-10-18 03:36:52 +00002150 case X86::VPERMILPSZ128rmk:
2151 case X86::VPERMILPSZ128rmkz:
Simon Pilgrima99368f2016-07-13 15:45:36 +00002152 case X86::VPERMILPSZ256rm:
Craig Topper175a4152016-10-18 03:36:52 +00002153 case X86::VPERMILPSZ256rmk:
2154 case X86::VPERMILPSZ256rmkz:
2155 case X86::VPERMILPSZrm:
2156 case X86::VPERMILPSZrmk:
2157 case X86::VPERMILPSZrmkz:
2158 case X86::VPERMILPDrm:
2159 case X86::VPERMILPDYrm:
2160 case X86::VPERMILPDZ128rm:
2161 case X86::VPERMILPDZ128rmk:
2162 case X86::VPERMILPDZ128rmkz:
2163 case X86::VPERMILPDZ256rm:
2164 case X86::VPERMILPDZ256rmk:
2165 case X86::VPERMILPDZ256rmkz:
2166 case X86::VPERMILPDZrm:
2167 case X86::VPERMILPDZrmk:
2168 case X86::VPERMILPDZrmkz: {
Simon Pilgrima99368f2016-07-13 15:45:36 +00002169 if (!OutStreamer->isVerboseAsm())
2170 break;
Craig Topper175a4152016-10-18 03:36:52 +00002171 unsigned SrcIdx, MaskIdx;
2172 unsigned ElSize;
2173 switch (MI->getOpcode()) {
Keith Wyss3d868232018-04-17 21:30:29 +00002174 default:
2175 llvm_unreachable("Invalid opcode");
Craig Topper175a4152016-10-18 03:36:52 +00002176 case X86::VPERMILPSrm:
2177 case X86::VPERMILPSYrm:
2178 case X86::VPERMILPSZ128rm:
2179 case X86::VPERMILPSZ256rm:
2180 case X86::VPERMILPSZrm:
Keith Wyss3d868232018-04-17 21:30:29 +00002181 SrcIdx = 1;
2182 MaskIdx = 5;
2183 ElSize = 32;
2184 break;
Craig Topper175a4152016-10-18 03:36:52 +00002185 case X86::VPERMILPSZ128rmkz:
2186 case X86::VPERMILPSZ256rmkz:
2187 case X86::VPERMILPSZrmkz:
Keith Wyss3d868232018-04-17 21:30:29 +00002188 SrcIdx = 2;
2189 MaskIdx = 6;
2190 ElSize = 32;
2191 break;
Craig Topper175a4152016-10-18 03:36:52 +00002192 case X86::VPERMILPSZ128rmk:
2193 case X86::VPERMILPSZ256rmk:
2194 case X86::VPERMILPSZrmk:
Keith Wyss3d868232018-04-17 21:30:29 +00002195 SrcIdx = 3;
2196 MaskIdx = 7;
2197 ElSize = 32;
2198 break;
Craig Topper175a4152016-10-18 03:36:52 +00002199 case X86::VPERMILPDrm:
2200 case X86::VPERMILPDYrm:
2201 case X86::VPERMILPDZ128rm:
2202 case X86::VPERMILPDZ256rm:
2203 case X86::VPERMILPDZrm:
Keith Wyss3d868232018-04-17 21:30:29 +00002204 SrcIdx = 1;
2205 MaskIdx = 5;
2206 ElSize = 64;
2207 break;
Craig Topper175a4152016-10-18 03:36:52 +00002208 case X86::VPERMILPDZ128rmkz:
2209 case X86::VPERMILPDZ256rmkz:
2210 case X86::VPERMILPDZrmkz:
Keith Wyss3d868232018-04-17 21:30:29 +00002211 SrcIdx = 2;
2212 MaskIdx = 6;
2213 ElSize = 64;
2214 break;
Craig Topper175a4152016-10-18 03:36:52 +00002215 case X86::VPERMILPDZ128rmk:
2216 case X86::VPERMILPDZ256rmk:
2217 case X86::VPERMILPDZrmk:
Keith Wyss3d868232018-04-17 21:30:29 +00002218 SrcIdx = 3;
2219 MaskIdx = 7;
2220 ElSize = 64;
2221 break;
Craig Topper175a4152016-10-18 03:36:52 +00002222 }
2223
Craig Topper1f5178f2016-10-17 06:41:18 +00002224 assert(MI->getNumOperands() >= 6 &&
2225 "We should always have at least 6 operands!");
Craig Topperd4000192015-12-26 04:50:07 +00002226
Simon Pilgrimca3072a2016-10-18 15:45:37 +00002227 const MachineOperand &MaskOp = MI->getOperand(MaskIdx);
Chandler Carruthe7e9c042014-09-24 09:39:41 +00002228 if (auto *C = getConstantFromPool(*MI, MaskOp)) {
Chandler Carruth7b688c62014-09-24 03:06:37 +00002229 SmallVector<int, 16> Mask;
Craig Topper175a4152016-10-18 03:36:52 +00002230 DecodeVPERMILPMask(C, ElSize, Mask);
Chandler Carruth7b688c62014-09-24 03:06:37 +00002231 if (!Mask.empty())
Andrew V. Tischenko75745d02017-04-14 07:44:23 +00002232 OutStreamer->AddComment(getShuffleComment(MI, SrcIdx, SrcIdx, Mask),
2233 !EnablePrintSchedInfo);
Simon Pilgrim1cc57122016-04-09 14:51:26 +00002234 }
2235 break;
2236 }
Simon Pilgrim2ead8612016-06-04 21:44:28 +00002237
2238 case X86::VPERMIL2PDrm:
2239 case X86::VPERMIL2PSrm:
Craig Topper811756b2017-02-18 22:53:43 +00002240 case X86::VPERMIL2PDYrm:
2241 case X86::VPERMIL2PSYrm: {
Simon Pilgrim2ead8612016-06-04 21:44:28 +00002242 if (!OutStreamer->isVerboseAsm())
2243 break;
Craig Topper1f5178f2016-10-17 06:41:18 +00002244 assert(MI->getNumOperands() >= 8 &&
2245 "We should always have at least 8 operands!");
Simon Pilgrim2ead8612016-06-04 21:44:28 +00002246
Simon Pilgrimca3072a2016-10-18 15:45:37 +00002247 const MachineOperand &CtrlOp = MI->getOperand(MI->getNumOperands() - 1);
Simon Pilgrim2ead8612016-06-04 21:44:28 +00002248 if (!CtrlOp.isImm())
2249 break;
2250
2251 unsigned ElSize;
2252 switch (MI->getOpcode()) {
Keith Wyss3d868232018-04-17 21:30:29 +00002253 default:
2254 llvm_unreachable("Invalid opcode");
2255 case X86::VPERMIL2PSrm:
2256 case X86::VPERMIL2PSYrm:
2257 ElSize = 32;
2258 break;
2259 case X86::VPERMIL2PDrm:
2260 case X86::VPERMIL2PDYrm:
2261 ElSize = 64;
2262 break;
Simon Pilgrim2ead8612016-06-04 21:44:28 +00002263 }
2264
Simon Pilgrimca3072a2016-10-18 15:45:37 +00002265 const MachineOperand &MaskOp = MI->getOperand(6);
Simon Pilgrim2ead8612016-06-04 21:44:28 +00002266 if (auto *C = getConstantFromPool(*MI, MaskOp)) {
2267 SmallVector<int, 16> Mask;
2268 DecodeVPERMIL2PMask(C, (unsigned)CtrlOp.getImm(), ElSize, Mask);
2269 if (!Mask.empty())
Andrew V. Tischenko75745d02017-04-14 07:44:23 +00002270 OutStreamer->AddComment(getShuffleComment(MI, 1, 2, Mask),
2271 !EnablePrintSchedInfo);
Simon Pilgrim2ead8612016-06-04 21:44:28 +00002272 }
2273 break;
2274 }
2275
Simon Pilgrim1cc57122016-04-09 14:51:26 +00002276 case X86::VPPERMrrm: {
2277 if (!OutStreamer->isVerboseAsm())
2278 break;
Craig Topper1f5178f2016-10-17 06:41:18 +00002279 assert(MI->getNumOperands() >= 7 &&
2280 "We should always have at least 7 operands!");
Simon Pilgrim1cc57122016-04-09 14:51:26 +00002281
Simon Pilgrimca3072a2016-10-18 15:45:37 +00002282 const MachineOperand &MaskOp = MI->getOperand(6);
Simon Pilgrim1cc57122016-04-09 14:51:26 +00002283 if (auto *C = getConstantFromPool(*MI, MaskOp)) {
2284 SmallVector<int, 16> Mask;
2285 DecodeVPPERMMask(C, Mask);
2286 if (!Mask.empty())
Andrew V. Tischenko75745d02017-04-14 07:44:23 +00002287 OutStreamer->AddComment(getShuffleComment(MI, 1, 2, Mask),
2288 !EnablePrintSchedInfo);
Chandler Carruth7b688c62014-09-24 03:06:37 +00002289 }
Chandler Carruth185cc182014-07-25 23:47:11 +00002290 break;
Chris Lattner74f4ca72009-09-02 17:35:12 +00002291 }
Chandler Carruthe7e9c042014-09-24 09:39:41 +00002292
Simon Pilgrim90fd0622018-03-01 22:22:31 +00002293 case X86::MMX_MOVQ64rm: {
2294 if (!OutStreamer->isVerboseAsm())
2295 break;
2296 if (MI->getNumOperands() <= 4)
2297 break;
2298 if (auto *C = getConstantFromPool(*MI, MI->getOperand(4))) {
2299 std::string Comment;
2300 raw_string_ostream CS(Comment);
2301 const MachineOperand &DstOp = MI->getOperand(0);
2302 CS << X86ATTInstPrinter::getRegisterName(DstOp.getReg()) << " = ";
2303 if (auto *CF = dyn_cast<ConstantFP>(C)) {
2304 CS << "0x" << CF->getValueAPF().bitcastToAPInt().toString(16, false);
2305 OutStreamer->AddComment(CS.str(), !EnablePrintSchedInfo);
2306 }
2307 }
2308 break;
2309 }
2310
Keith Wyss3d868232018-04-17 21:30:29 +00002311#define MOV_CASE(Prefix, Suffix) \
2312 case X86::Prefix##MOVAPD##Suffix##rm: \
2313 case X86::Prefix##MOVAPS##Suffix##rm: \
2314 case X86::Prefix##MOVUPD##Suffix##rm: \
2315 case X86::Prefix##MOVUPS##Suffix##rm: \
2316 case X86::Prefix##MOVDQA##Suffix##rm: \
Elena Demikhovskye88038f2015-09-08 06:38:21 +00002317 case X86::Prefix##MOVDQU##Suffix##rm:
2318
Keith Wyss3d868232018-04-17 21:30:29 +00002319#define MOV_AVX512_CASE(Suffix) \
2320 case X86::VMOVDQA64##Suffix##rm: \
2321 case X86::VMOVDQA32##Suffix##rm: \
2322 case X86::VMOVDQU64##Suffix##rm: \
2323 case X86::VMOVDQU32##Suffix##rm: \
2324 case X86::VMOVDQU16##Suffix##rm: \
2325 case X86::VMOVDQU8##Suffix##rm: \
2326 case X86::VMOVAPS##Suffix##rm: \
2327 case X86::VMOVAPD##Suffix##rm: \
2328 case X86::VMOVUPS##Suffix##rm: \
Elena Demikhovskye88038f2015-09-08 06:38:21 +00002329 case X86::VMOVUPD##Suffix##rm:
2330
Keith Wyss3d868232018-04-17 21:30:29 +00002331#define CASE_ALL_MOV_RM() \
2332 MOV_CASE(, ) /* SSE */ \
2333 MOV_CASE(V, ) /* AVX-128 */ \
2334 MOV_CASE(V, Y) /* AVX-256 */ \
2335 MOV_AVX512_CASE(Z) \
2336 MOV_AVX512_CASE(Z256) \
Elena Demikhovskye88038f2015-09-08 06:38:21 +00002337 MOV_AVX512_CASE(Z128)
2338
Keith Wyss3d868232018-04-17 21:30:29 +00002339 // For loads from a constant pool to a vector register, print the constant
2340 // loaded.
2341 CASE_ALL_MOV_RM()
Craig Topperad140cf2017-07-04 05:46:11 +00002342 case X86::VBROADCASTF128:
2343 case X86::VBROADCASTI128:
2344 case X86::VBROADCASTF32X4Z256rm:
2345 case X86::VBROADCASTF32X4rm:
2346 case X86::VBROADCASTF32X8rm:
2347 case X86::VBROADCASTF64X2Z128rm:
2348 case X86::VBROADCASTF64X2rm:
2349 case X86::VBROADCASTF64X4rm:
2350 case X86::VBROADCASTI32X4Z256rm:
2351 case X86::VBROADCASTI32X4rm:
2352 case X86::VBROADCASTI32X8rm:
2353 case X86::VBROADCASTI64X2Z128rm:
2354 case X86::VBROADCASTI64X2rm:
2355 case X86::VBROADCASTI64X4rm:
Lang Hames9ff69c82015-04-24 19:11:51 +00002356 if (!OutStreamer->isVerboseAsm())
Chandler Carruthe7e9c042014-09-24 09:39:41 +00002357 break;
Craig Topperd4091492016-11-25 02:29:24 +00002358 if (MI->getNumOperands() <= 4)
2359 break;
Chandler Carruthe7e9c042014-09-24 09:39:41 +00002360 if (auto *C = getConstantFromPool(*MI, MI->getOperand(4))) {
Craig Topperad140cf2017-07-04 05:46:11 +00002361 int NumLanes = 1;
2362 // Override NumLanes for the broadcast instructions.
2363 switch (MI->getOpcode()) {
Keith Wyss3d868232018-04-17 21:30:29 +00002364 case X86::VBROADCASTF128:
2365 NumLanes = 2;
2366 break;
2367 case X86::VBROADCASTI128:
2368 NumLanes = 2;
2369 break;
2370 case X86::VBROADCASTF32X4Z256rm:
2371 NumLanes = 2;
2372 break;
2373 case X86::VBROADCASTF32X4rm:
2374 NumLanes = 4;
2375 break;
2376 case X86::VBROADCASTF32X8rm:
2377 NumLanes = 2;
2378 break;
2379 case X86::VBROADCASTF64X2Z128rm:
2380 NumLanes = 2;
2381 break;
2382 case X86::VBROADCASTF64X2rm:
2383 NumLanes = 4;
2384 break;
2385 case X86::VBROADCASTF64X4rm:
2386 NumLanes = 2;
2387 break;
2388 case X86::VBROADCASTI32X4Z256rm:
2389 NumLanes = 2;
2390 break;
2391 case X86::VBROADCASTI32X4rm:
2392 NumLanes = 4;
2393 break;
2394 case X86::VBROADCASTI32X8rm:
2395 NumLanes = 2;
2396 break;
2397 case X86::VBROADCASTI64X2Z128rm:
2398 NumLanes = 2;
2399 break;
2400 case X86::VBROADCASTI64X2rm:
2401 NumLanes = 4;
2402 break;
2403 case X86::VBROADCASTI64X4rm:
2404 NumLanes = 2;
2405 break;
Craig Topperad140cf2017-07-04 05:46:11 +00002406 }
2407
Chandler Carruthe7e9c042014-09-24 09:39:41 +00002408 std::string Comment;
2409 raw_string_ostream CS(Comment);
2410 const MachineOperand &DstOp = MI->getOperand(0);
2411 CS << X86ATTInstPrinter::getRegisterName(DstOp.getReg()) << " = ";
2412 if (auto *CDS = dyn_cast<ConstantDataSequential>(C)) {
2413 CS << "[";
Craig Topperad140cf2017-07-04 05:46:11 +00002414 for (int l = 0; l != NumLanes; ++l) {
Keith Wyss3d868232018-04-17 21:30:29 +00002415 for (int i = 0, NumElements = CDS->getNumElements(); i < NumElements;
2416 ++i) {
Craig Topperad140cf2017-07-04 05:46:11 +00002417 if (i != 0 || l != 0)
2418 CS << ",";
2419 if (CDS->getElementType()->isIntegerTy())
2420 CS << CDS->getElementAsInteger(i);
2421 else if (CDS->getElementType()->isFloatTy())
2422 CS << CDS->getElementAsFloat(i);
2423 else if (CDS->getElementType()->isDoubleTy())
2424 CS << CDS->getElementAsDouble(i);
2425 else
2426 CS << "?";
2427 }
Chandler Carruthe7e9c042014-09-24 09:39:41 +00002428 }
2429 CS << "]";
Andrew V. Tischenko75745d02017-04-14 07:44:23 +00002430 OutStreamer->AddComment(CS.str(), !EnablePrintSchedInfo);
Chandler Carruthe7e9c042014-09-24 09:39:41 +00002431 } else if (auto *CV = dyn_cast<ConstantVector>(C)) {
2432 CS << "<";
Craig Topperad140cf2017-07-04 05:46:11 +00002433 for (int l = 0; l != NumLanes; ++l) {
Keith Wyss3d868232018-04-17 21:30:29 +00002434 for (int i = 0, NumOperands = CV->getNumOperands(); i < NumOperands;
2435 ++i) {
Craig Topperad140cf2017-07-04 05:46:11 +00002436 if (i != 0 || l != 0)
2437 CS << ",";
2438 printConstant(CV->getOperand(i), CS);
Chandler Carruthe7e9c042014-09-24 09:39:41 +00002439 }
2440 }
2441 CS << ">";
Andrew V. Tischenko75745d02017-04-14 07:44:23 +00002442 OutStreamer->AddComment(CS.str(), !EnablePrintSchedInfo);
Chandler Carruthe7e9c042014-09-24 09:39:41 +00002443 }
2444 }
2445 break;
Craig Topperad140cf2017-07-04 05:46:11 +00002446 case X86::VBROADCASTSSrm:
2447 case X86::VBROADCASTSSYrm:
2448 case X86::VBROADCASTSSZ128m:
2449 case X86::VBROADCASTSSZ256m:
2450 case X86::VBROADCASTSSZm:
2451 case X86::VBROADCASTSDYrm:
2452 case X86::VBROADCASTSDZ256m:
2453 case X86::VBROADCASTSDZm:
2454 case X86::VPBROADCASTBrm:
2455 case X86::VPBROADCASTBYrm:
2456 case X86::VPBROADCASTBZ128m:
2457 case X86::VPBROADCASTBZ256m:
2458 case X86::VPBROADCASTBZm:
2459 case X86::VPBROADCASTDrm:
2460 case X86::VPBROADCASTDYrm:
2461 case X86::VPBROADCASTDZ128m:
2462 case X86::VPBROADCASTDZ256m:
2463 case X86::VPBROADCASTDZm:
2464 case X86::VPBROADCASTQrm:
2465 case X86::VPBROADCASTQYrm:
2466 case X86::VPBROADCASTQZ128m:
2467 case X86::VPBROADCASTQZ256m:
2468 case X86::VPBROADCASTQZm:
2469 case X86::VPBROADCASTWrm:
2470 case X86::VPBROADCASTWYrm:
2471 case X86::VPBROADCASTWZ128m:
2472 case X86::VPBROADCASTWZ256m:
2473 case X86::VPBROADCASTWZm:
2474 if (!OutStreamer->isVerboseAsm())
2475 break;
2476 if (MI->getNumOperands() <= 4)
2477 break;
2478 if (auto *C = getConstantFromPool(*MI, MI->getOperand(4))) {
2479 int NumElts;
2480 switch (MI->getOpcode()) {
Keith Wyss3d868232018-04-17 21:30:29 +00002481 default:
2482 llvm_unreachable("Invalid opcode");
2483 case X86::VBROADCASTSSrm:
2484 NumElts = 4;
2485 break;
2486 case X86::VBROADCASTSSYrm:
2487 NumElts = 8;
2488 break;
2489 case X86::VBROADCASTSSZ128m:
2490 NumElts = 4;
2491 break;
2492 case X86::VBROADCASTSSZ256m:
2493 NumElts = 8;
2494 break;
2495 case X86::VBROADCASTSSZm:
2496 NumElts = 16;
2497 break;
2498 case X86::VBROADCASTSDYrm:
2499 NumElts = 4;
2500 break;
2501 case X86::VBROADCASTSDZ256m:
2502 NumElts = 4;
2503 break;
2504 case X86::VBROADCASTSDZm:
2505 NumElts = 8;
2506 break;
2507 case X86::VPBROADCASTBrm:
2508 NumElts = 16;
2509 break;
2510 case X86::VPBROADCASTBYrm:
2511 NumElts = 32;
2512 break;
2513 case X86::VPBROADCASTBZ128m:
2514 NumElts = 16;
2515 break;
2516 case X86::VPBROADCASTBZ256m:
2517 NumElts = 32;
2518 break;
2519 case X86::VPBROADCASTBZm:
2520 NumElts = 64;
2521 break;
2522 case X86::VPBROADCASTDrm:
2523 NumElts = 4;
2524 break;
2525 case X86::VPBROADCASTDYrm:
2526 NumElts = 8;
2527 break;
2528 case X86::VPBROADCASTDZ128m:
2529 NumElts = 4;
2530 break;
2531 case X86::VPBROADCASTDZ256m:
2532 NumElts = 8;
2533 break;
2534 case X86::VPBROADCASTDZm:
2535 NumElts = 16;
2536 break;
2537 case X86::VPBROADCASTQrm:
2538 NumElts = 2;
2539 break;
2540 case X86::VPBROADCASTQYrm:
2541 NumElts = 4;
2542 break;
2543 case X86::VPBROADCASTQZ128m:
2544 NumElts = 2;
2545 break;
2546 case X86::VPBROADCASTQZ256m:
2547 NumElts = 4;
2548 break;
2549 case X86::VPBROADCASTQZm:
2550 NumElts = 8;
2551 break;
2552 case X86::VPBROADCASTWrm:
2553 NumElts = 8;
2554 break;
2555 case X86::VPBROADCASTWYrm:
2556 NumElts = 16;
2557 break;
2558 case X86::VPBROADCASTWZ128m:
2559 NumElts = 8;
2560 break;
2561 case X86::VPBROADCASTWZ256m:
2562 NumElts = 16;
2563 break;
2564 case X86::VPBROADCASTWZm:
2565 NumElts = 32;
2566 break;
Craig Topperad140cf2017-07-04 05:46:11 +00002567 }
2568
2569 std::string Comment;
2570 raw_string_ostream CS(Comment);
2571 const MachineOperand &DstOp = MI->getOperand(0);
2572 CS << X86ATTInstPrinter::getRegisterName(DstOp.getReg()) << " = ";
2573 CS << "[";
2574 for (int i = 0; i != NumElts; ++i) {
2575 if (i != 0)
2576 CS << ",";
2577 printConstant(C, CS);
2578 }
2579 CS << "]";
2580 OutStreamer->AddComment(CS.str(), !EnablePrintSchedInfo);
2581 }
Chandler Carruth0b682d42014-09-24 02:16:12 +00002582 }
Chad Rosier24c19d22012-08-01 18:39:17 +00002583
Chris Lattner31722082009-09-12 20:34:57 +00002584 MCInst TmpInst;
2585 MCInstLowering.Lower(MI, TmpInst);
Andrew V. Tischenko22f07422017-12-15 18:13:05 +00002586 if (MI->getAsmPrinterFlag(MachineInstr::NoSchedComment))
2587 TmpInst.setFlags(TmpInst.getFlags() | X86::NO_SCHED_INFO);
Pete Cooper3c0af3522014-10-27 19:40:35 +00002588
2589 // Stackmap shadows cannot include branch targets, so we can count the bytes
Pete Cooper7c801dc2014-10-27 22:38:45 +00002590 // in a call towards the shadow, but must ensure that the no thread returns
2591 // in to the stackmap shadow. The only way to achieve this is if the call
2592 // is at the end of the shadow.
2593 if (MI->isCall()) {
2594 // Count then size of the call towards the shadow
Sanjoy Dasc0441c22016-04-19 05:24:47 +00002595 SMShadowTracker.count(TmpInst, getSubtargetInfo(), CodeEmitter.get());
Pete Cooper7c801dc2014-10-27 22:38:45 +00002596 // Then flush the shadow so that we fill with nops before the call, not
2597 // after it.
Lang Hames9ff69c82015-04-24 19:11:51 +00002598 SMShadowTracker.emitShadowPadding(*OutStreamer, getSubtargetInfo());
Pete Cooper7c801dc2014-10-27 22:38:45 +00002599 // Then emit the call
Lang Hames9ff69c82015-04-24 19:11:51 +00002600 OutStreamer->EmitInstruction(TmpInst, getSubtargetInfo());
Pete Cooper7c801dc2014-10-27 22:38:45 +00002601 return;
2602 }
2603
2604 EmitAndCountInstruction(TmpInst);
Chris Lattner74f4ca72009-09-02 17:35:12 +00002605}