Skip to content

Commit 6a8b919

Browse files
committed
Emit formats enum and supplemental info for LoongArch
1 parent ea8e164 commit 6a8b919

File tree

1 file changed

+57
-11
lines changed

1 file changed

+57
-11
lines changed

llvm/utils/TableGen/PrinterCapstone.cpp

Lines changed: 57 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2662,13 +2662,59 @@ std::string getArchSupplInfoPPC(StringRef const &TargetName,
26622662
return "{{ 0 }}";
26632663
}
26642664

2665+
std::string getArchSupplInfoLoongArch(StringRef const &TargetName,
2666+
CodeGenInstruction const *CGI,
2667+
raw_string_ostream &LoongArchFormatEnum) {
2668+
static std::set<std::string> Formats;
2669+
// Get instruction format
2670+
ArrayRef<std::pair<Record *, SMRange>> SCs = CGI->TheDef->getSuperClasses();
2671+
if (SCs.empty()) {
2672+
llvm_unreachable("A CGI without superclass should not exist.");
2673+
}
2674+
2675+
// Compute memory access type
2676+
std::string MemoryAccess;
2677+
if (CGI->mayLoad && CGI->mayStore) {
2678+
MemoryAccess = "CS_AC_READ_WRTE";
2679+
} else if (CGI->mayLoad && !CGI->mayStore) {
2680+
MemoryAccess = "CS_AC_READ";
2681+
} else if (!CGI->mayLoad && CGI->mayStore) {
2682+
MemoryAccess = "CS_AC_WRITE";
2683+
} else {
2684+
MemoryAccess = "CS_AC_INVALID";
2685+
}
2686+
2687+
// Get base instruction format class "LAInst"
2688+
const Record *PrevSC = nullptr;
2689+
// Superclasses are in post-order. So we go through them backwards.
2690+
// The class before the "LAInst" class is the format class.
2691+
for (int I = SCs.size() - 1; I >= 0; --I) {
2692+
const Record *SC = SCs[I].first;
2693+
if (SC->getName() == "LAInst") {
2694+
if (!PrevSC)
2695+
llvm_unreachable("I class has no predecessor.");
2696+
std::string Format = "LoongArch_INSN_FORM_" + PrevSC->getName().upper();
2697+
if (Formats.find(Format) == Formats.end()) {
2698+
LoongArchFormatEnum << Format + ",\n";
2699+
}
2700+
Formats.emplace(Format);
2701+
return "{ .loongarch = { " + Format + ", " + MemoryAccess + " }}";
2702+
}
2703+
PrevSC = SC;
2704+
}
2705+
// Pseudo instructions
2706+
return "{ .loongarch = { 0, " + MemoryAccess + " }}";
2707+
}
2708+
26652709
std::string getArchSupplInfo(StringRef const &TargetName,
26662710
CodeGenInstruction const *CGI,
2667-
raw_string_ostream &PPCFormatEnum) {
2711+
raw_string_ostream &FormatEnum) {
26682712
if (TargetName == "PPC")
2669-
return getArchSupplInfoPPC(TargetName, CGI, PPCFormatEnum);
2713+
return getArchSupplInfoPPC(TargetName, CGI, FormatEnum);
26702714
else if (TargetName == "AArch64") {
26712715
return getArchSupplInfoAArch64(CGI);
2716+
} else if (TargetName == "LoongArch") {
2717+
return getArchSupplInfoLoongArch(TargetName, CGI, FormatEnum);
26722718
}
26732719
return "{{ 0 }}";
26742720
}
@@ -2929,7 +2975,7 @@ void printInsnMapEntry(StringRef const &TargetName, AsmMatcherInfo &AMI,
29292975
std::unique_ptr<MatchableInfo> const &MI, bool UseMI,
29302976
CodeGenInstruction const *CGI,
29312977
raw_string_ostream &InsnMap, unsigned InsnNum,
2932-
raw_string_ostream &PPCFormatEnum) {
2978+
raw_string_ostream &FormatEnum) {
29332979
InsnMap << "{\n";
29342980
InsnMap.indent(2) << "/* "
29352981
<< (CGI->AsmString != "" ? CGI->AsmString
@@ -2948,7 +2994,7 @@ void printInsnMapEntry(StringRef const &TargetName, AsmMatcherInfo &AMI,
29482994
InsnMap << getReqFeatures(TargetName, AMI, MI, UseMI, CGI) << ", ";
29492995
InsnMap << ((CGI->isBranch || CGI->isReturn) ? "1" : "0") << ", ";
29502996
InsnMap << (CGI->isIndirectBranch ? "1" : "0") << ", ";
2951-
InsnMap << getArchSupplInfo(TargetName, CGI, PPCFormatEnum) << "\n";
2997+
InsnMap << getArchSupplInfo(TargetName, CGI, FormatEnum) << "\n";
29522998
} else {
29532999
InsnMap.indent(4) << "{ 0 }, { 0 }, { 0 }, 0, 0, {{ 0 }}";
29543000
}
@@ -3383,7 +3429,7 @@ void PrinterCapstone::asmMatcherEmitMatchTable(CodeGenTarget const &Target,
33833429
std::string FeatureEnumStr;
33843430
std::string FeatureNameArrayStr;
33853431
std::string OpGroupStr;
3386-
std::string PPCFormatEnumStr;
3432+
std::string FormatEnumStr;
33873433
std::string AliasEnumStr;
33883434
std::string AliasMnemMapStr;
33893435
raw_string_ostream InsnMap(InsnMapStr);
@@ -3393,7 +3439,7 @@ void PrinterCapstone::asmMatcherEmitMatchTable(CodeGenTarget const &Target,
33933439
raw_string_ostream FeatureEnum(FeatureEnumStr);
33943440
raw_string_ostream FeatureNameArray(FeatureNameArrayStr);
33953441
raw_string_ostream OpGroups(OpGroupStr);
3396-
raw_string_ostream PPCFormatEnum(PPCFormatEnumStr);
3442+
raw_string_ostream FormatEnum(FormatEnumStr);
33973443
raw_string_ostream AliasEnum(AliasEnumStr);
33983444
raw_string_ostream AliasMnemMap(AliasMnemMapStr);
33993445
emitDefaultSourceFileHeader(InsnMap);
@@ -3403,7 +3449,7 @@ void PrinterCapstone::asmMatcherEmitMatchTable(CodeGenTarget const &Target,
34033449
emitDefaultSourceFileHeader(FeatureEnum);
34043450
emitDefaultSourceFileHeader(FeatureNameArray);
34053451
emitDefaultSourceFileHeader(OpGroups);
3406-
emitDefaultSourceFileHeader(PPCFormatEnum);
3452+
emitDefaultSourceFileHeader(FormatEnum);
34073453
emitDefaultSourceFileHeader(AliasEnum);
34083454
emitDefaultSourceFileHeader(AliasMnemMap);
34093455

@@ -3453,7 +3499,7 @@ void PrinterCapstone::asmMatcherEmitMatchTable(CodeGenTarget const &Target,
34533499
printInsnOpMapEntry(Target, MI, UseMI, CGI, InsnOpMap, InsnNum,
34543500
InsnPatternMap);
34553501
printInsnMapEntry(Target.getName(), Info, MI, UseMI, CGI, InsnMap, InsnNum,
3456-
PPCFormatEnum);
3502+
FormatEnum);
34573503

34583504
++InsnNum;
34593505
}
@@ -3478,9 +3524,9 @@ void PrinterCapstone::asmMatcherEmitMatchTable(CodeGenTarget const &Target,
34783524
writeFile(InsnMapFilename, AliasEnumStr);
34793525
InsnMapFilename = TName + "GenCSAliasMnemMap.inc";
34803526
writeFile(InsnMapFilename, AliasMnemMapStr);
3481-
if (TName == "PPC") {
3482-
InsnMapFilename = "PPCGenCSInsnFormatsEnum.inc";
3483-
writeFile(InsnMapFilename, PPCFormatEnumStr);
3527+
if (TName == "PPC" || TName == "LoongArch") {
3528+
InsnMapFilename = TName + "GenCSInsnFormatsEnum.inc";
3529+
writeFile(InsnMapFilename, FormatEnumStr);
34843530
}
34853531
}
34863532

0 commit comments

Comments
 (0)