Path: blob/main/contrib/llvm-project/llvm/lib/Target/X86/MCTargetDesc/X86InstComments.cpp
35294 views
//===-- X86InstComments.cpp - Generate verbose-asm comments for instrs ----===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This defines functionality used to emit comments about X86 instructions to9// an output stream for -fverbose-asm.10//11//===----------------------------------------------------------------------===//1213#include "X86InstComments.h"14#include "X86ATTInstPrinter.h"15#include "X86BaseInfo.h"16#include "X86MCTargetDesc.h"17#include "X86ShuffleDecode.h"18#include "llvm/MC/MCInst.h"19#include "llvm/MC/MCInstrInfo.h"20#include "llvm/Support/raw_ostream.h"2122using namespace llvm;2324#define CASE_SSE_INS_COMMON(Inst, src) \25case X86::Inst##src:2627#define CASE_AVX_INS_COMMON(Inst, Suffix, src) \28case X86::V##Inst##Suffix##src:2930#define CASE_MASK_INS_COMMON(Inst, Suffix, src) \31case X86::V##Inst##Suffix##src##k:3233#define CASE_MASKZ_INS_COMMON(Inst, Suffix, src) \34case X86::V##Inst##Suffix##src##kz:3536#define CASE_AVX512_INS_COMMON(Inst, Suffix, src) \37CASE_AVX_INS_COMMON(Inst, Suffix, src) \38CASE_MASK_INS_COMMON(Inst, Suffix, src) \39CASE_MASKZ_INS_COMMON(Inst, Suffix, src)4041#define CASE_MOVDUP(Inst, src) \42CASE_AVX512_INS_COMMON(Inst, Z, r##src) \43CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \44CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \45CASE_AVX_INS_COMMON(Inst, , r##src) \46CASE_AVX_INS_COMMON(Inst, Y, r##src) \47CASE_SSE_INS_COMMON(Inst, r##src)4849#define CASE_MASK_MOVDUP(Inst, src) \50CASE_MASK_INS_COMMON(Inst, Z, r##src) \51CASE_MASK_INS_COMMON(Inst, Z256, r##src) \52CASE_MASK_INS_COMMON(Inst, Z128, r##src)5354#define CASE_MASKZ_MOVDUP(Inst, src) \55CASE_MASKZ_INS_COMMON(Inst, Z, r##src) \56CASE_MASKZ_INS_COMMON(Inst, Z256, r##src) \57CASE_MASKZ_INS_COMMON(Inst, Z128, r##src)5859#define CASE_PMOVZX(Inst, src) \60CASE_AVX512_INS_COMMON(Inst, Z, r##src) \61CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \62CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \63CASE_AVX_INS_COMMON(Inst, , r##src) \64CASE_AVX_INS_COMMON(Inst, Y, r##src) \65CASE_SSE_INS_COMMON(Inst, r##src)6667#define CASE_UNPCK(Inst, src) \68CASE_AVX512_INS_COMMON(Inst, Z, r##src) \69CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \70CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \71CASE_AVX_INS_COMMON(Inst, , r##src) \72CASE_AVX_INS_COMMON(Inst, Y, r##src) \73CASE_SSE_INS_COMMON(Inst, r##src)7475#define CASE_MASK_UNPCK(Inst, src) \76CASE_MASK_INS_COMMON(Inst, Z, r##src) \77CASE_MASK_INS_COMMON(Inst, Z256, r##src) \78CASE_MASK_INS_COMMON(Inst, Z128, r##src)7980#define CASE_MASKZ_UNPCK(Inst, src) \81CASE_MASKZ_INS_COMMON(Inst, Z, r##src) \82CASE_MASKZ_INS_COMMON(Inst, Z256, r##src) \83CASE_MASKZ_INS_COMMON(Inst, Z128, r##src)8485#define CASE_SHUF(Inst, suf) \86CASE_AVX512_INS_COMMON(Inst, Z, suf) \87CASE_AVX512_INS_COMMON(Inst, Z256, suf) \88CASE_AVX512_INS_COMMON(Inst, Z128, suf) \89CASE_AVX_INS_COMMON(Inst, , suf) \90CASE_AVX_INS_COMMON(Inst, Y, suf) \91CASE_SSE_INS_COMMON(Inst, suf)9293#define CASE_MASK_SHUF(Inst, src) \94CASE_MASK_INS_COMMON(Inst, Z, r##src##i) \95CASE_MASK_INS_COMMON(Inst, Z256, r##src##i) \96CASE_MASK_INS_COMMON(Inst, Z128, r##src##i)9798#define CASE_MASKZ_SHUF(Inst, src) \99CASE_MASKZ_INS_COMMON(Inst, Z, r##src##i) \100CASE_MASKZ_INS_COMMON(Inst, Z256, r##src##i) \101CASE_MASKZ_INS_COMMON(Inst, Z128, r##src##i)102103#define CASE_VPERMILPI(Inst, src) \104CASE_AVX512_INS_COMMON(Inst, Z, src##i) \105CASE_AVX512_INS_COMMON(Inst, Z256, src##i) \106CASE_AVX512_INS_COMMON(Inst, Z128, src##i) \107CASE_AVX_INS_COMMON(Inst, , src##i) \108CASE_AVX_INS_COMMON(Inst, Y, src##i)109110#define CASE_MASK_VPERMILPI(Inst, src) \111CASE_MASK_INS_COMMON(Inst, Z, src##i) \112CASE_MASK_INS_COMMON(Inst, Z256, src##i) \113CASE_MASK_INS_COMMON(Inst, Z128, src##i)114115#define CASE_MASKZ_VPERMILPI(Inst, src) \116CASE_MASKZ_INS_COMMON(Inst, Z, src##i) \117CASE_MASKZ_INS_COMMON(Inst, Z256, src##i) \118CASE_MASKZ_INS_COMMON(Inst, Z128, src##i)119120#define CASE_VPERM(Inst, src) \121CASE_AVX512_INS_COMMON(Inst, Z, src##i) \122CASE_AVX512_INS_COMMON(Inst, Z256, src##i) \123CASE_AVX_INS_COMMON(Inst, Y, src##i)124125#define CASE_MASK_VPERM(Inst, src) \126CASE_MASK_INS_COMMON(Inst, Z, src##i) \127CASE_MASK_INS_COMMON(Inst, Z256, src##i)128129#define CASE_MASKZ_VPERM(Inst, src) \130CASE_MASKZ_INS_COMMON(Inst, Z, src##i) \131CASE_MASKZ_INS_COMMON(Inst, Z256, src##i)132133#define CASE_VSHUF(Inst, src) \134CASE_AVX512_INS_COMMON(SHUFF##Inst, Z, r##src##i) \135CASE_AVX512_INS_COMMON(SHUFI##Inst, Z, r##src##i) \136CASE_AVX512_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \137CASE_AVX512_INS_COMMON(SHUFI##Inst, Z256, r##src##i)138139#define CASE_MASK_VSHUF(Inst, src) \140CASE_MASK_INS_COMMON(SHUFF##Inst, Z, r##src##i) \141CASE_MASK_INS_COMMON(SHUFI##Inst, Z, r##src##i) \142CASE_MASK_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \143CASE_MASK_INS_COMMON(SHUFI##Inst, Z256, r##src##i)144145#define CASE_MASKZ_VSHUF(Inst, src) \146CASE_MASKZ_INS_COMMON(SHUFF##Inst, Z, r##src##i) \147CASE_MASKZ_INS_COMMON(SHUFI##Inst, Z, r##src##i) \148CASE_MASKZ_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \149CASE_MASKZ_INS_COMMON(SHUFI##Inst, Z256, r##src##i)150151#define CASE_AVX512_FMA(Inst, suf) \152CASE_AVX512_INS_COMMON(Inst, Z, suf) \153CASE_AVX512_INS_COMMON(Inst, Z256, suf) \154CASE_AVX512_INS_COMMON(Inst, Z128, suf)155156#define CASE_FMA(Inst, suf) \157CASE_AVX512_FMA(Inst, suf) \158CASE_AVX_INS_COMMON(Inst, , suf) \159CASE_AVX_INS_COMMON(Inst, Y, suf)160161#define CASE_FMA_PACKED_REG(Inst) \162CASE_FMA(Inst##PD, r) \163CASE_FMA(Inst##PS, r)164165#define CASE_FMA_PACKED_MEM(Inst) \166CASE_FMA(Inst##PD, m) \167CASE_FMA(Inst##PS, m) \168CASE_AVX512_FMA(Inst##PD, mb) \169CASE_AVX512_FMA(Inst##PS, mb)170171#define CASE_FMA_SCALAR_REG(Inst) \172CASE_AVX_INS_COMMON(Inst##SD, , r) \173CASE_AVX_INS_COMMON(Inst##SS, , r) \174CASE_AVX_INS_COMMON(Inst##SD, , r_Int) \175CASE_AVX_INS_COMMON(Inst##SS, , r_Int) \176CASE_AVX_INS_COMMON(Inst##SD, Z, r) \177CASE_AVX_INS_COMMON(Inst##SS, Z, r) \178CASE_AVX512_INS_COMMON(Inst##SD, Z, r_Int) \179CASE_AVX512_INS_COMMON(Inst##SS, Z, r_Int)180181#define CASE_FMA_SCALAR_MEM(Inst) \182CASE_AVX_INS_COMMON(Inst##SD, , m) \183CASE_AVX_INS_COMMON(Inst##SS, , m) \184CASE_AVX_INS_COMMON(Inst##SD, , m_Int) \185CASE_AVX_INS_COMMON(Inst##SS, , m_Int) \186CASE_AVX_INS_COMMON(Inst##SD, Z, m) \187CASE_AVX_INS_COMMON(Inst##SS, Z, m) \188CASE_AVX512_INS_COMMON(Inst##SD, Z, m_Int) \189CASE_AVX512_INS_COMMON(Inst##SS, Z, m_Int)190191#define CASE_FMA4(Inst, suf) \192CASE_AVX_INS_COMMON(Inst, 4, suf) \193CASE_AVX_INS_COMMON(Inst, 4Y, suf)194195#define CASE_FMA4_PACKED_RR(Inst) \196CASE_FMA4(Inst##PD, rr) \197CASE_FMA4(Inst##PS, rr)198199#define CASE_FMA4_PACKED_RM(Inst) \200CASE_FMA4(Inst##PD, rm) \201CASE_FMA4(Inst##PS, rm)202203#define CASE_FMA4_PACKED_MR(Inst) \204CASE_FMA4(Inst##PD, mr) \205CASE_FMA4(Inst##PS, mr)206207#define CASE_FMA4_SCALAR_RR(Inst) \208CASE_AVX_INS_COMMON(Inst##SD4, , rr) \209CASE_AVX_INS_COMMON(Inst##SS4, , rr) \210CASE_AVX_INS_COMMON(Inst##SD4, , rr_Int) \211CASE_AVX_INS_COMMON(Inst##SS4, , rr_Int)212213#define CASE_FMA4_SCALAR_RM(Inst) \214CASE_AVX_INS_COMMON(Inst##SD4, , rm) \215CASE_AVX_INS_COMMON(Inst##SS4, , rm) \216CASE_AVX_INS_COMMON(Inst##SD4, , rm_Int) \217CASE_AVX_INS_COMMON(Inst##SS4, , rm_Int)218219#define CASE_FMA4_SCALAR_MR(Inst) \220CASE_AVX_INS_COMMON(Inst##SD4, , mr) \221CASE_AVX_INS_COMMON(Inst##SS4, , mr) \222CASE_AVX_INS_COMMON(Inst##SD4, , mr_Int) \223CASE_AVX_INS_COMMON(Inst##SS4, , mr_Int)224225static unsigned getVectorRegSize(unsigned RegNo) {226if (X86II::isZMMReg(RegNo))227return 512;228if (X86II::isYMMReg(RegNo))229return 256;230if (X86II::isXMMReg(RegNo))231return 128;232if (X86::MM0 <= RegNo && RegNo <= X86::MM7)233return 64;234235llvm_unreachable("Unknown vector reg!");236}237238static unsigned getRegOperandNumElts(const MCInst *MI, unsigned ScalarSize,239unsigned OperandIndex) {240unsigned OpReg = MI->getOperand(OperandIndex).getReg();241return getVectorRegSize(OpReg) / ScalarSize;242}243244static const char *getRegName(MCRegister Reg) {245return X86ATTInstPrinter::getRegisterName(Reg);246}247248/// Wraps the destination register name with AVX512 mask/maskz filtering.249static void printMasking(raw_ostream &OS, const MCInst *MI,250const MCInstrInfo &MCII) {251const MCInstrDesc &Desc = MCII.get(MI->getOpcode());252uint64_t TSFlags = Desc.TSFlags;253254if (!(TSFlags & X86II::EVEX_K))255return;256257bool MaskWithZero = (TSFlags & X86II::EVEX_Z);258unsigned MaskOp = Desc.getNumDefs();259260if (Desc.getOperandConstraint(MaskOp, MCOI::TIED_TO) != -1)261++MaskOp;262263const char *MaskRegName = getRegName(MI->getOperand(MaskOp).getReg());264265// MASK: zmmX {%kY}266OS << " {%" << MaskRegName << "}";267268// MASKZ: zmmX {%kY} {z}269if (MaskWithZero)270OS << " {z}";271}272273static bool printFMAComments(const MCInst *MI, raw_ostream &OS,274const MCInstrInfo &MCII) {275const char *Mul1Name = nullptr, *Mul2Name = nullptr, *AccName = nullptr;276unsigned NumOperands = MI->getNumOperands();277bool RegForm = false;278bool Negate = false;279StringRef AccStr = "+";280281// The operands for FMA3 instructions without rounding fall into two forms:282// dest, src1, src2, src3283// dest, src1, mask, src2, src3284// Where src3 is either a register or 5 memory address operands. So to find285// dest and src1 we can index from the front. To find src2 and src3 we can286// index from the end by taking into account memory vs register form when287// finding src2.288289// The operands for FMA4 instructions:290// dest, src1, src2, src3291// Where src2 OR src3 are either a register or 5 memory address operands. So292// to find dest and src1 we can index from the front, src2 (reg/mem) follows293// and then src3 (reg) will be at the end.294295switch (MI->getOpcode()) {296default:297return false;298299CASE_FMA4_PACKED_RR(FMADD)300CASE_FMA4_SCALAR_RR(FMADD)301AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());302[[fallthrough]];303CASE_FMA4_PACKED_RM(FMADD)304CASE_FMA4_SCALAR_RM(FMADD)305Mul2Name = getRegName(MI->getOperand(2).getReg());306Mul1Name = getRegName(MI->getOperand(1).getReg());307break;308CASE_FMA4_PACKED_MR(FMADD)309CASE_FMA4_SCALAR_MR(FMADD)310AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());311Mul1Name = getRegName(MI->getOperand(1).getReg());312break;313314CASE_FMA4_PACKED_RR(FMSUB)315CASE_FMA4_SCALAR_RR(FMSUB)316AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());317[[fallthrough]];318CASE_FMA4_PACKED_RM(FMSUB)319CASE_FMA4_SCALAR_RM(FMSUB)320Mul2Name = getRegName(MI->getOperand(2).getReg());321Mul1Name = getRegName(MI->getOperand(1).getReg());322AccStr = "-";323break;324CASE_FMA4_PACKED_MR(FMSUB)325CASE_FMA4_SCALAR_MR(FMSUB)326AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());327Mul1Name = getRegName(MI->getOperand(1).getReg());328AccStr = "-";329break;330331CASE_FMA4_PACKED_RR(FNMADD)332CASE_FMA4_SCALAR_RR(FNMADD)333AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());334[[fallthrough]];335CASE_FMA4_PACKED_RM(FNMADD)336CASE_FMA4_SCALAR_RM(FNMADD)337Mul2Name = getRegName(MI->getOperand(2).getReg());338Mul1Name = getRegName(MI->getOperand(1).getReg());339Negate = true;340break;341CASE_FMA4_PACKED_MR(FNMADD)342CASE_FMA4_SCALAR_MR(FNMADD)343AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());344Mul1Name = getRegName(MI->getOperand(1).getReg());345Negate = true;346break;347348CASE_FMA4_PACKED_RR(FNMSUB)349CASE_FMA4_SCALAR_RR(FNMSUB)350AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());351[[fallthrough]];352CASE_FMA4_PACKED_RM(FNMSUB)353CASE_FMA4_SCALAR_RM(FNMSUB)354Mul2Name = getRegName(MI->getOperand(2).getReg());355Mul1Name = getRegName(MI->getOperand(1).getReg());356AccStr = "-";357Negate = true;358break;359CASE_FMA4_PACKED_MR(FNMSUB)360CASE_FMA4_SCALAR_MR(FNMSUB)361AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());362Mul1Name = getRegName(MI->getOperand(1).getReg());363AccStr = "-";364Negate = true;365break;366367CASE_FMA4_PACKED_RR(FMADDSUB)368AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());369[[fallthrough]];370CASE_FMA4_PACKED_RM(FMADDSUB)371Mul2Name = getRegName(MI->getOperand(2).getReg());372Mul1Name = getRegName(MI->getOperand(1).getReg());373AccStr = "+/-";374break;375CASE_FMA4_PACKED_MR(FMADDSUB)376AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());377Mul1Name = getRegName(MI->getOperand(1).getReg());378AccStr = "+/-";379break;380381CASE_FMA4_PACKED_RR(FMSUBADD)382AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());383[[fallthrough]];384CASE_FMA4_PACKED_RM(FMSUBADD)385Mul2Name = getRegName(MI->getOperand(2).getReg());386Mul1Name = getRegName(MI->getOperand(1).getReg());387AccStr = "-/+";388break;389CASE_FMA4_PACKED_MR(FMSUBADD)390AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());391Mul1Name = getRegName(MI->getOperand(1).getReg());392AccStr = "-/+";393break;394395CASE_FMA_PACKED_REG(FMADD132)396CASE_FMA_SCALAR_REG(FMADD132)397Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());398RegForm = true;399[[fallthrough]];400CASE_FMA_PACKED_MEM(FMADD132)401CASE_FMA_SCALAR_MEM(FMADD132)402AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());403Mul1Name = getRegName(MI->getOperand(1).getReg());404break;405406CASE_FMA_PACKED_REG(FMADD213)407CASE_FMA_SCALAR_REG(FMADD213)408AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());409RegForm = true;410[[fallthrough]];411CASE_FMA_PACKED_MEM(FMADD213)412CASE_FMA_SCALAR_MEM(FMADD213)413Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());414Mul2Name = getRegName(MI->getOperand(1).getReg());415break;416417CASE_FMA_PACKED_REG(FMADD231)418CASE_FMA_SCALAR_REG(FMADD231)419Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());420RegForm = true;421[[fallthrough]];422CASE_FMA_PACKED_MEM(FMADD231)423CASE_FMA_SCALAR_MEM(FMADD231)424Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());425AccName = getRegName(MI->getOperand(1).getReg());426break;427428CASE_FMA_PACKED_REG(FMSUB132)429CASE_FMA_SCALAR_REG(FMSUB132)430Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());431RegForm = true;432[[fallthrough]];433CASE_FMA_PACKED_MEM(FMSUB132)434CASE_FMA_SCALAR_MEM(FMSUB132)435AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());436Mul1Name = getRegName(MI->getOperand(1).getReg());437AccStr = "-";438break;439440CASE_FMA_PACKED_REG(FMSUB213)441CASE_FMA_SCALAR_REG(FMSUB213)442AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());443RegForm = true;444[[fallthrough]];445CASE_FMA_PACKED_MEM(FMSUB213)446CASE_FMA_SCALAR_MEM(FMSUB213)447Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());448Mul2Name = getRegName(MI->getOperand(1).getReg());449AccStr = "-";450break;451452CASE_FMA_PACKED_REG(FMSUB231)453CASE_FMA_SCALAR_REG(FMSUB231)454Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());455RegForm = true;456[[fallthrough]];457CASE_FMA_PACKED_MEM(FMSUB231)458CASE_FMA_SCALAR_MEM(FMSUB231)459Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());460AccName = getRegName(MI->getOperand(1).getReg());461AccStr = "-";462break;463464CASE_FMA_PACKED_REG(FNMADD132)465CASE_FMA_SCALAR_REG(FNMADD132)466Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());467RegForm = true;468[[fallthrough]];469CASE_FMA_PACKED_MEM(FNMADD132)470CASE_FMA_SCALAR_MEM(FNMADD132)471AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());472Mul1Name = getRegName(MI->getOperand(1).getReg());473Negate = true;474break;475476CASE_FMA_PACKED_REG(FNMADD213)477CASE_FMA_SCALAR_REG(FNMADD213)478AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());479RegForm = true;480[[fallthrough]];481CASE_FMA_PACKED_MEM(FNMADD213)482CASE_FMA_SCALAR_MEM(FNMADD213)483Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());484Mul2Name = getRegName(MI->getOperand(1).getReg());485Negate = true;486break;487488CASE_FMA_PACKED_REG(FNMADD231)489CASE_FMA_SCALAR_REG(FNMADD231)490Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());491RegForm = true;492[[fallthrough]];493CASE_FMA_PACKED_MEM(FNMADD231)494CASE_FMA_SCALAR_MEM(FNMADD231)495Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());496AccName = getRegName(MI->getOperand(1).getReg());497Negate = true;498break;499500CASE_FMA_PACKED_REG(FNMSUB132)501CASE_FMA_SCALAR_REG(FNMSUB132)502Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());503RegForm = true;504[[fallthrough]];505CASE_FMA_PACKED_MEM(FNMSUB132)506CASE_FMA_SCALAR_MEM(FNMSUB132)507AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());508Mul1Name = getRegName(MI->getOperand(1).getReg());509AccStr = "-";510Negate = true;511break;512513CASE_FMA_PACKED_REG(FNMSUB213)514CASE_FMA_SCALAR_REG(FNMSUB213)515AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());516RegForm = true;517[[fallthrough]];518CASE_FMA_PACKED_MEM(FNMSUB213)519CASE_FMA_SCALAR_MEM(FNMSUB213)520Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());521Mul2Name = getRegName(MI->getOperand(1).getReg());522AccStr = "-";523Negate = true;524break;525526CASE_FMA_PACKED_REG(FNMSUB231)527CASE_FMA_SCALAR_REG(FNMSUB231)528Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());529RegForm = true;530[[fallthrough]];531CASE_FMA_PACKED_MEM(FNMSUB231)532CASE_FMA_SCALAR_MEM(FNMSUB231)533Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());534AccName = getRegName(MI->getOperand(1).getReg());535AccStr = "-";536Negate = true;537break;538539CASE_FMA_PACKED_REG(FMADDSUB132)540Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());541RegForm = true;542[[fallthrough]];543CASE_FMA_PACKED_MEM(FMADDSUB132)544AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());545Mul1Name = getRegName(MI->getOperand(1).getReg());546AccStr = "+/-";547break;548549CASE_FMA_PACKED_REG(FMADDSUB213)550AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());551RegForm = true;552[[fallthrough]];553CASE_FMA_PACKED_MEM(FMADDSUB213)554Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());555Mul2Name = getRegName(MI->getOperand(1).getReg());556AccStr = "+/-";557break;558559CASE_FMA_PACKED_REG(FMADDSUB231)560Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());561RegForm = true;562[[fallthrough]];563CASE_FMA_PACKED_MEM(FMADDSUB231)564Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());565AccName = getRegName(MI->getOperand(1).getReg());566AccStr = "+/-";567break;568569CASE_FMA_PACKED_REG(FMSUBADD132)570Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());571RegForm = true;572[[fallthrough]];573CASE_FMA_PACKED_MEM(FMSUBADD132)574AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());575Mul1Name = getRegName(MI->getOperand(1).getReg());576AccStr = "-/+";577break;578579CASE_FMA_PACKED_REG(FMSUBADD213)580AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());581RegForm = true;582[[fallthrough]];583CASE_FMA_PACKED_MEM(FMSUBADD213)584Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());585Mul2Name = getRegName(MI->getOperand(1).getReg());586AccStr = "-/+";587break;588589CASE_FMA_PACKED_REG(FMSUBADD231)590Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());591RegForm = true;592[[fallthrough]];593CASE_FMA_PACKED_MEM(FMSUBADD231)594Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());595AccName = getRegName(MI->getOperand(1).getReg());596AccStr = "-/+";597break;598}599600const char *DestName = getRegName(MI->getOperand(0).getReg());601602if (!Mul1Name) Mul1Name = "mem";603if (!Mul2Name) Mul2Name = "mem";604if (!AccName) AccName = "mem";605606OS << DestName;607printMasking(OS, MI, MCII);608OS << " = ";609610if (Negate)611OS << '-';612613OS << '(' << Mul1Name << " * " << Mul2Name << ") " << AccStr << ' '614<< AccName << '\n';615616return true;617}618619620//===----------------------------------------------------------------------===//621// Top Level Entrypoint622//===----------------------------------------------------------------------===//623624/// EmitAnyX86InstComments - This function decodes x86 instructions and prints625/// newline terminated strings to the specified string if desired. This626/// information is shown in disassembly dumps when verbose assembly is enabled.627bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,628const MCInstrInfo &MCII) {629// If this is a shuffle operation, the switch should fill in this state.630SmallVector<int, 8> ShuffleMask;631const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;632unsigned NumOperands = MI->getNumOperands();633bool RegForm = false;634635if (printFMAComments(MI, OS, MCII))636return true;637638switch (MI->getOpcode()) {639default:640// Not an instruction for which we can decode comments.641return false;642643case X86::BLENDPDrri:644case X86::VBLENDPDrri:645case X86::VBLENDPDYrri:646Src2Name = getRegName(MI->getOperand(2).getReg());647[[fallthrough]];648case X86::BLENDPDrmi:649case X86::VBLENDPDrmi:650case X86::VBLENDPDYrmi:651if (MI->getOperand(NumOperands - 1).isImm())652DecodeBLENDMask(getRegOperandNumElts(MI, 64, 0),653MI->getOperand(NumOperands - 1).getImm(),654ShuffleMask);655Src1Name = getRegName(MI->getOperand(1).getReg());656DestName = getRegName(MI->getOperand(0).getReg());657break;658659case X86::BLENDPSrri:660case X86::VBLENDPSrri:661case X86::VBLENDPSYrri:662Src2Name = getRegName(MI->getOperand(2).getReg());663[[fallthrough]];664case X86::BLENDPSrmi:665case X86::VBLENDPSrmi:666case X86::VBLENDPSYrmi:667if (MI->getOperand(NumOperands - 1).isImm())668DecodeBLENDMask(getRegOperandNumElts(MI, 32, 0),669MI->getOperand(NumOperands - 1).getImm(),670ShuffleMask);671Src1Name = getRegName(MI->getOperand(1).getReg());672DestName = getRegName(MI->getOperand(0).getReg());673break;674675case X86::PBLENDWrri:676case X86::VPBLENDWrri:677case X86::VPBLENDWYrri:678Src2Name = getRegName(MI->getOperand(2).getReg());679[[fallthrough]];680case X86::PBLENDWrmi:681case X86::VPBLENDWrmi:682case X86::VPBLENDWYrmi:683if (MI->getOperand(NumOperands - 1).isImm())684DecodeBLENDMask(getRegOperandNumElts(MI, 16, 0),685MI->getOperand(NumOperands - 1).getImm(),686ShuffleMask);687Src1Name = getRegName(MI->getOperand(1).getReg());688DestName = getRegName(MI->getOperand(0).getReg());689break;690691case X86::VPBLENDDrri:692case X86::VPBLENDDYrri:693Src2Name = getRegName(MI->getOperand(2).getReg());694[[fallthrough]];695case X86::VPBLENDDrmi:696case X86::VPBLENDDYrmi:697if (MI->getOperand(NumOperands - 1).isImm())698DecodeBLENDMask(getRegOperandNumElts(MI, 32, 0),699MI->getOperand(NumOperands - 1).getImm(),700ShuffleMask);701Src1Name = getRegName(MI->getOperand(1).getReg());702DestName = getRegName(MI->getOperand(0).getReg());703break;704705case X86::INSERTPSrr:706case X86::VINSERTPSrr:707case X86::VINSERTPSZrr:708Src2Name = getRegName(MI->getOperand(2).getReg());709[[fallthrough]];710case X86::INSERTPSrm:711case X86::VINSERTPSrm:712case X86::VINSERTPSZrm:713DestName = getRegName(MI->getOperand(0).getReg());714Src1Name = getRegName(MI->getOperand(1).getReg());715if (MI->getOperand(NumOperands - 1).isImm())716DecodeINSERTPSMask(MI->getOperand(NumOperands - 1).getImm(),717ShuffleMask);718break;719720case X86::MOVLHPSrr:721case X86::VMOVLHPSrr:722case X86::VMOVLHPSZrr:723Src2Name = getRegName(MI->getOperand(2).getReg());724Src1Name = getRegName(MI->getOperand(1).getReg());725DestName = getRegName(MI->getOperand(0).getReg());726DecodeMOVLHPSMask(2, ShuffleMask);727break;728729case X86::MOVHLPSrr:730case X86::VMOVHLPSrr:731case X86::VMOVHLPSZrr:732Src2Name = getRegName(MI->getOperand(2).getReg());733Src1Name = getRegName(MI->getOperand(1).getReg());734DestName = getRegName(MI->getOperand(0).getReg());735DecodeMOVHLPSMask(2, ShuffleMask);736break;737738case X86::MOVHPDrm:739case X86::VMOVHPDrm:740case X86::VMOVHPDZ128rm:741Src1Name = getRegName(MI->getOperand(1).getReg());742DestName = getRegName(MI->getOperand(0).getReg());743DecodeInsertElementMask(2, 1, 1, ShuffleMask);744break;745746case X86::MOVHPSrm:747case X86::VMOVHPSrm:748case X86::VMOVHPSZ128rm:749Src1Name = getRegName(MI->getOperand(1).getReg());750DestName = getRegName(MI->getOperand(0).getReg());751DecodeInsertElementMask(4, 2, 2, ShuffleMask);752break;753754case X86::MOVLPDrm:755case X86::VMOVLPDrm:756case X86::VMOVLPDZ128rm:757Src1Name = getRegName(MI->getOperand(1).getReg());758DestName = getRegName(MI->getOperand(0).getReg());759DecodeInsertElementMask(2, 0, 1, ShuffleMask);760break;761762case X86::MOVLPSrm:763case X86::VMOVLPSrm:764case X86::VMOVLPSZ128rm:765Src1Name = getRegName(MI->getOperand(1).getReg());766DestName = getRegName(MI->getOperand(0).getReg());767DecodeInsertElementMask(4, 0, 2, ShuffleMask);768break;769770CASE_MOVDUP(MOVSLDUP, r)771Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());772[[fallthrough]];773774CASE_MOVDUP(MOVSLDUP, m)775DestName = getRegName(MI->getOperand(0).getReg());776DecodeMOVSLDUPMask(getRegOperandNumElts(MI, 32, 0), ShuffleMask);777break;778779CASE_MOVDUP(MOVSHDUP, r)780Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());781[[fallthrough]];782783CASE_MOVDUP(MOVSHDUP, m)784DestName = getRegName(MI->getOperand(0).getReg());785DecodeMOVSHDUPMask(getRegOperandNumElts(MI, 32, 0), ShuffleMask);786break;787788CASE_MOVDUP(MOVDDUP, r)789Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());790[[fallthrough]];791792CASE_MOVDUP(MOVDDUP, m)793DestName = getRegName(MI->getOperand(0).getReg());794DecodeMOVDDUPMask(getRegOperandNumElts(MI, 64, 0), ShuffleMask);795break;796797case X86::PSLLDQri:798case X86::VPSLLDQri:799case X86::VPSLLDQYri:800case X86::VPSLLDQZ128ri:801case X86::VPSLLDQZ256ri:802case X86::VPSLLDQZri:803Src1Name = getRegName(MI->getOperand(1).getReg());804[[fallthrough]];805case X86::VPSLLDQZ128mi:806case X86::VPSLLDQZ256mi:807case X86::VPSLLDQZmi:808DestName = getRegName(MI->getOperand(0).getReg());809if (MI->getOperand(NumOperands - 1).isImm())810DecodePSLLDQMask(getRegOperandNumElts(MI, 8, 0),811MI->getOperand(NumOperands - 1).getImm(),812ShuffleMask);813break;814815case X86::PSRLDQri:816case X86::VPSRLDQri:817case X86::VPSRLDQYri:818case X86::VPSRLDQZ128ri:819case X86::VPSRLDQZ256ri:820case X86::VPSRLDQZri:821Src1Name = getRegName(MI->getOperand(1).getReg());822[[fallthrough]];823case X86::VPSRLDQZ128mi:824case X86::VPSRLDQZ256mi:825case X86::VPSRLDQZmi:826DestName = getRegName(MI->getOperand(0).getReg());827if (MI->getOperand(NumOperands - 1).isImm())828DecodePSRLDQMask(getRegOperandNumElts(MI, 8, 0),829MI->getOperand(NumOperands - 1).getImm(),830ShuffleMask);831break;832833CASE_SHUF(PALIGNR, rri)834Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());835RegForm = true;836[[fallthrough]];837838CASE_SHUF(PALIGNR, rmi)839Src2Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());840DestName = getRegName(MI->getOperand(0).getReg());841if (MI->getOperand(NumOperands - 1).isImm())842DecodePALIGNRMask(getRegOperandNumElts(MI, 8, 0),843MI->getOperand(NumOperands - 1).getImm(),844ShuffleMask);845break;846847CASE_AVX512_INS_COMMON(ALIGNQ, Z, rri)848CASE_AVX512_INS_COMMON(ALIGNQ, Z256, rri)849CASE_AVX512_INS_COMMON(ALIGNQ, Z128, rri)850Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());851RegForm = true;852[[fallthrough]];853854CASE_AVX512_INS_COMMON(ALIGNQ, Z, rmi)855CASE_AVX512_INS_COMMON(ALIGNQ, Z256, rmi)856CASE_AVX512_INS_COMMON(ALIGNQ, Z128, rmi)857Src2Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());858DestName = getRegName(MI->getOperand(0).getReg());859if (MI->getOperand(NumOperands - 1).isImm())860DecodeVALIGNMask(getRegOperandNumElts(MI, 64, 0),861MI->getOperand(NumOperands - 1).getImm(),862ShuffleMask);863break;864865CASE_AVX512_INS_COMMON(ALIGND, Z, rri)866CASE_AVX512_INS_COMMON(ALIGND, Z256, rri)867CASE_AVX512_INS_COMMON(ALIGND, Z128, rri)868Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());869RegForm = true;870[[fallthrough]];871872CASE_AVX512_INS_COMMON(ALIGND, Z, rmi)873CASE_AVX512_INS_COMMON(ALIGND, Z256, rmi)874CASE_AVX512_INS_COMMON(ALIGND, Z128, rmi)875Src2Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());876DestName = getRegName(MI->getOperand(0).getReg());877if (MI->getOperand(NumOperands - 1).isImm())878DecodeVALIGNMask(getRegOperandNumElts(MI, 32, 0),879MI->getOperand(NumOperands - 1).getImm(),880ShuffleMask);881break;882883CASE_SHUF(PSHUFD, ri)884Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());885[[fallthrough]];886887CASE_SHUF(PSHUFD, mi)888DestName = getRegName(MI->getOperand(0).getReg());889if (MI->getOperand(NumOperands - 1).isImm())890DecodePSHUFMask(getRegOperandNumElts(MI, 32, 0), 32,891MI->getOperand(NumOperands - 1).getImm(),892ShuffleMask);893break;894895CASE_SHUF(PSHUFHW, ri)896Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());897[[fallthrough]];898899CASE_SHUF(PSHUFHW, mi)900DestName = getRegName(MI->getOperand(0).getReg());901if (MI->getOperand(NumOperands - 1).isImm())902DecodePSHUFHWMask(getRegOperandNumElts(MI, 16, 0),903MI->getOperand(NumOperands - 1).getImm(),904ShuffleMask);905break;906907CASE_SHUF(PSHUFLW, ri)908Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());909[[fallthrough]];910911CASE_SHUF(PSHUFLW, mi)912DestName = getRegName(MI->getOperand(0).getReg());913if (MI->getOperand(NumOperands - 1).isImm())914DecodePSHUFLWMask(getRegOperandNumElts(MI, 16, 0),915MI->getOperand(NumOperands - 1).getImm(),916ShuffleMask);917break;918919case X86::MMX_PSHUFWri:920Src1Name = getRegName(MI->getOperand(1).getReg());921[[fallthrough]];922923case X86::MMX_PSHUFWmi:924DestName = getRegName(MI->getOperand(0).getReg());925if (MI->getOperand(NumOperands - 1).isImm())926DecodePSHUFMask(4, 16, MI->getOperand(NumOperands - 1).getImm(),927ShuffleMask);928break;929930case X86::PSWAPDrr:931Src1Name = getRegName(MI->getOperand(1).getReg());932[[fallthrough]];933934case X86::PSWAPDrm:935DestName = getRegName(MI->getOperand(0).getReg());936DecodePSWAPMask(2, ShuffleMask);937break;938939CASE_UNPCK(PUNPCKHBW, r)940case X86::MMX_PUNPCKHBWrr:941Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());942RegForm = true;943[[fallthrough]];944945CASE_UNPCK(PUNPCKHBW, m)946case X86::MMX_PUNPCKHBWrm:947Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());948DestName = getRegName(MI->getOperand(0).getReg());949DecodeUNPCKHMask(getRegOperandNumElts(MI, 8, 0), 8, ShuffleMask);950break;951952CASE_UNPCK(PUNPCKHWD, r)953case X86::MMX_PUNPCKHWDrr:954Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());955RegForm = true;956[[fallthrough]];957958CASE_UNPCK(PUNPCKHWD, m)959case X86::MMX_PUNPCKHWDrm:960Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());961DestName = getRegName(MI->getOperand(0).getReg());962DecodeUNPCKHMask(getRegOperandNumElts(MI, 16, 0), 16, ShuffleMask);963break;964965CASE_UNPCK(PUNPCKHDQ, r)966case X86::MMX_PUNPCKHDQrr:967Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());968RegForm = true;969[[fallthrough]];970971CASE_UNPCK(PUNPCKHDQ, m)972case X86::MMX_PUNPCKHDQrm:973Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());974DestName = getRegName(MI->getOperand(0).getReg());975DecodeUNPCKHMask(getRegOperandNumElts(MI, 32, 0), 32, ShuffleMask);976break;977978CASE_UNPCK(PUNPCKHQDQ, r)979Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());980RegForm = true;981[[fallthrough]];982983CASE_UNPCK(PUNPCKHQDQ, m)984Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());985DestName = getRegName(MI->getOperand(0).getReg());986DecodeUNPCKHMask(getRegOperandNumElts(MI, 64, 0), 64, ShuffleMask);987break;988989CASE_UNPCK(PUNPCKLBW, r)990case X86::MMX_PUNPCKLBWrr:991Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());992RegForm = true;993[[fallthrough]];994995CASE_UNPCK(PUNPCKLBW, m)996case X86::MMX_PUNPCKLBWrm:997Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());998DestName = getRegName(MI->getOperand(0).getReg());999DecodeUNPCKLMask(getRegOperandNumElts(MI, 8, 0), 8, ShuffleMask);1000break;10011002CASE_UNPCK(PUNPCKLWD, r)1003case X86::MMX_PUNPCKLWDrr:1004Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());1005RegForm = true;1006[[fallthrough]];10071008CASE_UNPCK(PUNPCKLWD, m)1009case X86::MMX_PUNPCKLWDrm:1010Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());1011DestName = getRegName(MI->getOperand(0).getReg());1012DecodeUNPCKLMask(getRegOperandNumElts(MI, 16, 0), 16, ShuffleMask);1013break;10141015CASE_UNPCK(PUNPCKLDQ, r)1016case X86::MMX_PUNPCKLDQrr:1017Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());1018RegForm = true;1019[[fallthrough]];10201021CASE_UNPCK(PUNPCKLDQ, m)1022case X86::MMX_PUNPCKLDQrm:1023Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());1024DestName = getRegName(MI->getOperand(0).getReg());1025DecodeUNPCKLMask(getRegOperandNumElts(MI, 32, 0), 32, ShuffleMask);1026break;10271028CASE_UNPCK(PUNPCKLQDQ, r)1029Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());1030RegForm = true;1031[[fallthrough]];10321033CASE_UNPCK(PUNPCKLQDQ, m)1034Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());1035DestName = getRegName(MI->getOperand(0).getReg());1036DecodeUNPCKLMask(getRegOperandNumElts(MI, 64, 0), 64, ShuffleMask);1037break;10381039CASE_SHUF(SHUFPD, rri)1040Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());1041RegForm = true;1042[[fallthrough]];10431044CASE_SHUF(SHUFPD, rmi)1045if (MI->getOperand(NumOperands - 1).isImm())1046DecodeSHUFPMask(getRegOperandNumElts(MI, 64, 0), 64,1047MI->getOperand(NumOperands - 1).getImm(), ShuffleMask);1048Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());1049DestName = getRegName(MI->getOperand(0).getReg());1050break;10511052CASE_SHUF(SHUFPS, rri)1053Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());1054RegForm = true;1055[[fallthrough]];10561057CASE_SHUF(SHUFPS, rmi)1058if (MI->getOperand(NumOperands - 1).isImm())1059DecodeSHUFPMask(getRegOperandNumElts(MI, 32, 0), 32,1060MI->getOperand(NumOperands - 1).getImm(),1061ShuffleMask);1062Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());1063DestName = getRegName(MI->getOperand(0).getReg());1064break;10651066CASE_VSHUF(64X2, r)1067Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());1068RegForm = true;1069[[fallthrough]];10701071CASE_VSHUF(64X2, m)1072decodeVSHUF64x2FamilyMask(getRegOperandNumElts(MI, 64, 0), 64,1073MI->getOperand(NumOperands - 1).getImm(),1074ShuffleMask);1075Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());1076DestName = getRegName(MI->getOperand(0).getReg());1077break;10781079CASE_VSHUF(32X4, r)1080Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());1081RegForm = true;1082[[fallthrough]];10831084CASE_VSHUF(32X4, m)1085decodeVSHUF64x2FamilyMask(getRegOperandNumElts(MI, 32, 0), 32,1086MI->getOperand(NumOperands - 1).getImm(),1087ShuffleMask);1088Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());1089DestName = getRegName(MI->getOperand(0).getReg());1090break;10911092CASE_UNPCK(UNPCKLPD, r)1093Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());1094RegForm = true;1095[[fallthrough]];10961097CASE_UNPCK(UNPCKLPD, m)1098DecodeUNPCKLMask(getRegOperandNumElts(MI, 64, 0), 64, ShuffleMask);1099Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());1100DestName = getRegName(MI->getOperand(0).getReg());1101break;11021103CASE_UNPCK(UNPCKLPS, r)1104Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());1105RegForm = true;1106[[fallthrough]];11071108CASE_UNPCK(UNPCKLPS, m)1109DecodeUNPCKLMask(getRegOperandNumElts(MI, 32, 0), 32, ShuffleMask);1110Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());1111DestName = getRegName(MI->getOperand(0).getReg());1112break;11131114CASE_UNPCK(UNPCKHPD, r)1115Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());1116RegForm = true;1117[[fallthrough]];11181119CASE_UNPCK(UNPCKHPD, m)1120DecodeUNPCKHMask(getRegOperandNumElts(MI, 64, 0), 64, ShuffleMask);1121Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());1122DestName = getRegName(MI->getOperand(0).getReg());1123break;11241125CASE_UNPCK(UNPCKHPS, r)1126Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());1127RegForm = true;1128[[fallthrough]];11291130CASE_UNPCK(UNPCKHPS, m)1131DecodeUNPCKHMask(getRegOperandNumElts(MI, 32, 0), 32, ShuffleMask);1132Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());1133DestName = getRegName(MI->getOperand(0).getReg());1134break;11351136CASE_VPERMILPI(PERMILPS, r)1137Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());1138[[fallthrough]];11391140CASE_VPERMILPI(PERMILPS, m)1141if (MI->getOperand(NumOperands - 1).isImm())1142DecodePSHUFMask(getRegOperandNumElts(MI, 32, 0), 32,1143MI->getOperand(NumOperands - 1).getImm(),1144ShuffleMask);1145DestName = getRegName(MI->getOperand(0).getReg());1146break;11471148CASE_VPERMILPI(PERMILPD, r)1149Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());1150[[fallthrough]];11511152CASE_VPERMILPI(PERMILPD, m)1153if (MI->getOperand(NumOperands - 1).isImm())1154DecodePSHUFMask(getRegOperandNumElts(MI, 64, 0), 64,1155MI->getOperand(NumOperands - 1).getImm(),1156ShuffleMask);1157DestName = getRegName(MI->getOperand(0).getReg());1158break;11591160case X86::VPERM2F128rr:1161case X86::VPERM2I128rr:1162Src2Name = getRegName(MI->getOperand(2).getReg());1163[[fallthrough]];11641165case X86::VPERM2F128rm:1166case X86::VPERM2I128rm:1167// For instruction comments purpose, assume the 256-bit vector is v4i64.1168if (MI->getOperand(NumOperands - 1).isImm())1169DecodeVPERM2X128Mask(4, MI->getOperand(NumOperands - 1).getImm(),1170ShuffleMask);1171Src1Name = getRegName(MI->getOperand(1).getReg());1172DestName = getRegName(MI->getOperand(0).getReg());1173break;11741175CASE_VPERM(PERMPD, r)1176Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());1177[[fallthrough]];11781179CASE_VPERM(PERMPD, m)1180if (MI->getOperand(NumOperands - 1).isImm())1181DecodeVPERMMask(getRegOperandNumElts(MI, 64, 0),1182MI->getOperand(NumOperands - 1).getImm(),1183ShuffleMask);1184DestName = getRegName(MI->getOperand(0).getReg());1185break;11861187CASE_VPERM(PERMQ, r)1188Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());1189[[fallthrough]];11901191CASE_VPERM(PERMQ, m)1192if (MI->getOperand(NumOperands - 1).isImm())1193DecodeVPERMMask(getRegOperandNumElts(MI, 64, 0),1194MI->getOperand(NumOperands - 1).getImm(),1195ShuffleMask);1196DestName = getRegName(MI->getOperand(0).getReg());1197break;11981199case X86::MOVSDrr:1200case X86::VMOVSDrr:1201case X86::VMOVSDZrr:1202Src2Name = getRegName(MI->getOperand(2).getReg());1203Src1Name = getRegName(MI->getOperand(1).getReg());1204DecodeScalarMoveMask(2, false, ShuffleMask);1205DestName = getRegName(MI->getOperand(0).getReg());1206break;12071208case X86::MOVSSrr:1209case X86::VMOVSSrr:1210case X86::VMOVSSZrr:1211Src2Name = getRegName(MI->getOperand(2).getReg());1212Src1Name = getRegName(MI->getOperand(1).getReg());1213DecodeScalarMoveMask(4, false, ShuffleMask);1214DestName = getRegName(MI->getOperand(0).getReg());1215break;12161217case X86::MOVPQI2QIrr:1218case X86::MOVZPQILo2PQIrr:1219case X86::VMOVPQI2QIrr:1220case X86::VMOVPQI2QIZrr:1221case X86::VMOVZPQILo2PQIrr:1222case X86::VMOVZPQILo2PQIZrr:1223Src1Name = getRegName(MI->getOperand(1).getReg());1224DecodeZeroMoveLowMask(2, ShuffleMask);1225DestName = getRegName(MI->getOperand(0).getReg());1226break;12271228case X86::EXTRQI:1229if (MI->getOperand(2).isImm() &&1230MI->getOperand(3).isImm())1231DecodeEXTRQIMask(16, 8, MI->getOperand(2).getImm(),1232MI->getOperand(3).getImm(), ShuffleMask);12331234DestName = getRegName(MI->getOperand(0).getReg());1235Src1Name = getRegName(MI->getOperand(1).getReg());1236break;12371238case X86::INSERTQI:1239if (MI->getOperand(3).isImm() &&1240MI->getOperand(4).isImm())1241DecodeINSERTQIMask(16, 8, MI->getOperand(3).getImm(),1242MI->getOperand(4).getImm(), ShuffleMask);12431244DestName = getRegName(MI->getOperand(0).getReg());1245Src1Name = getRegName(MI->getOperand(1).getReg());1246Src2Name = getRegName(MI->getOperand(2).getReg());1247break;12481249case X86::VBROADCASTF128rm:1250case X86::VBROADCASTI128rm:1251CASE_AVX512_INS_COMMON(BROADCASTF64X2, Z128, rm)1252CASE_AVX512_INS_COMMON(BROADCASTI64X2, Z128, rm)1253DecodeSubVectorBroadcast(4, 2, ShuffleMask);1254DestName = getRegName(MI->getOperand(0).getReg());1255break;1256CASE_AVX512_INS_COMMON(BROADCASTF64X2, , rm)1257CASE_AVX512_INS_COMMON(BROADCASTI64X2, , rm)1258DecodeSubVectorBroadcast(8, 2, ShuffleMask);1259DestName = getRegName(MI->getOperand(0).getReg());1260break;1261CASE_AVX512_INS_COMMON(BROADCASTF64X4, , rm)1262CASE_AVX512_INS_COMMON(BROADCASTI64X4, , rm)1263DecodeSubVectorBroadcast(8, 4, ShuffleMask);1264DestName = getRegName(MI->getOperand(0).getReg());1265break;1266CASE_AVX512_INS_COMMON(BROADCASTF32X4, Z256, rm)1267CASE_AVX512_INS_COMMON(BROADCASTI32X4, Z256, rm)1268DecodeSubVectorBroadcast(8, 4, ShuffleMask);1269DestName = getRegName(MI->getOperand(0).getReg());1270break;1271CASE_AVX512_INS_COMMON(BROADCASTF32X4, , rm)1272CASE_AVX512_INS_COMMON(BROADCASTI32X4, , rm)1273DecodeSubVectorBroadcast(16, 4, ShuffleMask);1274DestName = getRegName(MI->getOperand(0).getReg());1275break;1276CASE_AVX512_INS_COMMON(BROADCASTF32X8, , rm)1277CASE_AVX512_INS_COMMON(BROADCASTI32X8, , rm)1278DecodeSubVectorBroadcast(16, 8, ShuffleMask);1279DestName = getRegName(MI->getOperand(0).getReg());1280break;1281CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z128, rr)1282Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());1283[[fallthrough]];1284CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z128, rm)1285DecodeSubVectorBroadcast(4, 2, ShuffleMask);1286DestName = getRegName(MI->getOperand(0).getReg());1287break;1288CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z256, rr)1289CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z256, rr)1290Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());1291[[fallthrough]];1292CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z256, rm)1293CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z256, rm)1294DecodeSubVectorBroadcast(8, 2, ShuffleMask);1295DestName = getRegName(MI->getOperand(0).getReg());1296break;1297CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z, rr)1298CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z, rr)1299Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());1300[[fallthrough]];1301CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z, rm)1302CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z, rm)1303DecodeSubVectorBroadcast(16, 2, ShuffleMask);1304DestName = getRegName(MI->getOperand(0).getReg());1305break;13061307CASE_PMOVZX(PMOVZXBW, r)1308Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());1309DecodeZeroExtendMask(8, 16, getRegOperandNumElts(MI, 16, 0), false,1310ShuffleMask);1311DestName = getRegName(MI->getOperand(0).getReg());1312break;13131314CASE_PMOVZX(PMOVZXBD, r)1315Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());1316DecodeZeroExtendMask(8, 32, getRegOperandNumElts(MI, 32, 0), false,1317ShuffleMask);1318DestName = getRegName(MI->getOperand(0).getReg());1319break;13201321CASE_PMOVZX(PMOVZXBQ, r)1322Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());1323DecodeZeroExtendMask(8, 64, getRegOperandNumElts(MI, 64, 0), false,1324ShuffleMask);1325DestName = getRegName(MI->getOperand(0).getReg());1326break;13271328CASE_PMOVZX(PMOVZXWD, r)1329Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());1330DecodeZeroExtendMask(16, 32, getRegOperandNumElts(MI, 32, 0), false,1331ShuffleMask);1332DestName = getRegName(MI->getOperand(0).getReg());1333break;13341335CASE_PMOVZX(PMOVZXWQ, r)1336Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());1337DecodeZeroExtendMask(16, 64, getRegOperandNumElts(MI, 64, 0), false,1338ShuffleMask);1339DestName = getRegName(MI->getOperand(0).getReg());1340break;13411342CASE_PMOVZX(PMOVZXDQ, r)1343Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());1344DecodeZeroExtendMask(32, 64, getRegOperandNumElts(MI, 64, 0), false,1345ShuffleMask);1346DestName = getRegName(MI->getOperand(0).getReg());1347break;1348}13491350// The only comments we decode are shuffles, so give up if we were unable to1351// decode a shuffle mask.1352if (ShuffleMask.empty())1353return false;13541355if (!DestName) DestName = Src1Name;1356if (DestName) {1357OS << DestName;1358printMasking(OS, MI, MCII);1359} else1360OS << "mem";13611362OS << " = ";13631364// If the two sources are the same, canonicalize the input elements to be1365// from the first src so that we get larger element spans.1366if (Src1Name == Src2Name) {1367for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {1368if ((int)ShuffleMask[i] >= 0 && // Not sentinel.1369ShuffleMask[i] >= (int)e) // From second mask.1370ShuffleMask[i] -= e;1371}1372}13731374// The shuffle mask specifies which elements of the src1/src2 fill in the1375// destination, with a few sentinel values. Loop through and print them1376// out.1377for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {1378if (i != 0)1379OS << ',';1380if (ShuffleMask[i] == SM_SentinelZero) {1381OS << "zero";1382continue;1383}13841385// Otherwise, it must come from src1 or src2. Print the span of elements1386// that comes from this src.1387bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();1388const char *SrcName = isSrc1 ? Src1Name : Src2Name;1389OS << (SrcName ? SrcName : "mem") << '[';1390bool IsFirst = true;1391while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&1392(ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {1393if (!IsFirst)1394OS << ',';1395else1396IsFirst = false;1397if (ShuffleMask[i] == SM_SentinelUndef)1398OS << "u";1399else1400OS << ShuffleMask[i] % ShuffleMask.size();1401++i;1402}1403OS << ']';1404--i; // For loop increments element #.1405}1406OS << '\n';14071408// We successfully added a comment to this instruction.1409return true;1410}141114121413