xref: /llvm-project/llvm/utils/TableGen/Common/CodeGenHwModes.cpp (revision aca08a8515d48baff48328df5d54300fc7180bea)
1fa3d789dSPierre van Houtryve //===--- CodeGenHwModes.cpp -----------------------------------------------===//
2fa3d789dSPierre van Houtryve //
3fa3d789dSPierre van Houtryve // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4fa3d789dSPierre van Houtryve // See https://llvm.org/LICENSE.txt for license information.
5fa3d789dSPierre van Houtryve // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6fa3d789dSPierre van Houtryve //
7fa3d789dSPierre van Houtryve //===----------------------------------------------------------------------===//
8fa3d789dSPierre van Houtryve // Classes to parse and store HW mode information for instruction selection
9fa3d789dSPierre van Houtryve //===----------------------------------------------------------------------===//
10fa3d789dSPierre van Houtryve 
11fa3d789dSPierre van Houtryve #include "CodeGenHwModes.h"
12fa3d789dSPierre van Houtryve #include "llvm/Support/Debug.h"
13fa3d789dSPierre van Houtryve #include "llvm/Support/raw_ostream.h"
14fa3d789dSPierre van Houtryve #include "llvm/TableGen/Error.h"
15fa3d789dSPierre van Houtryve #include "llvm/TableGen/Record.h"
16fa3d789dSPierre van Houtryve 
17fa3d789dSPierre van Houtryve using namespace llvm;
18fa3d789dSPierre van Houtryve 
19fa3d789dSPierre van Houtryve StringRef CodeGenHwModes::DefaultModeName = "DefaultMode";
20fa3d789dSPierre van Houtryve 
21985600dcSRahul Joshi HwMode::HwMode(const Record *R) {
22fa3d789dSPierre van Houtryve   Name = R->getName();
23fa3d789dSPierre van Houtryve   Features = std::string(R->getValueAsString("Features"));
24fa3d789dSPierre van Houtryve 
25fa3d789dSPierre van Houtryve   SmallString<128> PredicateCheck;
26fa3d789dSPierre van Houtryve   raw_svector_ostream OS(PredicateCheck);
27fa3d789dSPierre van Houtryve   ListSeparator LS(" && ");
28985600dcSRahul Joshi   for (const Record *Pred : R->getValueAsListOfDefs("Predicates")) {
29fa3d789dSPierre van Houtryve     StringRef CondString = Pred->getValueAsString("CondString");
30fa3d789dSPierre van Houtryve     if (CondString.empty())
31fa3d789dSPierre van Houtryve       continue;
32fa3d789dSPierre van Houtryve     OS << LS << '(' << CondString << ')';
33fa3d789dSPierre van Houtryve   }
34fa3d789dSPierre van Houtryve 
35fa3d789dSPierre van Houtryve   Predicates = std::string(PredicateCheck);
36fa3d789dSPierre van Houtryve }
37fa3d789dSPierre van Houtryve 
38fa3d789dSPierre van Houtryve LLVM_DUMP_METHOD
39fa3d789dSPierre van Houtryve void HwMode::dump() const { dbgs() << Name << ": " << Features << '\n'; }
40fa3d789dSPierre van Houtryve 
41985600dcSRahul Joshi HwModeSelect::HwModeSelect(const Record *R, CodeGenHwModes &CGH) {
42a140931bSRahul Joshi   std::vector<const Record *> Modes = R->getValueAsListOfDefs("Modes");
43a140931bSRahul Joshi   std::vector<const Record *> Objects = R->getValueAsListOfDefs("Objects");
443138eb50SRahul Joshi   for (auto [Mode, Object] : zip_equal(Modes, Objects)) {
453138eb50SRahul Joshi     unsigned ModeId = CGH.getHwModeId(Mode);
46*4e8c9d28SJay Foad     Items.emplace_back(ModeId, Object);
47fa3d789dSPierre van Houtryve   }
48fa3d789dSPierre van Houtryve }
49fa3d789dSPierre van Houtryve 
50fa3d789dSPierre van Houtryve LLVM_DUMP_METHOD
51fa3d789dSPierre van Houtryve void HwModeSelect::dump() const {
52fa3d789dSPierre van Houtryve   dbgs() << '{';
53fa3d789dSPierre van Houtryve   for (const PairType &P : Items)
54fa3d789dSPierre van Houtryve     dbgs() << " (" << P.first << ',' << P.second->getName() << ')';
55fa3d789dSPierre van Houtryve   dbgs() << " }\n";
56fa3d789dSPierre van Houtryve }
57fa3d789dSPierre van Houtryve 
58985600dcSRahul Joshi CodeGenHwModes::CodeGenHwModes(const RecordKeeper &RK) : Records(RK) {
59985600dcSRahul Joshi   for (const Record *R : Records.getAllDerivedDefinitions("HwMode")) {
60fa3d789dSPierre van Houtryve     // The default mode needs a definition in the .td sources for TableGen
61fa3d789dSPierre van Houtryve     // to accept references to it. We need to ignore the definition here.
62fa3d789dSPierre van Houtryve     if (R->getName() == DefaultModeName)
63fa3d789dSPierre van Houtryve       continue;
64fa3d789dSPierre van Houtryve     Modes.emplace_back(R);
65*4e8c9d28SJay Foad     ModeIds.try_emplace(R, Modes.size());
66fa3d789dSPierre van Houtryve   }
67fa3d789dSPierre van Houtryve 
68ffc9a309SsuperZWT123   assert(Modes.size() <= 32 && "number of HwModes exceeds maximum of 32");
69ffc9a309SsuperZWT123 
70985600dcSRahul Joshi   for (const Record *R : Records.getAllDerivedDefinitions("HwModeSelect")) {
71*4e8c9d28SJay Foad     auto P = ModeSelects.emplace(R, HwModeSelect(R, *this));
72fa3d789dSPierre van Houtryve     assert(P.second);
73fa3d789dSPierre van Houtryve     (void)P;
74fa3d789dSPierre van Houtryve   }
75fa3d789dSPierre van Houtryve }
76fa3d789dSPierre van Houtryve 
77985600dcSRahul Joshi unsigned CodeGenHwModes::getHwModeId(const Record *R) const {
78fa3d789dSPierre van Houtryve   if (R->getName() == DefaultModeName)
79fa3d789dSPierre van Houtryve     return DefaultMode;
80fa3d789dSPierre van Houtryve   auto F = ModeIds.find(R);
81fa3d789dSPierre van Houtryve   assert(F != ModeIds.end() && "Unknown mode name");
82fa3d789dSPierre van Houtryve   return F->second;
83fa3d789dSPierre van Houtryve }
84fa3d789dSPierre van Houtryve 
85985600dcSRahul Joshi const HwModeSelect &CodeGenHwModes::getHwModeSelect(const Record *R) const {
86fa3d789dSPierre van Houtryve   auto F = ModeSelects.find(R);
87fa3d789dSPierre van Houtryve   assert(F != ModeSelects.end() && "Record is not a \"mode select\"");
88fa3d789dSPierre van Houtryve   return F->second;
89fa3d789dSPierre van Houtryve }
90fa3d789dSPierre van Houtryve 
91fa3d789dSPierre van Houtryve LLVM_DUMP_METHOD
92fa3d789dSPierre van Houtryve void CodeGenHwModes::dump() const {
93fa3d789dSPierre van Houtryve   dbgs() << "Modes: {\n";
94fa3d789dSPierre van Houtryve   for (const HwMode &M : Modes) {
95fa3d789dSPierre van Houtryve     dbgs() << "  ";
96fa3d789dSPierre van Houtryve     M.dump();
97fa3d789dSPierre van Houtryve   }
98fa3d789dSPierre van Houtryve   dbgs() << "}\n";
99fa3d789dSPierre van Houtryve 
100fa3d789dSPierre van Houtryve   dbgs() << "ModeIds: {\n";
101fa3d789dSPierre van Houtryve   for (const auto &P : ModeIds)
102fa3d789dSPierre van Houtryve     dbgs() << "  " << P.first->getName() << " -> " << P.second << '\n';
103fa3d789dSPierre van Houtryve   dbgs() << "}\n";
104fa3d789dSPierre van Houtryve 
105fa3d789dSPierre van Houtryve   dbgs() << "ModeSelects: {\n";
106fa3d789dSPierre van Houtryve   for (const auto &P : ModeSelects) {
107fa3d789dSPierre van Houtryve     dbgs() << "  " << P.first->getName() << " -> ";
108fa3d789dSPierre van Houtryve     P.second.dump();
109fa3d789dSPierre van Houtryve   }
110fa3d789dSPierre van Houtryve   dbgs() << "}\n";
111fa3d789dSPierre van Houtryve }
112