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,137 @@ 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::VPEXTRBmr: + case X86::VPEXTRBrr: + // Insert Byte into XMM + case X86::PINSRBrm: + case X86::PINSRBrr: + case X86::VPINSRBrm: + case X86::VPINSRBrr: + NumElts = 128 / 8; + break; + // Extract Byte from ZMM + case X86::VPEXTRBZmr: + case X86::VPEXTRBZrr: + // Insert Byte into ZMM + case X86::VPINSRBZrm: + case X86::VPINSRBZrr: + NumElts = 512 / 8; + break; + + // Extract Word from XMM + case X86::PEXTRWmr: + case X86::PEXTRWrr: + case X86::VPEXTRWmr: + case X86::VPEXTRWrr: + // Insert Word into XMM + case X86::PINSRWrm: + case X86::PINSRWrr: + case X86::VPINSRWrm: + case X86::VPINSRWrr: + NumElts = 128 / 16; + break; + // Extract Word from ZMM + case X86::VPEXTRWZmr: + case X86::VPEXTRWZrr: + // Insert Word into ZMM + case X86::VPINSRWZrm: + case X86::VPINSRWZrr: + NumElts = 512 / 16; + break; + + // Extract Double-Word from XMM + case X86::PEXTRDmr: + case X86::PEXTRDrr: + case X86::VPEXTRDmr: + case X86::VPEXTRDrr: + // Insert Double-Word into XMM + case X86::PINSRDrm: + case X86::PINSRDrr: + case X86::VPINSRDrm: + case X86::VPINSRDrr: + NumElts = 128 / 32; + break; + // Extract Double-Word from ZMM + case X86::VPEXTRDZmr: + case X86::VPEXTRDZrr: + // Insert Double-Word into ZMM + case X86::VPINSRDZrm: + case X86::VPINSRDZrr: + NumElts = 512 / 32; + break; + + // Extract Quad-Word from XMM + case X86::PEXTRQmr: + case X86::PEXTRQrr: + case X86::VPEXTRQmr: + case X86::VPEXTRQrr: + // Insert Quad-Word into XMM + case X86::PINSRQrm: + case X86::PINSRQrr: + case X86::VPINSRQrm: + case X86::VPINSRQrr: + NumElts = 128 / 64; + break; + // Extract Quad-Word from ZMM + case X86::VPEXTRQZmr: + case X86::VPEXTRQZrr: + // Insert Quad-Word into ZMM + case X86::VPINSRQZrm: + case X86::VPINSRQZrr: + NumElts = 512 / 64; + break; + + // Extract Scalar Single-Precision Floating-Point Value from XMM + case X86::EXTRACTPSmr: + case X86::EXTRACTPSrr: + case X86::VEXTRACTPSmr: + case X86::VEXTRACTPSrr: + // Insert Scalar Single-Precision Floating-Point Value into XMM + case X86::INSERTPSrm: + case X86::INSERTPSrr: + case X86::VINSERTPSrm: + case X86::VINSERTPSrr: + NumElts = 128 / 32; + break; + // Extract Scalar Single-Precision Floating-Point Value from ZMM + case X86::VEXTRACTPSZmr: + case X86::VEXTRACTPSZrr: + // Insert Scalar Single-Precision Floating-Point Value into ZMM + case X86::VINSERTPSZrm: + case X86::VINSERTPSZrr: + NumElts = 512 / 32; + break; + + // Extract XMM from YMM + case X86::VEXTRACTF128mr: + case X86::VEXTRACTF128rr: + case X86::VEXTRACTI128mr: + case X86::VEXTRACTI128rr: + // Insert XMM into YMM + case X86::VINSERTF128rm: + case X86::VINSERTF128rr: + case X86::VINSERTI128rm: + case X86::VINSERTI128rr: + NumElts = 256 / 128; + 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 +901,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.