forked from OSchip/llvm-project
[X86] Prefer VEX encoding in X86 assembler.
This patch is to order the AVX instructions ahead of AVX512 instructions in the matching table so that the AVX instructions can be matched first. Thanks Craig and Shengchen for the idea. Differential Revision: https://reviews.llvm.org/D111538
This commit is contained in:
parent
239b4d62b6
commit
942536ac08
|
@ -653,6 +653,11 @@ class Instruction : InstructionEncoding {
|
|||
/// instruction selection predicates. FastISel cannot handle such cases, but
|
||||
/// SelectionDAG can.
|
||||
bit FastISelShouldIgnore = false;
|
||||
|
||||
/// HasPositionOrder: Indicate tablegen to sort the instructions by record
|
||||
/// ID, so that instruction that is defined earlier can be sorted earlier
|
||||
/// in the assembly matching table.
|
||||
bit HasPositionOrder = false;
|
||||
}
|
||||
|
||||
/// Defines an additional encoding that disassembles to the given instruction
|
||||
|
|
|
@ -4270,24 +4270,6 @@ unsigned X86AsmParser::checkTargetMatchPredicate(MCInst &Inst) {
|
|||
ForcedVEXEncoding != VEXEncoding_VEX3))
|
||||
return Match_Unsupported;
|
||||
|
||||
// These instructions match ambiguously with their VEX encoded counterparts
|
||||
// and appear first in the matching table. Reject them unless we're forcing
|
||||
// EVEX encoding.
|
||||
// FIXME: We really need a way to break the ambiguity.
|
||||
switch (Opc) {
|
||||
case X86::VCVTSD2SIZrm_Int:
|
||||
case X86::VCVTSD2SI64Zrm_Int:
|
||||
case X86::VCVTSS2SIZrm_Int:
|
||||
case X86::VCVTSS2SI64Zrm_Int:
|
||||
case X86::VCVTTSD2SIZrm: case X86::VCVTTSD2SIZrm_Int:
|
||||
case X86::VCVTTSD2SI64Zrm: case X86::VCVTTSD2SI64Zrm_Int:
|
||||
case X86::VCVTTSS2SIZrm: case X86::VCVTTSS2SIZrm_Int:
|
||||
case X86::VCVTTSS2SI64Zrm: case X86::VCVTTSS2SI64Zrm_Int:
|
||||
if (ForcedVEXEncoding != VEXEncoding_EVEX)
|
||||
return Match_Unsupported;
|
||||
break;
|
||||
}
|
||||
|
||||
return Match_Success;
|
||||
}
|
||||
|
||||
|
|
|
@ -296,6 +296,8 @@ class X86Inst<bits<8> opcod, Format f, ImmType i, dag outs, dag ins,
|
|||
// If this is a pseudo instruction, mark it isCodeGenOnly.
|
||||
let isCodeGenOnly = !eq(!cast<string>(f), "Pseudo");
|
||||
|
||||
let HasPositionOrder = 1;
|
||||
|
||||
//
|
||||
// Attributes specific to X86 instructions...
|
||||
//
|
||||
|
|
|
@ -636,6 +636,15 @@ struct MatchableInfo {
|
|||
if (RequiredFeatures.size() != RHS.RequiredFeatures.size())
|
||||
return RequiredFeatures.size() > RHS.RequiredFeatures.size();
|
||||
|
||||
// For X86 AVX/AVX512 instructions, we prefer vex encoding because the
|
||||
// vex encoding size is smaller. Since X86InstrSSE.td is included ahead
|
||||
// of X86InstrAVX512.td, the AVX instruction ID is less than AVX512 ID.
|
||||
// We use the ID to sort AVX instruction before AVX512 instruction in
|
||||
// matching table.
|
||||
if (TheDef->isSubClassOf("Instruction") &&
|
||||
TheDef->getValueAsBit("HasPositionOrder"))
|
||||
return TheDef->getID() < RHS.TheDef->getID();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue