1 //===-- X86InstComments.cpp - Generate verbose-asm comments for instrs ----===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This defines functionality used to emit comments about X86 instructions to 11 // an output stream for -fverbose-asm. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "X86InstComments.h" 16 #include "MCTargetDesc/X86MCTargetDesc.h" 17 #include "Utils/X86ShuffleDecode.h" 18 #include "llvm/MC/MCInst.h" 19 #include "llvm/CodeGen/MachineValueType.h" 20 #include "llvm/Support/raw_ostream.h" 21 22 using namespace llvm; 23 24 #define CASE_SSE_INS_COMMON(Inst, src) \ 25 case X86::Inst##src: 26 27 #define CASE_AVX_INS_COMMON(Inst, Suffix, src) \ 28 case X86::V##Inst##Suffix##src: 29 30 #define CASE_MASK_INS_COMMON(Inst, Suffix, src) \ 31 case X86::V##Inst##Suffix##src##k: 32 33 #define CASE_MASKZ_INS_COMMON(Inst, Suffix, src) \ 34 case X86::V##Inst##Suffix##src##kz: 35 36 #define CASE_AVX512_INS_COMMON(Inst, Suffix, src) \ 37 CASE_AVX_INS_COMMON(Inst, Suffix, src) \ 38 CASE_MASK_INS_COMMON(Inst, Suffix, src) \ 39 CASE_MASKZ_INS_COMMON(Inst, Suffix, src) 40 41 #define CASE_MOVDUP(Inst, src) \ 42 CASE_AVX512_INS_COMMON(Inst, Z, r##src) \ 43 CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \ 44 CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \ 45 CASE_AVX_INS_COMMON(Inst, , r##src) \ 46 CASE_AVX_INS_COMMON(Inst, Y, r##src) \ 47 CASE_SSE_INS_COMMON(Inst, r##src) 48 49 #define CASE_MASK_MOVDUP(Inst, src) \ 50 CASE_MASK_INS_COMMON(Inst, Z, r##src) \ 51 CASE_MASK_INS_COMMON(Inst, Z256, r##src) \ 52 CASE_MASK_INS_COMMON(Inst, Z128, r##src) 53 54 #define CASE_MASKZ_MOVDUP(Inst, src) \ 55 CASE_MASKZ_INS_COMMON(Inst, Z, r##src) \ 56 CASE_MASKZ_INS_COMMON(Inst, Z256, r##src) \ 57 CASE_MASKZ_INS_COMMON(Inst, Z128, r##src) 58 59 #define CASE_PMOVZX(Inst, src) \ 60 CASE_AVX512_INS_COMMON(Inst, Z, r##src) \ 61 CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \ 62 CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \ 63 CASE_AVX_INS_COMMON(Inst, , r##src) \ 64 CASE_AVX_INS_COMMON(Inst, Y, r##src) \ 65 CASE_SSE_INS_COMMON(Inst, r##src) 66 67 #define CASE_MASK_PMOVZX(Inst, src) \ 68 CASE_MASK_INS_COMMON(Inst, Z, r##src) \ 69 CASE_MASK_INS_COMMON(Inst, Z256, r##src) \ 70 CASE_MASK_INS_COMMON(Inst, Z128, r##src) 71 72 #define CASE_MASKZ_PMOVZX(Inst, src) \ 73 CASE_MASKZ_INS_COMMON(Inst, Z, r##src) \ 74 CASE_MASKZ_INS_COMMON(Inst, Z256, r##src) \ 75 CASE_MASKZ_INS_COMMON(Inst, Z128, r##src) 76 77 #define CASE_UNPCK(Inst, src) \ 78 CASE_AVX512_INS_COMMON(Inst, Z, r##src) \ 79 CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \ 80 CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \ 81 CASE_AVX_INS_COMMON(Inst, , r##src) \ 82 CASE_AVX_INS_COMMON(Inst, Y, r##src) \ 83 CASE_SSE_INS_COMMON(Inst, r##src) 84 85 #define CASE_MASK_UNPCK(Inst, src) \ 86 CASE_MASK_INS_COMMON(Inst, Z, r##src) \ 87 CASE_MASK_INS_COMMON(Inst, Z256, r##src) \ 88 CASE_MASK_INS_COMMON(Inst, Z128, r##src) 89 90 #define CASE_MASKZ_UNPCK(Inst, src) \ 91 CASE_MASKZ_INS_COMMON(Inst, Z, r##src) \ 92 CASE_MASKZ_INS_COMMON(Inst, Z256, r##src) \ 93 CASE_MASKZ_INS_COMMON(Inst, Z128, r##src) 94 95 #define CASE_SHUF(Inst, suf) \ 96 CASE_AVX512_INS_COMMON(Inst, Z, suf) \ 97 CASE_AVX512_INS_COMMON(Inst, Z256, suf) \ 98 CASE_AVX512_INS_COMMON(Inst, Z128, suf) \ 99 CASE_AVX_INS_COMMON(Inst, , suf) \ 100 CASE_AVX_INS_COMMON(Inst, Y, suf) \ 101 CASE_SSE_INS_COMMON(Inst, suf) 102 103 #define CASE_MASK_SHUF(Inst, src) \ 104 CASE_MASK_INS_COMMON(Inst, Z, r##src##i) \ 105 CASE_MASK_INS_COMMON(Inst, Z256, r##src##i) \ 106 CASE_MASK_INS_COMMON(Inst, Z128, r##src##i) 107 108 #define CASE_MASKZ_SHUF(Inst, src) \ 109 CASE_MASKZ_INS_COMMON(Inst, Z, r##src##i) \ 110 CASE_MASKZ_INS_COMMON(Inst, Z256, r##src##i) \ 111 CASE_MASKZ_INS_COMMON(Inst, Z128, r##src##i) 112 113 #define CASE_VPERMILPI(Inst, src) \ 114 CASE_AVX512_INS_COMMON(Inst, Z, src##i) \ 115 CASE_AVX512_INS_COMMON(Inst, Z256, src##i) \ 116 CASE_AVX512_INS_COMMON(Inst, Z128, src##i) \ 117 CASE_AVX_INS_COMMON(Inst, , src##i) \ 118 CASE_AVX_INS_COMMON(Inst, Y, src##i) 119 120 #define CASE_MASK_VPERMILPI(Inst, src) \ 121 CASE_MASK_INS_COMMON(Inst, Z, src##i) \ 122 CASE_MASK_INS_COMMON(Inst, Z256, src##i) \ 123 CASE_MASK_INS_COMMON(Inst, Z128, src##i) 124 125 #define CASE_MASKZ_VPERMILPI(Inst, src) \ 126 CASE_MASKZ_INS_COMMON(Inst, Z, src##i) \ 127 CASE_MASKZ_INS_COMMON(Inst, Z256, src##i) \ 128 CASE_MASKZ_INS_COMMON(Inst, Z128, src##i) 129 130 #define CASE_VPERM(Inst, src) \ 131 CASE_AVX512_INS_COMMON(Inst, Z, src##i) \ 132 CASE_AVX512_INS_COMMON(Inst, Z256, src##i) \ 133 CASE_AVX_INS_COMMON(Inst, Y, src##i) 134 135 #define CASE_MASK_VPERM(Inst, src) \ 136 CASE_MASK_INS_COMMON(Inst, Z, src##i) \ 137 CASE_MASK_INS_COMMON(Inst, Z256, src##i) 138 139 #define CASE_MASKZ_VPERM(Inst, src) \ 140 CASE_MASKZ_INS_COMMON(Inst, Z, src##i) \ 141 CASE_MASKZ_INS_COMMON(Inst, Z256, src##i) 142 143 #define CASE_VSHUF(Inst, src) \ 144 CASE_AVX512_INS_COMMON(SHUFF##Inst, Z, r##src##i) \ 145 CASE_AVX512_INS_COMMON(SHUFI##Inst, Z, r##src##i) \ 146 CASE_AVX512_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \ 147 CASE_AVX512_INS_COMMON(SHUFI##Inst, Z256, r##src##i) 148 149 #define CASE_MASK_VSHUF(Inst, src) \ 150 CASE_MASK_INS_COMMON(SHUFF##Inst, Z, r##src##i) \ 151 CASE_MASK_INS_COMMON(SHUFI##Inst, Z, r##src##i) \ 152 CASE_MASK_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \ 153 CASE_MASK_INS_COMMON(SHUFI##Inst, Z256, r##src##i) 154 155 #define CASE_MASKZ_VSHUF(Inst, src) \ 156 CASE_MASKZ_INS_COMMON(SHUFF##Inst, Z, r##src##i) \ 157 CASE_MASKZ_INS_COMMON(SHUFI##Inst, Z, r##src##i) \ 158 CASE_MASKZ_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \ 159 CASE_MASKZ_INS_COMMON(SHUFI##Inst, Z256, r##src##i) 160 161 static unsigned getVectorRegSize(unsigned RegNo) { 162 if (X86::ZMM0 <= RegNo && RegNo <= X86::ZMM31) 163 return 512; 164 if (X86::YMM0 <= RegNo && RegNo <= X86::YMM31) 165 return 256; 166 if (X86::XMM0 <= RegNo && RegNo <= X86::XMM31) 167 return 128; 168 if (X86::MM0 <= RegNo && RegNo <= X86::MM7) 169 return 64; 170 171 llvm_unreachable("Unknown vector reg!"); 172 } 173 174 static MVT getRegOperandVectorVT(const MCInst *MI, const MVT &ScalarVT, 175 unsigned OperandIndex) { 176 unsigned OpReg = MI->getOperand(OperandIndex).getReg(); 177 return MVT::getVectorVT(ScalarVT, 178 getVectorRegSize(OpReg)/ScalarVT.getSizeInBits()); 179 } 180 181 /// \brief Extracts the dst type for a given zero extension instruction. 182 static MVT getZeroExtensionResultType(const MCInst *MI) { 183 switch (MI->getOpcode()) { 184 default: 185 llvm_unreachable("Unknown zero extension instruction"); 186 // zero extension to i16 187 CASE_PMOVZX(PMOVZXBW, m) 188 CASE_PMOVZX(PMOVZXBW, r) 189 return getRegOperandVectorVT(MI, MVT::i16, 0); 190 // zero extension to i32 191 CASE_PMOVZX(PMOVZXBD, m) 192 CASE_PMOVZX(PMOVZXBD, r) 193 CASE_PMOVZX(PMOVZXWD, m) 194 CASE_PMOVZX(PMOVZXWD, r) 195 return getRegOperandVectorVT(MI, MVT::i32, 0); 196 // zero extension to i64 197 CASE_PMOVZX(PMOVZXBQ, m) 198 CASE_PMOVZX(PMOVZXBQ, r) 199 CASE_PMOVZX(PMOVZXWQ, m) 200 CASE_PMOVZX(PMOVZXWQ, r) 201 CASE_PMOVZX(PMOVZXDQ, m) 202 CASE_PMOVZX(PMOVZXDQ, r) 203 return getRegOperandVectorVT(MI, MVT::i64, 0); 204 } 205 } 206 207 /// Wraps the destination register name with AVX512 mask/maskz filtering. 208 static std::string getMaskName(const MCInst *MI, const char *DestName, 209 const char *(*getRegName)(unsigned)) { 210 std::string OpMaskName(DestName); 211 212 bool MaskWithZero = false; 213 const char *MaskRegName = nullptr; 214 215 switch (MI->getOpcode()) { 216 default: 217 return OpMaskName; 218 CASE_MASKZ_MOVDUP(MOVDDUP, m) 219 CASE_MASKZ_MOVDUP(MOVDDUP, r) 220 CASE_MASKZ_MOVDUP(MOVSHDUP, m) 221 CASE_MASKZ_MOVDUP(MOVSHDUP, r) 222 CASE_MASKZ_MOVDUP(MOVSLDUP, m) 223 CASE_MASKZ_MOVDUP(MOVSLDUP, r) 224 CASE_MASKZ_PMOVZX(PMOVZXBD, m) 225 CASE_MASKZ_PMOVZX(PMOVZXBD, r) 226 CASE_MASKZ_PMOVZX(PMOVZXBQ, m) 227 CASE_MASKZ_PMOVZX(PMOVZXBQ, r) 228 CASE_MASKZ_PMOVZX(PMOVZXBW, m) 229 CASE_MASKZ_PMOVZX(PMOVZXBW, r) 230 CASE_MASKZ_PMOVZX(PMOVZXDQ, m) 231 CASE_MASKZ_PMOVZX(PMOVZXDQ, r) 232 CASE_MASKZ_PMOVZX(PMOVZXWD, m) 233 CASE_MASKZ_PMOVZX(PMOVZXWD, r) 234 CASE_MASKZ_PMOVZX(PMOVZXWQ, m) 235 CASE_MASKZ_PMOVZX(PMOVZXWQ, r) 236 CASE_MASKZ_UNPCK(PUNPCKHBW, m) 237 CASE_MASKZ_UNPCK(PUNPCKHBW, r) 238 CASE_MASKZ_UNPCK(PUNPCKHWD, m) 239 CASE_MASKZ_UNPCK(PUNPCKHWD, r) 240 CASE_MASKZ_UNPCK(PUNPCKHDQ, m) 241 CASE_MASKZ_UNPCK(PUNPCKHDQ, r) 242 CASE_MASKZ_UNPCK(PUNPCKLBW, m) 243 CASE_MASKZ_UNPCK(PUNPCKLBW, r) 244 CASE_MASKZ_UNPCK(PUNPCKLWD, m) 245 CASE_MASKZ_UNPCK(PUNPCKLWD, r) 246 CASE_MASKZ_UNPCK(PUNPCKLDQ, m) 247 CASE_MASKZ_UNPCK(PUNPCKLDQ, r) 248 CASE_MASKZ_UNPCK(UNPCKHPD, m) 249 CASE_MASKZ_UNPCK(UNPCKHPD, r) 250 CASE_MASKZ_UNPCK(UNPCKHPS, m) 251 CASE_MASKZ_UNPCK(UNPCKHPS, r) 252 CASE_MASKZ_UNPCK(UNPCKLPD, m) 253 CASE_MASKZ_UNPCK(UNPCKLPD, r) 254 CASE_MASKZ_UNPCK(UNPCKLPS, m) 255 CASE_MASKZ_UNPCK(UNPCKLPS, r) 256 CASE_MASKZ_SHUF(PALIGNR, r) 257 CASE_MASKZ_SHUF(PALIGNR, m) 258 CASE_MASKZ_SHUF(SHUFPD, m) 259 CASE_MASKZ_SHUF(SHUFPD, r) 260 CASE_MASKZ_SHUF(SHUFPS, m) 261 CASE_MASKZ_SHUF(SHUFPS, r) 262 CASE_MASKZ_VPERMILPI(PERMILPD, m) 263 CASE_MASKZ_VPERMILPI(PERMILPD, r) 264 CASE_MASKZ_VPERMILPI(PERMILPS, m) 265 CASE_MASKZ_VPERMILPI(PERMILPS, r) 266 CASE_MASKZ_VPERMILPI(PSHUFD, m) 267 CASE_MASKZ_VPERMILPI(PSHUFD, r) 268 CASE_MASKZ_VPERMILPI(PSHUFHW, m) 269 CASE_MASKZ_VPERMILPI(PSHUFHW, r) 270 CASE_MASKZ_VPERMILPI(PSHUFLW, m) 271 CASE_MASKZ_VPERMILPI(PSHUFLW, r) 272 CASE_MASKZ_VPERM(PERMPD, m) 273 CASE_MASKZ_VPERM(PERMPD, r) 274 CASE_MASKZ_VPERM(PERMQ, m) 275 CASE_MASKZ_VPERM(PERMQ, r) 276 CASE_MASKZ_VSHUF(64X2, m) 277 CASE_MASKZ_VSHUF(64X2, r) 278 CASE_MASKZ_VSHUF(32X4, m) 279 CASE_MASKZ_VSHUF(32X4, r) 280 MaskWithZero = true; 281 MaskRegName = getRegName(MI->getOperand(1).getReg()); 282 break; 283 CASE_MASK_MOVDUP(MOVDDUP, m) 284 CASE_MASK_MOVDUP(MOVDDUP, r) 285 CASE_MASK_MOVDUP(MOVSHDUP, m) 286 CASE_MASK_MOVDUP(MOVSHDUP, r) 287 CASE_MASK_MOVDUP(MOVSLDUP, m) 288 CASE_MASK_MOVDUP(MOVSLDUP, r) 289 CASE_MASK_PMOVZX(PMOVZXBD, m) 290 CASE_MASK_PMOVZX(PMOVZXBD, r) 291 CASE_MASK_PMOVZX(PMOVZXBQ, m) 292 CASE_MASK_PMOVZX(PMOVZXBQ, r) 293 CASE_MASK_PMOVZX(PMOVZXBW, m) 294 CASE_MASK_PMOVZX(PMOVZXBW, r) 295 CASE_MASK_PMOVZX(PMOVZXDQ, m) 296 CASE_MASK_PMOVZX(PMOVZXDQ, r) 297 CASE_MASK_PMOVZX(PMOVZXWD, m) 298 CASE_MASK_PMOVZX(PMOVZXWD, r) 299 CASE_MASK_PMOVZX(PMOVZXWQ, m) 300 CASE_MASK_PMOVZX(PMOVZXWQ, r) 301 CASE_MASK_UNPCK(PUNPCKHBW, m) 302 CASE_MASK_UNPCK(PUNPCKHBW, r) 303 CASE_MASK_UNPCK(PUNPCKHWD, m) 304 CASE_MASK_UNPCK(PUNPCKHWD, r) 305 CASE_MASK_UNPCK(PUNPCKHDQ, m) 306 CASE_MASK_UNPCK(PUNPCKHDQ, r) 307 CASE_MASK_UNPCK(PUNPCKLBW, m) 308 CASE_MASK_UNPCK(PUNPCKLBW, r) 309 CASE_MASK_UNPCK(PUNPCKLWD, m) 310 CASE_MASK_UNPCK(PUNPCKLWD, r) 311 CASE_MASK_UNPCK(PUNPCKLDQ, m) 312 CASE_MASK_UNPCK(PUNPCKLDQ, r) 313 CASE_MASK_UNPCK(UNPCKHPD, m) 314 CASE_MASK_UNPCK(UNPCKHPD, r) 315 CASE_MASK_UNPCK(UNPCKHPS, m) 316 CASE_MASK_UNPCK(UNPCKHPS, r) 317 CASE_MASK_UNPCK(UNPCKLPD, m) 318 CASE_MASK_UNPCK(UNPCKLPD, r) 319 CASE_MASK_UNPCK(UNPCKLPS, m) 320 CASE_MASK_UNPCK(UNPCKLPS, r) 321 CASE_MASK_SHUF(PALIGNR, r) 322 CASE_MASK_SHUF(PALIGNR, m) 323 CASE_MASK_SHUF(SHUFPD, m) 324 CASE_MASK_SHUF(SHUFPD, r) 325 CASE_MASK_SHUF(SHUFPS, m) 326 CASE_MASK_SHUF(SHUFPS, r) 327 CASE_MASK_VPERMILPI(PERMILPD, m) 328 CASE_MASK_VPERMILPI(PERMILPD, r) 329 CASE_MASK_VPERMILPI(PERMILPS, m) 330 CASE_MASK_VPERMILPI(PERMILPS, r) 331 CASE_MASK_VPERMILPI(PSHUFD, m) 332 CASE_MASK_VPERMILPI(PSHUFD, r) 333 CASE_MASK_VPERMILPI(PSHUFHW, m) 334 CASE_MASK_VPERMILPI(PSHUFHW, r) 335 CASE_MASK_VPERMILPI(PSHUFLW, m) 336 CASE_MASK_VPERMILPI(PSHUFLW, r) 337 CASE_MASK_VPERM(PERMPD, m) 338 CASE_MASK_VPERM(PERMPD, r) 339 CASE_MASK_VPERM(PERMQ, m) 340 CASE_MASK_VPERM(PERMQ, r) 341 CASE_MASK_VSHUF(64X2, m) 342 CASE_MASK_VSHUF(64X2, r) 343 CASE_MASK_VSHUF(32X4, m) 344 CASE_MASK_VSHUF(32X4, r) 345 MaskRegName = getRegName(MI->getOperand(2).getReg()); 346 break; 347 } 348 349 // MASK: zmmX {%kY} 350 OpMaskName += " {%"; 351 OpMaskName += MaskRegName; 352 OpMaskName += "}"; 353 354 // MASKZ: zmmX {%kY} {z} 355 if (MaskWithZero) 356 OpMaskName += " {z}"; 357 358 return OpMaskName; 359 } 360 361 //===----------------------------------------------------------------------===// 362 // Top Level Entrypoint 363 //===----------------------------------------------------------------------===// 364 365 /// EmitAnyX86InstComments - This function decodes x86 instructions and prints 366 /// newline terminated strings to the specified string if desired. This 367 /// information is shown in disassembly dumps when verbose assembly is enabled. 368 bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS, 369 const char *(*getRegName)(unsigned)) { 370 // If this is a shuffle operation, the switch should fill in this state. 371 SmallVector<int, 8> ShuffleMask; 372 const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr; 373 unsigned NumOperands = MI->getNumOperands(); 374 bool RegForm = false; 375 376 switch (MI->getOpcode()) { 377 default: 378 // Not an instruction for which we can decode comments. 379 return false; 380 381 case X86::BLENDPDrri: 382 case X86::VBLENDPDrri: 383 case X86::VBLENDPDYrri: 384 Src2Name = getRegName(MI->getOperand(2).getReg()); 385 // FALL THROUGH. 386 case X86::BLENDPDrmi: 387 case X86::VBLENDPDrmi: 388 case X86::VBLENDPDYrmi: 389 if (MI->getOperand(NumOperands - 1).isImm()) 390 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f64, 0), 391 MI->getOperand(NumOperands - 1).getImm(), 392 ShuffleMask); 393 Src1Name = getRegName(MI->getOperand(1).getReg()); 394 DestName = getRegName(MI->getOperand(0).getReg()); 395 break; 396 397 case X86::BLENDPSrri: 398 case X86::VBLENDPSrri: 399 case X86::VBLENDPSYrri: 400 Src2Name = getRegName(MI->getOperand(2).getReg()); 401 // FALL THROUGH. 402 case X86::BLENDPSrmi: 403 case X86::VBLENDPSrmi: 404 case X86::VBLENDPSYrmi: 405 if (MI->getOperand(NumOperands - 1).isImm()) 406 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f32, 0), 407 MI->getOperand(NumOperands - 1).getImm(), 408 ShuffleMask); 409 Src1Name = getRegName(MI->getOperand(1).getReg()); 410 DestName = getRegName(MI->getOperand(0).getReg()); 411 break; 412 413 case X86::PBLENDWrri: 414 case X86::VPBLENDWrri: 415 case X86::VPBLENDWYrri: 416 Src2Name = getRegName(MI->getOperand(2).getReg()); 417 // FALL THROUGH. 418 case X86::PBLENDWrmi: 419 case X86::VPBLENDWrmi: 420 case X86::VPBLENDWYrmi: 421 if (MI->getOperand(NumOperands - 1).isImm()) 422 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i16, 0), 423 MI->getOperand(NumOperands - 1).getImm(), 424 ShuffleMask); 425 Src1Name = getRegName(MI->getOperand(1).getReg()); 426 DestName = getRegName(MI->getOperand(0).getReg()); 427 break; 428 429 case X86::VPBLENDDrri: 430 case X86::VPBLENDDYrri: 431 Src2Name = getRegName(MI->getOperand(2).getReg()); 432 // FALL THROUGH. 433 case X86::VPBLENDDrmi: 434 case X86::VPBLENDDYrmi: 435 if (MI->getOperand(NumOperands - 1).isImm()) 436 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i32, 0), 437 MI->getOperand(NumOperands - 1).getImm(), 438 ShuffleMask); 439 Src1Name = getRegName(MI->getOperand(1).getReg()); 440 DestName = getRegName(MI->getOperand(0).getReg()); 441 break; 442 443 case X86::INSERTPSrr: 444 case X86::VINSERTPSrr: 445 case X86::VINSERTPSzrr: 446 Src2Name = getRegName(MI->getOperand(2).getReg()); 447 // FALL THROUGH. 448 case X86::INSERTPSrm: 449 case X86::VINSERTPSrm: 450 case X86::VINSERTPSzrm: 451 DestName = getRegName(MI->getOperand(0).getReg()); 452 Src1Name = getRegName(MI->getOperand(1).getReg()); 453 if (MI->getOperand(NumOperands - 1).isImm()) 454 DecodeINSERTPSMask(MI->getOperand(NumOperands - 1).getImm(), 455 ShuffleMask); 456 break; 457 458 case X86::MOVLHPSrr: 459 case X86::VMOVLHPSrr: 460 case X86::VMOVLHPSZrr: 461 Src2Name = getRegName(MI->getOperand(2).getReg()); 462 Src1Name = getRegName(MI->getOperand(1).getReg()); 463 DestName = getRegName(MI->getOperand(0).getReg()); 464 DecodeMOVLHPSMask(2, ShuffleMask); 465 break; 466 467 case X86::MOVHLPSrr: 468 case X86::VMOVHLPSrr: 469 case X86::VMOVHLPSZrr: 470 Src2Name = getRegName(MI->getOperand(2).getReg()); 471 Src1Name = getRegName(MI->getOperand(1).getReg()); 472 DestName = getRegName(MI->getOperand(0).getReg()); 473 DecodeMOVHLPSMask(2, ShuffleMask); 474 break; 475 476 case X86::MOVHPDrm: 477 case X86::VMOVHPDrm: 478 case X86::VMOVHPDZ128rm: 479 Src1Name = getRegName(MI->getOperand(1).getReg()); 480 DestName = getRegName(MI->getOperand(0).getReg()); 481 DecodeInsertElementMask(MVT::v2f64, 1, 1, ShuffleMask); 482 break; 483 484 case X86::MOVHPSrm: 485 case X86::VMOVHPSrm: 486 case X86::VMOVHPSZ128rm: 487 Src1Name = getRegName(MI->getOperand(1).getReg()); 488 DestName = getRegName(MI->getOperand(0).getReg()); 489 DecodeInsertElementMask(MVT::v4f32, 2, 2, ShuffleMask); 490 break; 491 492 case X86::MOVLPDrm: 493 case X86::VMOVLPDrm: 494 case X86::VMOVLPDZ128rm: 495 Src1Name = getRegName(MI->getOperand(1).getReg()); 496 DestName = getRegName(MI->getOperand(0).getReg()); 497 DecodeInsertElementMask(MVT::v2f64, 0, 1, ShuffleMask); 498 break; 499 500 case X86::MOVLPSrm: 501 case X86::VMOVLPSrm: 502 case X86::VMOVLPSZ128rm: 503 Src1Name = getRegName(MI->getOperand(1).getReg()); 504 DestName = getRegName(MI->getOperand(0).getReg()); 505 DecodeInsertElementMask(MVT::v4f32, 0, 2, ShuffleMask); 506 break; 507 508 CASE_MOVDUP(MOVSLDUP, r) 509 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg()); 510 // FALL THROUGH. 511 CASE_MOVDUP(MOVSLDUP, m) 512 DestName = getRegName(MI->getOperand(0).getReg()); 513 DecodeMOVSLDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask); 514 break; 515 516 CASE_MOVDUP(MOVSHDUP, r) 517 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg()); 518 // FALL THROUGH. 519 CASE_MOVDUP(MOVSHDUP, m) 520 DestName = getRegName(MI->getOperand(0).getReg()); 521 DecodeMOVSHDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask); 522 break; 523 524 CASE_MOVDUP(MOVDDUP, r) 525 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg()); 526 // FALL THROUGH. 527 CASE_MOVDUP(MOVDDUP, m) 528 DestName = getRegName(MI->getOperand(0).getReg()); 529 DecodeMOVDDUPMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask); 530 break; 531 532 case X86::PSLLDQri: 533 case X86::VPSLLDQri: 534 case X86::VPSLLDQYri: 535 case X86::VPSLLDQZ128rr: 536 case X86::VPSLLDQZ256rr: 537 case X86::VPSLLDQZ512rr: 538 Src1Name = getRegName(MI->getOperand(1).getReg()); 539 case X86::VPSLLDQZ128rm: 540 case X86::VPSLLDQZ256rm: 541 case X86::VPSLLDQZ512rm: 542 DestName = getRegName(MI->getOperand(0).getReg()); 543 if (MI->getOperand(NumOperands - 1).isImm()) 544 DecodePSLLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0), 545 MI->getOperand(NumOperands - 1).getImm(), 546 ShuffleMask); 547 break; 548 549 case X86::PSRLDQri: 550 case X86::VPSRLDQri: 551 case X86::VPSRLDQYri: 552 case X86::VPSRLDQZ128rr: 553 case X86::VPSRLDQZ256rr: 554 case X86::VPSRLDQZ512rr: 555 Src1Name = getRegName(MI->getOperand(1).getReg()); 556 case X86::VPSRLDQZ128rm: 557 case X86::VPSRLDQZ256rm: 558 case X86::VPSRLDQZ512rm: 559 DestName = getRegName(MI->getOperand(0).getReg()); 560 if (MI->getOperand(NumOperands - 1).isImm()) 561 DecodePSRLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0), 562 MI->getOperand(NumOperands - 1).getImm(), 563 ShuffleMask); 564 break; 565 566 CASE_SHUF(PALIGNR, rri) 567 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg()); 568 RegForm = true; 569 // FALL THROUGH. 570 CASE_SHUF(PALIGNR, rmi) 571 Src2Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg()); 572 DestName = getRegName(MI->getOperand(0).getReg()); 573 if (MI->getOperand(NumOperands - 1).isImm()) 574 DecodePALIGNRMask(getRegOperandVectorVT(MI, MVT::i8, 0), 575 MI->getOperand(NumOperands - 1).getImm(), 576 ShuffleMask); 577 break; 578 579 CASE_SHUF(PSHUFD, ri) 580 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg()); 581 // FALL THROUGH. 582 CASE_SHUF(PSHUFD, mi) 583 DestName = getRegName(MI->getOperand(0).getReg()); 584 if (MI->getOperand(NumOperands - 1).isImm()) 585 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::i32, 0), 586 MI->getOperand(NumOperands - 1).getImm(), 587 ShuffleMask); 588 break; 589 590 CASE_SHUF(PSHUFHW, ri) 591 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg()); 592 // FALL THROUGH. 593 CASE_SHUF(PSHUFHW, mi) 594 DestName = getRegName(MI->getOperand(0).getReg()); 595 if (MI->getOperand(NumOperands - 1).isImm()) 596 DecodePSHUFHWMask(getRegOperandVectorVT(MI, MVT::i16, 0), 597 MI->getOperand(NumOperands - 1).getImm(), 598 ShuffleMask); 599 break; 600 601 CASE_SHUF(PSHUFLW, ri) 602 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg()); 603 // FALL THROUGH. 604 CASE_SHUF(PSHUFLW, mi) 605 DestName = getRegName(MI->getOperand(0).getReg()); 606 if (MI->getOperand(NumOperands - 1).isImm()) 607 DecodePSHUFLWMask(getRegOperandVectorVT(MI, MVT::i16, 0), 608 MI->getOperand(NumOperands - 1).getImm(), 609 ShuffleMask); 610 break; 611 612 case X86::MMX_PSHUFWri: 613 Src1Name = getRegName(MI->getOperand(1).getReg()); 614 // FALL THROUGH. 615 case X86::MMX_PSHUFWmi: 616 DestName = getRegName(MI->getOperand(0).getReg()); 617 if (MI->getOperand(NumOperands - 1).isImm()) 618 DecodePSHUFMask(MVT::v4i16, 619 MI->getOperand(NumOperands - 1).getImm(), 620 ShuffleMask); 621 break; 622 623 case X86::PSWAPDrr: 624 Src1Name = getRegName(MI->getOperand(1).getReg()); 625 // FALL THROUGH. 626 case X86::PSWAPDrm: 627 DestName = getRegName(MI->getOperand(0).getReg()); 628 DecodePSWAPMask(MVT::v2i32, ShuffleMask); 629 break; 630 631 CASE_UNPCK(PUNPCKHBW, r) 632 case X86::MMX_PUNPCKHBWirr: 633 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg()); 634 RegForm = true; 635 // FALL THROUGH. 636 CASE_UNPCK(PUNPCKHBW, m) 637 case X86::MMX_PUNPCKHBWirm: 638 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg()); 639 DestName = getRegName(MI->getOperand(0).getReg()); 640 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask); 641 break; 642 643 CASE_UNPCK(PUNPCKHWD, r) 644 case X86::MMX_PUNPCKHWDirr: 645 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg()); 646 RegForm = true; 647 // FALL THROUGH. 648 CASE_UNPCK(PUNPCKHWD, m) 649 case X86::MMX_PUNPCKHWDirm: 650 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg()); 651 DestName = getRegName(MI->getOperand(0).getReg()); 652 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask); 653 break; 654 655 CASE_UNPCK(PUNPCKHDQ, r) 656 case X86::MMX_PUNPCKHDQirr: 657 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg()); 658 RegForm = true; 659 // FALL THROUGH. 660 CASE_UNPCK(PUNPCKHDQ, m) 661 case X86::MMX_PUNPCKHDQirm: 662 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg()); 663 DestName = getRegName(MI->getOperand(0).getReg()); 664 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask); 665 break; 666 667 CASE_UNPCK(PUNPCKHQDQ, r) 668 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg()); 669 RegForm = true; 670 // FALL THROUGH. 671 CASE_UNPCK(PUNPCKHQDQ, m) 672 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg()); 673 DestName = getRegName(MI->getOperand(0).getReg()); 674 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask); 675 break; 676 677 CASE_UNPCK(PUNPCKLBW, r) 678 case X86::MMX_PUNPCKLBWirr: 679 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg()); 680 RegForm = true; 681 // FALL THROUGH. 682 CASE_UNPCK(PUNPCKLBW, m) 683 case X86::MMX_PUNPCKLBWirm: 684 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg()); 685 DestName = getRegName(MI->getOperand(0).getReg()); 686 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask); 687 break; 688 689 CASE_UNPCK(PUNPCKLWD, r) 690 case X86::MMX_PUNPCKLWDirr: 691 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg()); 692 RegForm = true; 693 // FALL THROUGH. 694 CASE_UNPCK(PUNPCKLWD, m) 695 case X86::MMX_PUNPCKLWDirm: 696 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg()); 697 DestName = getRegName(MI->getOperand(0).getReg()); 698 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask); 699 break; 700 701 CASE_UNPCK(PUNPCKLDQ, r) 702 case X86::MMX_PUNPCKLDQirr: 703 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg()); 704 RegForm = true; 705 // FALL THROUGH. 706 CASE_UNPCK(PUNPCKLDQ, m) 707 case X86::MMX_PUNPCKLDQirm: 708 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg()); 709 DestName = getRegName(MI->getOperand(0).getReg()); 710 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask); 711 break; 712 713 CASE_UNPCK(PUNPCKLQDQ, r) 714 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg()); 715 RegForm = true; 716 // FALL THROUGH. 717 CASE_UNPCK(PUNPCKLQDQ, m) 718 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg()); 719 DestName = getRegName(MI->getOperand(0).getReg()); 720 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask); 721 break; 722 723 CASE_SHUF(SHUFPD, rri) 724 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg()); 725 RegForm = true; 726 // FALL THROUGH. 727 CASE_SHUF(SHUFPD, rmi) 728 if (MI->getOperand(NumOperands - 1).isImm()) 729 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f64, 0), 730 MI->getOperand(NumOperands - 1).getImm(), 731 ShuffleMask); 732 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg()); 733 DestName = getRegName(MI->getOperand(0).getReg()); 734 break; 735 736 CASE_SHUF(SHUFPS, rri) 737 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg()); 738 RegForm = true; 739 // FALL THROUGH. 740 CASE_SHUF(SHUFPS, rmi) 741 if (MI->getOperand(NumOperands - 1).isImm()) 742 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f32, 0), 743 MI->getOperand(NumOperands - 1).getImm(), 744 ShuffleMask); 745 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg()); 746 DestName = getRegName(MI->getOperand(0).getReg()); 747 break; 748 749 CASE_VSHUF(64X2, r) 750 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg()); 751 RegForm = true; 752 // FALL THROUGH. 753 CASE_VSHUF(64X2, m) 754 decodeVSHUF64x2FamilyMask(getRegOperandVectorVT(MI, MVT::i64, 0), 755 MI->getOperand(NumOperands - 1).getImm(), 756 ShuffleMask); 757 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg()); 758 DestName = getRegName(MI->getOperand(0).getReg()); 759 break; 760 761 CASE_VSHUF(32X4, r) 762 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg()); 763 RegForm = true; 764 // FALL THROUGH. 765 CASE_VSHUF(32X4, m) 766 decodeVSHUF64x2FamilyMask(getRegOperandVectorVT(MI, MVT::i32, 0), 767 MI->getOperand(NumOperands - 1).getImm(), 768 ShuffleMask); 769 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg()); 770 DestName = getRegName(MI->getOperand(0).getReg()); 771 break; 772 773 CASE_UNPCK(UNPCKLPD, r) 774 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg()); 775 RegForm = true; 776 // FALL THROUGH. 777 CASE_UNPCK(UNPCKLPD, m) 778 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask); 779 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg()); 780 DestName = getRegName(MI->getOperand(0).getReg()); 781 break; 782 783 CASE_UNPCK(UNPCKLPS, r) 784 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg()); 785 RegForm = true; 786 // FALL THROUGH. 787 CASE_UNPCK(UNPCKLPS, m) 788 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask); 789 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg()); 790 DestName = getRegName(MI->getOperand(0).getReg()); 791 break; 792 793 CASE_UNPCK(UNPCKHPD, r) 794 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg()); 795 RegForm = true; 796 // FALL THROUGH. 797 CASE_UNPCK(UNPCKHPD, m) 798 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask); 799 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg()); 800 DestName = getRegName(MI->getOperand(0).getReg()); 801 break; 802 803 CASE_UNPCK(UNPCKHPS, r) 804 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg()); 805 RegForm = true; 806 // FALL THROUGH. 807 CASE_UNPCK(UNPCKHPS, m) 808 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask); 809 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg()); 810 DestName = getRegName(MI->getOperand(0).getReg()); 811 break; 812 813 CASE_VPERMILPI(PERMILPS, r) 814 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg()); 815 // FALL THROUGH. 816 CASE_VPERMILPI(PERMILPS, m) 817 if (MI->getOperand(NumOperands - 1).isImm()) 818 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f32, 0), 819 MI->getOperand(NumOperands - 1).getImm(), 820 ShuffleMask); 821 DestName = getRegName(MI->getOperand(0).getReg()); 822 break; 823 824 CASE_VPERMILPI(PERMILPD, r) 825 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg()); 826 // FALL THROUGH. 827 CASE_VPERMILPI(PERMILPD, m) 828 if (MI->getOperand(NumOperands - 1).isImm()) 829 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f64, 0), 830 MI->getOperand(NumOperands - 1).getImm(), 831 ShuffleMask); 832 DestName = getRegName(MI->getOperand(0).getReg()); 833 break; 834 835 case X86::VPERM2F128rr: 836 case X86::VPERM2I128rr: 837 Src2Name = getRegName(MI->getOperand(2).getReg()); 838 // FALL THROUGH. 839 case X86::VPERM2F128rm: 840 case X86::VPERM2I128rm: 841 // For instruction comments purpose, assume the 256-bit vector is v4i64. 842 if (MI->getOperand(NumOperands - 1).isImm()) 843 DecodeVPERM2X128Mask(MVT::v4i64, 844 MI->getOperand(NumOperands - 1).getImm(), 845 ShuffleMask); 846 Src1Name = getRegName(MI->getOperand(1).getReg()); 847 DestName = getRegName(MI->getOperand(0).getReg()); 848 break; 849 850 CASE_VPERM(PERMPD, r) 851 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg()); 852 // FALL THROUGH. 853 CASE_VPERM(PERMPD, m) 854 if (MI->getOperand(NumOperands - 1).isImm()) 855 DecodeVPERMMask(getRegOperandVectorVT(MI, MVT::f64, 0), 856 MI->getOperand(NumOperands - 1).getImm(), 857 ShuffleMask); 858 DestName = getRegName(MI->getOperand(0).getReg()); 859 break; 860 861 CASE_VPERM(PERMQ, r) 862 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg()); 863 // FALL THROUGH. 864 CASE_VPERM(PERMQ, m) 865 if (MI->getOperand(NumOperands - 1).isImm()) 866 DecodeVPERMMask(getRegOperandVectorVT(MI, MVT::i64, 0), 867 MI->getOperand(NumOperands - 1).getImm(), 868 ShuffleMask); 869 DestName = getRegName(MI->getOperand(0).getReg()); 870 break; 871 872 case X86::MOVSDrr: 873 case X86::VMOVSDrr: 874 case X86::VMOVSDZrr: 875 Src2Name = getRegName(MI->getOperand(2).getReg()); 876 Src1Name = getRegName(MI->getOperand(1).getReg()); 877 // FALL THROUGH. 878 case X86::MOVSDrm: 879 case X86::VMOVSDrm: 880 case X86::VMOVSDZrm: 881 DecodeScalarMoveMask(MVT::v2f64, nullptr == Src2Name, ShuffleMask); 882 DestName = getRegName(MI->getOperand(0).getReg()); 883 break; 884 885 case X86::MOVSSrr: 886 case X86::VMOVSSrr: 887 case X86::VMOVSSZrr: 888 Src2Name = getRegName(MI->getOperand(2).getReg()); 889 Src1Name = getRegName(MI->getOperand(1).getReg()); 890 // FALL THROUGH. 891 case X86::MOVSSrm: 892 case X86::VMOVSSrm: 893 case X86::VMOVSSZrm: 894 DecodeScalarMoveMask(MVT::v4f32, nullptr == Src2Name, ShuffleMask); 895 DestName = getRegName(MI->getOperand(0).getReg()); 896 break; 897 898 case X86::MOVPQI2QIrr: 899 case X86::MOVZPQILo2PQIrr: 900 case X86::VMOVPQI2QIrr: 901 case X86::VMOVZPQILo2PQIrr: 902 case X86::VMOVZPQILo2PQIZrr: 903 Src1Name = getRegName(MI->getOperand(1).getReg()); 904 // FALL THROUGH. 905 case X86::MOVQI2PQIrm: 906 case X86::MOVZQI2PQIrm: 907 case X86::MOVZPQILo2PQIrm: 908 case X86::VMOVQI2PQIrm: 909 case X86::VMOVQI2PQIZrm: 910 case X86::VMOVZQI2PQIrm: 911 case X86::VMOVZPQILo2PQIrm: 912 case X86::VMOVZPQILo2PQIZrm: 913 DecodeZeroMoveLowMask(MVT::v2i64, ShuffleMask); 914 DestName = getRegName(MI->getOperand(0).getReg()); 915 break; 916 917 case X86::MOVDI2PDIrm: 918 case X86::VMOVDI2PDIrm: 919 case X86::VMOVDI2PDIZrm: 920 DecodeZeroMoveLowMask(MVT::v4i32, ShuffleMask); 921 DestName = getRegName(MI->getOperand(0).getReg()); 922 break; 923 924 case X86::EXTRQI: 925 if (MI->getOperand(2).isImm() && 926 MI->getOperand(3).isImm()) 927 DecodeEXTRQIMask(MI->getOperand(2).getImm(), 928 MI->getOperand(3).getImm(), 929 ShuffleMask); 930 931 DestName = getRegName(MI->getOperand(0).getReg()); 932 Src1Name = getRegName(MI->getOperand(1).getReg()); 933 break; 934 935 case X86::INSERTQI: 936 if (MI->getOperand(3).isImm() && 937 MI->getOperand(4).isImm()) 938 DecodeINSERTQIMask(MI->getOperand(3).getImm(), 939 MI->getOperand(4).getImm(), 940 ShuffleMask); 941 942 DestName = getRegName(MI->getOperand(0).getReg()); 943 Src1Name = getRegName(MI->getOperand(1).getReg()); 944 Src2Name = getRegName(MI->getOperand(2).getReg()); 945 break; 946 947 case X86::VBROADCASTF128: 948 case X86::VBROADCASTI128: 949 DecodeSubVectorBroadcast(MVT::v4f64, MVT::v2f64, ShuffleMask); 950 DestName = getRegName(MI->getOperand(0).getReg()); 951 break; 952 953 CASE_PMOVZX(PMOVZXBW, r) 954 CASE_PMOVZX(PMOVZXBD, r) 955 CASE_PMOVZX(PMOVZXBQ, r) 956 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg()); 957 // FALL THROUGH. 958 CASE_PMOVZX(PMOVZXBW, m) 959 CASE_PMOVZX(PMOVZXBD, m) 960 CASE_PMOVZX(PMOVZXBQ, m) 961 DecodeZeroExtendMask(MVT::i8, getZeroExtensionResultType(MI), ShuffleMask); 962 DestName = getRegName(MI->getOperand(0).getReg()); 963 break; 964 965 CASE_PMOVZX(PMOVZXWD, r) 966 CASE_PMOVZX(PMOVZXWQ, r) 967 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg()); 968 // FALL THROUGH. 969 CASE_PMOVZX(PMOVZXWD, m) 970 CASE_PMOVZX(PMOVZXWQ, m) 971 DecodeZeroExtendMask(MVT::i16, getZeroExtensionResultType(MI), ShuffleMask); 972 DestName = getRegName(MI->getOperand(0).getReg()); 973 break; 974 975 CASE_PMOVZX(PMOVZXDQ, r) 976 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg()); 977 // FALL THROUGH. 978 CASE_PMOVZX(PMOVZXDQ, m) 979 DecodeZeroExtendMask(MVT::i32, getZeroExtensionResultType(MI), ShuffleMask); 980 DestName = getRegName(MI->getOperand(0).getReg()); 981 break; 982 } 983 984 // The only comments we decode are shuffles, so give up if we were unable to 985 // decode a shuffle mask. 986 if (ShuffleMask.empty()) 987 return false; 988 989 if (!DestName) DestName = Src1Name; 990 OS << (DestName ? getMaskName(MI, DestName, getRegName) : "mem") << " = "; 991 992 // If the two sources are the same, canonicalize the input elements to be 993 // from the first src so that we get larger element spans. 994 if (Src1Name == Src2Name) { 995 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) { 996 if ((int)ShuffleMask[i] >= 0 && // Not sentinel. 997 ShuffleMask[i] >= (int)e) // From second mask. 998 ShuffleMask[i] -= e; 999 } 1000 } 1001 1002 // The shuffle mask specifies which elements of the src1/src2 fill in the 1003 // destination, with a few sentinel values. Loop through and print them 1004 // out. 1005 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) { 1006 if (i != 0) 1007 OS << ','; 1008 if (ShuffleMask[i] == SM_SentinelZero) { 1009 OS << "zero"; 1010 continue; 1011 } 1012 1013 // Otherwise, it must come from src1 or src2. Print the span of elements 1014 // that comes from this src. 1015 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size(); 1016 const char *SrcName = isSrc1 ? Src1Name : Src2Name; 1017 OS << (SrcName ? SrcName : "mem") << '['; 1018 bool IsFirst = true; 1019 while (i != e && (int)ShuffleMask[i] != SM_SentinelZero && 1020 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) { 1021 if (!IsFirst) 1022 OS << ','; 1023 else 1024 IsFirst = false; 1025 if (ShuffleMask[i] == SM_SentinelUndef) 1026 OS << "u"; 1027 else 1028 OS << ShuffleMask[i] % ShuffleMask.size(); 1029 ++i; 1030 } 1031 OS << ']'; 1032 --i; // For loop increments element #. 1033 } 1034 //MI->print(OS, 0); 1035 OS << "\n"; 1036 1037 // We successfully added a comment to this instruction. 1038 return true; 1039 } 1040