1218885Sdim//===-- X86InstComments.cpp - Generate verbose-asm comments for instrs ----===// 2218885Sdim// 3218885Sdim// The LLVM Compiler Infrastructure 4218885Sdim// 5218885Sdim// This file is distributed under the University of Illinois Open Source 6218885Sdim// License. See LICENSE.TXT for details. 7218885Sdim// 8218885Sdim//===----------------------------------------------------------------------===// 9218885Sdim// 10218885Sdim// This defines functionality used to emit comments about X86 instructions to 11218885Sdim// an output stream for -fverbose-asm. 12218885Sdim// 13218885Sdim//===----------------------------------------------------------------------===// 14218885Sdim 15218885Sdim#include "X86InstComments.h" 16224145Sdim#include "MCTargetDesc/X86MCTargetDesc.h" 17226633Sdim#include "Utils/X86ShuffleDecode.h" 18218885Sdim#include "llvm/MC/MCInst.h" 19218885Sdim#include "llvm/Support/raw_ostream.h" 20218885Sdimusing namespace llvm; 21218885Sdim 22218885Sdim//===----------------------------------------------------------------------===// 23218885Sdim// Top Level Entrypoint 24218885Sdim//===----------------------------------------------------------------------===// 25218885Sdim 26218885Sdim/// EmitAnyX86InstComments - This function decodes x86 instructions and prints 27218885Sdim/// newline terminated strings to the specified string if desired. This 28218885Sdim/// information is shown in disassembly dumps when verbose assembly is enabled. 29218885Sdimvoid llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS, 30218885Sdim const char *(*getRegName)(unsigned)) { 31218885Sdim // If this is a shuffle operation, the switch should fill in this state. 32234353Sdim SmallVector<int, 8> ShuffleMask; 33218885Sdim const char *DestName = 0, *Src1Name = 0, *Src2Name = 0; 34218885Sdim 35218885Sdim switch (MI->getOpcode()) { 36218885Sdim case X86::INSERTPSrr: 37234353Sdim case X86::VINSERTPSrr: 38234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 39218885Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 40218885Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 41218885Sdim DecodeINSERTPSMask(MI->getOperand(3).getImm(), ShuffleMask); 42218885Sdim break; 43218885Sdim 44218885Sdim case X86::MOVLHPSrr: 45234353Sdim case X86::VMOVLHPSrr: 46234353Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 47234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 48234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 49234353Sdim DecodeMOVLHPSMask(2, ShuffleMask); 50234353Sdim break; 51218885Sdim 52218885Sdim case X86::MOVHLPSrr: 53234353Sdim case X86::VMOVHLPSrr: 54234353Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 55234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 56234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 57234353Sdim DecodeMOVHLPSMask(2, ShuffleMask); 58234353Sdim break; 59218885Sdim 60249423Sdim case X86::PALIGNR128rr: 61249423Sdim case X86::VPALIGNR128rr: 62249423Sdim Src1Name = getRegName(MI->getOperand(2).getReg()); 63249423Sdim // FALL THROUGH. 64249423Sdim case X86::PALIGNR128rm: 65249423Sdim case X86::VPALIGNR128rm: 66249423Sdim Src2Name = getRegName(MI->getOperand(1).getReg()); 67249423Sdim DestName = getRegName(MI->getOperand(0).getReg()); 68249423Sdim DecodePALIGNRMask(MVT::v16i8, 69249423Sdim MI->getOperand(MI->getNumOperands()-1).getImm(), 70249423Sdim ShuffleMask); 71249423Sdim break; 72249423Sdim case X86::VPALIGNR256rr: 73249423Sdim Src1Name = getRegName(MI->getOperand(2).getReg()); 74249423Sdim // FALL THROUGH. 75249423Sdim case X86::VPALIGNR256rm: 76249423Sdim Src2Name = getRegName(MI->getOperand(1).getReg()); 77249423Sdim DestName = getRegName(MI->getOperand(0).getReg()); 78249423Sdim DecodePALIGNRMask(MVT::v32i8, 79249423Sdim MI->getOperand(MI->getNumOperands()-1).getImm(), 80249423Sdim ShuffleMask); 81249423Sdim break; 82249423Sdim 83218885Sdim case X86::PSHUFDri: 84234353Sdim case X86::VPSHUFDri: 85218885Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 86218885Sdim // FALL THROUGH. 87218885Sdim case X86::PSHUFDmi: 88234353Sdim case X86::VPSHUFDmi: 89218885Sdim DestName = getRegName(MI->getOperand(0).getReg()); 90234353Sdim DecodePSHUFMask(MVT::v4i32, MI->getOperand(MI->getNumOperands()-1).getImm(), 91234353Sdim ShuffleMask); 92234353Sdim break; 93234353Sdim case X86::VPSHUFDYri: 94234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 95234353Sdim // FALL THROUGH. 96234353Sdim case X86::VPSHUFDYmi: 97234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 98234353Sdim DecodePSHUFMask(MVT::v8i32, MI->getOperand(MI->getNumOperands()-1).getImm(), 99218885Sdim ShuffleMask); 100218885Sdim break; 101218885Sdim 102234353Sdim 103218885Sdim case X86::PSHUFHWri: 104234353Sdim case X86::VPSHUFHWri: 105218885Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 106218885Sdim // FALL THROUGH. 107218885Sdim case X86::PSHUFHWmi: 108234353Sdim case X86::VPSHUFHWmi: 109218885Sdim DestName = getRegName(MI->getOperand(0).getReg()); 110239462Sdim DecodePSHUFHWMask(MVT::v8i16, 111239462Sdim MI->getOperand(MI->getNumOperands()-1).getImm(), 112218885Sdim ShuffleMask); 113218885Sdim break; 114239462Sdim case X86::VPSHUFHWYri: 115239462Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 116239462Sdim // FALL THROUGH. 117239462Sdim case X86::VPSHUFHWYmi: 118239462Sdim DestName = getRegName(MI->getOperand(0).getReg()); 119239462Sdim DecodePSHUFHWMask(MVT::v16i16, 120239462Sdim MI->getOperand(MI->getNumOperands()-1).getImm(), 121239462Sdim ShuffleMask); 122239462Sdim break; 123218885Sdim case X86::PSHUFLWri: 124234353Sdim case X86::VPSHUFLWri: 125218885Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 126218885Sdim // FALL THROUGH. 127218885Sdim case X86::PSHUFLWmi: 128234353Sdim case X86::VPSHUFLWmi: 129218885Sdim DestName = getRegName(MI->getOperand(0).getReg()); 130239462Sdim DecodePSHUFLWMask(MVT::v8i16, 131239462Sdim MI->getOperand(MI->getNumOperands()-1).getImm(), 132218885Sdim ShuffleMask); 133218885Sdim break; 134239462Sdim case X86::VPSHUFLWYri: 135239462Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 136239462Sdim // FALL THROUGH. 137239462Sdim case X86::VPSHUFLWYmi: 138239462Sdim DestName = getRegName(MI->getOperand(0).getReg()); 139239462Sdim DecodePSHUFLWMask(MVT::v16i16, 140239462Sdim MI->getOperand(MI->getNumOperands()-1).getImm(), 141239462Sdim ShuffleMask); 142239462Sdim break; 143218885Sdim 144218885Sdim case X86::PUNPCKHBWrr: 145249423Sdim case X86::VPUNPCKHBWrr: 146218885Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 147218885Sdim // FALL THROUGH. 148218885Sdim case X86::PUNPCKHBWrm: 149234353Sdim case X86::VPUNPCKHBWrm: 150234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 151234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 152234353Sdim DecodeUNPCKHMask(MVT::v16i8, ShuffleMask); 153234353Sdim break; 154234353Sdim case X86::VPUNPCKHBWYrr: 155234353Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 156234353Sdim // FALL THROUGH. 157234353Sdim case X86::VPUNPCKHBWYrm: 158234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 159234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 160234353Sdim DecodeUNPCKHMask(MVT::v32i8, ShuffleMask); 161234353Sdim break; 162218885Sdim case X86::PUNPCKHWDrr: 163249423Sdim case X86::VPUNPCKHWDrr: 164218885Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 165218885Sdim // FALL THROUGH. 166218885Sdim case X86::PUNPCKHWDrm: 167234353Sdim case X86::VPUNPCKHWDrm: 168234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 169234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 170234353Sdim DecodeUNPCKHMask(MVT::v8i16, ShuffleMask); 171234353Sdim break; 172234353Sdim case X86::VPUNPCKHWDYrr: 173234353Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 174234353Sdim // FALL THROUGH. 175234353Sdim case X86::VPUNPCKHWDYrm: 176234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 177234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 178234353Sdim DecodeUNPCKHMask(MVT::v16i16, ShuffleMask); 179234353Sdim break; 180218885Sdim case X86::PUNPCKHDQrr: 181249423Sdim case X86::VPUNPCKHDQrr: 182218885Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 183218885Sdim // FALL THROUGH. 184218885Sdim case X86::PUNPCKHDQrm: 185234353Sdim case X86::VPUNPCKHDQrm: 186234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 187234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 188234353Sdim DecodeUNPCKHMask(MVT::v4i32, ShuffleMask); 189234353Sdim break; 190234353Sdim case X86::VPUNPCKHDQYrr: 191234353Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 192234353Sdim // FALL THROUGH. 193234353Sdim case X86::VPUNPCKHDQYrm: 194234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 195234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 196234353Sdim DecodeUNPCKHMask(MVT::v8i32, ShuffleMask); 197234353Sdim break; 198218885Sdim case X86::PUNPCKHQDQrr: 199249423Sdim case X86::VPUNPCKHQDQrr: 200218885Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 201218885Sdim // FALL THROUGH. 202218885Sdim case X86::PUNPCKHQDQrm: 203234353Sdim case X86::VPUNPCKHQDQrm: 204234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 205234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 206234353Sdim DecodeUNPCKHMask(MVT::v2i64, ShuffleMask); 207234353Sdim break; 208234353Sdim case X86::VPUNPCKHQDQYrr: 209234353Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 210234353Sdim // FALL THROUGH. 211234353Sdim case X86::VPUNPCKHQDQYrm: 212234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 213234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 214234353Sdim DecodeUNPCKHMask(MVT::v4i64, ShuffleMask); 215234353Sdim break; 216218885Sdim 217218885Sdim case X86::PUNPCKLBWrr: 218249423Sdim case X86::VPUNPCKLBWrr: 219218885Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 220218885Sdim // FALL THROUGH. 221218885Sdim case X86::PUNPCKLBWrm: 222234353Sdim case X86::VPUNPCKLBWrm: 223234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 224234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 225234353Sdim DecodeUNPCKLMask(MVT::v16i8, ShuffleMask); 226234353Sdim break; 227234353Sdim case X86::VPUNPCKLBWYrr: 228234353Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 229234353Sdim // FALL THROUGH. 230234353Sdim case X86::VPUNPCKLBWYrm: 231234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 232234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 233234353Sdim DecodeUNPCKLMask(MVT::v32i8, ShuffleMask); 234234353Sdim break; 235218885Sdim case X86::PUNPCKLWDrr: 236249423Sdim case X86::VPUNPCKLWDrr: 237218885Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 238218885Sdim // FALL THROUGH. 239218885Sdim case X86::PUNPCKLWDrm: 240234353Sdim case X86::VPUNPCKLWDrm: 241234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 242234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 243234353Sdim DecodeUNPCKLMask(MVT::v8i16, ShuffleMask); 244234353Sdim break; 245234353Sdim case X86::VPUNPCKLWDYrr: 246234353Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 247234353Sdim // FALL THROUGH. 248234353Sdim case X86::VPUNPCKLWDYrm: 249234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 250234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 251234353Sdim DecodeUNPCKLMask(MVT::v16i16, ShuffleMask); 252234353Sdim break; 253218885Sdim case X86::PUNPCKLDQrr: 254249423Sdim case X86::VPUNPCKLDQrr: 255218885Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 256218885Sdim // FALL THROUGH. 257218885Sdim case X86::PUNPCKLDQrm: 258234353Sdim case X86::VPUNPCKLDQrm: 259234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 260234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 261234353Sdim DecodeUNPCKLMask(MVT::v4i32, ShuffleMask); 262234353Sdim break; 263234353Sdim case X86::VPUNPCKLDQYrr: 264234353Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 265234353Sdim // FALL THROUGH. 266234353Sdim case X86::VPUNPCKLDQYrm: 267234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 268234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 269234353Sdim DecodeUNPCKLMask(MVT::v8i32, ShuffleMask); 270234353Sdim break; 271218885Sdim case X86::PUNPCKLQDQrr: 272249423Sdim case X86::VPUNPCKLQDQrr: 273218885Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 274218885Sdim // FALL THROUGH. 275218885Sdim case X86::PUNPCKLQDQrm: 276234353Sdim case X86::VPUNPCKLQDQrm: 277234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 278234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 279234353Sdim DecodeUNPCKLMask(MVT::v2i64, ShuffleMask); 280234353Sdim break; 281234353Sdim case X86::VPUNPCKLQDQYrr: 282234353Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 283234353Sdim // FALL THROUGH. 284234353Sdim case X86::VPUNPCKLQDQYrm: 285234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 286234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 287234353Sdim DecodeUNPCKLMask(MVT::v4i64, ShuffleMask); 288234353Sdim break; 289218885Sdim 290218885Sdim case X86::SHUFPDrri: 291249423Sdim case X86::VSHUFPDrri: 292226633Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 293226633Sdim // FALL THROUGH. 294226633Sdim case X86::SHUFPDrmi: 295234353Sdim case X86::VSHUFPDrmi: 296234353Sdim DecodeSHUFPMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(), 297234353Sdim ShuffleMask); 298234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 299234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 300234353Sdim break; 301234353Sdim case X86::VSHUFPDYrri: 302234353Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 303234353Sdim // FALL THROUGH. 304234353Sdim case X86::VSHUFPDYrmi: 305234353Sdim DecodeSHUFPMask(MVT::v4f64, MI->getOperand(MI->getNumOperands()-1).getImm(), 306234353Sdim ShuffleMask); 307234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 308234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 309234353Sdim break; 310218885Sdim 311218885Sdim case X86::SHUFPSrri: 312249423Sdim case X86::VSHUFPSrri: 313218885Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 314218885Sdim // FALL THROUGH. 315218885Sdim case X86::SHUFPSrmi: 316234353Sdim case X86::VSHUFPSrmi: 317234353Sdim DecodeSHUFPMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(), 318234353Sdim ShuffleMask); 319234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 320234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 321234353Sdim break; 322234353Sdim case X86::VSHUFPSYrri: 323234353Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 324234353Sdim // FALL THROUGH. 325234353Sdim case X86::VSHUFPSYrmi: 326234353Sdim DecodeSHUFPMask(MVT::v8f32, MI->getOperand(MI->getNumOperands()-1).getImm(), 327234353Sdim ShuffleMask); 328234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 329234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 330234353Sdim break; 331218885Sdim 332218885Sdim case X86::UNPCKLPDrr: 333249423Sdim case X86::VUNPCKLPDrr: 334218885Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 335218885Sdim // FALL THROUGH. 336218885Sdim case X86::UNPCKLPDrm: 337221345Sdim case X86::VUNPCKLPDrm: 338234353Sdim DecodeUNPCKLMask(MVT::v2f64, ShuffleMask); 339221345Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 340234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 341221345Sdim break; 342221345Sdim case X86::VUNPCKLPDYrr: 343221345Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 344221345Sdim // FALL THROUGH. 345221345Sdim case X86::VUNPCKLPDYrm: 346234353Sdim DecodeUNPCKLMask(MVT::v4f64, ShuffleMask); 347221345Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 348234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 349221345Sdim break; 350218885Sdim case X86::UNPCKLPSrr: 351249423Sdim case X86::VUNPCKLPSrr: 352218885Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 353218885Sdim // FALL THROUGH. 354218885Sdim case X86::UNPCKLPSrm: 355221345Sdim case X86::VUNPCKLPSrm: 356234353Sdim DecodeUNPCKLMask(MVT::v4f32, ShuffleMask); 357221345Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 358234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 359221345Sdim break; 360221345Sdim case X86::VUNPCKLPSYrr: 361221345Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 362221345Sdim // FALL THROUGH. 363221345Sdim case X86::VUNPCKLPSYrm: 364234353Sdim DecodeUNPCKLMask(MVT::v8f32, ShuffleMask); 365221345Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 366234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 367221345Sdim break; 368218885Sdim case X86::UNPCKHPDrr: 369249423Sdim case X86::VUNPCKHPDrr: 370218885Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 371218885Sdim // FALL THROUGH. 372218885Sdim case X86::UNPCKHPDrm: 373234353Sdim case X86::VUNPCKHPDrm: 374234353Sdim DecodeUNPCKHMask(MVT::v2f64, ShuffleMask); 375234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 376234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 377234353Sdim break; 378234353Sdim case X86::VUNPCKHPDYrr: 379234353Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 380234353Sdim // FALL THROUGH. 381234353Sdim case X86::VUNPCKHPDYrm: 382234353Sdim DecodeUNPCKHMask(MVT::v4f64, ShuffleMask); 383234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 384234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 385234353Sdim break; 386218885Sdim case X86::UNPCKHPSrr: 387249423Sdim case X86::VUNPCKHPSrr: 388218885Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 389218885Sdim // FALL THROUGH. 390218885Sdim case X86::UNPCKHPSrm: 391234353Sdim case X86::VUNPCKHPSrm: 392234353Sdim DecodeUNPCKHMask(MVT::v4f32, ShuffleMask); 393234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 394234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 395234353Sdim break; 396234353Sdim case X86::VUNPCKHPSYrr: 397234353Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 398234353Sdim // FALL THROUGH. 399234353Sdim case X86::VUNPCKHPSYrm: 400234353Sdim DecodeUNPCKHMask(MVT::v8f32, ShuffleMask); 401234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 402234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 403234353Sdim break; 404226633Sdim case X86::VPERMILPSri: 405234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 406234353Sdim // FALL THROUGH. 407234353Sdim case X86::VPERMILPSmi: 408234353Sdim DecodePSHUFMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(), 409234353Sdim ShuffleMask); 410234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 411226633Sdim break; 412226633Sdim case X86::VPERMILPSYri: 413234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 414234353Sdim // FALL THROUGH. 415234353Sdim case X86::VPERMILPSYmi: 416234353Sdim DecodePSHUFMask(MVT::v8f32, MI->getOperand(MI->getNumOperands()-1).getImm(), 417234353Sdim ShuffleMask); 418234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 419226633Sdim break; 420226633Sdim case X86::VPERMILPDri: 421234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 422234353Sdim // FALL THROUGH. 423234353Sdim case X86::VPERMILPDmi: 424234353Sdim DecodePSHUFMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(), 425234353Sdim ShuffleMask); 426234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 427226633Sdim break; 428226633Sdim case X86::VPERMILPDYri: 429234353Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 430234353Sdim // FALL THROUGH. 431234353Sdim case X86::VPERMILPDYmi: 432234353Sdim DecodePSHUFMask(MVT::v4f64, MI->getOperand(MI->getNumOperands()-1).getImm(), 433234353Sdim ShuffleMask); 434234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 435226633Sdim break; 436226633Sdim case X86::VPERM2F128rr: 437234353Sdim case X86::VPERM2I128rr: 438234353Sdim Src2Name = getRegName(MI->getOperand(2).getReg()); 439234353Sdim // FALL THROUGH. 440234353Sdim case X86::VPERM2F128rm: 441234353Sdim case X86::VPERM2I128rm: 442234353Sdim // For instruction comments purpose, assume the 256-bit vector is v4i64. 443234353Sdim DecodeVPERM2X128Mask(MVT::v4i64, 444234353Sdim MI->getOperand(MI->getNumOperands()-1).getImm(), 445234353Sdim ShuffleMask); 446226633Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 447234353Sdim DestName = getRegName(MI->getOperand(0).getReg()); 448226633Sdim break; 449239462Sdim case X86::VPERMQYri: 450239462Sdim case X86::VPERMPDYri: 451239462Sdim Src1Name = getRegName(MI->getOperand(1).getReg()); 452239462Sdim // FALL THROUGH. 453239462Sdim case X86::VPERMQYmi: 454239462Sdim case X86::VPERMPDYmi: 455239462Sdim DecodeVPERMMask(MI->getOperand(MI->getNumOperands()-1).getImm(), 456239462Sdim ShuffleMask); 457239462Sdim DestName = getRegName(MI->getOperand(0).getReg()); 458239462Sdim break; 459218885Sdim } 460218885Sdim 461218885Sdim 462218885Sdim // If this was a shuffle operation, print the shuffle mask. 463218885Sdim if (!ShuffleMask.empty()) { 464218885Sdim if (DestName == 0) DestName = Src1Name; 465218885Sdim OS << (DestName ? DestName : "mem") << " = "; 466218885Sdim 467218885Sdim // If the two sources are the same, canonicalize the input elements to be 468218885Sdim // from the first src so that we get larger element spans. 469218885Sdim if (Src1Name == Src2Name) { 470218885Sdim for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) { 471218885Sdim if ((int)ShuffleMask[i] >= 0 && // Not sentinel. 472234353Sdim ShuffleMask[i] >= (int)e) // From second mask. 473218885Sdim ShuffleMask[i] -= e; 474218885Sdim } 475218885Sdim } 476218885Sdim 477218885Sdim // The shuffle mask specifies which elements of the src1/src2 fill in the 478218885Sdim // destination, with a few sentinel values. Loop through and print them 479218885Sdim // out. 480218885Sdim for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) { 481218885Sdim if (i != 0) 482218885Sdim OS << ','; 483218885Sdim if (ShuffleMask[i] == SM_SentinelZero) { 484218885Sdim OS << "zero"; 485218885Sdim continue; 486218885Sdim } 487218885Sdim 488218885Sdim // Otherwise, it must come from src1 or src2. Print the span of elements 489218885Sdim // that comes from this src. 490234353Sdim bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size(); 491218885Sdim const char *SrcName = isSrc1 ? Src1Name : Src2Name; 492218885Sdim OS << (SrcName ? SrcName : "mem") << '['; 493218885Sdim bool IsFirst = true; 494218885Sdim while (i != e && 495218885Sdim (int)ShuffleMask[i] >= 0 && 496234353Sdim (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) { 497218885Sdim if (!IsFirst) 498218885Sdim OS << ','; 499218885Sdim else 500218885Sdim IsFirst = false; 501218885Sdim OS << ShuffleMask[i] % ShuffleMask.size(); 502218885Sdim ++i; 503218885Sdim } 504218885Sdim OS << ']'; 505218885Sdim --i; // For loop increments element #. 506218885Sdim } 507218885Sdim //MI->print(OS, 0); 508218885Sdim OS << "\n"; 509218885Sdim } 510218885Sdim 511218885Sdim} 512