X86InstComments.cpp revision 234353
117658Sjulian//===-- X86InstComments.cpp - Generate verbose-asm comments for instrs ----===// 217658Sjulian// 317658Sjulian// The LLVM Compiler Infrastructure 417658Sjulian// 517658Sjulian// This file is distributed under the University of Illinois Open Source 617658Sjulian// License. See LICENSE.TXT for details. 717658Sjulian// 817658Sjulian//===----------------------------------------------------------------------===// 917658Sjulian// 1017658Sjulian// This defines functionality used to emit comments about X86 instructions to 1117658Sjulian// an output stream for -fverbose-asm. 1217658Sjulian// 1317658Sjulian//===----------------------------------------------------------------------===// 1417658Sjulian 1517658Sjulian#include "X86InstComments.h" 1617658Sjulian#include "MCTargetDesc/X86MCTargetDesc.h" 1717658Sjulian#include "Utils/X86ShuffleDecode.h" 1817658Sjulian#include "llvm/MC/MCInst.h" 1917658Sjulian#include "llvm/Support/raw_ostream.h" 2017658Sjulianusing namespace llvm; 2117658Sjulian 2217658Sjulian//===----------------------------------------------------------------------===// 2317658Sjulian// Top Level Entrypoint 2417658Sjulian//===----------------------------------------------------------------------===// 2517658Sjulian 2617658Sjulian/// EmitAnyX86InstComments - This function decodes x86 instructions and prints 2717658Sjulian/// newline terminated strings to the specified string if desired. This 2817658Sjulian/// information is shown in disassembly dumps when verbose assembly is enabled. 2917658Sjulianvoid llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS, 3017658Sjulian const char *(*getRegName)(unsigned)) { 3117658Sjulian // If this is a shuffle operation, the switch should fill in this state. 3217658Sjulian SmallVector<int, 8> ShuffleMask; 3317658Sjulian const char *DestName = 0, *Src1Name = 0, *Src2Name = 0; 3417658Sjulian 3517658Sjulian switch (MI->getOpcode()) { 3617658Sjulian case X86::INSERTPSrr: 37116182Sobrien Src1Name = getRegName(MI->getOperand(0).getReg()); 38116182Sobrien Src2Name = getRegName(MI->getOperand(2).getReg()); 39116182Sobrien DecodeINSERTPSMask(MI->getOperand(3).getImm(), ShuffleMask); 40131927Smarcel break; 41106024Srwatson case X86::VINSERTPSrr: 4228976Sbde DestName = getRegName(MI->getOperand(0).getReg()); 4328976Sbde Src1Name = getRegName(MI->getOperand(1).getReg()); 44134649Sscottl Src2Name = getRegName(MI->getOperand(2).getReg()); 4517658Sjulian DecodeINSERTPSMask(MI->getOperand(3).getImm(), ShuffleMask); 4617658Sjulian break; 4717658Sjulian 4860041Sphk case X86::MOVLHPSrr: 4931275Sbde Src2Name = getRegName(MI->getOperand(2).getReg()); 5078767Sjhb Src1Name = getRegName(MI->getOperand(0).getReg()); 5178767Sjhb DecodeMOVLHPSMask(2, ShuffleMask); 5278767Sjhb break; 53131927Smarcel case X86::VMOVLHPSrr: 5417658Sjulian Src2Name = getRegName(MI->getOperand(2).getReg()); 5555539Sluoqi Src1Name = getRegName(MI->getOperand(1).getReg()); 56106024Srwatson DestName = getRegName(MI->getOperand(0).getReg()); 5789601Ssobomax DecodeMOVLHPSMask(2, ShuffleMask); 5821776Sbde break; 5978767Sjhb 6078767Sjhb case X86::MOVHLPSrr: 6178767Sjhb Src2Name = getRegName(MI->getOperand(2).getReg()); 62137263Speter Src1Name = getRegName(MI->getOperand(0).getReg()); 6378767Sjhb DecodeMOVHLPSMask(2, ShuffleMask); 6417658Sjulian break; 6517658Sjulian case X86::VMOVHLPSrr: 6617658Sjulian Src2Name = getRegName(MI->getOperand(2).getReg()); 67118990Smarcel Src1Name = getRegName(MI->getOperand(1).getReg()); 6894169Sphk DestName = getRegName(MI->getOperand(0).getReg()); 6991778Sjake DecodeMOVHLPSMask(2, ShuffleMask); 7017658Sjulian break; 7117658Sjulian 7217658Sjulian case X86::PSHUFDri: 7317658Sjulian case X86::VPSHUFDri: 7417658Sjulian Src1Name = getRegName(MI->getOperand(1).getReg()); 7517658Sjulian // FALL THROUGH. 7617658Sjulian case X86::PSHUFDmi: 7717658Sjulian case X86::VPSHUFDmi: 7817658Sjulian DestName = getRegName(MI->getOperand(0).getReg()); 7917658Sjulian DecodePSHUFMask(MVT::v4i32, MI->getOperand(MI->getNumOperands()-1).getImm(), 8017658Sjulian ShuffleMask); 8117658Sjulian break; 8217658Sjulian case X86::VPSHUFDYri: 83131927Smarcel Src1Name = getRegName(MI->getOperand(1).getReg()); 84131927Smarcel // FALL THROUGH. 8542135Smsmith case X86::VPSHUFDYmi: 8617658Sjulian DestName = getRegName(MI->getOperand(0).getReg()); 8742135Smsmith DecodePSHUFMask(MVT::v8i32, MI->getOperand(MI->getNumOperands()-1).getImm(), 8817658Sjulian ShuffleMask); 8917658Sjulian break; 9046381Sbillf 91103647Sjhb 92131927Smarcel case X86::PSHUFHWri: 93103647Sjhb case X86::VPSHUFHWri: 94103647Sjhb Src1Name = getRegName(MI->getOperand(1).getReg()); 95103647Sjhb // FALL THROUGH. 9617658Sjulian case X86::PSHUFHWmi: 97103647Sjhb case X86::VPSHUFHWmi: 98103647Sjhb DestName = getRegName(MI->getOperand(0).getReg()); 99131927Smarcel DecodePSHUFHWMask(MI->getOperand(MI->getNumOperands()-1).getImm(), 10017658Sjulian ShuffleMask); 101132506Srwatson break; 10285202Speter case X86::PSHUFLWri: 10385202Speter case X86::VPSHUFLWri: 10485202Speter Src1Name = getRegName(MI->getOperand(1).getReg()); 10543436Smsmith // FALL THROUGH. 10643436Smsmith case X86::PSHUFLWmi: 10717658Sjulian case X86::VPSHUFLWmi: 10817658Sjulian DestName = getRegName(MI->getOperand(0).getReg()); 10917658Sjulian DecodePSHUFLWMask(MI->getOperand(MI->getNumOperands()-1).getImm(), 11017658Sjulian ShuffleMask); 11117658Sjulian break; 11217658Sjulian 11393496Sphk case X86::PUNPCKHBWrr: 114155383Sjeff Src2Name = getRegName(MI->getOperand(2).getReg()); 11593496Sphk // FALL THROUGH. 11667093Sps case X86::PUNPCKHBWrm: 117131927Smarcel Src1Name = getRegName(MI->getOperand(0).getReg()); 118131927Smarcel DecodeUNPCKHMask(MVT::v16i8, ShuffleMask); 119131927Smarcel break; 120131927Smarcel case X86::VPUNPCKHBWrr: 12165395Speter Src2Name = getRegName(MI->getOperand(2).getReg()); 12265395Speter // FALL THROUGH. 12365395Speter case X86::VPUNPCKHBWrm: 12465395Speter Src1Name = getRegName(MI->getOperand(1).getReg()); 12565395Speter DestName = getRegName(MI->getOperand(0).getReg()); 12617658Sjulian DecodeUNPCKHMask(MVT::v16i8, ShuffleMask); 12750107Smsmith break; 128110859Salfred case X86::VPUNPCKHBWYrr: 12950107Smsmith Src2Name = getRegName(MI->getOperand(2).getReg()); 13050107Smsmith // FALL THROUGH. 131110859Salfred case X86::VPUNPCKHBWYrm: 132110859Salfred Src1Name = getRegName(MI->getOperand(1).getReg()); 133110859Salfred DestName = getRegName(MI->getOperand(0).getReg()); 134110859Salfred DecodeUNPCKHMask(MVT::v32i8, ShuffleMask); 135110859Salfred break; 136110859Salfred case X86::PUNPCKHWDrr: 137110859Salfred Src2Name = getRegName(MI->getOperand(2).getReg()); 138110859Salfred // FALL THROUGH. 139110859Salfred case X86::PUNPCKHWDrm: 14050107Smsmith Src1Name = getRegName(MI->getOperand(0).getReg()); 14148868Sphk DecodeUNPCKHMask(MVT::v8i16, ShuffleMask); 14250107Smsmith break; 14350107Smsmith case X86::VPUNPCKHWDrr: 14417658Sjulian Src2Name = getRegName(MI->getOperand(2).getReg()); 14517658Sjulian // FALL THROUGH. 14682749Sdillon case X86::VPUNPCKHWDrm: 14782749Sdillon Src1Name = getRegName(MI->getOperand(1).getReg()); 14817658Sjulian DestName = getRegName(MI->getOperand(0).getReg()); 14982749Sdillon DecodeUNPCKHMask(MVT::v8i16, ShuffleMask); 15017658Sjulian break; 15183366Sjulian case X86::VPUNPCKHWDYrr: 15217658Sjulian Src2Name = getRegName(MI->getOperand(2).getReg()); 15317658Sjulian // FALL THROUGH. 15417658Sjulian case X86::VPUNPCKHWDYrm: 155106024Srwatson Src1Name = getRegName(MI->getOperand(1).getReg()); 156106024Srwatson DestName = getRegName(MI->getOperand(0).getReg()); 157106024Srwatson DecodeUNPCKHMask(MVT::v16i16, ShuffleMask); 158106024Srwatson break; 159106024Srwatson case X86::PUNPCKHDQrr: 160106024Srwatson Src2Name = getRegName(MI->getOperand(2).getReg()); 161106024Srwatson // FALL THROUGH. 162106024Srwatson case X86::PUNPCKHDQrm: 16382749Sdillon Src1Name = getRegName(MI->getOperand(0).getReg()); 164106024Srwatson DecodeUNPCKHMask(MVT::v4i32, ShuffleMask); 165106024Srwatson break; 16682749Sdillon case X86::VPUNPCKHDQrr: 16717658Sjulian Src2Name = getRegName(MI->getOperand(2).getReg()); 16817658Sjulian // FALL THROUGH. 16917658Sjulian case X86::VPUNPCKHDQrm: 17017658Sjulian Src1Name = getRegName(MI->getOperand(1).getReg()); 17117658Sjulian DestName = getRegName(MI->getOperand(0).getReg()); 17265268Smsmith DecodeUNPCKHMask(MVT::v4i32, ShuffleMask); 17365268Smsmith break; 17417658Sjulian case X86::VPUNPCKHDQYrr: 17565268Smsmith Src2Name = getRegName(MI->getOperand(2).getReg()); 17617658Sjulian // FALL THROUGH. 177110859Salfred case X86::VPUNPCKHDQYrm: 17865268Smsmith Src1Name = getRegName(MI->getOperand(1).getReg()); 179110859Salfred DestName = getRegName(MI->getOperand(0).getReg()); 18017658Sjulian DecodeUNPCKHMask(MVT::v8i32, ShuffleMask); 18117658Sjulian break; 18273913Sjhb case X86::PUNPCKHQDQrr: 18317658Sjulian Src2Name = getRegName(MI->getOperand(2).getReg()); 18473913Sjhb // FALL THROUGH. 18517658Sjulian case X86::PUNPCKHQDQrm: 18617658Sjulian Src1Name = getRegName(MI->getOperand(0).getReg()); 18717658Sjulian DecodeUNPCKHMask(MVT::v2i64, ShuffleMask); 18817658Sjulian break; 18917658Sjulian case X86::VPUNPCKHQDQrr: 19017658Sjulian Src2Name = getRegName(MI->getOperand(2).getReg()); 19117658Sjulian // FALL THROUGH. 19217658Sjulian case X86::VPUNPCKHQDQrm: 19354233Sphk Src1Name = getRegName(MI->getOperand(1).getReg()); 19465395Speter DestName = getRegName(MI->getOperand(0).getReg()); 19554233Sphk DecodeUNPCKHMask(MVT::v2i64, ShuffleMask); 19654233Sphk break; 19754233Sphk case X86::VPUNPCKHQDQYrr: 19854233Sphk Src2Name = getRegName(MI->getOperand(2).getReg()); 19954233Sphk // FALL THROUGH. 20054233Sphk case X86::VPUNPCKHQDQYrm: 20154233Sphk Src1Name = getRegName(MI->getOperand(1).getReg()); 20254233Sphk DestName = getRegName(MI->getOperand(0).getReg()); 20365764Sjhb DecodeUNPCKHMask(MVT::v4i64, ShuffleMask); 20454233Sphk break; 20554233Sphk 20654233Sphk case X86::PUNPCKLBWrr: 20754233Sphk Src2Name = getRegName(MI->getOperand(2).getReg()); 20865764Sjhb // FALL THROUGH. 20954233Sphk case X86::PUNPCKLBWrm: 21054233Sphk Src1Name = getRegName(MI->getOperand(0).getReg()); 21154233Sphk DecodeUNPCKLMask(MVT::v16i8, ShuffleMask); 21254233Sphk break; 21365764Sjhb case X86::VPUNPCKLBWrr: 21454233Sphk Src2Name = getRegName(MI->getOperand(2).getReg()); 21554233Sphk // FALL THROUGH. 21654233Sphk case X86::VPUNPCKLBWrm: 21765764Sjhb Src1Name = getRegName(MI->getOperand(1).getReg()); 21854233Sphk DestName = getRegName(MI->getOperand(0).getReg()); 21954233Sphk DecodeUNPCKLMask(MVT::v16i8, ShuffleMask); 22094169Sphk break; 22194169Sphk case X86::VPUNPCKLBWYrr: 22294169Sphk Src2Name = getRegName(MI->getOperand(2).getReg()); 223110859Salfred // FALL THROUGH. 224132412Sjulian case X86::VPUNPCKLBWYrm: 225132412Sjulian Src1Name = getRegName(MI->getOperand(1).getReg()); 226132412Sjulian DestName = getRegName(MI->getOperand(0).getReg()); 227132412Sjulian DecodeUNPCKLMask(MVT::v32i8, ShuffleMask); 228132412Sjulian break; 229132412Sjulian case X86::PUNPCKLWDrr: 230132413Sjulian Src2Name = getRegName(MI->getOperand(2).getReg()); 231132412Sjulian // FALL THROUGH. 232132412Sjulian case X86::PUNPCKLWDrm: 233132412Sjulian Src1Name = getRegName(MI->getOperand(0).getReg()); 23494169Sphk DecodeUNPCKLMask(MVT::v8i16, ShuffleMask); 235131927Smarcel break; 23694169Sphk case X86::VPUNPCKLWDrr: 23794169Sphk Src2Name = getRegName(MI->getOperand(2).getReg()); 23894169Sphk // FALL THROUGH. 23994169Sphk case X86::VPUNPCKLWDrm: 240149875Struckman Src1Name = getRegName(MI->getOperand(1).getReg()); 241149875Struckman DestName = getRegName(MI->getOperand(0).getReg()); 242149875Struckman DecodeUNPCKLMask(MVT::v8i16, ShuffleMask); 243149875Struckman break; 244149875Struckman case X86::VPUNPCKLWDYrr: 245149875Struckman Src2Name = getRegName(MI->getOperand(2).getReg()); 246149875Struckman // FALL THROUGH. 247149875Struckman case X86::VPUNPCKLWDYrm: 248149875Struckman Src1Name = getRegName(MI->getOperand(1).getReg()); 249149875Struckman DestName = getRegName(MI->getOperand(0).getReg()); 25017658Sjulian DecodeUNPCKLMask(MVT::v16i16, ShuffleMask); 251137329Snjl break; 25217658Sjulian case X86::PUNPCKLDQrr: 25331275Sbde Src2Name = getRegName(MI->getOperand(2).getReg()); 25465395Speter // FALL THROUGH. 25517658Sjulian case X86::PUNPCKLDQrm: 256133763Struckman Src1Name = getRegName(MI->getOperand(0).getReg()); 25717658Sjulian DecodeUNPCKLMask(MVT::v4i32, ShuffleMask); 258137375Smarcel break; 259137329Snjl case X86::VPUNPCKLDQrr: 260137329Snjl Src2Name = getRegName(MI->getOperand(2).getReg()); 261137329Snjl // FALL THROUGH. 262137329Snjl case X86::VPUNPCKLDQrm: 263137329Snjl Src1Name = getRegName(MI->getOperand(1).getReg()); 264137263Speter DestName = getRegName(MI->getOperand(0).getReg()); 265137263Speter DecodeUNPCKLMask(MVT::v4i32, ShuffleMask); 266137263Speter break; 267138217Snjl case X86::VPUNPCKLDQYrr: 268137263Speter Src2Name = getRegName(MI->getOperand(2).getReg()); 269155383Sjeff // FALL THROUGH. 270155383Sjeff case X86::VPUNPCKLDQYrm: 271137263Speter Src1Name = getRegName(MI->getOperand(1).getReg()); 27265268Smsmith DestName = getRegName(MI->getOperand(0).getReg()); 27365268Smsmith DecodeUNPCKLMask(MVT::v8i32, ShuffleMask); 27465268Smsmith break; 27582119Sjhb case X86::PUNPCKLQDQrr: 276131927Smarcel Src2Name = getRegName(MI->getOperand(2).getReg()); 27782119Sjhb // FALL THROUGH. 27827997Sjulian case X86::PUNPCKLQDQrm: 27927997Sjulian Src1Name = getRegName(MI->getOperand(0).getReg()); 28027997Sjulian DecodeUNPCKLMask(MVT::v2i64, ShuffleMask); 28150107Smsmith break; 28227997Sjulian case X86::VPUNPCKLQDQrr: 28327997Sjulian Src2Name = getRegName(MI->getOperand(2).getReg()); 28427997Sjulian // FALL THROUGH. 28527997Sjulian case X86::VPUNPCKLQDQrm: 28617658Sjulian Src1Name = getRegName(MI->getOperand(1).getReg()); 28717658Sjulian DestName = getRegName(MI->getOperand(0).getReg()); 28865707Sjasone DecodeUNPCKLMask(MVT::v2i64, ShuffleMask); 289131481Sjhb break; 29065707Sjasone case X86::VPUNPCKLQDQYrr: 291131481Sjhb Src2Name = getRegName(MI->getOperand(2).getReg()); 29217658Sjulian // FALL THROUGH. 29317658Sjulian case X86::VPUNPCKLQDQYrm: 29417658Sjulian Src1Name = getRegName(MI->getOperand(1).getReg()); 295150472Sups DestName = getRegName(MI->getOperand(0).getReg()); 29617658Sjulian DecodeUNPCKLMask(MVT::v4i64, ShuffleMask); 29734266Sjulian break; 29834266Sjulian 29934266Sjulian case X86::SHUFPDrri: 30034266Sjulian Src2Name = getRegName(MI->getOperand(2).getReg()); 30134266Sjulian // FALL THROUGH. 30265707Sjasone case X86::SHUFPDrmi: 30317658Sjulian DecodeSHUFPMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(), 304149875Struckman ShuffleMask); 305149875Struckman Src1Name = getRegName(MI->getOperand(0).getReg()); 30617658Sjulian break; 307133763Struckman case X86::VSHUFPDrri: 308133763Struckman Src2Name = getRegName(MI->getOperand(2).getReg()); 309136115Sphk // FALL THROUGH. 31017658Sjulian case X86::VSHUFPDrmi: 311133763Struckman DecodeSHUFPMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(), 312133763Struckman ShuffleMask); 313133763Struckman Src1Name = getRegName(MI->getOperand(1).getReg()); 314133763Struckman DestName = getRegName(MI->getOperand(0).getReg()); 315133763Struckman break; 31617658Sjulian case X86::VSHUFPDYrri: 31765707Sjasone Src2Name = getRegName(MI->getOperand(2).getReg()); 31865707Sjasone // FALL THROUGH. 31965707Sjasone case X86::VSHUFPDYrmi: 320150472Sups DecodeSHUFPMask(MVT::v4f64, MI->getOperand(MI->getNumOperands()-1).getImm(), 321131481Sjhb ShuffleMask); 322131481Sjhb Src1Name = getRegName(MI->getOperand(1).getReg()); 323131481Sjhb DestName = getRegName(MI->getOperand(0).getReg()); 324131481Sjhb break; 325131481Sjhb 326131481Sjhb case X86::SHUFPSrri: 327131481Sjhb Src2Name = getRegName(MI->getOperand(2).getReg()); 32834266Sjulian // FALL THROUGH. 329131481Sjhb case X86::SHUFPSrmi: 330131481Sjhb DecodeSHUFPMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(), 331131481Sjhb ShuffleMask); 332131481Sjhb Src1Name = getRegName(MI->getOperand(0).getReg()); 333131481Sjhb break; 334131481Sjhb case X86::VSHUFPSrri: 335131481Sjhb Src2Name = getRegName(MI->getOperand(2).getReg()); 336131481Sjhb // FALL THROUGH. 337131481Sjhb case X86::VSHUFPSrmi: 338131481Sjhb DecodeSHUFPMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(), 339131481Sjhb ShuffleMask); 340131481Sjhb Src1Name = getRegName(MI->getOperand(1).getReg()); 341131481Sjhb DestName = getRegName(MI->getOperand(0).getReg()); 342131481Sjhb break; 343131481Sjhb case X86::VSHUFPSYrri: 34417658Sjulian Src2Name = getRegName(MI->getOperand(2).getReg()); 345133418Snjl // FALL THROUGH. 34641137Smsmith case X86::VSHUFPSYrmi: 34741137Smsmith DecodeSHUFPMask(MVT::v8f32, MI->getOperand(MI->getNumOperands()-1).getImm(), 34841137Smsmith ShuffleMask); 34941137Smsmith Src1Name = getRegName(MI->getOperand(1).getReg()); 35041137Smsmith DestName = getRegName(MI->getOperand(0).getReg()); 35141137Smsmith break; 352149875Struckman 353137186Sphk case X86::UNPCKLPDrr: 354137186Sphk Src2Name = getRegName(MI->getOperand(2).getReg()); 355130640Sphk // FALL THROUGH. 35653452Sphk case X86::UNPCKLPDrm: 35748225Smckusick DecodeUNPCKLMask(MVT::v2f64, ShuffleMask); 35853023Sphk Src1Name = getRegName(MI->getOperand(0).getReg()); 35953023Sphk break; 360137186Sphk case X86::VUNPCKLPDrr: 36153023Sphk Src2Name = getRegName(MI->getOperand(2).getReg()); 36253023Sphk // FALL THROUGH. 36353023Sphk case X86::VUNPCKLPDrm: 364137186Sphk DecodeUNPCKLMask(MVT::v2f64, ShuffleMask); 365137186Sphk Src1Name = getRegName(MI->getOperand(1).getReg()); 36653023Sphk DestName = getRegName(MI->getOperand(0).getReg()); 36753023Sphk break; 36853023Sphk case X86::VUNPCKLPDYrr: 36946568Speter Src2Name = getRegName(MI->getOperand(2).getReg()); 37041137Smsmith // FALL THROUGH. 37117658Sjulian case X86::VUNPCKLPDYrm: 37217658Sjulian DecodeUNPCKLMask(MVT::v4f64, ShuffleMask); 37317658Sjulian Src1Name = getRegName(MI->getOperand(1).getReg()); 37417658Sjulian DestName = getRegName(MI->getOperand(0).getReg()); 37517658Sjulian break; 376133763Struckman case X86::UNPCKLPSrr: 37717658Sjulian Src2Name = getRegName(MI->getOperand(2).getReg()); 37817658Sjulian // FALL THROUGH. 379133763Struckman case X86::UNPCKLPSrm: 380133763Struckman DecodeUNPCKLMask(MVT::v4f32, ShuffleMask); 38117658Sjulian Src1Name = getRegName(MI->getOperand(0).getReg()); 38217658Sjulian break; 38317658Sjulian case X86::VUNPCKLPSrr: 38417658Sjulian Src2Name = getRegName(MI->getOperand(2).getReg()); 38517658Sjulian // FALL THROUGH. 38617658Sjulian case X86::VUNPCKLPSrm: 38739237Sgibbs DecodeUNPCKLMask(MVT::v4f32, ShuffleMask); 38817658Sjulian Src1Name = getRegName(MI->getOperand(1).getReg()); 38927997Sjulian DestName = getRegName(MI->getOperand(0).getReg()); 39054233Sphk break; 39154233Sphk case X86::VUNPCKLPSYrr: 39227997Sjulian Src2Name = getRegName(MI->getOperand(2).getReg()); 39327997Sjulian // FALL THROUGH. 39427997Sjulian case X86::VUNPCKLPSYrm: 39527997Sjulian DecodeUNPCKLMask(MVT::v8f32, ShuffleMask); 39650107Smsmith Src1Name = getRegName(MI->getOperand(1).getReg()); 397137329Snjl DestName = getRegName(MI->getOperand(0).getReg()); 398137329Snjl break; 39939237Sgibbs case X86::UNPCKHPDrr: 400137329Snjl Src2Name = getRegName(MI->getOperand(2).getReg()); 401132412Sjulian // FALL THROUGH. 40294169Sphk case X86::UNPCKHPDrm: 40339237Sgibbs DecodeUNPCKHMask(MVT::v2f64, ShuffleMask); 40439237Sgibbs Src1Name = getRegName(MI->getOperand(0).getReg()); 40550107Smsmith break; 40639237Sgibbs case X86::VUNPCKHPDrr: 40750107Smsmith Src2Name = getRegName(MI->getOperand(2).getReg()); 40850107Smsmith // FALL THROUGH. 40950107Smsmith case X86::VUNPCKHPDrm: 41050107Smsmith DecodeUNPCKHMask(MVT::v2f64, ShuffleMask); 41150107Smsmith Src1Name = getRegName(MI->getOperand(1).getReg()); 41250107Smsmith DestName = getRegName(MI->getOperand(0).getReg()); 41350107Smsmith break; 41450107Smsmith case X86::VUNPCKHPDYrr: 41550107Smsmith Src2Name = getRegName(MI->getOperand(2).getReg()); 41650107Smsmith // FALL THROUGH. 417110859Salfred case X86::VUNPCKHPDYrm: 41817658Sjulian DecodeUNPCKHMask(MVT::v4f64, ShuffleMask); 41917658Sjulian Src1Name = getRegName(MI->getOperand(1).getReg()); 42017658Sjulian DestName = getRegName(MI->getOperand(0).getReg()); 42117658Sjulian break; 42219274Sjulian case X86::UNPCKHPSrr: 42319274Sjulian Src2Name = getRegName(MI->getOperand(2).getReg()); 42419274Sjulian // FALL THROUGH. 42519274Sjulian case X86::UNPCKHPSrm: 42619274Sjulian DecodeUNPCKHMask(MVT::v4f32, ShuffleMask); 42739237Sgibbs Src1Name = getRegName(MI->getOperand(0).getReg()); 42819274Sjulian break; 42919274Sjulian case X86::VUNPCKHPSrr: 43050107Smsmith Src2Name = getRegName(MI->getOperand(2).getReg()); 43150107Smsmith // FALL THROUGH. 43217658Sjulian case X86::VUNPCKHPSrm: 43350107Smsmith DecodeUNPCKHMask(MVT::v4f32, ShuffleMask); 43450107Smsmith Src1Name = getRegName(MI->getOperand(1).getReg()); 43550107Smsmith DestName = getRegName(MI->getOperand(0).getReg()); 43650107Smsmith break; 43750107Smsmith case X86::VUNPCKHPSYrr: 43850107Smsmith Src2Name = getRegName(MI->getOperand(2).getReg()); 43950107Smsmith // FALL THROUGH. 44050107Smsmith case X86::VUNPCKHPSYrm: 44150107Smsmith DecodeUNPCKHMask(MVT::v8f32, ShuffleMask); 44250107Smsmith Src1Name = getRegName(MI->getOperand(1).getReg()); 44339237Sgibbs DestName = getRegName(MI->getOperand(0).getReg()); 44439237Sgibbs break; 44539237Sgibbs case X86::VPERMILPSri: 44639237Sgibbs Src1Name = getRegName(MI->getOperand(1).getReg()); 44739237Sgibbs // FALL THROUGH. 44839237Sgibbs case X86::VPERMILPSmi: 44939237Sgibbs DecodePSHUFMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(), 45039237Sgibbs ShuffleMask); 45139237Sgibbs DestName = getRegName(MI->getOperand(0).getReg()); 45239237Sgibbs break; 45339237Sgibbs case X86::VPERMILPSYri: 45417658Sjulian Src1Name = getRegName(MI->getOperand(1).getReg()); 45539237Sgibbs // FALL THROUGH. 45650107Smsmith case X86::VPERMILPSYmi: 45717658Sjulian DecodePSHUFMask(MVT::v8f32, MI->getOperand(MI->getNumOperands()-1).getImm(), 45839237Sgibbs ShuffleMask); 45950107Smsmith DestName = getRegName(MI->getOperand(0).getReg()); 46017658Sjulian break; 46189522Snik case X86::VPERMILPDri: 46289522Snik Src1Name = getRegName(MI->getOperand(1).getReg()); 46339237Sgibbs // FALL THROUGH. 46417658Sjulian case X86::VPERMILPDmi: 46550107Smsmith DecodePSHUFMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(), 46650107Smsmith ShuffleMask); 46750107Smsmith DestName = getRegName(MI->getOperand(0).getReg()); 46850107Smsmith break; 46950107Smsmith case X86::VPERMILPDYri: 47050107Smsmith Src1Name = getRegName(MI->getOperand(1).getReg()); 47150107Smsmith // FALL THROUGH. 47250107Smsmith case X86::VPERMILPDYmi: 473110859Salfred DecodePSHUFMask(MVT::v4f64, MI->getOperand(MI->getNumOperands()-1).getImm(), 47417658Sjulian ShuffleMask); 47517658Sjulian DestName = getRegName(MI->getOperand(0).getReg()); 47617677Sjulian break; 47717658Sjulian case X86::VPERM2F128rr: 47850107Smsmith case X86::VPERM2I128rr: 47917658Sjulian Src2Name = getRegName(MI->getOperand(2).getReg()); 48017658Sjulian // FALL THROUGH. 48175570Sjhb case X86::VPERM2F128rm: 482101155Sjhb case X86::VPERM2I128rm: 48375570Sjhb // For instruction comments purpose, assume the 256-bit vector is v4i64. 48475570Sjhb DecodeVPERM2X128Mask(MVT::v4i64, 48517658Sjulian MI->getOperand(MI->getNumOperands()-1).getImm(), 48617658Sjulian ShuffleMask); 48717658Sjulian Src1Name = getRegName(MI->getOperand(1).getReg()); 48817658Sjulian DestName = getRegName(MI->getOperand(0).getReg()); 48982749Sdillon break; 49082749Sdillon } 49117658Sjulian 49217658Sjulian 493130164Sphk // If this was a shuffle operation, print the shuffle mask. 49417658Sjulian if (!ShuffleMask.empty()) { 495100209Sgallatin if (DestName == 0) DestName = Src1Name; 496103647Sjhb OS << (DestName ? DestName : "mem") << " = "; 49717658Sjulian 49838874Sache // If the two sources are the same, canonicalize the input elements to be 49917658Sjulian // from the first src so that we get larger element spans. 50065557Sjasone if (Src1Name == Src2Name) { 50182115Sjhb for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) { 50282115Sjhb if ((int)ShuffleMask[i] >= 0 && // Not sentinel. 503101155Sjhb ShuffleMask[i] >= (int)e) // From second mask. 504101155Sjhb ShuffleMask[i] -= e; 50582115Sjhb } 50682115Sjhb } 507101155Sjhb 508101155Sjhb // The shuffle mask specifies which elements of the src1/src2 fill in the 509101155Sjhb // destination, with a few sentinel values. Loop through and print them 510101155Sjhb // out. 511101155Sjhb for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) { 51265557Sjasone if (i != 0) 51365557Sjasone OS << ','; 51417658Sjulian if (ShuffleMask[i] == SM_SentinelZero) { 515103647Sjhb OS << "zero"; 51617658Sjulian continue; 51717658Sjulian } 518103647Sjhb 51917658Sjulian // Otherwise, it must come from src1 or src2. Print the span of elements 520103647Sjhb // that comes from this src. 521103647Sjhb bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size(); 52217658Sjulian const char *SrcName = isSrc1 ? Src1Name : Src2Name; 52317658Sjulian OS << (SrcName ? SrcName : "mem") << '['; 524116398Siedowse bool IsFirst = true; 525116398Siedowse while (i != e && 52638874Sache (int)ShuffleMask[i] >= 0 && 527130164Sphk (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) { 528116398Siedowse if (!IsFirst) 529116398Siedowse OS << ','; 530116398Siedowse else 531130164Sphk IsFirst = false; 532116398Siedowse OS << ShuffleMask[i] % ShuffleMask.size(); 53317658Sjulian ++i; 53426100Sfsmp } 535134089Sjhb OS << ']'; 53626100Sfsmp --i; // For loop increments element #. 53717658Sjulian } 538131927Smarcel //MI->print(OS, 0); 539103647Sjhb OS << "\n"; 540131927Smarcel } 54117658Sjulian 542131927Smarcel} 54382223Sjhb