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 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 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 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. 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 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. 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