Skip to content

Commit a38f0a0

Browse files
committed
Pull the duplicated logic to a common place
1 parent 367e907 commit a38f0a0

File tree

1 file changed

+26
-39
lines changed

1 file changed

+26
-39
lines changed

llvm/utils/TableGen/AsmMatcherEmitter.cpp

Lines changed: 26 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1956,7 +1956,7 @@ static unsigned
19561956
emitConvertFuncs(CodeGenTarget &Target, StringRef ClassName,
19571957
std::vector<std::unique_ptr<MatchableInfo>> &Infos,
19581958
bool HasMnemonicFirst, bool HasOptionalOperands,
1959-
unsigned MaxNumOperands, raw_ostream &OS) {
1959+
raw_ostream &OS) {
19601960
SmallSetVector<CachedHashString, 16> OperandConversionKinds;
19611961
SmallSetVector<CachedHashString, 16> InstructionConversionKinds;
19621962
std::vector<std::vector<uint8_t>> ConversionTable;
@@ -1976,7 +1976,8 @@ emitConvertFuncs(CodeGenTarget &Target, StringRef ClassName,
19761976
<< "convertToMCInst(unsigned Kind, MCInst &Inst, "
19771977
<< "unsigned Opcode,\n"
19781978
<< " const OperandVector &Operands,\n"
1979-
<< " const SmallBitVector &OptionalOperandsMask) {\n";
1979+
<< " const SmallBitVector &OptionalOperandsMask,\n"
1980+
<< " ArrayRef<unsigned> DefaultsOffset) {\n";
19801981
} else {
19811982
CvtOS << "void " << Target.getName() << ClassName << "::\n"
19821983
<< "convertToMCInst(unsigned Kind, MCInst &Inst, "
@@ -1985,17 +1986,6 @@ emitConvertFuncs(CodeGenTarget &Target, StringRef ClassName,
19851986
}
19861987
CvtOS << " assert(Kind < CVT_NUM_SIGNATURES && \"Invalid signature!\");\n";
19871988
CvtOS << " const uint8_t *Converter = ConversionTable[Kind];\n";
1988-
if (HasOptionalOperands) {
1989-
CvtOS << " unsigned DefaultsOffset[" << (MaxNumOperands + 1)
1990-
<< "] = { 0 };\n";
1991-
CvtOS << " assert(OptionalOperandsMask.size() == " << (MaxNumOperands)
1992-
<< ");\n";
1993-
CvtOS << " for (unsigned i = 0, NumDefaults = 0; i < " << (MaxNumOperands)
1994-
<< "; ++i) {\n";
1995-
CvtOS << " DefaultsOffset[i + 1] = NumDefaults;\n";
1996-
CvtOS << " NumDefaults += (OptionalOperandsMask[i] ? 1 : 0);\n";
1997-
CvtOS << " }\n";
1998-
}
19991989
CvtOS << " unsigned OpIdx;\n";
20001990
CvtOS << " Inst.setOpcode(Opcode);\n";
20011991
CvtOS << " for (const uint8_t *p = Converter; *p; p += 2) {\n";
@@ -3028,8 +3018,7 @@ emitCustomOperandParsing(raw_ostream &OS, CodeGenTarget &Target,
30283018

30293019
static void emitAsmTiedOperandConstraints(CodeGenTarget &Target,
30303020
AsmMatcherInfo &Info, raw_ostream &OS,
3031-
bool HasOptionalOperands,
3032-
unsigned MaxNumOperands) {
3021+
bool HasOptionalOperands) {
30333022
std::string AsmParserName =
30343023
std::string(Info.AsmParser->getValueAsString("AsmParserClassName"));
30353024
OS << "static bool ";
@@ -3038,22 +3027,10 @@ static void emitAsmTiedOperandConstraints(CodeGenTarget &Target,
30383027
OS << " unsigned Kind, const OperandVector "
30393028
"&Operands,\n";
30403029
if (HasOptionalOperands)
3041-
OS << " const SmallBitVector "
3042-
"&OptionalOperandsMask,\n";
3030+
OS << " ArrayRef<unsigned> DefaultsOffset,\n";
30433031
OS << " uint64_t &ErrorInfo) {\n";
30443032
OS << " assert(Kind < CVT_NUM_SIGNATURES && \"Invalid signature!\");\n";
30453033
OS << " const uint8_t *Converter = ConversionTable[Kind];\n";
3046-
if (HasOptionalOperands) {
3047-
OS << " unsigned DefaultsOffset[" << (MaxNumOperands + 1)
3048-
<< "] = { 0 };\n";
3049-
OS << " assert(OptionalOperandsMask.size() == " << (MaxNumOperands)
3050-
<< ");\n";
3051-
OS << " for (unsigned i = 0, NumDefaults = 0; i < " << (MaxNumOperands)
3052-
<< "; ++i) {\n";
3053-
OS << " DefaultsOffset[i + 1] = NumDefaults;\n";
3054-
OS << " NumDefaults += (OptionalOperandsMask[i] ? 1 : 0);\n";
3055-
OS << " }\n";
3056-
}
30573034
OS << " for (const uint8_t *p = Converter; *p; p += 2) {\n";
30583035
OS << " switch (*p) {\n";
30593036
OS << " case CVT_Tied: {\n";
@@ -3306,7 +3283,8 @@ void AsmMatcherEmitter::run(raw_ostream &OS) {
33063283
<< "unsigned Opcode,\n"
33073284
<< " const OperandVector &Operands,\n"
33083285
<< " const SmallBitVector "
3309-
"&OptionalOperandsMask);\n";
3286+
"&OptionalOperandsMask,\n"
3287+
<< " ArrayRef<unsigned> DefaultsOffset);\n";
33103288
} else {
33113289
OS << " void convertToMCInst(unsigned Kind, MCInst &Inst, "
33123290
<< "unsigned Opcode,\n"
@@ -3386,16 +3364,12 @@ void AsmMatcherEmitter::run(raw_ostream &OS) {
33863364
// Generate the function that remaps for mnemonic aliases.
33873365
bool HasMnemonicAliases = emitMnemonicAliases(OS, Info, Target);
33883366

3389-
size_t MaxNumOperands = 0;
3390-
for (const auto &MI : Info.Matchables)
3391-
MaxNumOperands = std::max(MaxNumOperands, MI->AsmOperands.size());
3392-
33933367
// Generate the convertToMCInst function to convert operands into an MCInst.
33943368
// Also, generate the convertToMapAndConstraints function for MS-style inline
33953369
// assembly. The latter doesn't actually generate a MCInst.
33963370
unsigned NumConverters =
33973371
emitConvertFuncs(Target, ClassName, Info.Matchables, HasMnemonicFirst,
3398-
HasOptionalOperands, MaxNumOperands, OS);
3372+
HasOptionalOperands, OS);
33993373

34003374
// Emit the enumeration for classes which participate in matching.
34013375
emitMatchClassEnumeration(Target, Info.Classes, OS);
@@ -3424,14 +3398,15 @@ void AsmMatcherEmitter::run(raw_ostream &OS) {
34243398
Info.SubtargetFeatures, OS);
34253399

34263400
if (!ReportMultipleNearMisses)
3427-
emitAsmTiedOperandConstraints(Target, Info, OS, HasOptionalOperands,
3428-
MaxNumOperands);
3401+
emitAsmTiedOperandConstraints(Target, Info, OS, HasOptionalOperands);
34293402

34303403
StringToOffsetTable StringTable;
34313404

3405+
size_t MaxNumOperands = 0;
34323406
unsigned MaxMnemonicIndex = 0;
34333407
bool HasDeprecation = false;
34343408
for (const auto &MI : Info.Matchables) {
3409+
MaxNumOperands = std::max(MaxNumOperands, MI->AsmOperands.size());
34353410
HasDeprecation |= MI->HasDeprecation;
34363411

34373412
// Store a pascal-style length byte in the mnemonic.
@@ -3946,13 +3921,25 @@ void AsmMatcherEmitter::run(raw_ostream &OS) {
39463921
OS << " }\n\n";
39473922
}
39483923

3924+
if (HasOptionalOperands) {
3925+
OS << " unsigned DefaultsOffset[" << (MaxNumOperands + 1)
3926+
<< "] = { 0 };\n";
3927+
OS << " assert(OptionalOperandsMask.size() == " << (MaxNumOperands)
3928+
<< ");\n";
3929+
OS << " for (unsigned i = 0, NumDefaults = 0; i < " << (MaxNumOperands)
3930+
<< "; ++i) {\n";
3931+
OS << " DefaultsOffset[i + 1] = NumDefaults;\n";
3932+
OS << " NumDefaults += (OptionalOperandsMask[i] ? 1 : 0);\n";
3933+
OS << " }\n\n";
3934+
}
3935+
39493936
OS << " if (matchingInlineAsm) {\n";
39503937
OS << " convertToMapAndConstraints(it->ConvertFn, Operands);\n";
39513938
if (!ReportMultipleNearMisses) {
39523939
if (HasOptionalOperands) {
39533940
OS << " if (!checkAsmTiedOperandConstraints(*this, it->ConvertFn, "
39543941
"Operands,\n";
3955-
OS << " OptionalOperandsMask, "
3942+
OS << " DefaultsOffset, "
39563943
"ErrorInfo))\n";
39573944
} else {
39583945
OS << " if (!checkAsmTiedOperandConstraints(*this, it->ConvertFn, "
@@ -3968,7 +3955,7 @@ void AsmMatcherEmitter::run(raw_ostream &OS) {
39683955
<< " // operands into the appropriate MCInst.\n";
39693956
if (HasOptionalOperands) {
39703957
OS << " convertToMCInst(it->ConvertFn, Inst, it->Opcode, Operands,\n"
3971-
<< " OptionalOperandsMask);\n";
3958+
<< " OptionalOperandsMask, DefaultsOffset);\n";
39723959
} else {
39733960
OS << " convertToMCInst(it->ConvertFn, Inst, it->Opcode, Operands);\n";
39743961
}
@@ -4051,7 +4038,7 @@ void AsmMatcherEmitter::run(raw_ostream &OS) {
40514038
if (HasOptionalOperands) {
40524039
OS << " if (!checkAsmTiedOperandConstraints(*this, it->ConvertFn, "
40534040
"Operands,\n";
4054-
OS << " OptionalOperandsMask, "
4041+
OS << " DefaultsOffset, "
40554042
"ErrorInfo))\n";
40564043
} else {
40574044
OS << " if (!checkAsmTiedOperandConstraints(*this, it->ConvertFn, "

0 commit comments

Comments
 (0)