diff --git a/llvm/tools/llvm-exegesis/lib/X86/Target.cpp b/llvm/tools/llvm-exegesis/lib/X86/Target.cpp --- a/llvm/tools/llvm-exegesis/lib/X86/Target.cpp +++ b/llvm/tools/llvm-exegesis/lib/X86/Target.cpp @@ -762,11 +762,247 @@ switch (Instr.getPrimaryOperand(Var).getExplicitOperandInfo().OperandType) { default: - // We don't wish to explicitly explore this variable. - Choices.emplace_back(); // But add invalid MCOperand to simplify logic. - continue; + break; + case MCOI::OperandType::OPERAND_IMMEDIATE: { + int NumElts = 0; + switch (Instr.Description.getOpcode()) { + default: + break; + // Extract Byte from XMM + case X86::PEXTRBmr: + case X86::PEXTRBrr: + case X86::VPEXTRBZmr: + case X86::VPEXTRBZrr: + case X86::VPEXTRBmr: + case X86::VPEXTRBrr: + // Insert Byte into XMM + case X86::PINSRBrm: + case X86::PINSRBrr: + case X86::VPINSRBZrm: + case X86::VPINSRBZrr: + case X86::VPINSRBrm: + case X86::VPINSRBrr: + NumElts = 128 / 8; + break; + + // Extract Word from XMM + case X86::PEXTRWmr: + case X86::PEXTRWrr: + case X86::VPEXTRWZmr: + case X86::VPEXTRWZrr: + case X86::VPEXTRWmr: + case X86::VPEXTRWrr: + // Insert Word into XMM + case X86::PINSRWrm: + case X86::PINSRWrr: + case X86::VPINSRWZrm: + case X86::VPINSRWZrr: + case X86::VPINSRWrm: + case X86::VPINSRWrr: + NumElts = 128 / 16; + break; + + // Extract Double-Word from XMM + case X86::PEXTRDmr: + case X86::PEXTRDrr: + case X86::VPEXTRDZmr: + case X86::VPEXTRDZrr: + case X86::VPEXTRDmr: + case X86::VPEXTRDrr: + // Insert Double-Word into XMM + case X86::PINSRDrm: + case X86::PINSRDrr: + case X86::VPINSRDZrm: + case X86::VPINSRDZrr: + case X86::VPINSRDrm: + case X86::VPINSRDrr: + NumElts = 128 / 32; + break; + + // Extract Quad-Word from XMM + case X86::PEXTRQmr: + case X86::PEXTRQrr: + case X86::VPEXTRQZmr: + case X86::VPEXTRQZrr: + case X86::VPEXTRQmr: + case X86::VPEXTRQrr: + // Insert Quad-Word into XMM + case X86::PINSRQrm: + case X86::PINSRQrr: + case X86::VPINSRQZrm: + case X86::VPINSRQZrr: + case X86::VPINSRQrm: + case X86::VPINSRQrr: + NumElts = 128 / 64; + break; + + // Extract Scalar Single-Precision Floating-Point Value from XMM + case X86::EXTRACTPSmr: + case X86::EXTRACTPSrr: + case X86::VEXTRACTPSZmr: + case X86::VEXTRACTPSZrr: + case X86::VEXTRACTPSmr: + case X86::VEXTRACTPSrr: + // Insert Scalar Single-Precision Floating-Point Value into XMM + case X86::INSERTPSrm: + case X86::INSERTPSrr: + case X86::VINSERTPSZrm: + case X86::VINSERTPSZrr: + case X86::VINSERTPSrm: + case X86::VINSERTPSrr: + NumElts = 128 / 32; + break; + + // Extract XMM from YMM + case X86::VEXTRACTF128mr: + case X86::VEXTRACTF128rr: + case X86::VEXTRACTF32x4Z256mr: + case X86::VEXTRACTF32x4Z256mrk: + case X86::VEXTRACTF32x4Z256rr: + case X86::VEXTRACTF32x4Z256rrk: + case X86::VEXTRACTF32x4Z256rrkz: + case X86::VEXTRACTF64x2Z256mr: + case X86::VEXTRACTF64x2Z256mrk: + case X86::VEXTRACTF64x2Z256rr: + case X86::VEXTRACTF64x2Z256rrk: + case X86::VEXTRACTF64x2Z256rrkz: + case X86::VEXTRACTI128mr: + case X86::VEXTRACTI128rr: + case X86::VEXTRACTI32x4Z256mr: + case X86::VEXTRACTI32x4Z256mrk: + case X86::VEXTRACTI32x4Z256rr: + case X86::VEXTRACTI32x4Z256rrk: + case X86::VEXTRACTI32x4Z256rrkz: + case X86::VEXTRACTI64x2Z256mr: + case X86::VEXTRACTI64x2Z256mrk: + case X86::VEXTRACTI64x2Z256rr: + case X86::VEXTRACTI64x2Z256rrk: + case X86::VEXTRACTI64x2Z256rrkz: + // Insert XMM into YMM + case X86::VINSERTF128rm: + case X86::VINSERTF128rr: + case X86::VINSERTF32x4Z256rm: + case X86::VINSERTF32x4Z256rmk: + case X86::VINSERTF32x4Z256rr: + case X86::VINSERTF32x4Z256rrk: + case X86::VINSERTF32x4Z256rrkz: + case X86::VINSERTF64x2Z256rm: + case X86::VINSERTF64x2Z256rmk: + case X86::VINSERTF64x2Z256rr: + case X86::VINSERTF64x2Z256rrk: + case X86::VINSERTF64x2Z256rrkz: + case X86::VINSERTI128rm: + case X86::VINSERTI128rr: + case X86::VINSERTI32x4Z256rm: + case X86::VINSERTI32x4Z256rmk: + case X86::VINSERTI32x4Z256rr: + case X86::VINSERTI32x4Z256rrk: + case X86::VINSERTI32x4Z256rrkz: + case X86::VINSERTI64x2Z256rm: + case X86::VINSERTI64x2Z256rmk: + case X86::VINSERTI64x2Z256rr: + case X86::VINSERTI64x2Z256rrk: + case X86::VINSERTI64x2Z256rrkz: + NumElts = 256 / 128; + break; + + // Extract XMM from ZMM + case X86::VEXTRACTF32x4Zmr: + case X86::VEXTRACTF32x4Zmrk: + case X86::VEXTRACTF32x4Zrr: + case X86::VEXTRACTF32x4Zrrk: + case X86::VEXTRACTF32x4Zrrkz: + case X86::VEXTRACTF64x2Zmr: + case X86::VEXTRACTF64x2Zmrk: + case X86::VEXTRACTF64x2Zrr: + case X86::VEXTRACTF64x2Zrrk: + case X86::VEXTRACTF64x2Zrrkz: + case X86::VEXTRACTI32x4Zmr: + case X86::VEXTRACTI32x4Zmrk: + case X86::VEXTRACTI32x4Zrr: + case X86::VEXTRACTI32x4Zrrk: + case X86::VEXTRACTI32x4Zrrkz: + case X86::VEXTRACTI64x2Zmr: + case X86::VEXTRACTI64x2Zmrk: + case X86::VEXTRACTI64x2Zrr: + case X86::VEXTRACTI64x2Zrrk: + case X86::VEXTRACTI64x2Zrrkz: + // Insert XMM into ZMM + case X86::VINSERTF32x4Zrm: + case X86::VINSERTF32x4Zrmk: + case X86::VINSERTF32x4Zrr: + case X86::VINSERTF32x4Zrrk: + case X86::VINSERTF32x4Zrrkz: + case X86::VINSERTF64x2Zrm: + case X86::VINSERTF64x2Zrmk: + case X86::VINSERTF64x2Zrr: + case X86::VINSERTF64x2Zrrk: + case X86::VINSERTF64x2Zrrkz: + case X86::VINSERTI32x4Zrm: + case X86::VINSERTI32x4Zrmk: + case X86::VINSERTI32x4Zrr: + case X86::VINSERTI32x4Zrrk: + case X86::VINSERTI32x4Zrrkz: + case X86::VINSERTI64x2Zrm: + case X86::VINSERTI64x2Zrmk: + case X86::VINSERTI64x2Zrr: + case X86::VINSERTI64x2Zrrk: + case X86::VINSERTI64x2Zrrkz: + NumElts = 512 / 128; + break; + + // Extract YMM from ZMM + case X86::VEXTRACTF32x8Zmr: + case X86::VEXTRACTF32x8Zmrk: + case X86::VEXTRACTF32x8Zrr: + case X86::VEXTRACTF32x8Zrrk: + case X86::VEXTRACTF32x8Zrrkz: + case X86::VEXTRACTF64x4Zmr: + case X86::VEXTRACTF64x4Zmrk: + case X86::VEXTRACTF64x4Zrr: + case X86::VEXTRACTF64x4Zrrk: + case X86::VEXTRACTF64x4Zrrkz: + case X86::VEXTRACTI32x8Zmr: + case X86::VEXTRACTI32x8Zmrk: + case X86::VEXTRACTI32x8Zrr: + case X86::VEXTRACTI32x8Zrrk: + case X86::VEXTRACTI32x8Zrrkz: + case X86::VEXTRACTI64x4Zmr: + case X86::VEXTRACTI64x4Zmrk: + case X86::VEXTRACTI64x4Zrr: + case X86::VEXTRACTI64x4Zrrk: + case X86::VEXTRACTI64x4Zrrkz: + // Insert YMM into ZMM + case X86::VINSERTF32x8Zrm: + case X86::VINSERTF32x8Zrr: + case X86::VINSERTF32x8Zrmk: + case X86::VINSERTF32x8Zrrk: + case X86::VINSERTF32x8Zrrkz: + case X86::VINSERTF64x4Zrm: + case X86::VINSERTF64x4Zrr: + case X86::VINSERTF64x4Zrmk: + case X86::VINSERTF64x4Zrrk: + case X86::VINSERTF64x4Zrrkz: + case X86::VINSERTI32x8Zrm: + case X86::VINSERTI32x8Zrr: + case X86::VINSERTI32x8Zrmk: + case X86::VINSERTI32x8Zrrk: + case X86::VINSERTI32x8Zrrkz: + case X86::VINSERTI64x4Zrm: + case X86::VINSERTI64x4Zrr: + case X86::VINSERTI64x4Zrmk: + case X86::VINSERTI64x4Zrrk: + case X86::VINSERTI64x4Zrrkz: + NumElts = 512 / 256; + break; + } + auto Indexes = seq(0, NumElts); + Choices.reserve(std::distance(Indexes.begin(), Indexes.end())); + for (int CondCode : Indexes) + Choices.emplace_back(MCOperand::createImm(CondCode)); + break; + } case X86::OperandType::OPERAND_COND_CODE: { - Exploration = true; auto CondCodes = seq((int)X86::CondCode::COND_O, 1 + (int)X86::CondCode::LAST_VALID_COND); Choices.reserve(std::distance(CondCodes.begin(), CondCodes.end())); @@ -775,6 +1011,12 @@ break; } } + + // We don't wish to explicitly explore this variable. + if (Choices.empty()) + Choices.emplace_back(); // But add invalid MCOperand to simplify logic. + else + Exploration = true; } // If we don't wish to explore any variables, defer to the baseline method.