@@ -1956,7 +1956,7 @@ static unsigned
19561956emitConvertFuncs (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
30293019static 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