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