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/Support/raw_ostream.h" 20using namespace llvm; 21 22//===----------------------------------------------------------------------===// 23// Top Level Entrypoint 24//===----------------------------------------------------------------------===// 25 26/// EmitAnyX86InstComments - This function decodes x86 instructions and prints 27/// newline terminated strings to the specified string if desired. This 28/// information is shown in disassembly dumps when verbose assembly is enabled. 29void llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS, 30 const char *(*getRegName)(unsigned)) { 31 // If this is a shuffle operation, the switch should fill in this state. 32 SmallVector<int, 8> ShuffleMask; 33 const char *DestName = 0, *Src1Name = 0, *Src2Name = 0; 34 35 switch (MI->getOpcode()) { 36 case X86::INSERTPSrr: 37 case X86::VINSERTPSrr: 38 DestName = getRegName(MI->getOperand(0).getReg()); 39 Src1Name = getRegName(MI->getOperand(1).getReg()); 40 Src2Name = getRegName(MI->getOperand(2).getReg()); 41 DecodeINSERTPSMask(MI->getOperand(3).getImm(), ShuffleMask); 42 break; 43 44 case X86::MOVLHPSrr: 45 case X86::VMOVLHPSrr: 46 Src2Name = getRegName(MI->getOperand(2).getReg()); 47 Src1Name = getRegName(MI->getOperand(1).getReg()); 48 DestName = getRegName(MI->getOperand(0).getReg()); 49 DecodeMOVLHPSMask(2, ShuffleMask); 50 break; 51 52 case X86::MOVHLPSrr: 53 case X86::VMOVHLPSrr: 54 Src2Name = getRegName(MI->getOperand(2).getReg()); 55 Src1Name = getRegName(MI->getOperand(1).getReg()); 56 DestName = getRegName(MI->getOperand(0).getReg()); 57 DecodeMOVHLPSMask(2, ShuffleMask); 58 break; 59 60 case X86::PALIGNR128rr: 61 case X86::VPALIGNR128rr: 62 Src1Name = getRegName(MI->getOperand(2).getReg()); 63 // FALL THROUGH. 64 case X86::PALIGNR128rm: 65 case X86::VPALIGNR128rm: 66 Src2Name = getRegName(MI->getOperand(1).getReg()); 67 DestName = getRegName(MI->getOperand(0).getReg()); 68 DecodePALIGNRMask(MVT::v16i8, 69 MI->getOperand(MI->getNumOperands()-1).getImm(), 70 ShuffleMask); 71 break; 72 case X86::VPALIGNR256rr: 73 Src1Name = getRegName(MI->getOperand(2).getReg()); 74 // FALL THROUGH. 75 case X86::VPALIGNR256rm: 76 Src2Name = getRegName(MI->getOperand(1).getReg()); 77 DestName = getRegName(MI->getOperand(0).getReg()); 78 DecodePALIGNRMask(MVT::v32i8, 79 MI->getOperand(MI->getNumOperands()-1).getImm(), 80 ShuffleMask); 81 break; 82 83 case X86::PSHUFDri: 84 case X86::VPSHUFDri: 85 Src1Name = getRegName(MI->getOperand(1).getReg()); 86 // FALL THROUGH. 87 case X86::PSHUFDmi: 88 case X86::VPSHUFDmi: 89 DestName = getRegName(MI->getOperand(0).getReg()); 90 DecodePSHUFMask(MVT::v4i32, MI->getOperand(MI->getNumOperands()-1).getImm(), 91 ShuffleMask); 92 break; 93 case X86::VPSHUFDYri: 94 Src1Name = getRegName(MI->getOperand(1).getReg()); 95 // FALL THROUGH. 96 case X86::VPSHUFDYmi: 97 DestName = getRegName(MI->getOperand(0).getReg()); 98 DecodePSHUFMask(MVT::v8i32, MI->getOperand(MI->getNumOperands()-1).getImm(), 99 ShuffleMask); 100 break; 101 102 103 case X86::PSHUFHWri: 104 case X86::VPSHUFHWri: 105 Src1Name = getRegName(MI->getOperand(1).getReg()); 106 // FALL THROUGH. 107 case X86::PSHUFHWmi: 108 case X86::VPSHUFHWmi: 109 DestName = getRegName(MI->getOperand(0).getReg()); 110 DecodePSHUFHWMask(MVT::v8i16, 111 MI->getOperand(MI->getNumOperands()-1).getImm(), 112 ShuffleMask); 113 break; 114 case X86::VPSHUFHWYri: 115 Src1Name = getRegName(MI->getOperand(1).getReg()); 116 // FALL THROUGH. 117 case X86::VPSHUFHWYmi: 118 DestName = getRegName(MI->getOperand(0).getReg()); 119 DecodePSHUFHWMask(MVT::v16i16, 120 MI->getOperand(MI->getNumOperands()-1).getImm(), 121 ShuffleMask); 122 break; 123 case X86::PSHUFLWri: 124 case X86::VPSHUFLWri: 125 Src1Name = getRegName(MI->getOperand(1).getReg()); 126 // FALL THROUGH. 127 case X86::PSHUFLWmi: 128 case X86::VPSHUFLWmi: 129 DestName = getRegName(MI->getOperand(0).getReg()); 130 DecodePSHUFLWMask(MVT::v8i16, 131 MI->getOperand(MI->getNumOperands()-1).getImm(), 132 ShuffleMask); 133 break; 134 case X86::VPSHUFLWYri: 135 Src1Name = getRegName(MI->getOperand(1).getReg()); 136 // FALL THROUGH. 137 case X86::VPSHUFLWYmi: 138 DestName = getRegName(MI->getOperand(0).getReg()); 139 DecodePSHUFLWMask(MVT::v16i16, 140 MI->getOperand(MI->getNumOperands()-1).getImm(), 141 ShuffleMask); 142 break; 143 144 case X86::PUNPCKHBWrr: 145 case X86::VPUNPCKHBWrr: 146 Src2Name = getRegName(MI->getOperand(2).getReg()); 147 // FALL THROUGH. 148 case X86::PUNPCKHBWrm: 149 case X86::VPUNPCKHBWrm: 150 Src1Name = getRegName(MI->getOperand(1).getReg()); 151 DestName = getRegName(MI->getOperand(0).getReg()); 152 DecodeUNPCKHMask(MVT::v16i8, ShuffleMask); 153 break; 154 case X86::VPUNPCKHBWYrr: 155 Src2Name = getRegName(MI->getOperand(2).getReg()); 156 // FALL THROUGH. 157 case X86::VPUNPCKHBWYrm: 158 Src1Name = getRegName(MI->getOperand(1).getReg()); 159 DestName = getRegName(MI->getOperand(0).getReg()); 160 DecodeUNPCKHMask(MVT::v32i8, ShuffleMask); 161 break; 162 case X86::PUNPCKHWDrr: 163 case X86::VPUNPCKHWDrr: 164 Src2Name = getRegName(MI->getOperand(2).getReg()); 165 // FALL THROUGH. 166 case X86::PUNPCKHWDrm: 167 case X86::VPUNPCKHWDrm: 168 Src1Name = getRegName(MI->getOperand(1).getReg()); 169 DestName = getRegName(MI->getOperand(0).getReg()); 170 DecodeUNPCKHMask(MVT::v8i16, ShuffleMask); 171 break; 172 case X86::VPUNPCKHWDYrr: 173 Src2Name = getRegName(MI->getOperand(2).getReg()); 174 // FALL THROUGH. 175 case X86::VPUNPCKHWDYrm: 176 Src1Name = getRegName(MI->getOperand(1).getReg()); 177 DestName = getRegName(MI->getOperand(0).getReg()); 178 DecodeUNPCKHMask(MVT::v16i16, ShuffleMask); 179 break; 180 case X86::PUNPCKHDQrr: 181 case X86::VPUNPCKHDQrr: 182 Src2Name = getRegName(MI->getOperand(2).getReg()); 183 // FALL THROUGH. 184 case X86::PUNPCKHDQrm: 185 case X86::VPUNPCKHDQrm: 186 Src1Name = getRegName(MI->getOperand(1).getReg()); 187 DestName = getRegName(MI->getOperand(0).getReg()); 188 DecodeUNPCKHMask(MVT::v4i32, ShuffleMask); 189 break; 190 case X86::VPUNPCKHDQYrr: 191 Src2Name = getRegName(MI->getOperand(2).getReg()); 192 // FALL THROUGH. 193 case X86::VPUNPCKHDQYrm: 194 Src1Name = getRegName(MI->getOperand(1).getReg()); 195 DestName = getRegName(MI->getOperand(0).getReg()); 196 DecodeUNPCKHMask(MVT::v8i32, ShuffleMask); 197 break; 198 case X86::PUNPCKHQDQrr: 199 case X86::VPUNPCKHQDQrr: 200 Src2Name = getRegName(MI->getOperand(2).getReg()); 201 // FALL THROUGH. 202 case X86::PUNPCKHQDQrm: 203 case X86::VPUNPCKHQDQrm: 204 Src1Name = getRegName(MI->getOperand(1).getReg()); 205 DestName = getRegName(MI->getOperand(0).getReg()); 206 DecodeUNPCKHMask(MVT::v2i64, ShuffleMask); 207 break; 208 case X86::VPUNPCKHQDQYrr: 209 Src2Name = getRegName(MI->getOperand(2).getReg()); 210 // FALL THROUGH. 211 case X86::VPUNPCKHQDQYrm: 212 Src1Name = getRegName(MI->getOperand(1).getReg()); 213 DestName = getRegName(MI->getOperand(0).getReg()); 214 DecodeUNPCKHMask(MVT::v4i64, ShuffleMask); 215 break; 216 217 case X86::PUNPCKLBWrr: 218 case X86::VPUNPCKLBWrr: 219 Src2Name = getRegName(MI->getOperand(2).getReg()); 220 // FALL THROUGH. 221 case X86::PUNPCKLBWrm: 222 case X86::VPUNPCKLBWrm: 223 Src1Name = getRegName(MI->getOperand(1).getReg()); 224 DestName = getRegName(MI->getOperand(0).getReg()); 225 DecodeUNPCKLMask(MVT::v16i8, ShuffleMask); 226 break; 227 case X86::VPUNPCKLBWYrr: 228 Src2Name = getRegName(MI->getOperand(2).getReg()); 229 // FALL THROUGH. 230 case X86::VPUNPCKLBWYrm: 231 Src1Name = getRegName(MI->getOperand(1).getReg()); 232 DestName = getRegName(MI->getOperand(0).getReg()); 233 DecodeUNPCKLMask(MVT::v32i8, ShuffleMask); 234 break; 235 case X86::PUNPCKLWDrr: 236 case X86::VPUNPCKLWDrr: 237 Src2Name = getRegName(MI->getOperand(2).getReg()); 238 // FALL THROUGH. 239 case X86::PUNPCKLWDrm: 240 case X86::VPUNPCKLWDrm: 241 Src1Name = getRegName(MI->getOperand(1).getReg()); 242 DestName = getRegName(MI->getOperand(0).getReg()); 243 DecodeUNPCKLMask(MVT::v8i16, ShuffleMask); 244 break; 245 case X86::VPUNPCKLWDYrr: 246 Src2Name = getRegName(MI->getOperand(2).getReg()); 247 // FALL THROUGH. 248 case X86::VPUNPCKLWDYrm: 249 Src1Name = getRegName(MI->getOperand(1).getReg()); 250 DestName = getRegName(MI->getOperand(0).getReg()); 251 DecodeUNPCKLMask(MVT::v16i16, ShuffleMask); 252 break; 253 case X86::PUNPCKLDQrr: 254 case X86::VPUNPCKLDQrr: 255 Src2Name = getRegName(MI->getOperand(2).getReg()); 256 // FALL THROUGH. 257 case X86::PUNPCKLDQrm: 258 case X86::VPUNPCKLDQrm: 259 Src1Name = getRegName(MI->getOperand(1).getReg()); 260 DestName = getRegName(MI->getOperand(0).getReg()); 261 DecodeUNPCKLMask(MVT::v4i32, ShuffleMask); 262 break; 263 case X86::VPUNPCKLDQYrr: 264 Src2Name = getRegName(MI->getOperand(2).getReg()); 265 // FALL THROUGH. 266 case X86::VPUNPCKLDQYrm: 267 Src1Name = getRegName(MI->getOperand(1).getReg()); 268 DestName = getRegName(MI->getOperand(0).getReg()); 269 DecodeUNPCKLMask(MVT::v8i32, ShuffleMask); 270 break; 271 case X86::PUNPCKLQDQrr: 272 case X86::VPUNPCKLQDQrr: 273 Src2Name = getRegName(MI->getOperand(2).getReg()); 274 // FALL THROUGH. 275 case X86::PUNPCKLQDQrm: 276 case X86::VPUNPCKLQDQrm: 277 Src1Name = getRegName(MI->getOperand(1).getReg()); 278 DestName = getRegName(MI->getOperand(0).getReg()); 279 DecodeUNPCKLMask(MVT::v2i64, ShuffleMask); 280 break; 281 case X86::VPUNPCKLQDQYrr: 282 Src2Name = getRegName(MI->getOperand(2).getReg()); 283 // FALL THROUGH. 284 case X86::VPUNPCKLQDQYrm: 285 Src1Name = getRegName(MI->getOperand(1).getReg()); 286 DestName = getRegName(MI->getOperand(0).getReg()); 287 DecodeUNPCKLMask(MVT::v4i64, ShuffleMask); 288 break; 289 290 case X86::SHUFPDrri: 291 case X86::VSHUFPDrri: 292 Src2Name = getRegName(MI->getOperand(2).getReg()); 293 // FALL THROUGH. 294 case X86::SHUFPDrmi: 295 case X86::VSHUFPDrmi: 296 DecodeSHUFPMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(), 297 ShuffleMask); 298 Src1Name = getRegName(MI->getOperand(1).getReg()); 299 DestName = getRegName(MI->getOperand(0).getReg()); 300 break; 301 case X86::VSHUFPDYrri: 302 Src2Name = getRegName(MI->getOperand(2).getReg()); 303 // FALL THROUGH. 304 case X86::VSHUFPDYrmi: 305 DecodeSHUFPMask(MVT::v4f64, MI->getOperand(MI->getNumOperands()-1).getImm(), 306 ShuffleMask); 307 Src1Name = getRegName(MI->getOperand(1).getReg()); 308 DestName = getRegName(MI->getOperand(0).getReg()); 309 break; 310 311 case X86::SHUFPSrri: 312 case X86::VSHUFPSrri: 313 Src2Name = getRegName(MI->getOperand(2).getReg()); 314 // FALL THROUGH. 315 case X86::SHUFPSrmi: 316 case X86::VSHUFPSrmi: 317 DecodeSHUFPMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(), 318 ShuffleMask); 319 Src1Name = getRegName(MI->getOperand(1).getReg()); 320 DestName = getRegName(MI->getOperand(0).getReg()); 321 break; 322 case X86::VSHUFPSYrri: 323 Src2Name = getRegName(MI->getOperand(2).getReg()); 324 // FALL THROUGH. 325 case X86::VSHUFPSYrmi: 326 DecodeSHUFPMask(MVT::v8f32, MI->getOperand(MI->getNumOperands()-1).getImm(), 327 ShuffleMask); 328 Src1Name = getRegName(MI->getOperand(1).getReg()); 329 DestName = getRegName(MI->getOperand(0).getReg()); 330 break; 331 332 case X86::UNPCKLPDrr: 333 case X86::VUNPCKLPDrr: 334 Src2Name = getRegName(MI->getOperand(2).getReg()); 335 // FALL THROUGH. 336 case X86::UNPCKLPDrm: 337 case X86::VUNPCKLPDrm: 338 DecodeUNPCKLMask(MVT::v2f64, ShuffleMask); 339 Src1Name = getRegName(MI->getOperand(1).getReg()); 340 DestName = getRegName(MI->getOperand(0).getReg()); 341 break; 342 case X86::VUNPCKLPDYrr: 343 Src2Name = getRegName(MI->getOperand(2).getReg()); 344 // FALL THROUGH. 345 case X86::VUNPCKLPDYrm: 346 DecodeUNPCKLMask(MVT::v4f64, ShuffleMask); 347 Src1Name = getRegName(MI->getOperand(1).getReg()); 348 DestName = getRegName(MI->getOperand(0).getReg()); 349 break; 350 case X86::UNPCKLPSrr: 351 case X86::VUNPCKLPSrr: 352 Src2Name = getRegName(MI->getOperand(2).getReg()); 353 // FALL THROUGH. 354 case X86::UNPCKLPSrm: 355 case X86::VUNPCKLPSrm: 356 DecodeUNPCKLMask(MVT::v4f32, ShuffleMask); 357 Src1Name = getRegName(MI->getOperand(1).getReg()); 358 DestName = getRegName(MI->getOperand(0).getReg()); 359 break; 360 case X86::VUNPCKLPSYrr: 361 Src2Name = getRegName(MI->getOperand(2).getReg()); 362 // FALL THROUGH. 363 case X86::VUNPCKLPSYrm: 364 DecodeUNPCKLMask(MVT::v8f32, ShuffleMask); 365 Src1Name = getRegName(MI->getOperand(1).getReg()); 366 DestName = getRegName(MI->getOperand(0).getReg()); 367 break; 368 case X86::UNPCKHPDrr: 369 case X86::VUNPCKHPDrr: 370 Src2Name = getRegName(MI->getOperand(2).getReg()); 371 // FALL THROUGH. 372 case X86::UNPCKHPDrm: 373 case X86::VUNPCKHPDrm: 374 DecodeUNPCKHMask(MVT::v2f64, ShuffleMask); 375 Src1Name = getRegName(MI->getOperand(1).getReg()); 376 DestName = getRegName(MI->getOperand(0).getReg()); 377 break; 378 case X86::VUNPCKHPDYrr: 379 Src2Name = getRegName(MI->getOperand(2).getReg()); 380 // FALL THROUGH. 381 case X86::VUNPCKHPDYrm: 382 DecodeUNPCKHMask(MVT::v4f64, ShuffleMask); 383 Src1Name = getRegName(MI->getOperand(1).getReg()); 384 DestName = getRegName(MI->getOperand(0).getReg()); 385 break; 386 case X86::UNPCKHPSrr: 387 case X86::VUNPCKHPSrr: 388 Src2Name = getRegName(MI->getOperand(2).getReg()); 389 // FALL THROUGH. 390 case X86::UNPCKHPSrm: 391 case X86::VUNPCKHPSrm: 392 DecodeUNPCKHMask(MVT::v4f32, ShuffleMask); 393 Src1Name = getRegName(MI->getOperand(1).getReg()); 394 DestName = getRegName(MI->getOperand(0).getReg()); 395 break; 396 case X86::VUNPCKHPSYrr: 397 Src2Name = getRegName(MI->getOperand(2).getReg()); 398 // FALL THROUGH. 399 case X86::VUNPCKHPSYrm: 400 DecodeUNPCKHMask(MVT::v8f32, ShuffleMask); 401 Src1Name = getRegName(MI->getOperand(1).getReg()); 402 DestName = getRegName(MI->getOperand(0).getReg()); 403 break; 404 case X86::VPERMILPSri: 405 Src1Name = getRegName(MI->getOperand(1).getReg()); 406 // FALL THROUGH. 407 case X86::VPERMILPSmi: 408 DecodePSHUFMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(), 409 ShuffleMask); 410 DestName = getRegName(MI->getOperand(0).getReg()); 411 break; 412 case X86::VPERMILPSYri: 413 Src1Name = getRegName(MI->getOperand(1).getReg()); 414 // FALL THROUGH. 415 case X86::VPERMILPSYmi: 416 DecodePSHUFMask(MVT::v8f32, MI->getOperand(MI->getNumOperands()-1).getImm(), 417 ShuffleMask); 418 DestName = getRegName(MI->getOperand(0).getReg()); 419 break; 420 case X86::VPERMILPDri: 421 Src1Name = getRegName(MI->getOperand(1).getReg()); 422 // FALL THROUGH. 423 case X86::VPERMILPDmi: 424 DecodePSHUFMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(), 425 ShuffleMask); 426 DestName = getRegName(MI->getOperand(0).getReg()); 427 break; 428 case X86::VPERMILPDYri: 429 Src1Name = getRegName(MI->getOperand(1).getReg()); 430 // FALL THROUGH. 431 case X86::VPERMILPDYmi: 432 DecodePSHUFMask(MVT::v4f64, MI->getOperand(MI->getNumOperands()-1).getImm(), 433 ShuffleMask); 434 DestName = getRegName(MI->getOperand(0).getReg()); 435 break; 436 case X86::VPERM2F128rr: 437 case X86::VPERM2I128rr: 438 Src2Name = getRegName(MI->getOperand(2).getReg()); 439 // FALL THROUGH. 440 case X86::VPERM2F128rm: 441 case X86::VPERM2I128rm: 442 // For instruction comments purpose, assume the 256-bit vector is v4i64. 443 DecodeVPERM2X128Mask(MVT::v4i64, 444 MI->getOperand(MI->getNumOperands()-1).getImm(), 445 ShuffleMask); 446 Src1Name = getRegName(MI->getOperand(1).getReg()); 447 DestName = getRegName(MI->getOperand(0).getReg()); 448 break; 449 case X86::VPERMQYri: 450 case X86::VPERMPDYri: 451 Src1Name = getRegName(MI->getOperand(1).getReg()); 452 // FALL THROUGH. 453 case X86::VPERMQYmi: 454 case X86::VPERMPDYmi: 455 DecodeVPERMMask(MI->getOperand(MI->getNumOperands()-1).getImm(), 456 ShuffleMask); 457 DestName = getRegName(MI->getOperand(0).getReg()); 458 break; 459 } 460 461 462 // If this was a shuffle operation, print the shuffle mask. 463 if (!ShuffleMask.empty()) { 464 if (DestName == 0) DestName = Src1Name; 465 OS << (DestName ? DestName : "mem") << " = "; 466 467 // If the two sources are the same, canonicalize the input elements to be 468 // from the first src so that we get larger element spans. 469 if (Src1Name == Src2Name) { 470 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) { 471 if ((int)ShuffleMask[i] >= 0 && // Not sentinel. 472 ShuffleMask[i] >= (int)e) // From second mask. 473 ShuffleMask[i] -= e; 474 } 475 } 476 477 // The shuffle mask specifies which elements of the src1/src2 fill in the 478 // destination, with a few sentinel values. Loop through and print them 479 // out. 480 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) { 481 if (i != 0) 482 OS << ','; 483 if (ShuffleMask[i] == SM_SentinelZero) { 484 OS << "zero"; 485 continue; 486 } 487 488 // Otherwise, it must come from src1 or src2. Print the span of elements 489 // that comes from this src. 490 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size(); 491 const char *SrcName = isSrc1 ? Src1Name : Src2Name; 492 OS << (SrcName ? SrcName : "mem") << '['; 493 bool IsFirst = true; 494 while (i != e && 495 (int)ShuffleMask[i] >= 0 && 496 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) { 497 if (!IsFirst) 498 OS << ','; 499 else 500 IsFirst = false; 501 OS << ShuffleMask[i] % ShuffleMask.size(); 502 ++i; 503 } 504 OS << ']'; 505 --i; // For loop increments element #. 506 } 507 //MI->print(OS, 0); 508 OS << "\n"; 509 } 510 511} 512