Mercurial > hg > CbC > CbC_llvm
comparison utils/TableGen/SubtargetEmitter.cpp @ 134:3a76565eade5 LLVM5.0.1
update 5.0.1
author | mir3636 |
---|---|
date | Sat, 17 Feb 2018 09:57:20 +0900 |
parents | 803732b1fca8 |
children | c2174574ed3a |
comparison
equal
deleted
inserted
replaced
133:c60214abe0e8 | 134:3a76565eade5 |
---|---|
90 void EmitItineraries(raw_ostream &OS, | 90 void EmitItineraries(raw_ostream &OS, |
91 std::vector<std::vector<InstrItinerary>> | 91 std::vector<std::vector<InstrItinerary>> |
92 &ProcItinLists); | 92 &ProcItinLists); |
93 void EmitProcessorProp(raw_ostream &OS, const Record *R, StringRef Name, | 93 void EmitProcessorProp(raw_ostream &OS, const Record *R, StringRef Name, |
94 char Separator); | 94 char Separator); |
95 void EmitProcessorResourceSubUnits(const CodeGenProcModel &ProcModel, | |
96 raw_ostream &OS); | |
95 void EmitProcessorResources(const CodeGenProcModel &ProcModel, | 97 void EmitProcessorResources(const CodeGenProcModel &ProcModel, |
96 raw_ostream &OS); | 98 raw_ostream &OS); |
97 Record *FindWriteResources(const CodeGenSchedRW &SchedWrite, | 99 Record *FindWriteResources(const CodeGenSchedRW &SchedWrite, |
98 const CodeGenProcModel &ProcModel); | 100 const CodeGenProcModel &ProcModel); |
99 Record *FindReadAdvance(const CodeGenSchedRW &SchedRead, | 101 Record *FindReadAdvance(const CodeGenSchedRW &SchedRead, |
576 else | 578 else |
577 OS << "MCSchedModel::Default" << Name << Separator; | 579 OS << "MCSchedModel::Default" << Name << Separator; |
578 OS << '\n'; | 580 OS << '\n'; |
579 } | 581 } |
580 | 582 |
583 void SubtargetEmitter::EmitProcessorResourceSubUnits( | |
584 const CodeGenProcModel &ProcModel, raw_ostream &OS) { | |
585 OS << "\nstatic const unsigned " << ProcModel.ModelName | |
586 << "ProcResourceSubUnits[] = {\n" | |
587 << " 0, // Invalid\n"; | |
588 | |
589 for (unsigned i = 0, e = ProcModel.ProcResourceDefs.size(); i < e; ++i) { | |
590 Record *PRDef = ProcModel.ProcResourceDefs[i]; | |
591 if (!PRDef->isSubClassOf("ProcResGroup")) | |
592 continue; | |
593 RecVec ResUnits = PRDef->getValueAsListOfDefs("Resources"); | |
594 for (Record *RUDef : ResUnits) { | |
595 Record *const RU = | |
596 SchedModels.findProcResUnits(RUDef, ProcModel, PRDef->getLoc()); | |
597 for (unsigned J = 0; J < RU->getValueAsInt("NumUnits"); ++J) { | |
598 OS << " " << ProcModel.getProcResourceIdx(RU) << ", "; | |
599 } | |
600 } | |
601 OS << " // " << PRDef->getName() << "\n"; | |
602 } | |
603 OS << "};\n"; | |
604 } | |
605 | |
581 void SubtargetEmitter::EmitProcessorResources(const CodeGenProcModel &ProcModel, | 606 void SubtargetEmitter::EmitProcessorResources(const CodeGenProcModel &ProcModel, |
582 raw_ostream &OS) { | 607 raw_ostream &OS) { |
583 OS << "\n// {Name, NumUnits, SuperIdx, IsBuffered}\n"; | 608 EmitProcessorResourceSubUnits(ProcModel, OS); |
584 OS << "static const llvm::MCProcResourceDesc " | 609 |
585 << ProcModel.ModelName << "ProcResources" << "[] = {\n" | 610 OS << "\n// {Name, NumUnits, SuperIdx, IsBuffered, SubUnitsIdxBegin}\n"; |
586 << " {DBGFIELD(\"InvalidUnit\") 0, 0, 0},\n"; | 611 OS << "static const llvm::MCProcResourceDesc " << ProcModel.ModelName |
587 | 612 << "ProcResources" |
613 << "[] = {\n" | |
614 << " {DBGFIELD(\"InvalidUnit\") 0, 0, 0, 0},\n"; | |
615 | |
616 unsigned SubUnitsOffset = 1; | |
588 for (unsigned i = 0, e = ProcModel.ProcResourceDefs.size(); i < e; ++i) { | 617 for (unsigned i = 0, e = ProcModel.ProcResourceDefs.size(); i < e; ++i) { |
589 Record *PRDef = ProcModel.ProcResourceDefs[i]; | 618 Record *PRDef = ProcModel.ProcResourceDefs[i]; |
590 | 619 |
591 Record *SuperDef = nullptr; | 620 Record *SuperDef = nullptr; |
592 unsigned SuperIdx = 0; | 621 unsigned SuperIdx = 0; |
593 unsigned NumUnits = 0; | 622 unsigned NumUnits = 0; |
623 const unsigned SubUnitsBeginOffset = SubUnitsOffset; | |
594 int BufferSize = PRDef->getValueAsInt("BufferSize"); | 624 int BufferSize = PRDef->getValueAsInt("BufferSize"); |
595 if (PRDef->isSubClassOf("ProcResGroup")) { | 625 if (PRDef->isSubClassOf("ProcResGroup")) { |
596 RecVec ResUnits = PRDef->getValueAsListOfDefs("Resources"); | 626 RecVec ResUnits = PRDef->getValueAsListOfDefs("Resources"); |
597 for (Record *RU : ResUnits) { | 627 for (Record *RU : ResUnits) { |
598 NumUnits += RU->getValueAsInt("NumUnits"); | 628 NumUnits += RU->getValueAsInt("NumUnits"); |
629 SubUnitsOffset += RU->getValueAsInt("NumUnits"); | |
599 } | 630 } |
600 } | 631 } |
601 else { | 632 else { |
602 // Find the SuperIdx | 633 // Find the SuperIdx |
603 if (PRDef->getValueInit("Super")->isComplete()) { | 634 if (PRDef->getValueInit("Super")->isComplete()) { |
604 SuperDef = SchedModels.findProcResUnits( | 635 SuperDef = |
605 PRDef->getValueAsDef("Super"), ProcModel); | 636 SchedModels.findProcResUnits(PRDef->getValueAsDef("Super"), |
637 ProcModel, PRDef->getLoc()); | |
606 SuperIdx = ProcModel.getProcResourceIdx(SuperDef); | 638 SuperIdx = ProcModel.getProcResourceIdx(SuperDef); |
607 } | 639 } |
608 NumUnits = PRDef->getValueAsInt("NumUnits"); | 640 NumUnits = PRDef->getValueAsInt("NumUnits"); |
609 } | 641 } |
610 // Emit the ProcResourceDesc | 642 // Emit the ProcResourceDesc |
611 OS << " {DBGFIELD(\"" << PRDef->getName() << "\") "; | 643 OS << " {DBGFIELD(\"" << PRDef->getName() << "\") "; |
612 if (PRDef->getName().size() < 15) | 644 if (PRDef->getName().size() < 15) |
613 OS.indent(15 - PRDef->getName().size()); | 645 OS.indent(15 - PRDef->getName().size()); |
614 OS << NumUnits << ", " << SuperIdx << ", " | 646 OS << NumUnits << ", " << SuperIdx << ", " << BufferSize << ", "; |
615 << BufferSize << "}, // #" << i+1; | 647 if (SubUnitsBeginOffset != SubUnitsOffset) { |
648 OS << ProcModel.ModelName << "ProcResourceSubUnits + " | |
649 << SubUnitsBeginOffset; | |
650 } else { | |
651 OS << "nullptr"; | |
652 } | |
653 OS << "}, // #" << i+1; | |
616 if (SuperDef) | 654 if (SuperDef) |
617 OS << ", Super=" << SuperDef->getName(); | 655 OS << ", Super=" << SuperDef->getName(); |
618 OS << "\n"; | 656 OS << "\n"; |
619 } | 657 } |
620 OS << "};\n"; | 658 OS << "};\n"; |
737 RecVec SubResources; | 775 RecVec SubResources; |
738 if (PRDef->isSubClassOf("ProcResGroup")) | 776 if (PRDef->isSubClassOf("ProcResGroup")) |
739 SubResources = PRDef->getValueAsListOfDefs("Resources"); | 777 SubResources = PRDef->getValueAsListOfDefs("Resources"); |
740 else { | 778 else { |
741 SubResources.push_back(PRDef); | 779 SubResources.push_back(PRDef); |
742 PRDef = SchedModels.findProcResUnits(PRVec[i], PM); | 780 PRDef = SchedModels.findProcResUnits(PRDef, PM, PRDef->getLoc()); |
743 for (Record *SubDef = PRDef; | 781 for (Record *SubDef = PRDef; |
744 SubDef->getValueInit("Super")->isComplete();) { | 782 SubDef->getValueInit("Super")->isComplete();) { |
745 if (SubDef->isSubClassOf("ProcResGroup")) { | 783 if (SubDef->isSubClassOf("ProcResGroup")) { |
746 // Disallow this for simplicitly. | 784 // Disallow this for simplicitly. |
747 PrintFatalError(SubDef->getLoc(), "Processor resource group " | 785 PrintFatalError(SubDef->getLoc(), "Processor resource group " |
748 " cannot be a super resources."); | 786 " cannot be a super resources."); |
749 } | 787 } |
750 Record *SuperDef = | 788 Record *SuperDef = |
751 SchedModels.findProcResUnits(SubDef->getValueAsDef("Super"), PM); | 789 SchedModels.findProcResUnits(SubDef->getValueAsDef("Super"), PM, |
790 SubDef->getLoc()); | |
752 PRVec.push_back(SuperDef); | 791 PRVec.push_back(SuperDef); |
753 Cycles.push_back(Cycles[i]); | 792 Cycles.push_back(Cycles[i]); |
754 SubDef = SuperDef; | 793 SubDef = SuperDef; |
755 } | 794 } |
756 } | 795 } |