10b57cec5SDimitry Andric //===-- X86InstComments.cpp - Generate verbose-asm comments for instrs ----===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This defines functionality used to emit comments about X86 instructions to
100b57cec5SDimitry Andric // an output stream for -fverbose-asm.
110b57cec5SDimitry Andric //
120b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
130b57cec5SDimitry Andric
140b57cec5SDimitry Andric #include "X86InstComments.h"
150b57cec5SDimitry Andric #include "X86ATTInstPrinter.h"
160b57cec5SDimitry Andric #include "X86BaseInfo.h"
170b57cec5SDimitry Andric #include "X86MCTargetDesc.h"
185ffd83dbSDimitry Andric #include "X86ShuffleDecode.h"
190b57cec5SDimitry Andric #include "llvm/MC/MCInst.h"
200b57cec5SDimitry Andric #include "llvm/MC/MCInstrInfo.h"
210b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h"
220b57cec5SDimitry Andric
230b57cec5SDimitry Andric using namespace llvm;
240b57cec5SDimitry Andric
250b57cec5SDimitry Andric #define CASE_SSE_INS_COMMON(Inst, src) \
260b57cec5SDimitry Andric case X86::Inst##src:
270b57cec5SDimitry Andric
280b57cec5SDimitry Andric #define CASE_AVX_INS_COMMON(Inst, Suffix, src) \
290b57cec5SDimitry Andric case X86::V##Inst##Suffix##src:
300b57cec5SDimitry Andric
310b57cec5SDimitry Andric #define CASE_MASK_INS_COMMON(Inst, Suffix, src) \
320b57cec5SDimitry Andric case X86::V##Inst##Suffix##src##k:
330b57cec5SDimitry Andric
340b57cec5SDimitry Andric #define CASE_MASKZ_INS_COMMON(Inst, Suffix, src) \
350b57cec5SDimitry Andric case X86::V##Inst##Suffix##src##kz:
360b57cec5SDimitry Andric
370b57cec5SDimitry Andric #define CASE_AVX512_INS_COMMON(Inst, Suffix, src) \
380b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst, Suffix, src) \
390b57cec5SDimitry Andric CASE_MASK_INS_COMMON(Inst, Suffix, src) \
400b57cec5SDimitry Andric CASE_MASKZ_INS_COMMON(Inst, Suffix, src)
410b57cec5SDimitry Andric
420b57cec5SDimitry Andric #define CASE_MOVDUP(Inst, src) \
430b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(Inst, Z, r##src) \
440b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \
450b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \
460b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst, , r##src) \
470b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst, Y, r##src) \
480b57cec5SDimitry Andric CASE_SSE_INS_COMMON(Inst, r##src)
490b57cec5SDimitry Andric
500b57cec5SDimitry Andric #define CASE_MASK_MOVDUP(Inst, src) \
510b57cec5SDimitry Andric CASE_MASK_INS_COMMON(Inst, Z, r##src) \
520b57cec5SDimitry Andric CASE_MASK_INS_COMMON(Inst, Z256, r##src) \
530b57cec5SDimitry Andric CASE_MASK_INS_COMMON(Inst, Z128, r##src)
540b57cec5SDimitry Andric
550b57cec5SDimitry Andric #define CASE_MASKZ_MOVDUP(Inst, src) \
560b57cec5SDimitry Andric CASE_MASKZ_INS_COMMON(Inst, Z, r##src) \
570b57cec5SDimitry Andric CASE_MASKZ_INS_COMMON(Inst, Z256, r##src) \
580b57cec5SDimitry Andric CASE_MASKZ_INS_COMMON(Inst, Z128, r##src)
590b57cec5SDimitry Andric
600b57cec5SDimitry Andric #define CASE_PMOVZX(Inst, src) \
610b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(Inst, Z, r##src) \
620b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \
630b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \
640b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst, , r##src) \
650b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst, Y, r##src) \
660b57cec5SDimitry Andric CASE_SSE_INS_COMMON(Inst, r##src)
670b57cec5SDimitry Andric
680b57cec5SDimitry Andric #define CASE_UNPCK(Inst, src) \
690b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(Inst, Z, r##src) \
700b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \
710b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \
720b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst, , r##src) \
730b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst, Y, r##src) \
740b57cec5SDimitry Andric CASE_SSE_INS_COMMON(Inst, r##src)
750b57cec5SDimitry Andric
760b57cec5SDimitry Andric #define CASE_MASK_UNPCK(Inst, src) \
770b57cec5SDimitry Andric CASE_MASK_INS_COMMON(Inst, Z, r##src) \
780b57cec5SDimitry Andric CASE_MASK_INS_COMMON(Inst, Z256, r##src) \
790b57cec5SDimitry Andric CASE_MASK_INS_COMMON(Inst, Z128, r##src)
800b57cec5SDimitry Andric
810b57cec5SDimitry Andric #define CASE_MASKZ_UNPCK(Inst, src) \
820b57cec5SDimitry Andric CASE_MASKZ_INS_COMMON(Inst, Z, r##src) \
830b57cec5SDimitry Andric CASE_MASKZ_INS_COMMON(Inst, Z256, r##src) \
840b57cec5SDimitry Andric CASE_MASKZ_INS_COMMON(Inst, Z128, r##src)
850b57cec5SDimitry Andric
860b57cec5SDimitry Andric #define CASE_SHUF(Inst, suf) \
870b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(Inst, Z, suf) \
880b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(Inst, Z256, suf) \
890b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(Inst, Z128, suf) \
900b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst, , suf) \
910b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst, Y, suf) \
920b57cec5SDimitry Andric CASE_SSE_INS_COMMON(Inst, suf)
930b57cec5SDimitry Andric
940b57cec5SDimitry Andric #define CASE_MASK_SHUF(Inst, src) \
950b57cec5SDimitry Andric CASE_MASK_INS_COMMON(Inst, Z, r##src##i) \
960b57cec5SDimitry Andric CASE_MASK_INS_COMMON(Inst, Z256, r##src##i) \
970b57cec5SDimitry Andric CASE_MASK_INS_COMMON(Inst, Z128, r##src##i)
980b57cec5SDimitry Andric
990b57cec5SDimitry Andric #define CASE_MASKZ_SHUF(Inst, src) \
1000b57cec5SDimitry Andric CASE_MASKZ_INS_COMMON(Inst, Z, r##src##i) \
1010b57cec5SDimitry Andric CASE_MASKZ_INS_COMMON(Inst, Z256, r##src##i) \
1020b57cec5SDimitry Andric CASE_MASKZ_INS_COMMON(Inst, Z128, r##src##i)
1030b57cec5SDimitry Andric
1040b57cec5SDimitry Andric #define CASE_VPERMILPI(Inst, src) \
1050b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(Inst, Z, src##i) \
1060b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(Inst, Z256, src##i) \
1070b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(Inst, Z128, src##i) \
1080b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst, , src##i) \
1090b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst, Y, src##i)
1100b57cec5SDimitry Andric
1110b57cec5SDimitry Andric #define CASE_MASK_VPERMILPI(Inst, src) \
1120b57cec5SDimitry Andric CASE_MASK_INS_COMMON(Inst, Z, src##i) \
1130b57cec5SDimitry Andric CASE_MASK_INS_COMMON(Inst, Z256, src##i) \
1140b57cec5SDimitry Andric CASE_MASK_INS_COMMON(Inst, Z128, src##i)
1150b57cec5SDimitry Andric
1160b57cec5SDimitry Andric #define CASE_MASKZ_VPERMILPI(Inst, src) \
1170b57cec5SDimitry Andric CASE_MASKZ_INS_COMMON(Inst, Z, src##i) \
1180b57cec5SDimitry Andric CASE_MASKZ_INS_COMMON(Inst, Z256, src##i) \
1190b57cec5SDimitry Andric CASE_MASKZ_INS_COMMON(Inst, Z128, src##i)
1200b57cec5SDimitry Andric
1210b57cec5SDimitry Andric #define CASE_VPERM(Inst, src) \
1220b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(Inst, Z, src##i) \
1230b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(Inst, Z256, src##i) \
1240b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst, Y, src##i)
1250b57cec5SDimitry Andric
1260b57cec5SDimitry Andric #define CASE_MASK_VPERM(Inst, src) \
1270b57cec5SDimitry Andric CASE_MASK_INS_COMMON(Inst, Z, src##i) \
1280b57cec5SDimitry Andric CASE_MASK_INS_COMMON(Inst, Z256, src##i)
1290b57cec5SDimitry Andric
1300b57cec5SDimitry Andric #define CASE_MASKZ_VPERM(Inst, src) \
1310b57cec5SDimitry Andric CASE_MASKZ_INS_COMMON(Inst, Z, src##i) \
1320b57cec5SDimitry Andric CASE_MASKZ_INS_COMMON(Inst, Z256, src##i)
1330b57cec5SDimitry Andric
1340b57cec5SDimitry Andric #define CASE_VSHUF(Inst, src) \
1350b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
1360b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
1370b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
1380b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
1390b57cec5SDimitry Andric
1400b57cec5SDimitry Andric #define CASE_MASK_VSHUF(Inst, src) \
1410b57cec5SDimitry Andric CASE_MASK_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
1420b57cec5SDimitry Andric CASE_MASK_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
1430b57cec5SDimitry Andric CASE_MASK_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
1440b57cec5SDimitry Andric CASE_MASK_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
1450b57cec5SDimitry Andric
1460b57cec5SDimitry Andric #define CASE_MASKZ_VSHUF(Inst, src) \
1470b57cec5SDimitry Andric CASE_MASKZ_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
1480b57cec5SDimitry Andric CASE_MASKZ_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
1490b57cec5SDimitry Andric CASE_MASKZ_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
1500b57cec5SDimitry Andric CASE_MASKZ_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
1510b57cec5SDimitry Andric
1520b57cec5SDimitry Andric #define CASE_AVX512_FMA(Inst, suf) \
1530b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(Inst, Z, suf) \
1540b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(Inst, Z256, suf) \
1550b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(Inst, Z128, suf)
1560b57cec5SDimitry Andric
1570b57cec5SDimitry Andric #define CASE_FMA(Inst, suf) \
1580b57cec5SDimitry Andric CASE_AVX512_FMA(Inst, suf) \
1590b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst, , suf) \
1600b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst, Y, suf)
1610b57cec5SDimitry Andric
1620b57cec5SDimitry Andric #define CASE_FMA_PACKED_REG(Inst) \
1630b57cec5SDimitry Andric CASE_FMA(Inst##PD, r) \
1640b57cec5SDimitry Andric CASE_FMA(Inst##PS, r)
1650b57cec5SDimitry Andric
1660b57cec5SDimitry Andric #define CASE_FMA_PACKED_MEM(Inst) \
1670b57cec5SDimitry Andric CASE_FMA(Inst##PD, m) \
1680b57cec5SDimitry Andric CASE_FMA(Inst##PS, m) \
1690b57cec5SDimitry Andric CASE_AVX512_FMA(Inst##PD, mb) \
1700b57cec5SDimitry Andric CASE_AVX512_FMA(Inst##PS, mb)
1710b57cec5SDimitry Andric
1720b57cec5SDimitry Andric #define CASE_FMA_SCALAR_REG(Inst) \
1730b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst##SD, , r) \
1740b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst##SS, , r) \
1750b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst##SD, , r_Int) \
1760b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst##SS, , r_Int) \
1770b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst##SD, Z, r) \
1780b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst##SS, Z, r) \
1790b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(Inst##SD, Z, r_Int) \
1800b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(Inst##SS, Z, r_Int)
1810b57cec5SDimitry Andric
1820b57cec5SDimitry Andric #define CASE_FMA_SCALAR_MEM(Inst) \
1830b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst##SD, , m) \
1840b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst##SS, , m) \
1850b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst##SD, , m_Int) \
1860b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst##SS, , m_Int) \
1870b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst##SD, Z, m) \
1880b57cec5SDimitry Andric CASE_AVX_INS_COMMON(Inst##SS, Z, m) \
1890b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(Inst##SD, Z, m_Int) \
1900b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(Inst##SS, Z, m_Int)
1910b57cec5SDimitry Andric
1925ffd83dbSDimitry Andric #define CASE_FMA4(Inst, suf) \
1935ffd83dbSDimitry Andric CASE_AVX_INS_COMMON(Inst, 4, suf) \
1945ffd83dbSDimitry Andric CASE_AVX_INS_COMMON(Inst, 4Y, suf)
1955ffd83dbSDimitry Andric
1965ffd83dbSDimitry Andric #define CASE_FMA4_PACKED_RR(Inst) \
1975ffd83dbSDimitry Andric CASE_FMA4(Inst##PD, rr) \
1985ffd83dbSDimitry Andric CASE_FMA4(Inst##PS, rr)
1995ffd83dbSDimitry Andric
2005ffd83dbSDimitry Andric #define CASE_FMA4_PACKED_RM(Inst) \
2015ffd83dbSDimitry Andric CASE_FMA4(Inst##PD, rm) \
2025ffd83dbSDimitry Andric CASE_FMA4(Inst##PS, rm)
2035ffd83dbSDimitry Andric
2045ffd83dbSDimitry Andric #define CASE_FMA4_PACKED_MR(Inst) \
2055ffd83dbSDimitry Andric CASE_FMA4(Inst##PD, mr) \
2065ffd83dbSDimitry Andric CASE_FMA4(Inst##PS, mr)
2075ffd83dbSDimitry Andric
2085ffd83dbSDimitry Andric #define CASE_FMA4_SCALAR_RR(Inst) \
2095ffd83dbSDimitry Andric CASE_AVX_INS_COMMON(Inst##SD4, , rr) \
2105ffd83dbSDimitry Andric CASE_AVX_INS_COMMON(Inst##SS4, , rr) \
2115ffd83dbSDimitry Andric CASE_AVX_INS_COMMON(Inst##SD4, , rr_Int) \
2125ffd83dbSDimitry Andric CASE_AVX_INS_COMMON(Inst##SS4, , rr_Int)
2135ffd83dbSDimitry Andric
2145ffd83dbSDimitry Andric #define CASE_FMA4_SCALAR_RM(Inst) \
2155ffd83dbSDimitry Andric CASE_AVX_INS_COMMON(Inst##SD4, , rm) \
2165ffd83dbSDimitry Andric CASE_AVX_INS_COMMON(Inst##SS4, , rm) \
2175ffd83dbSDimitry Andric CASE_AVX_INS_COMMON(Inst##SD4, , rm_Int) \
2185ffd83dbSDimitry Andric CASE_AVX_INS_COMMON(Inst##SS4, , rm_Int)
2195ffd83dbSDimitry Andric
2205ffd83dbSDimitry Andric #define CASE_FMA4_SCALAR_MR(Inst) \
2215ffd83dbSDimitry Andric CASE_AVX_INS_COMMON(Inst##SD4, , mr) \
2225ffd83dbSDimitry Andric CASE_AVX_INS_COMMON(Inst##SS4, , mr) \
2235ffd83dbSDimitry Andric CASE_AVX_INS_COMMON(Inst##SD4, , mr_Int) \
2245ffd83dbSDimitry Andric CASE_AVX_INS_COMMON(Inst##SS4, , mr_Int)
2255ffd83dbSDimitry Andric
getVectorRegSize(unsigned RegNo)2260b57cec5SDimitry Andric static unsigned getVectorRegSize(unsigned RegNo) {
2275f757f3fSDimitry Andric if (X86II::isZMMReg(RegNo))
2280b57cec5SDimitry Andric return 512;
2295f757f3fSDimitry Andric if (X86II::isYMMReg(RegNo))
2300b57cec5SDimitry Andric return 256;
2315f757f3fSDimitry Andric if (X86II::isXMMReg(RegNo))
2320b57cec5SDimitry Andric return 128;
2330b57cec5SDimitry Andric if (X86::MM0 <= RegNo && RegNo <= X86::MM7)
2340b57cec5SDimitry Andric return 64;
2350b57cec5SDimitry Andric
2360b57cec5SDimitry Andric llvm_unreachable("Unknown vector reg!");
2370b57cec5SDimitry Andric }
2380b57cec5SDimitry Andric
getRegOperandNumElts(const MCInst * MI,unsigned ScalarSize,unsigned OperandIndex)2390b57cec5SDimitry Andric static unsigned getRegOperandNumElts(const MCInst *MI, unsigned ScalarSize,
2400b57cec5SDimitry Andric unsigned OperandIndex) {
2410b57cec5SDimitry Andric unsigned OpReg = MI->getOperand(OperandIndex).getReg();
2420b57cec5SDimitry Andric return getVectorRegSize(OpReg) / ScalarSize;
2430b57cec5SDimitry Andric }
2440b57cec5SDimitry Andric
getRegName(MCRegister Reg)245bdd1243dSDimitry Andric static const char *getRegName(MCRegister Reg) {
2460b57cec5SDimitry Andric return X86ATTInstPrinter::getRegisterName(Reg);
2470b57cec5SDimitry Andric }
2480b57cec5SDimitry Andric
2490b57cec5SDimitry Andric /// Wraps the destination register name with AVX512 mask/maskz filtering.
printMasking(raw_ostream & OS,const MCInst * MI,const MCInstrInfo & MCII)2500b57cec5SDimitry Andric static void printMasking(raw_ostream &OS, const MCInst *MI,
2510b57cec5SDimitry Andric const MCInstrInfo &MCII) {
2520b57cec5SDimitry Andric const MCInstrDesc &Desc = MCII.get(MI->getOpcode());
2530b57cec5SDimitry Andric uint64_t TSFlags = Desc.TSFlags;
2540b57cec5SDimitry Andric
2550b57cec5SDimitry Andric if (!(TSFlags & X86II::EVEX_K))
2560b57cec5SDimitry Andric return;
2570b57cec5SDimitry Andric
2580b57cec5SDimitry Andric bool MaskWithZero = (TSFlags & X86II::EVEX_Z);
2590b57cec5SDimitry Andric unsigned MaskOp = Desc.getNumDefs();
2600b57cec5SDimitry Andric
2610b57cec5SDimitry Andric if (Desc.getOperandConstraint(MaskOp, MCOI::TIED_TO) != -1)
2620b57cec5SDimitry Andric ++MaskOp;
2630b57cec5SDimitry Andric
2640b57cec5SDimitry Andric const char *MaskRegName = getRegName(MI->getOperand(MaskOp).getReg());
2650b57cec5SDimitry Andric
2660b57cec5SDimitry Andric // MASK: zmmX {%kY}
2670b57cec5SDimitry Andric OS << " {%" << MaskRegName << "}";
2680b57cec5SDimitry Andric
2690b57cec5SDimitry Andric // MASKZ: zmmX {%kY} {z}
2700b57cec5SDimitry Andric if (MaskWithZero)
2710b57cec5SDimitry Andric OS << " {z}";
2720b57cec5SDimitry Andric }
2730b57cec5SDimitry Andric
printFMAComments(const MCInst * MI,raw_ostream & OS,const MCInstrInfo & MCII)2745ffd83dbSDimitry Andric static bool printFMAComments(const MCInst *MI, raw_ostream &OS,
2755ffd83dbSDimitry Andric const MCInstrInfo &MCII) {
2760b57cec5SDimitry Andric const char *Mul1Name = nullptr, *Mul2Name = nullptr, *AccName = nullptr;
2770b57cec5SDimitry Andric unsigned NumOperands = MI->getNumOperands();
2780b57cec5SDimitry Andric bool RegForm = false;
2790b57cec5SDimitry Andric bool Negate = false;
2800b57cec5SDimitry Andric StringRef AccStr = "+";
2810b57cec5SDimitry Andric
2825ffd83dbSDimitry Andric // The operands for FMA3 instructions without rounding fall into two forms:
2830b57cec5SDimitry Andric // dest, src1, src2, src3
2840b57cec5SDimitry Andric // dest, src1, mask, src2, src3
2850b57cec5SDimitry Andric // Where src3 is either a register or 5 memory address operands. So to find
2860b57cec5SDimitry Andric // dest and src1 we can index from the front. To find src2 and src3 we can
2870b57cec5SDimitry Andric // index from the end by taking into account memory vs register form when
2880b57cec5SDimitry Andric // finding src2.
2890b57cec5SDimitry Andric
2905ffd83dbSDimitry Andric // The operands for FMA4 instructions:
2915ffd83dbSDimitry Andric // dest, src1, src2, src3
2925ffd83dbSDimitry Andric // Where src2 OR src3 are either a register or 5 memory address operands. So
2935ffd83dbSDimitry Andric // to find dest and src1 we can index from the front, src2 (reg/mem) follows
2945ffd83dbSDimitry Andric // and then src3 (reg) will be at the end.
2955ffd83dbSDimitry Andric
2960b57cec5SDimitry Andric switch (MI->getOpcode()) {
2970b57cec5SDimitry Andric default:
2980b57cec5SDimitry Andric return false;
2995ffd83dbSDimitry Andric
3005ffd83dbSDimitry Andric CASE_FMA4_PACKED_RR(FMADD)
3015ffd83dbSDimitry Andric CASE_FMA4_SCALAR_RR(FMADD)
3025ffd83dbSDimitry Andric AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
303bdd1243dSDimitry Andric [[fallthrough]];
3045ffd83dbSDimitry Andric CASE_FMA4_PACKED_RM(FMADD)
3055ffd83dbSDimitry Andric CASE_FMA4_SCALAR_RM(FMADD)
3065ffd83dbSDimitry Andric Mul2Name = getRegName(MI->getOperand(2).getReg());
3075ffd83dbSDimitry Andric Mul1Name = getRegName(MI->getOperand(1).getReg());
3085ffd83dbSDimitry Andric break;
3095ffd83dbSDimitry Andric CASE_FMA4_PACKED_MR(FMADD)
3105ffd83dbSDimitry Andric CASE_FMA4_SCALAR_MR(FMADD)
3115ffd83dbSDimitry Andric AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
3125ffd83dbSDimitry Andric Mul1Name = getRegName(MI->getOperand(1).getReg());
3135ffd83dbSDimitry Andric break;
3145ffd83dbSDimitry Andric
3155ffd83dbSDimitry Andric CASE_FMA4_PACKED_RR(FMSUB)
3165ffd83dbSDimitry Andric CASE_FMA4_SCALAR_RR(FMSUB)
3175ffd83dbSDimitry Andric AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
318bdd1243dSDimitry Andric [[fallthrough]];
3195ffd83dbSDimitry Andric CASE_FMA4_PACKED_RM(FMSUB)
3205ffd83dbSDimitry Andric CASE_FMA4_SCALAR_RM(FMSUB)
3215ffd83dbSDimitry Andric Mul2Name = getRegName(MI->getOperand(2).getReg());
3225ffd83dbSDimitry Andric Mul1Name = getRegName(MI->getOperand(1).getReg());
3235ffd83dbSDimitry Andric AccStr = "-";
3245ffd83dbSDimitry Andric break;
3255ffd83dbSDimitry Andric CASE_FMA4_PACKED_MR(FMSUB)
3265ffd83dbSDimitry Andric CASE_FMA4_SCALAR_MR(FMSUB)
3275ffd83dbSDimitry Andric AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
3285ffd83dbSDimitry Andric Mul1Name = getRegName(MI->getOperand(1).getReg());
3295ffd83dbSDimitry Andric AccStr = "-";
3305ffd83dbSDimitry Andric break;
3315ffd83dbSDimitry Andric
3325ffd83dbSDimitry Andric CASE_FMA4_PACKED_RR(FNMADD)
3335ffd83dbSDimitry Andric CASE_FMA4_SCALAR_RR(FNMADD)
3345ffd83dbSDimitry Andric AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
335bdd1243dSDimitry Andric [[fallthrough]];
3365ffd83dbSDimitry Andric CASE_FMA4_PACKED_RM(FNMADD)
3375ffd83dbSDimitry Andric CASE_FMA4_SCALAR_RM(FNMADD)
3385ffd83dbSDimitry Andric Mul2Name = getRegName(MI->getOperand(2).getReg());
3395ffd83dbSDimitry Andric Mul1Name = getRegName(MI->getOperand(1).getReg());
3405ffd83dbSDimitry Andric Negate = true;
3415ffd83dbSDimitry Andric break;
3425ffd83dbSDimitry Andric CASE_FMA4_PACKED_MR(FNMADD)
3435ffd83dbSDimitry Andric CASE_FMA4_SCALAR_MR(FNMADD)
3445ffd83dbSDimitry Andric AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
3455ffd83dbSDimitry Andric Mul1Name = getRegName(MI->getOperand(1).getReg());
3465ffd83dbSDimitry Andric Negate = true;
3475ffd83dbSDimitry Andric break;
3485ffd83dbSDimitry Andric
3495ffd83dbSDimitry Andric CASE_FMA4_PACKED_RR(FNMSUB)
3505ffd83dbSDimitry Andric CASE_FMA4_SCALAR_RR(FNMSUB)
3515ffd83dbSDimitry Andric AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
352bdd1243dSDimitry Andric [[fallthrough]];
3535ffd83dbSDimitry Andric CASE_FMA4_PACKED_RM(FNMSUB)
3545ffd83dbSDimitry Andric CASE_FMA4_SCALAR_RM(FNMSUB)
3555ffd83dbSDimitry Andric Mul2Name = getRegName(MI->getOperand(2).getReg());
3565ffd83dbSDimitry Andric Mul1Name = getRegName(MI->getOperand(1).getReg());
3575ffd83dbSDimitry Andric AccStr = "-";
3585ffd83dbSDimitry Andric Negate = true;
3595ffd83dbSDimitry Andric break;
3605ffd83dbSDimitry Andric CASE_FMA4_PACKED_MR(FNMSUB)
3615ffd83dbSDimitry Andric CASE_FMA4_SCALAR_MR(FNMSUB)
3625ffd83dbSDimitry Andric AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
3635ffd83dbSDimitry Andric Mul1Name = getRegName(MI->getOperand(1).getReg());
3645ffd83dbSDimitry Andric AccStr = "-";
3655ffd83dbSDimitry Andric Negate = true;
3665ffd83dbSDimitry Andric break;
3675ffd83dbSDimitry Andric
3685ffd83dbSDimitry Andric CASE_FMA4_PACKED_RR(FMADDSUB)
3695ffd83dbSDimitry Andric AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
370bdd1243dSDimitry Andric [[fallthrough]];
3715ffd83dbSDimitry Andric CASE_FMA4_PACKED_RM(FMADDSUB)
3725ffd83dbSDimitry Andric Mul2Name = getRegName(MI->getOperand(2).getReg());
3735ffd83dbSDimitry Andric Mul1Name = getRegName(MI->getOperand(1).getReg());
3745ffd83dbSDimitry Andric AccStr = "+/-";
3755ffd83dbSDimitry Andric break;
3765ffd83dbSDimitry Andric CASE_FMA4_PACKED_MR(FMADDSUB)
3775ffd83dbSDimitry Andric AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
3785ffd83dbSDimitry Andric Mul1Name = getRegName(MI->getOperand(1).getReg());
3795ffd83dbSDimitry Andric AccStr = "+/-";
3805ffd83dbSDimitry Andric break;
3815ffd83dbSDimitry Andric
3825ffd83dbSDimitry Andric CASE_FMA4_PACKED_RR(FMSUBADD)
3835ffd83dbSDimitry Andric AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
384bdd1243dSDimitry Andric [[fallthrough]];
3855ffd83dbSDimitry Andric CASE_FMA4_PACKED_RM(FMSUBADD)
3865ffd83dbSDimitry Andric Mul2Name = getRegName(MI->getOperand(2).getReg());
3875ffd83dbSDimitry Andric Mul1Name = getRegName(MI->getOperand(1).getReg());
3885ffd83dbSDimitry Andric AccStr = "-/+";
3895ffd83dbSDimitry Andric break;
3905ffd83dbSDimitry Andric CASE_FMA4_PACKED_MR(FMSUBADD)
3915ffd83dbSDimitry Andric AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
3925ffd83dbSDimitry Andric Mul1Name = getRegName(MI->getOperand(1).getReg());
3935ffd83dbSDimitry Andric AccStr = "-/+";
3945ffd83dbSDimitry Andric break;
3955ffd83dbSDimitry Andric
3960b57cec5SDimitry Andric CASE_FMA_PACKED_REG(FMADD132)
3970b57cec5SDimitry Andric CASE_FMA_SCALAR_REG(FMADD132)
3980b57cec5SDimitry Andric Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
3990b57cec5SDimitry Andric RegForm = true;
400bdd1243dSDimitry Andric [[fallthrough]];
4010b57cec5SDimitry Andric CASE_FMA_PACKED_MEM(FMADD132)
4020b57cec5SDimitry Andric CASE_FMA_SCALAR_MEM(FMADD132)
4030b57cec5SDimitry Andric AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
4040b57cec5SDimitry Andric Mul1Name = getRegName(MI->getOperand(1).getReg());
4050b57cec5SDimitry Andric break;
4060b57cec5SDimitry Andric
4070b57cec5SDimitry Andric CASE_FMA_PACKED_REG(FMADD213)
4080b57cec5SDimitry Andric CASE_FMA_SCALAR_REG(FMADD213)
4090b57cec5SDimitry Andric AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
4100b57cec5SDimitry Andric RegForm = true;
411bdd1243dSDimitry Andric [[fallthrough]];
4120b57cec5SDimitry Andric CASE_FMA_PACKED_MEM(FMADD213)
4130b57cec5SDimitry Andric CASE_FMA_SCALAR_MEM(FMADD213)
4140b57cec5SDimitry Andric Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
4150b57cec5SDimitry Andric Mul2Name = getRegName(MI->getOperand(1).getReg());
4160b57cec5SDimitry Andric break;
4170b57cec5SDimitry Andric
4180b57cec5SDimitry Andric CASE_FMA_PACKED_REG(FMADD231)
4190b57cec5SDimitry Andric CASE_FMA_SCALAR_REG(FMADD231)
4200b57cec5SDimitry Andric Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
4210b57cec5SDimitry Andric RegForm = true;
422bdd1243dSDimitry Andric [[fallthrough]];
4230b57cec5SDimitry Andric CASE_FMA_PACKED_MEM(FMADD231)
4240b57cec5SDimitry Andric CASE_FMA_SCALAR_MEM(FMADD231)
4250b57cec5SDimitry Andric Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
4260b57cec5SDimitry Andric AccName = getRegName(MI->getOperand(1).getReg());
4270b57cec5SDimitry Andric break;
4280b57cec5SDimitry Andric
4290b57cec5SDimitry Andric CASE_FMA_PACKED_REG(FMSUB132)
4300b57cec5SDimitry Andric CASE_FMA_SCALAR_REG(FMSUB132)
4310b57cec5SDimitry Andric Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
4320b57cec5SDimitry Andric RegForm = true;
433bdd1243dSDimitry Andric [[fallthrough]];
4340b57cec5SDimitry Andric CASE_FMA_PACKED_MEM(FMSUB132)
4350b57cec5SDimitry Andric CASE_FMA_SCALAR_MEM(FMSUB132)
4360b57cec5SDimitry Andric AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
4370b57cec5SDimitry Andric Mul1Name = getRegName(MI->getOperand(1).getReg());
4380b57cec5SDimitry Andric AccStr = "-";
4390b57cec5SDimitry Andric break;
4400b57cec5SDimitry Andric
4410b57cec5SDimitry Andric CASE_FMA_PACKED_REG(FMSUB213)
4420b57cec5SDimitry Andric CASE_FMA_SCALAR_REG(FMSUB213)
4430b57cec5SDimitry Andric AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
4440b57cec5SDimitry Andric RegForm = true;
445bdd1243dSDimitry Andric [[fallthrough]];
4460b57cec5SDimitry Andric CASE_FMA_PACKED_MEM(FMSUB213)
4470b57cec5SDimitry Andric CASE_FMA_SCALAR_MEM(FMSUB213)
4480b57cec5SDimitry Andric Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
4490b57cec5SDimitry Andric Mul2Name = getRegName(MI->getOperand(1).getReg());
4500b57cec5SDimitry Andric AccStr = "-";
4510b57cec5SDimitry Andric break;
4520b57cec5SDimitry Andric
4530b57cec5SDimitry Andric CASE_FMA_PACKED_REG(FMSUB231)
4540b57cec5SDimitry Andric CASE_FMA_SCALAR_REG(FMSUB231)
4550b57cec5SDimitry Andric Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
4560b57cec5SDimitry Andric RegForm = true;
457bdd1243dSDimitry Andric [[fallthrough]];
4580b57cec5SDimitry Andric CASE_FMA_PACKED_MEM(FMSUB231)
4590b57cec5SDimitry Andric CASE_FMA_SCALAR_MEM(FMSUB231)
4600b57cec5SDimitry Andric Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
4610b57cec5SDimitry Andric AccName = getRegName(MI->getOperand(1).getReg());
4620b57cec5SDimitry Andric AccStr = "-";
4630b57cec5SDimitry Andric break;
4640b57cec5SDimitry Andric
4650b57cec5SDimitry Andric CASE_FMA_PACKED_REG(FNMADD132)
4660b57cec5SDimitry Andric CASE_FMA_SCALAR_REG(FNMADD132)
4670b57cec5SDimitry Andric Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
4680b57cec5SDimitry Andric RegForm = true;
469bdd1243dSDimitry Andric [[fallthrough]];
4700b57cec5SDimitry Andric CASE_FMA_PACKED_MEM(FNMADD132)
4710b57cec5SDimitry Andric CASE_FMA_SCALAR_MEM(FNMADD132)
4720b57cec5SDimitry Andric AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
4730b57cec5SDimitry Andric Mul1Name = getRegName(MI->getOperand(1).getReg());
4740b57cec5SDimitry Andric Negate = true;
4750b57cec5SDimitry Andric break;
4760b57cec5SDimitry Andric
4770b57cec5SDimitry Andric CASE_FMA_PACKED_REG(FNMADD213)
4780b57cec5SDimitry Andric CASE_FMA_SCALAR_REG(FNMADD213)
4790b57cec5SDimitry Andric AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
4800b57cec5SDimitry Andric RegForm = true;
481bdd1243dSDimitry Andric [[fallthrough]];
4820b57cec5SDimitry Andric CASE_FMA_PACKED_MEM(FNMADD213)
4830b57cec5SDimitry Andric CASE_FMA_SCALAR_MEM(FNMADD213)
4840b57cec5SDimitry Andric Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
4850b57cec5SDimitry Andric Mul2Name = getRegName(MI->getOperand(1).getReg());
4860b57cec5SDimitry Andric Negate = true;
4870b57cec5SDimitry Andric break;
4880b57cec5SDimitry Andric
4890b57cec5SDimitry Andric CASE_FMA_PACKED_REG(FNMADD231)
4900b57cec5SDimitry Andric CASE_FMA_SCALAR_REG(FNMADD231)
4910b57cec5SDimitry Andric Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
4920b57cec5SDimitry Andric RegForm = true;
493bdd1243dSDimitry Andric [[fallthrough]];
4940b57cec5SDimitry Andric CASE_FMA_PACKED_MEM(FNMADD231)
4950b57cec5SDimitry Andric CASE_FMA_SCALAR_MEM(FNMADD231)
4960b57cec5SDimitry Andric Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
4970b57cec5SDimitry Andric AccName = getRegName(MI->getOperand(1).getReg());
4980b57cec5SDimitry Andric Negate = true;
4990b57cec5SDimitry Andric break;
5000b57cec5SDimitry Andric
5010b57cec5SDimitry Andric CASE_FMA_PACKED_REG(FNMSUB132)
5020b57cec5SDimitry Andric CASE_FMA_SCALAR_REG(FNMSUB132)
5030b57cec5SDimitry Andric Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
5040b57cec5SDimitry Andric RegForm = true;
505bdd1243dSDimitry Andric [[fallthrough]];
5060b57cec5SDimitry Andric CASE_FMA_PACKED_MEM(FNMSUB132)
5070b57cec5SDimitry Andric CASE_FMA_SCALAR_MEM(FNMSUB132)
5080b57cec5SDimitry Andric AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
5090b57cec5SDimitry Andric Mul1Name = getRegName(MI->getOperand(1).getReg());
5100b57cec5SDimitry Andric AccStr = "-";
5110b57cec5SDimitry Andric Negate = true;
5120b57cec5SDimitry Andric break;
5130b57cec5SDimitry Andric
5140b57cec5SDimitry Andric CASE_FMA_PACKED_REG(FNMSUB213)
5150b57cec5SDimitry Andric CASE_FMA_SCALAR_REG(FNMSUB213)
5160b57cec5SDimitry Andric AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
5170b57cec5SDimitry Andric RegForm = true;
518bdd1243dSDimitry Andric [[fallthrough]];
5190b57cec5SDimitry Andric CASE_FMA_PACKED_MEM(FNMSUB213)
5200b57cec5SDimitry Andric CASE_FMA_SCALAR_MEM(FNMSUB213)
5210b57cec5SDimitry Andric Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
5220b57cec5SDimitry Andric Mul2Name = getRegName(MI->getOperand(1).getReg());
5230b57cec5SDimitry Andric AccStr = "-";
5240b57cec5SDimitry Andric Negate = true;
5250b57cec5SDimitry Andric break;
5260b57cec5SDimitry Andric
5270b57cec5SDimitry Andric CASE_FMA_PACKED_REG(FNMSUB231)
5280b57cec5SDimitry Andric CASE_FMA_SCALAR_REG(FNMSUB231)
5290b57cec5SDimitry Andric Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
5300b57cec5SDimitry Andric RegForm = true;
531bdd1243dSDimitry Andric [[fallthrough]];
5320b57cec5SDimitry Andric CASE_FMA_PACKED_MEM(FNMSUB231)
5330b57cec5SDimitry Andric CASE_FMA_SCALAR_MEM(FNMSUB231)
5340b57cec5SDimitry Andric Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
5350b57cec5SDimitry Andric AccName = getRegName(MI->getOperand(1).getReg());
5360b57cec5SDimitry Andric AccStr = "-";
5370b57cec5SDimitry Andric Negate = true;
5380b57cec5SDimitry Andric break;
5390b57cec5SDimitry Andric
5400b57cec5SDimitry Andric CASE_FMA_PACKED_REG(FMADDSUB132)
5410b57cec5SDimitry Andric Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
5420b57cec5SDimitry Andric RegForm = true;
543bdd1243dSDimitry Andric [[fallthrough]];
5440b57cec5SDimitry Andric CASE_FMA_PACKED_MEM(FMADDSUB132)
5450b57cec5SDimitry Andric AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
5460b57cec5SDimitry Andric Mul1Name = getRegName(MI->getOperand(1).getReg());
5470b57cec5SDimitry Andric AccStr = "+/-";
5480b57cec5SDimitry Andric break;
5490b57cec5SDimitry Andric
5500b57cec5SDimitry Andric CASE_FMA_PACKED_REG(FMADDSUB213)
5510b57cec5SDimitry Andric AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
5520b57cec5SDimitry Andric RegForm = true;
553bdd1243dSDimitry Andric [[fallthrough]];
5540b57cec5SDimitry Andric CASE_FMA_PACKED_MEM(FMADDSUB213)
5550b57cec5SDimitry Andric Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
5560b57cec5SDimitry Andric Mul2Name = getRegName(MI->getOperand(1).getReg());
5570b57cec5SDimitry Andric AccStr = "+/-";
5580b57cec5SDimitry Andric break;
5590b57cec5SDimitry Andric
5600b57cec5SDimitry Andric CASE_FMA_PACKED_REG(FMADDSUB231)
5610b57cec5SDimitry Andric Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
5620b57cec5SDimitry Andric RegForm = true;
563bdd1243dSDimitry Andric [[fallthrough]];
5640b57cec5SDimitry Andric CASE_FMA_PACKED_MEM(FMADDSUB231)
5650b57cec5SDimitry Andric Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
5660b57cec5SDimitry Andric AccName = getRegName(MI->getOperand(1).getReg());
5670b57cec5SDimitry Andric AccStr = "+/-";
5680b57cec5SDimitry Andric break;
5690b57cec5SDimitry Andric
5700b57cec5SDimitry Andric CASE_FMA_PACKED_REG(FMSUBADD132)
5710b57cec5SDimitry Andric Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
5720b57cec5SDimitry Andric RegForm = true;
573bdd1243dSDimitry Andric [[fallthrough]];
5740b57cec5SDimitry Andric CASE_FMA_PACKED_MEM(FMSUBADD132)
5750b57cec5SDimitry Andric AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
5760b57cec5SDimitry Andric Mul1Name = getRegName(MI->getOperand(1).getReg());
5770b57cec5SDimitry Andric AccStr = "-/+";
5780b57cec5SDimitry Andric break;
5790b57cec5SDimitry Andric
5800b57cec5SDimitry Andric CASE_FMA_PACKED_REG(FMSUBADD213)
5810b57cec5SDimitry Andric AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
5820b57cec5SDimitry Andric RegForm = true;
583bdd1243dSDimitry Andric [[fallthrough]];
5840b57cec5SDimitry Andric CASE_FMA_PACKED_MEM(FMSUBADD213)
5850b57cec5SDimitry Andric Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
5860b57cec5SDimitry Andric Mul2Name = getRegName(MI->getOperand(1).getReg());
5870b57cec5SDimitry Andric AccStr = "-/+";
5880b57cec5SDimitry Andric break;
5890b57cec5SDimitry Andric
5900b57cec5SDimitry Andric CASE_FMA_PACKED_REG(FMSUBADD231)
5910b57cec5SDimitry Andric Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
5920b57cec5SDimitry Andric RegForm = true;
593bdd1243dSDimitry Andric [[fallthrough]];
5940b57cec5SDimitry Andric CASE_FMA_PACKED_MEM(FMSUBADD231)
5950b57cec5SDimitry Andric Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
5960b57cec5SDimitry Andric AccName = getRegName(MI->getOperand(1).getReg());
5970b57cec5SDimitry Andric AccStr = "-/+";
5980b57cec5SDimitry Andric break;
5990b57cec5SDimitry Andric }
6000b57cec5SDimitry Andric
6010b57cec5SDimitry Andric const char *DestName = getRegName(MI->getOperand(0).getReg());
6020b57cec5SDimitry Andric
6030b57cec5SDimitry Andric if (!Mul1Name) Mul1Name = "mem";
6040b57cec5SDimitry Andric if (!Mul2Name) Mul2Name = "mem";
6050b57cec5SDimitry Andric if (!AccName) AccName = "mem";
6060b57cec5SDimitry Andric
6075ffd83dbSDimitry Andric OS << DestName;
6085ffd83dbSDimitry Andric printMasking(OS, MI, MCII);
6095ffd83dbSDimitry Andric OS << " = ";
6100b57cec5SDimitry Andric
6110b57cec5SDimitry Andric if (Negate)
6120b57cec5SDimitry Andric OS << '-';
6130b57cec5SDimitry Andric
6140b57cec5SDimitry Andric OS << '(' << Mul1Name << " * " << Mul2Name << ") " << AccStr << ' '
615753f127fSDimitry Andric << AccName << '\n';
6160b57cec5SDimitry Andric
6170b57cec5SDimitry Andric return true;
6180b57cec5SDimitry Andric }
6190b57cec5SDimitry Andric
6200b57cec5SDimitry Andric
6210b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
6220b57cec5SDimitry Andric // Top Level Entrypoint
6230b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
6240b57cec5SDimitry Andric
6250b57cec5SDimitry Andric /// EmitAnyX86InstComments - This function decodes x86 instructions and prints
6260b57cec5SDimitry Andric /// newline terminated strings to the specified string if desired. This
6270b57cec5SDimitry Andric /// information is shown in disassembly dumps when verbose assembly is enabled.
EmitAnyX86InstComments(const MCInst * MI,raw_ostream & OS,const MCInstrInfo & MCII)6280b57cec5SDimitry Andric bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
6290b57cec5SDimitry Andric const MCInstrInfo &MCII) {
6300b57cec5SDimitry Andric // If this is a shuffle operation, the switch should fill in this state.
6310b57cec5SDimitry Andric SmallVector<int, 8> ShuffleMask;
6320b57cec5SDimitry Andric const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
6330b57cec5SDimitry Andric unsigned NumOperands = MI->getNumOperands();
6340b57cec5SDimitry Andric bool RegForm = false;
6350b57cec5SDimitry Andric
6365ffd83dbSDimitry Andric if (printFMAComments(MI, OS, MCII))
6370b57cec5SDimitry Andric return true;
6380b57cec5SDimitry Andric
6390b57cec5SDimitry Andric switch (MI->getOpcode()) {
6400b57cec5SDimitry Andric default:
6410b57cec5SDimitry Andric // Not an instruction for which we can decode comments.
6420b57cec5SDimitry Andric return false;
6430b57cec5SDimitry Andric
6440b57cec5SDimitry Andric case X86::BLENDPDrri:
6450b57cec5SDimitry Andric case X86::VBLENDPDrri:
6460b57cec5SDimitry Andric case X86::VBLENDPDYrri:
6470b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(2).getReg());
648bdd1243dSDimitry Andric [[fallthrough]];
6490b57cec5SDimitry Andric case X86::BLENDPDrmi:
6500b57cec5SDimitry Andric case X86::VBLENDPDrmi:
6510b57cec5SDimitry Andric case X86::VBLENDPDYrmi:
6520b57cec5SDimitry Andric if (MI->getOperand(NumOperands - 1).isImm())
6530b57cec5SDimitry Andric DecodeBLENDMask(getRegOperandNumElts(MI, 64, 0),
6540b57cec5SDimitry Andric MI->getOperand(NumOperands - 1).getImm(),
6550b57cec5SDimitry Andric ShuffleMask);
6560b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(1).getReg());
6570b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
6580b57cec5SDimitry Andric break;
6590b57cec5SDimitry Andric
6600b57cec5SDimitry Andric case X86::BLENDPSrri:
6610b57cec5SDimitry Andric case X86::VBLENDPSrri:
6620b57cec5SDimitry Andric case X86::VBLENDPSYrri:
6630b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(2).getReg());
664bdd1243dSDimitry Andric [[fallthrough]];
6650b57cec5SDimitry Andric case X86::BLENDPSrmi:
6660b57cec5SDimitry Andric case X86::VBLENDPSrmi:
6670b57cec5SDimitry Andric case X86::VBLENDPSYrmi:
6680b57cec5SDimitry Andric if (MI->getOperand(NumOperands - 1).isImm())
6690b57cec5SDimitry Andric DecodeBLENDMask(getRegOperandNumElts(MI, 32, 0),
6700b57cec5SDimitry Andric MI->getOperand(NumOperands - 1).getImm(),
6710b57cec5SDimitry Andric ShuffleMask);
6720b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(1).getReg());
6730b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
6740b57cec5SDimitry Andric break;
6750b57cec5SDimitry Andric
6760b57cec5SDimitry Andric case X86::PBLENDWrri:
6770b57cec5SDimitry Andric case X86::VPBLENDWrri:
6780b57cec5SDimitry Andric case X86::VPBLENDWYrri:
6790b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(2).getReg());
680bdd1243dSDimitry Andric [[fallthrough]];
6810b57cec5SDimitry Andric case X86::PBLENDWrmi:
6820b57cec5SDimitry Andric case X86::VPBLENDWrmi:
6830b57cec5SDimitry Andric case X86::VPBLENDWYrmi:
6840b57cec5SDimitry Andric if (MI->getOperand(NumOperands - 1).isImm())
6850b57cec5SDimitry Andric DecodeBLENDMask(getRegOperandNumElts(MI, 16, 0),
6860b57cec5SDimitry Andric MI->getOperand(NumOperands - 1).getImm(),
6870b57cec5SDimitry Andric ShuffleMask);
6880b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(1).getReg());
6890b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
6900b57cec5SDimitry Andric break;
6910b57cec5SDimitry Andric
6920b57cec5SDimitry Andric case X86::VPBLENDDrri:
6930b57cec5SDimitry Andric case X86::VPBLENDDYrri:
6940b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(2).getReg());
695bdd1243dSDimitry Andric [[fallthrough]];
6960b57cec5SDimitry Andric case X86::VPBLENDDrmi:
6970b57cec5SDimitry Andric case X86::VPBLENDDYrmi:
6980b57cec5SDimitry Andric if (MI->getOperand(NumOperands - 1).isImm())
6990b57cec5SDimitry Andric DecodeBLENDMask(getRegOperandNumElts(MI, 32, 0),
7000b57cec5SDimitry Andric MI->getOperand(NumOperands - 1).getImm(),
7010b57cec5SDimitry Andric ShuffleMask);
7020b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(1).getReg());
7030b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
7040b57cec5SDimitry Andric break;
7050b57cec5SDimitry Andric
7060b57cec5SDimitry Andric case X86::INSERTPSrr:
7070b57cec5SDimitry Andric case X86::VINSERTPSrr:
7080b57cec5SDimitry Andric case X86::VINSERTPSZrr:
7090b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(2).getReg());
710bdd1243dSDimitry Andric [[fallthrough]];
7110b57cec5SDimitry Andric case X86::INSERTPSrm:
7120b57cec5SDimitry Andric case X86::VINSERTPSrm:
7130b57cec5SDimitry Andric case X86::VINSERTPSZrm:
7140b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
7150b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(1).getReg());
7160b57cec5SDimitry Andric if (MI->getOperand(NumOperands - 1).isImm())
7170b57cec5SDimitry Andric DecodeINSERTPSMask(MI->getOperand(NumOperands - 1).getImm(),
7180b57cec5SDimitry Andric ShuffleMask);
7190b57cec5SDimitry Andric break;
7200b57cec5SDimitry Andric
7210b57cec5SDimitry Andric case X86::MOVLHPSrr:
7220b57cec5SDimitry Andric case X86::VMOVLHPSrr:
7230b57cec5SDimitry Andric case X86::VMOVLHPSZrr:
7240b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(2).getReg());
7250b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(1).getReg());
7260b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
7270b57cec5SDimitry Andric DecodeMOVLHPSMask(2, ShuffleMask);
7280b57cec5SDimitry Andric break;
7290b57cec5SDimitry Andric
7300b57cec5SDimitry Andric case X86::MOVHLPSrr:
7310b57cec5SDimitry Andric case X86::VMOVHLPSrr:
7320b57cec5SDimitry Andric case X86::VMOVHLPSZrr:
7330b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(2).getReg());
7340b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(1).getReg());
7350b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
7360b57cec5SDimitry Andric DecodeMOVHLPSMask(2, ShuffleMask);
7370b57cec5SDimitry Andric break;
7380b57cec5SDimitry Andric
7390b57cec5SDimitry Andric case X86::MOVHPDrm:
7400b57cec5SDimitry Andric case X86::VMOVHPDrm:
7410b57cec5SDimitry Andric case X86::VMOVHPDZ128rm:
7420b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(1).getReg());
7430b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
7440b57cec5SDimitry Andric DecodeInsertElementMask(2, 1, 1, ShuffleMask);
7450b57cec5SDimitry Andric break;
7460b57cec5SDimitry Andric
7470b57cec5SDimitry Andric case X86::MOVHPSrm:
7480b57cec5SDimitry Andric case X86::VMOVHPSrm:
7490b57cec5SDimitry Andric case X86::VMOVHPSZ128rm:
7500b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(1).getReg());
7510b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
7520b57cec5SDimitry Andric DecodeInsertElementMask(4, 2, 2, ShuffleMask);
7530b57cec5SDimitry Andric break;
7540b57cec5SDimitry Andric
7550b57cec5SDimitry Andric case X86::MOVLPDrm:
7560b57cec5SDimitry Andric case X86::VMOVLPDrm:
7570b57cec5SDimitry Andric case X86::VMOVLPDZ128rm:
7580b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(1).getReg());
7590b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
7600b57cec5SDimitry Andric DecodeInsertElementMask(2, 0, 1, ShuffleMask);
7610b57cec5SDimitry Andric break;
7620b57cec5SDimitry Andric
7630b57cec5SDimitry Andric case X86::MOVLPSrm:
7640b57cec5SDimitry Andric case X86::VMOVLPSrm:
7650b57cec5SDimitry Andric case X86::VMOVLPSZ128rm:
7660b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(1).getReg());
7670b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
7680b57cec5SDimitry Andric DecodeInsertElementMask(4, 0, 2, ShuffleMask);
7690b57cec5SDimitry Andric break;
7700b57cec5SDimitry Andric
7710b57cec5SDimitry Andric CASE_MOVDUP(MOVSLDUP, r)
7720b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
773bdd1243dSDimitry Andric [[fallthrough]];
7740b57cec5SDimitry Andric
7750b57cec5SDimitry Andric CASE_MOVDUP(MOVSLDUP, m)
7760b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
7770b57cec5SDimitry Andric DecodeMOVSLDUPMask(getRegOperandNumElts(MI, 32, 0), ShuffleMask);
7780b57cec5SDimitry Andric break;
7790b57cec5SDimitry Andric
7800b57cec5SDimitry Andric CASE_MOVDUP(MOVSHDUP, r)
7810b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
782bdd1243dSDimitry Andric [[fallthrough]];
7830b57cec5SDimitry Andric
7840b57cec5SDimitry Andric CASE_MOVDUP(MOVSHDUP, m)
7850b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
7860b57cec5SDimitry Andric DecodeMOVSHDUPMask(getRegOperandNumElts(MI, 32, 0), ShuffleMask);
7870b57cec5SDimitry Andric break;
7880b57cec5SDimitry Andric
7890b57cec5SDimitry Andric CASE_MOVDUP(MOVDDUP, r)
7900b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
791bdd1243dSDimitry Andric [[fallthrough]];
7920b57cec5SDimitry Andric
7930b57cec5SDimitry Andric CASE_MOVDUP(MOVDDUP, m)
7940b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
7950b57cec5SDimitry Andric DecodeMOVDDUPMask(getRegOperandNumElts(MI, 64, 0), ShuffleMask);
7960b57cec5SDimitry Andric break;
7970b57cec5SDimitry Andric
7980b57cec5SDimitry Andric case X86::PSLLDQri:
7990b57cec5SDimitry Andric case X86::VPSLLDQri:
8000b57cec5SDimitry Andric case X86::VPSLLDQYri:
8015ffd83dbSDimitry Andric case X86::VPSLLDQZ128ri:
8025ffd83dbSDimitry Andric case X86::VPSLLDQZ256ri:
8035ffd83dbSDimitry Andric case X86::VPSLLDQZri:
8040b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(1).getReg());
805bdd1243dSDimitry Andric [[fallthrough]];
8065ffd83dbSDimitry Andric case X86::VPSLLDQZ128mi:
8075ffd83dbSDimitry Andric case X86::VPSLLDQZ256mi:
8085ffd83dbSDimitry Andric case X86::VPSLLDQZmi:
8090b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
8100b57cec5SDimitry Andric if (MI->getOperand(NumOperands - 1).isImm())
8110b57cec5SDimitry Andric DecodePSLLDQMask(getRegOperandNumElts(MI, 8, 0),
8120b57cec5SDimitry Andric MI->getOperand(NumOperands - 1).getImm(),
8130b57cec5SDimitry Andric ShuffleMask);
8140b57cec5SDimitry Andric break;
8150b57cec5SDimitry Andric
8160b57cec5SDimitry Andric case X86::PSRLDQri:
8170b57cec5SDimitry Andric case X86::VPSRLDQri:
8180b57cec5SDimitry Andric case X86::VPSRLDQYri:
8195ffd83dbSDimitry Andric case X86::VPSRLDQZ128ri:
8205ffd83dbSDimitry Andric case X86::VPSRLDQZ256ri:
8215ffd83dbSDimitry Andric case X86::VPSRLDQZri:
8220b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(1).getReg());
823bdd1243dSDimitry Andric [[fallthrough]];
8245ffd83dbSDimitry Andric case X86::VPSRLDQZ128mi:
8255ffd83dbSDimitry Andric case X86::VPSRLDQZ256mi:
8265ffd83dbSDimitry Andric case X86::VPSRLDQZmi:
8270b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
8280b57cec5SDimitry Andric if (MI->getOperand(NumOperands - 1).isImm())
8290b57cec5SDimitry Andric DecodePSRLDQMask(getRegOperandNumElts(MI, 8, 0),
8300b57cec5SDimitry Andric MI->getOperand(NumOperands - 1).getImm(),
8310b57cec5SDimitry Andric ShuffleMask);
8320b57cec5SDimitry Andric break;
8330b57cec5SDimitry Andric
8340b57cec5SDimitry Andric CASE_SHUF(PALIGNR, rri)
8350b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
8360b57cec5SDimitry Andric RegForm = true;
837bdd1243dSDimitry Andric [[fallthrough]];
8380b57cec5SDimitry Andric
8390b57cec5SDimitry Andric CASE_SHUF(PALIGNR, rmi)
8400b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
8410b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
8420b57cec5SDimitry Andric if (MI->getOperand(NumOperands - 1).isImm())
8430b57cec5SDimitry Andric DecodePALIGNRMask(getRegOperandNumElts(MI, 8, 0),
8440b57cec5SDimitry Andric MI->getOperand(NumOperands - 1).getImm(),
8450b57cec5SDimitry Andric ShuffleMask);
8460b57cec5SDimitry Andric break;
8470b57cec5SDimitry Andric
8480b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(ALIGNQ, Z, rri)
8490b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(ALIGNQ, Z256, rri)
8500b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(ALIGNQ, Z128, rri)
8510b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
8520b57cec5SDimitry Andric RegForm = true;
853bdd1243dSDimitry Andric [[fallthrough]];
8540b57cec5SDimitry Andric
8550b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(ALIGNQ, Z, rmi)
8560b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(ALIGNQ, Z256, rmi)
8570b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(ALIGNQ, Z128, rmi)
8580b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
8590b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
8600b57cec5SDimitry Andric if (MI->getOperand(NumOperands - 1).isImm())
8610b57cec5SDimitry Andric DecodeVALIGNMask(getRegOperandNumElts(MI, 64, 0),
8620b57cec5SDimitry Andric MI->getOperand(NumOperands - 1).getImm(),
8630b57cec5SDimitry Andric ShuffleMask);
8640b57cec5SDimitry Andric break;
8650b57cec5SDimitry Andric
8660b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(ALIGND, Z, rri)
8670b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(ALIGND, Z256, rri)
8680b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(ALIGND, Z128, rri)
8690b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
8700b57cec5SDimitry Andric RegForm = true;
871bdd1243dSDimitry Andric [[fallthrough]];
8720b57cec5SDimitry Andric
8730b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(ALIGND, Z, rmi)
8740b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(ALIGND, Z256, rmi)
8750b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(ALIGND, Z128, rmi)
8760b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
8770b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
8780b57cec5SDimitry Andric if (MI->getOperand(NumOperands - 1).isImm())
8790b57cec5SDimitry Andric DecodeVALIGNMask(getRegOperandNumElts(MI, 32, 0),
8800b57cec5SDimitry Andric MI->getOperand(NumOperands - 1).getImm(),
8810b57cec5SDimitry Andric ShuffleMask);
8820b57cec5SDimitry Andric break;
8830b57cec5SDimitry Andric
8840b57cec5SDimitry Andric CASE_SHUF(PSHUFD, ri)
8850b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
886bdd1243dSDimitry Andric [[fallthrough]];
8870b57cec5SDimitry Andric
8880b57cec5SDimitry Andric CASE_SHUF(PSHUFD, mi)
8890b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
8900b57cec5SDimitry Andric if (MI->getOperand(NumOperands - 1).isImm())
8910b57cec5SDimitry Andric DecodePSHUFMask(getRegOperandNumElts(MI, 32, 0), 32,
8920b57cec5SDimitry Andric MI->getOperand(NumOperands - 1).getImm(),
8930b57cec5SDimitry Andric ShuffleMask);
8940b57cec5SDimitry Andric break;
8950b57cec5SDimitry Andric
8960b57cec5SDimitry Andric CASE_SHUF(PSHUFHW, ri)
8970b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
898bdd1243dSDimitry Andric [[fallthrough]];
8990b57cec5SDimitry Andric
9000b57cec5SDimitry Andric CASE_SHUF(PSHUFHW, mi)
9010b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
9020b57cec5SDimitry Andric if (MI->getOperand(NumOperands - 1).isImm())
9030b57cec5SDimitry Andric DecodePSHUFHWMask(getRegOperandNumElts(MI, 16, 0),
9040b57cec5SDimitry Andric MI->getOperand(NumOperands - 1).getImm(),
9050b57cec5SDimitry Andric ShuffleMask);
9060b57cec5SDimitry Andric break;
9070b57cec5SDimitry Andric
9080b57cec5SDimitry Andric CASE_SHUF(PSHUFLW, ri)
9090b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
910bdd1243dSDimitry Andric [[fallthrough]];
9110b57cec5SDimitry Andric
9120b57cec5SDimitry Andric CASE_SHUF(PSHUFLW, mi)
9130b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
9140b57cec5SDimitry Andric if (MI->getOperand(NumOperands - 1).isImm())
9150b57cec5SDimitry Andric DecodePSHUFLWMask(getRegOperandNumElts(MI, 16, 0),
9160b57cec5SDimitry Andric MI->getOperand(NumOperands - 1).getImm(),
9170b57cec5SDimitry Andric ShuffleMask);
9180b57cec5SDimitry Andric break;
9190b57cec5SDimitry Andric
9200b57cec5SDimitry Andric case X86::MMX_PSHUFWri:
9210b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(1).getReg());
922bdd1243dSDimitry Andric [[fallthrough]];
9230b57cec5SDimitry Andric
9240b57cec5SDimitry Andric case X86::MMX_PSHUFWmi:
9250b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
9260b57cec5SDimitry Andric if (MI->getOperand(NumOperands - 1).isImm())
9270b57cec5SDimitry Andric DecodePSHUFMask(4, 16, MI->getOperand(NumOperands - 1).getImm(),
9280b57cec5SDimitry Andric ShuffleMask);
9290b57cec5SDimitry Andric break;
9300b57cec5SDimitry Andric
9310b57cec5SDimitry Andric case X86::PSWAPDrr:
9320b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(1).getReg());
933bdd1243dSDimitry Andric [[fallthrough]];
9340b57cec5SDimitry Andric
9350b57cec5SDimitry Andric case X86::PSWAPDrm:
9360b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
9370b57cec5SDimitry Andric DecodePSWAPMask(2, ShuffleMask);
9380b57cec5SDimitry Andric break;
9390b57cec5SDimitry Andric
9400b57cec5SDimitry Andric CASE_UNPCK(PUNPCKHBW, r)
9410eae32dcSDimitry Andric case X86::MMX_PUNPCKHBWrr:
9420b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
9430b57cec5SDimitry Andric RegForm = true;
944bdd1243dSDimitry Andric [[fallthrough]];
9450b57cec5SDimitry Andric
9460b57cec5SDimitry Andric CASE_UNPCK(PUNPCKHBW, m)
9470eae32dcSDimitry Andric case X86::MMX_PUNPCKHBWrm:
9480b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
9490b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
9500b57cec5SDimitry Andric DecodeUNPCKHMask(getRegOperandNumElts(MI, 8, 0), 8, ShuffleMask);
9510b57cec5SDimitry Andric break;
9520b57cec5SDimitry Andric
9530b57cec5SDimitry Andric CASE_UNPCK(PUNPCKHWD, r)
9540eae32dcSDimitry Andric case X86::MMX_PUNPCKHWDrr:
9550b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
9560b57cec5SDimitry Andric RegForm = true;
957bdd1243dSDimitry Andric [[fallthrough]];
9580b57cec5SDimitry Andric
9590b57cec5SDimitry Andric CASE_UNPCK(PUNPCKHWD, m)
9600eae32dcSDimitry Andric case X86::MMX_PUNPCKHWDrm:
9610b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
9620b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
9630b57cec5SDimitry Andric DecodeUNPCKHMask(getRegOperandNumElts(MI, 16, 0), 16, ShuffleMask);
9640b57cec5SDimitry Andric break;
9650b57cec5SDimitry Andric
9660b57cec5SDimitry Andric CASE_UNPCK(PUNPCKHDQ, r)
9670eae32dcSDimitry Andric case X86::MMX_PUNPCKHDQrr:
9680b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
9690b57cec5SDimitry Andric RegForm = true;
970bdd1243dSDimitry Andric [[fallthrough]];
9710b57cec5SDimitry Andric
9720b57cec5SDimitry Andric CASE_UNPCK(PUNPCKHDQ, m)
9730eae32dcSDimitry Andric case X86::MMX_PUNPCKHDQrm:
9740b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
9750b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
9760b57cec5SDimitry Andric DecodeUNPCKHMask(getRegOperandNumElts(MI, 32, 0), 32, ShuffleMask);
9770b57cec5SDimitry Andric break;
9780b57cec5SDimitry Andric
9790b57cec5SDimitry Andric CASE_UNPCK(PUNPCKHQDQ, r)
9800b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
9810b57cec5SDimitry Andric RegForm = true;
982bdd1243dSDimitry Andric [[fallthrough]];
9830b57cec5SDimitry Andric
9840b57cec5SDimitry Andric CASE_UNPCK(PUNPCKHQDQ, m)
9850b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
9860b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
9870b57cec5SDimitry Andric DecodeUNPCKHMask(getRegOperandNumElts(MI, 64, 0), 64, ShuffleMask);
9880b57cec5SDimitry Andric break;
9890b57cec5SDimitry Andric
9900b57cec5SDimitry Andric CASE_UNPCK(PUNPCKLBW, r)
9910eae32dcSDimitry Andric case X86::MMX_PUNPCKLBWrr:
9920b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
9930b57cec5SDimitry Andric RegForm = true;
994bdd1243dSDimitry Andric [[fallthrough]];
9950b57cec5SDimitry Andric
9960b57cec5SDimitry Andric CASE_UNPCK(PUNPCKLBW, m)
9970eae32dcSDimitry Andric case X86::MMX_PUNPCKLBWrm:
9980b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
9990b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
10000b57cec5SDimitry Andric DecodeUNPCKLMask(getRegOperandNumElts(MI, 8, 0), 8, ShuffleMask);
10010b57cec5SDimitry Andric break;
10020b57cec5SDimitry Andric
10030b57cec5SDimitry Andric CASE_UNPCK(PUNPCKLWD, r)
10040eae32dcSDimitry Andric case X86::MMX_PUNPCKLWDrr:
10050b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
10060b57cec5SDimitry Andric RegForm = true;
1007bdd1243dSDimitry Andric [[fallthrough]];
10080b57cec5SDimitry Andric
10090b57cec5SDimitry Andric CASE_UNPCK(PUNPCKLWD, m)
10100eae32dcSDimitry Andric case X86::MMX_PUNPCKLWDrm:
10110b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
10120b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
10130b57cec5SDimitry Andric DecodeUNPCKLMask(getRegOperandNumElts(MI, 16, 0), 16, ShuffleMask);
10140b57cec5SDimitry Andric break;
10150b57cec5SDimitry Andric
10160b57cec5SDimitry Andric CASE_UNPCK(PUNPCKLDQ, r)
10170eae32dcSDimitry Andric case X86::MMX_PUNPCKLDQrr:
10180b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
10190b57cec5SDimitry Andric RegForm = true;
1020bdd1243dSDimitry Andric [[fallthrough]];
10210b57cec5SDimitry Andric
10220b57cec5SDimitry Andric CASE_UNPCK(PUNPCKLDQ, m)
10230eae32dcSDimitry Andric case X86::MMX_PUNPCKLDQrm:
10240b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
10250b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
10260b57cec5SDimitry Andric DecodeUNPCKLMask(getRegOperandNumElts(MI, 32, 0), 32, ShuffleMask);
10270b57cec5SDimitry Andric break;
10280b57cec5SDimitry Andric
10290b57cec5SDimitry Andric CASE_UNPCK(PUNPCKLQDQ, r)
10300b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
10310b57cec5SDimitry Andric RegForm = true;
1032bdd1243dSDimitry Andric [[fallthrough]];
10330b57cec5SDimitry Andric
10340b57cec5SDimitry Andric CASE_UNPCK(PUNPCKLQDQ, m)
10350b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
10360b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
10370b57cec5SDimitry Andric DecodeUNPCKLMask(getRegOperandNumElts(MI, 64, 0), 64, ShuffleMask);
10380b57cec5SDimitry Andric break;
10390b57cec5SDimitry Andric
10400b57cec5SDimitry Andric CASE_SHUF(SHUFPD, rri)
10410b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
10420b57cec5SDimitry Andric RegForm = true;
1043bdd1243dSDimitry Andric [[fallthrough]];
10440b57cec5SDimitry Andric
10450b57cec5SDimitry Andric CASE_SHUF(SHUFPD, rmi)
10460b57cec5SDimitry Andric if (MI->getOperand(NumOperands - 1).isImm())
10470b57cec5SDimitry Andric DecodeSHUFPMask(getRegOperandNumElts(MI, 64, 0), 64,
10480b57cec5SDimitry Andric MI->getOperand(NumOperands - 1).getImm(), ShuffleMask);
10490b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
10500b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
10510b57cec5SDimitry Andric break;
10520b57cec5SDimitry Andric
10530b57cec5SDimitry Andric CASE_SHUF(SHUFPS, rri)
10540b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
10550b57cec5SDimitry Andric RegForm = true;
1056bdd1243dSDimitry Andric [[fallthrough]];
10570b57cec5SDimitry Andric
10580b57cec5SDimitry Andric CASE_SHUF(SHUFPS, rmi)
10590b57cec5SDimitry Andric if (MI->getOperand(NumOperands - 1).isImm())
10600b57cec5SDimitry Andric DecodeSHUFPMask(getRegOperandNumElts(MI, 32, 0), 32,
10610b57cec5SDimitry Andric MI->getOperand(NumOperands - 1).getImm(),
10620b57cec5SDimitry Andric ShuffleMask);
10630b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
10640b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
10650b57cec5SDimitry Andric break;
10660b57cec5SDimitry Andric
10670b57cec5SDimitry Andric CASE_VSHUF(64X2, r)
10680b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
10690b57cec5SDimitry Andric RegForm = true;
1070bdd1243dSDimitry Andric [[fallthrough]];
10710b57cec5SDimitry Andric
10720b57cec5SDimitry Andric CASE_VSHUF(64X2, m)
10730b57cec5SDimitry Andric decodeVSHUF64x2FamilyMask(getRegOperandNumElts(MI, 64, 0), 64,
10740b57cec5SDimitry Andric MI->getOperand(NumOperands - 1).getImm(),
10750b57cec5SDimitry Andric ShuffleMask);
10760b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
10770b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
10780b57cec5SDimitry Andric break;
10790b57cec5SDimitry Andric
10800b57cec5SDimitry Andric CASE_VSHUF(32X4, r)
10810b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
10820b57cec5SDimitry Andric RegForm = true;
1083bdd1243dSDimitry Andric [[fallthrough]];
10840b57cec5SDimitry Andric
10850b57cec5SDimitry Andric CASE_VSHUF(32X4, m)
10860b57cec5SDimitry Andric decodeVSHUF64x2FamilyMask(getRegOperandNumElts(MI, 32, 0), 32,
10870b57cec5SDimitry Andric MI->getOperand(NumOperands - 1).getImm(),
10880b57cec5SDimitry Andric ShuffleMask);
10890b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
10900b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
10910b57cec5SDimitry Andric break;
10920b57cec5SDimitry Andric
10930b57cec5SDimitry Andric CASE_UNPCK(UNPCKLPD, r)
10940b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
10950b57cec5SDimitry Andric RegForm = true;
1096bdd1243dSDimitry Andric [[fallthrough]];
10970b57cec5SDimitry Andric
10980b57cec5SDimitry Andric CASE_UNPCK(UNPCKLPD, m)
10990b57cec5SDimitry Andric DecodeUNPCKLMask(getRegOperandNumElts(MI, 64, 0), 64, ShuffleMask);
11000b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
11010b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
11020b57cec5SDimitry Andric break;
11030b57cec5SDimitry Andric
11040b57cec5SDimitry Andric CASE_UNPCK(UNPCKLPS, r)
11050b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
11060b57cec5SDimitry Andric RegForm = true;
1107bdd1243dSDimitry Andric [[fallthrough]];
11080b57cec5SDimitry Andric
11090b57cec5SDimitry Andric CASE_UNPCK(UNPCKLPS, m)
11100b57cec5SDimitry Andric DecodeUNPCKLMask(getRegOperandNumElts(MI, 32, 0), 32, ShuffleMask);
11110b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
11120b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
11130b57cec5SDimitry Andric break;
11140b57cec5SDimitry Andric
11150b57cec5SDimitry Andric CASE_UNPCK(UNPCKHPD, r)
11160b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
11170b57cec5SDimitry Andric RegForm = true;
1118bdd1243dSDimitry Andric [[fallthrough]];
11190b57cec5SDimitry Andric
11200b57cec5SDimitry Andric CASE_UNPCK(UNPCKHPD, m)
11210b57cec5SDimitry Andric DecodeUNPCKHMask(getRegOperandNumElts(MI, 64, 0), 64, ShuffleMask);
11220b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
11230b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
11240b57cec5SDimitry Andric break;
11250b57cec5SDimitry Andric
11260b57cec5SDimitry Andric CASE_UNPCK(UNPCKHPS, r)
11270b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
11280b57cec5SDimitry Andric RegForm = true;
1129bdd1243dSDimitry Andric [[fallthrough]];
11300b57cec5SDimitry Andric
11310b57cec5SDimitry Andric CASE_UNPCK(UNPCKHPS, m)
11320b57cec5SDimitry Andric DecodeUNPCKHMask(getRegOperandNumElts(MI, 32, 0), 32, ShuffleMask);
11330b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
11340b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
11350b57cec5SDimitry Andric break;
11360b57cec5SDimitry Andric
11370b57cec5SDimitry Andric CASE_VPERMILPI(PERMILPS, r)
11380b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
1139bdd1243dSDimitry Andric [[fallthrough]];
11400b57cec5SDimitry Andric
11410b57cec5SDimitry Andric CASE_VPERMILPI(PERMILPS, m)
11420b57cec5SDimitry Andric if (MI->getOperand(NumOperands - 1).isImm())
11430b57cec5SDimitry Andric DecodePSHUFMask(getRegOperandNumElts(MI, 32, 0), 32,
11440b57cec5SDimitry Andric MI->getOperand(NumOperands - 1).getImm(),
11450b57cec5SDimitry Andric ShuffleMask);
11460b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
11470b57cec5SDimitry Andric break;
11480b57cec5SDimitry Andric
11490b57cec5SDimitry Andric CASE_VPERMILPI(PERMILPD, r)
11500b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
1151bdd1243dSDimitry Andric [[fallthrough]];
11520b57cec5SDimitry Andric
11530b57cec5SDimitry Andric CASE_VPERMILPI(PERMILPD, m)
11540b57cec5SDimitry Andric if (MI->getOperand(NumOperands - 1).isImm())
11550b57cec5SDimitry Andric DecodePSHUFMask(getRegOperandNumElts(MI, 64, 0), 64,
11560b57cec5SDimitry Andric MI->getOperand(NumOperands - 1).getImm(),
11570b57cec5SDimitry Andric ShuffleMask);
11580b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
11590b57cec5SDimitry Andric break;
11600b57cec5SDimitry Andric
11610b57cec5SDimitry Andric case X86::VPERM2F128rr:
11620b57cec5SDimitry Andric case X86::VPERM2I128rr:
11630b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(2).getReg());
1164bdd1243dSDimitry Andric [[fallthrough]];
11650b57cec5SDimitry Andric
11660b57cec5SDimitry Andric case X86::VPERM2F128rm:
11670b57cec5SDimitry Andric case X86::VPERM2I128rm:
11680b57cec5SDimitry Andric // For instruction comments purpose, assume the 256-bit vector is v4i64.
11690b57cec5SDimitry Andric if (MI->getOperand(NumOperands - 1).isImm())
11700b57cec5SDimitry Andric DecodeVPERM2X128Mask(4, MI->getOperand(NumOperands - 1).getImm(),
11710b57cec5SDimitry Andric ShuffleMask);
11720b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(1).getReg());
11730b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
11740b57cec5SDimitry Andric break;
11750b57cec5SDimitry Andric
11760b57cec5SDimitry Andric CASE_VPERM(PERMPD, r)
11770b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
1178bdd1243dSDimitry Andric [[fallthrough]];
11790b57cec5SDimitry Andric
11800b57cec5SDimitry Andric CASE_VPERM(PERMPD, m)
11810b57cec5SDimitry Andric if (MI->getOperand(NumOperands - 1).isImm())
11820b57cec5SDimitry Andric DecodeVPERMMask(getRegOperandNumElts(MI, 64, 0),
11830b57cec5SDimitry Andric MI->getOperand(NumOperands - 1).getImm(),
11840b57cec5SDimitry Andric ShuffleMask);
11850b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
11860b57cec5SDimitry Andric break;
11870b57cec5SDimitry Andric
11880b57cec5SDimitry Andric CASE_VPERM(PERMQ, r)
11890b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
1190bdd1243dSDimitry Andric [[fallthrough]];
11910b57cec5SDimitry Andric
11920b57cec5SDimitry Andric CASE_VPERM(PERMQ, m)
11930b57cec5SDimitry Andric if (MI->getOperand(NumOperands - 1).isImm())
11940b57cec5SDimitry Andric DecodeVPERMMask(getRegOperandNumElts(MI, 64, 0),
11950b57cec5SDimitry Andric MI->getOperand(NumOperands - 1).getImm(),
11960b57cec5SDimitry Andric ShuffleMask);
11970b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
11980b57cec5SDimitry Andric break;
11990b57cec5SDimitry Andric
12000b57cec5SDimitry Andric case X86::MOVSDrr:
12010b57cec5SDimitry Andric case X86::VMOVSDrr:
12020b57cec5SDimitry Andric case X86::VMOVSDZrr:
12030b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(2).getReg());
12040b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(1).getReg());
1205*7a6dacacSDimitry Andric DecodeScalarMoveMask(2, false, ShuffleMask);
12060b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
12070b57cec5SDimitry Andric break;
12080b57cec5SDimitry Andric
12090b57cec5SDimitry Andric case X86::MOVSSrr:
12100b57cec5SDimitry Andric case X86::VMOVSSrr:
12110b57cec5SDimitry Andric case X86::VMOVSSZrr:
12120b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(2).getReg());
12130b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(1).getReg());
1214*7a6dacacSDimitry Andric DecodeScalarMoveMask(4, false, ShuffleMask);
12150b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
12160b57cec5SDimitry Andric break;
12170b57cec5SDimitry Andric
12180b57cec5SDimitry Andric case X86::MOVPQI2QIrr:
12190b57cec5SDimitry Andric case X86::MOVZPQILo2PQIrr:
12200b57cec5SDimitry Andric case X86::VMOVPQI2QIrr:
12210b57cec5SDimitry Andric case X86::VMOVPQI2QIZrr:
12220b57cec5SDimitry Andric case X86::VMOVZPQILo2PQIrr:
12230b57cec5SDimitry Andric case X86::VMOVZPQILo2PQIZrr:
12240b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(1).getReg());
12250b57cec5SDimitry Andric DecodeZeroMoveLowMask(2, ShuffleMask);
12260b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
12270b57cec5SDimitry Andric break;
12280b57cec5SDimitry Andric
12290b57cec5SDimitry Andric case X86::EXTRQI:
12300b57cec5SDimitry Andric if (MI->getOperand(2).isImm() &&
12310b57cec5SDimitry Andric MI->getOperand(3).isImm())
12320b57cec5SDimitry Andric DecodeEXTRQIMask(16, 8, MI->getOperand(2).getImm(),
12330b57cec5SDimitry Andric MI->getOperand(3).getImm(), ShuffleMask);
12340b57cec5SDimitry Andric
12350b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
12360b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(1).getReg());
12370b57cec5SDimitry Andric break;
12380b57cec5SDimitry Andric
12390b57cec5SDimitry Andric case X86::INSERTQI:
12400b57cec5SDimitry Andric if (MI->getOperand(3).isImm() &&
12410b57cec5SDimitry Andric MI->getOperand(4).isImm())
12420b57cec5SDimitry Andric DecodeINSERTQIMask(16, 8, MI->getOperand(3).getImm(),
12430b57cec5SDimitry Andric MI->getOperand(4).getImm(), ShuffleMask);
12440b57cec5SDimitry Andric
12450b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
12460b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(1).getReg());
12470b57cec5SDimitry Andric Src2Name = getRegName(MI->getOperand(2).getReg());
12480b57cec5SDimitry Andric break;
12490b57cec5SDimitry Andric
12505f757f3fSDimitry Andric case X86::VBROADCASTF128rm:
12515f757f3fSDimitry Andric case X86::VBROADCASTI128rm:
12520b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(BROADCASTF64X2, Z128, rm)
12530b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(BROADCASTI64X2, Z128, rm)
12540b57cec5SDimitry Andric DecodeSubVectorBroadcast(4, 2, ShuffleMask);
12550b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
12560b57cec5SDimitry Andric break;
12570b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(BROADCASTF64X2, , rm)
12580b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(BROADCASTI64X2, , rm)
12590b57cec5SDimitry Andric DecodeSubVectorBroadcast(8, 2, ShuffleMask);
12600b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
12610b57cec5SDimitry Andric break;
12620b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(BROADCASTF64X4, , rm)
12630b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(BROADCASTI64X4, , rm)
12640b57cec5SDimitry Andric DecodeSubVectorBroadcast(8, 4, ShuffleMask);
12650b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
12660b57cec5SDimitry Andric break;
12670b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(BROADCASTF32X4, Z256, rm)
12680b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(BROADCASTI32X4, Z256, rm)
12690b57cec5SDimitry Andric DecodeSubVectorBroadcast(8, 4, ShuffleMask);
12700b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
12710b57cec5SDimitry Andric break;
12720b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(BROADCASTF32X4, , rm)
12730b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(BROADCASTI32X4, , rm)
12740b57cec5SDimitry Andric DecodeSubVectorBroadcast(16, 4, ShuffleMask);
12750b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
12760b57cec5SDimitry Andric break;
12770b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(BROADCASTF32X8, , rm)
12780b57cec5SDimitry Andric CASE_AVX512_INS_COMMON(BROADCASTI32X8, , rm)
12790b57cec5SDimitry Andric DecodeSubVectorBroadcast(16, 8, ShuffleMask);
12800b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
12810b57cec5SDimitry Andric break;
12825ffd83dbSDimitry Andric CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z128, rr)
12830b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1284bdd1243dSDimitry Andric [[fallthrough]];
12855ffd83dbSDimitry Andric CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z128, rm)
12860b57cec5SDimitry Andric DecodeSubVectorBroadcast(4, 2, ShuffleMask);
12870b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
12880b57cec5SDimitry Andric break;
12895ffd83dbSDimitry Andric CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z256, rr)
12905ffd83dbSDimitry Andric CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z256, rr)
12910b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1292bdd1243dSDimitry Andric [[fallthrough]];
12935ffd83dbSDimitry Andric CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z256, rm)
12945ffd83dbSDimitry Andric CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z256, rm)
12950b57cec5SDimitry Andric DecodeSubVectorBroadcast(8, 2, ShuffleMask);
12960b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
12970b57cec5SDimitry Andric break;
12985ffd83dbSDimitry Andric CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z, rr)
12995ffd83dbSDimitry Andric CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z, rr)
13000b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1301bdd1243dSDimitry Andric [[fallthrough]];
13025ffd83dbSDimitry Andric CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z, rm)
13035ffd83dbSDimitry Andric CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z, rm)
13040b57cec5SDimitry Andric DecodeSubVectorBroadcast(16, 2, ShuffleMask);
13050b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
13060b57cec5SDimitry Andric break;
13070b57cec5SDimitry Andric
13080b57cec5SDimitry Andric CASE_PMOVZX(PMOVZXBW, r)
13090b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
13100b57cec5SDimitry Andric DecodeZeroExtendMask(8, 16, getRegOperandNumElts(MI, 16, 0), false,
13110b57cec5SDimitry Andric ShuffleMask);
13120b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
13130b57cec5SDimitry Andric break;
13140b57cec5SDimitry Andric
13150b57cec5SDimitry Andric CASE_PMOVZX(PMOVZXBD, r)
13160b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
13170b57cec5SDimitry Andric DecodeZeroExtendMask(8, 32, getRegOperandNumElts(MI, 32, 0), false,
13180b57cec5SDimitry Andric ShuffleMask);
13190b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
13200b57cec5SDimitry Andric break;
13210b57cec5SDimitry Andric
13220b57cec5SDimitry Andric CASE_PMOVZX(PMOVZXBQ, r)
13230b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
13240b57cec5SDimitry Andric DecodeZeroExtendMask(8, 64, getRegOperandNumElts(MI, 64, 0), false,
13250b57cec5SDimitry Andric ShuffleMask);
13260b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
13270b57cec5SDimitry Andric break;
13280b57cec5SDimitry Andric
13290b57cec5SDimitry Andric CASE_PMOVZX(PMOVZXWD, r)
13300b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
13310b57cec5SDimitry Andric DecodeZeroExtendMask(16, 32, getRegOperandNumElts(MI, 32, 0), false,
13320b57cec5SDimitry Andric ShuffleMask);
13330b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
13340b57cec5SDimitry Andric break;
13350b57cec5SDimitry Andric
13360b57cec5SDimitry Andric CASE_PMOVZX(PMOVZXWQ, r)
13370b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
13380b57cec5SDimitry Andric DecodeZeroExtendMask(16, 64, getRegOperandNumElts(MI, 64, 0), false,
13390b57cec5SDimitry Andric ShuffleMask);
13400b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
13410b57cec5SDimitry Andric break;
13420b57cec5SDimitry Andric
13430b57cec5SDimitry Andric CASE_PMOVZX(PMOVZXDQ, r)
13440b57cec5SDimitry Andric Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
13450b57cec5SDimitry Andric DecodeZeroExtendMask(32, 64, getRegOperandNumElts(MI, 64, 0), false,
13460b57cec5SDimitry Andric ShuffleMask);
13470b57cec5SDimitry Andric DestName = getRegName(MI->getOperand(0).getReg());
13480b57cec5SDimitry Andric break;
13490b57cec5SDimitry Andric }
13500b57cec5SDimitry Andric
13510b57cec5SDimitry Andric // The only comments we decode are shuffles, so give up if we were unable to
13520b57cec5SDimitry Andric // decode a shuffle mask.
13530b57cec5SDimitry Andric if (ShuffleMask.empty())
13540b57cec5SDimitry Andric return false;
13550b57cec5SDimitry Andric
13560b57cec5SDimitry Andric if (!DestName) DestName = Src1Name;
13570b57cec5SDimitry Andric if (DestName) {
13580b57cec5SDimitry Andric OS << DestName;
13590b57cec5SDimitry Andric printMasking(OS, MI, MCII);
13600b57cec5SDimitry Andric } else
13610b57cec5SDimitry Andric OS << "mem";
13620b57cec5SDimitry Andric
13630b57cec5SDimitry Andric OS << " = ";
13640b57cec5SDimitry Andric
13650b57cec5SDimitry Andric // If the two sources are the same, canonicalize the input elements to be
13660b57cec5SDimitry Andric // from the first src so that we get larger element spans.
13670b57cec5SDimitry Andric if (Src1Name == Src2Name) {
13680b57cec5SDimitry Andric for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
13690b57cec5SDimitry Andric if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
13700b57cec5SDimitry Andric ShuffleMask[i] >= (int)e) // From second mask.
13710b57cec5SDimitry Andric ShuffleMask[i] -= e;
13720b57cec5SDimitry Andric }
13730b57cec5SDimitry Andric }
13740b57cec5SDimitry Andric
13750b57cec5SDimitry Andric // The shuffle mask specifies which elements of the src1/src2 fill in the
13760b57cec5SDimitry Andric // destination, with a few sentinel values. Loop through and print them
13770b57cec5SDimitry Andric // out.
13780b57cec5SDimitry Andric for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
13790b57cec5SDimitry Andric if (i != 0)
13800b57cec5SDimitry Andric OS << ',';
13810b57cec5SDimitry Andric if (ShuffleMask[i] == SM_SentinelZero) {
13820b57cec5SDimitry Andric OS << "zero";
13830b57cec5SDimitry Andric continue;
13840b57cec5SDimitry Andric }
13850b57cec5SDimitry Andric
13860b57cec5SDimitry Andric // Otherwise, it must come from src1 or src2. Print the span of elements
13870b57cec5SDimitry Andric // that comes from this src.
13880b57cec5SDimitry Andric bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
13890b57cec5SDimitry Andric const char *SrcName = isSrc1 ? Src1Name : Src2Name;
13900b57cec5SDimitry Andric OS << (SrcName ? SrcName : "mem") << '[';
13910b57cec5SDimitry Andric bool IsFirst = true;
13920b57cec5SDimitry Andric while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
13930b57cec5SDimitry Andric (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
13940b57cec5SDimitry Andric if (!IsFirst)
13950b57cec5SDimitry Andric OS << ',';
13960b57cec5SDimitry Andric else
13970b57cec5SDimitry Andric IsFirst = false;
13980b57cec5SDimitry Andric if (ShuffleMask[i] == SM_SentinelUndef)
13990b57cec5SDimitry Andric OS << "u";
14000b57cec5SDimitry Andric else
14010b57cec5SDimitry Andric OS << ShuffleMask[i] % ShuffleMask.size();
14020b57cec5SDimitry Andric ++i;
14030b57cec5SDimitry Andric }
14040b57cec5SDimitry Andric OS << ']';
14050b57cec5SDimitry Andric --i; // For loop increments element #.
14060b57cec5SDimitry Andric }
14070b57cec5SDimitry Andric OS << '\n';
14080b57cec5SDimitry Andric
14090b57cec5SDimitry Andric // We successfully added a comment to this instruction.
14100b57cec5SDimitry Andric return true;
14110b57cec5SDimitry Andric }
1412