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 }