xref: /freebsd/contrib/llvm-project/llvm/lib/Target/X86/MCTargetDesc/X86InstComments.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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