@@ -530,13 +530,40 @@ SwplTargetMachine *AArch64InstrInfo::getSwplTargetMachine() const {
530
530
531
531
}
532
532
533
- namespace llvm {
533
+ static const char *getResourceName (StmResourceId resource) {
534
+ const char *name=" " ;
535
+ switch (resource) {
536
+ case A64FXRes::PortKind::P_FLA:name=" FLA" ;break ;
537
+ case A64FXRes::PortKind::P_FLB:name=" FLB" ;break ;
538
+ case A64FXRes::PortKind::P_EXA:name=" EXA" ;break ;
539
+ case A64FXRes::PortKind::P_EXB:name=" EXB" ;break ;
540
+ case A64FXRes::PortKind::P_EAGA:name=" EAGA" ;break ;
541
+ case A64FXRes::PortKind::P_EAGB:name=" EAGB" ;break ;
542
+ case A64FXRes::PortKind::P_PRX:name=" PRX" ;break ;
543
+ case A64FXRes::PortKind::P_BR:name=" BR" ;break ;
544
+ case A64FXRes::PortKind::P_LSU1:name=" LSU1" ;break ;
545
+ case A64FXRes::PortKind::P_LSU2:name=" LSU2" ;break ;
546
+ case A64FXRes::PortKind::P_FLA_C:name=" FLA_C" ;break ;
547
+ case A64FXRes::PortKind::P_FLB_C:name=" FLB_C" ;break ;
548
+ case A64FXRes::PortKind::P_EXA_C:name=" EXA_C" ;break ;
549
+ case A64FXRes::PortKind::P_EXB_C:name=" EXB_C" ;break ;
550
+ case A64FXRes::PortKind::P_EAGA_C:name=" EAGA_C" ;break ;
551
+ case A64FXRes::PortKind::P_EAGB_C:name=" EAGB_C" ;break ;
552
+ default :
553
+ llvm_unreachable (" unknown resourceid" );
554
+ }
555
+ return name;
556
+
557
+ }
558
+
559
+ static StmPipelines forPseudoMI;
560
+ static StmPipelines forNoImplMI;
561
+
534
562
535
563
void AArch64SwplTargetMachine::initialize (const MachineFunction &mf) {
536
564
if (MF==nullptr ) {
537
565
const TargetSubtargetInfo &ST = mf.getSubtarget ();
538
566
SM.init (&ST);
539
- ResInfo=new AArch64A64FXResInfo (ST);
540
567
tmNumSameKindResources[A64FXRes::PortKind::P_FLA]=2 ;
541
568
tmNumSameKindResources[A64FXRes::PortKind::P_FLB]=2 ;
542
569
tmNumSameKindResources[A64FXRes::PortKind::P_EXA]=2 ;
@@ -545,7 +572,22 @@ void AArch64SwplTargetMachine::initialize(const MachineFunction &mf) {
545
572
tmNumSameKindResources[A64FXRes::PortKind::P_EAGB]=2 ;
546
573
tmNumSameKindResources[A64FXRes::PortKind::P_PRX]=1 ;
547
574
tmNumSameKindResources[A64FXRes::PortKind::P_BR]=1 ;
548
- numResource=8 ; // 資源管理がSchedModelとは別になったので、ハードコードする
575
+ tmNumSameKindResources[A64FXRes::PortKind::P_LSU1]=2 ;
576
+ tmNumSameKindResources[A64FXRes::PortKind::P_LSU2]=2 ;
577
+ tmNumSameKindResources[A64FXRes::PortKind::P_FLA_C]=2 ;
578
+ tmNumSameKindResources[A64FXRes::PortKind::P_FLB_C]=2 ;
579
+ tmNumSameKindResources[A64FXRes::PortKind::P_EXA_C]=2 ;
580
+ tmNumSameKindResources[A64FXRes::PortKind::P_EXB_C]=2 ;
581
+ tmNumSameKindResources[A64FXRes::PortKind::P_EAGA_C]=2 ;
582
+ tmNumSameKindResources[A64FXRes::PortKind::P_EAGB_C]=2 ;
583
+ numResource=16 ; // 資源管理がSchedModelとは別になったので、ハードコードする
584
+
585
+ forPseudoMI.push_back (new AArch64StmPipeline ());
586
+ auto *p = new AArch64StmPipeline ();
587
+ p->stages .push_back (0 );
588
+ p->resources .push_back (A64FXRes::PortKind::P_BR);
589
+ forNoImplMI.push_back (p);
590
+
549
591
}
550
592
MF=&mf;
551
593
}
@@ -578,38 +620,11 @@ void AArch64StmPipeline::print(raw_ostream &ost) const {
578
620
}
579
621
580
622
const char *AArch64StmPipeline::getResourceName (StmResourceId resource) const {
581
- // @todo AArch64SwplTargetMachine::getResourceName()を呼び出すようにすべきor本メソッド削除
582
- const char *name=" " ;
583
- switch (resource) {
584
- case A64FXRes::PortKind::P_FLA:name=" FLA" ;break ;
585
- case A64FXRes::PortKind::P_FLB:name=" FLB" ;break ;
586
- case A64FXRes::PortKind::P_EXA:name=" EXA" ;break ;
587
- case A64FXRes::PortKind::P_EXB:name=" EXB" ;break ;
588
- case A64FXRes::PortKind::P_EAGA:name=" EAGA" ;break ;
589
- case A64FXRes::PortKind::P_EAGB:name=" EAGB" ;break ;
590
- case A64FXRes::PortKind::P_PRX:name=" PRX" ;break ;
591
- case A64FXRes::PortKind::P_BR:name=" BR" ;break ;
592
- default :
593
- llvm_unreachable (" unknown resourceid" );
594
- }
595
- return name;
623
+ return ::getResourceName (resource);
596
624
}
597
625
598
626
const char *AArch64SwplTargetMachine::getResourceName (StmResourceId resource) const {
599
- const char *name=" " ;
600
- switch (resource) {
601
- case A64FXRes::PortKind::P_FLA:name=" FLA" ;break ;
602
- case A64FXRes::PortKind::P_FLB:name=" FLB" ;break ;
603
- case A64FXRes::PortKind::P_EXA:name=" EXA" ;break ;
604
- case A64FXRes::PortKind::P_EXB:name=" EXB" ;break ;
605
- case A64FXRes::PortKind::P_EAGA:name=" EAGA" ;break ;
606
- case A64FXRes::PortKind::P_EAGB:name=" EAGB" ;break ;
607
- case A64FXRes::PortKind::P_PRX:name=" PRX" ;break ;
608
- case A64FXRes::PortKind::P_BR:name=" BR" ;break ;
609
- default :
610
- llvm_unreachable (" unknown resourceid" );
611
- }
612
- return name;
627
+ return ::getResourceName (resource);
613
628
}
614
629
615
630
int AArch64SwplTargetMachine::computeMemFlowDependence (const MachineInstr *, const MachineInstr *) const {
@@ -618,34 +633,24 @@ int AArch64SwplTargetMachine::computeMemFlowDependence(const MachineInstr *, con
618
633
return 1 ;
619
634
}
620
635
636
+
621
637
const StmPipelinesImpl *
622
- AArch64SwplTargetMachine::getPipelines (const MachineInstr &mi) {
623
- auto *tps= stmPipelines[mi.getOpcode ()];
624
- if (tps==nullptr ) {
625
- tps= generateStmPipelines (mi);
626
- stmPipelines[mi.getOpcode ()]=tps;
627
- }
628
- return tps;
629
- }
638
+ AArch64SwplTargetMachine::getPipelines (const MachineInstr &mi) const {
630
639
631
- StmPipelinesImpl *
632
- AArch64SwplTargetMachine::generateStmPipelines (const MachineInstr &mi) {
633
- // @todo 作りが必要
634
- auto *pipelines=new StmPipelines;
635
- if (mi.isPseudo ()) {
636
- pipelines->push_back (new AArch64StmPipeline ());
637
- } else {
638
- auto *p = new AArch64StmPipeline ();
639
- p->stages .push_back (0 );
640
- p->resources .push_back (A64FXRes::PortKind::P_BR);
641
- pipelines->push_back (p);
640
+ if (SwplSched.isPseudo (mi)) {
641
+ return &forPseudoMI;
642
+ } else if (!isImplimented (mi)) {
643
+ return &forNoImplMI;
642
644
}
643
- return pipelines;
645
+ auto id=SwplSched.getRes (mi);
646
+ return SwplSched.getPipelines (id);
644
647
}
645
648
646
- }
647
649
int AArch64SwplTargetMachine::computeRegFlowDependence (const MachineInstr* def, const MachineInstr* use) const {
648
- // @todo 作り必要
650
+ if (isPseudo (*def) || isPseudo (*use)) return 0 ;
651
+ if (isImplimented (*def)) {
652
+ return SwplSched.getLatency (SwplSched.getRes (*def));
653
+ }
649
654
return 1 ;
650
655
}
651
656
@@ -662,16 +667,15 @@ unsigned int AArch64SwplTargetMachine::getNumResource(void) const {
662
667
}
663
668
664
669
bool AArch64SwplTargetMachine::isImplimented (const MachineInstr&mi) const {
665
- if (OptionCopyIsVirtual) {
666
- if (mi.isCopy ()) return false ;
667
- }
668
- // @todo 作り必要
669
- return false ;
670
+ if (SwplSched.getRes (mi)==0 )
671
+ return false ;
672
+ else
673
+ return true ;
670
674
}
671
675
672
676
bool AArch64SwplTargetMachine::isPseudo (const MachineInstr &mi) const {
673
- // @todo 作り必要
674
- return mi.isPseudo ();
675
- // return !isImplimented(mi);
677
+ if (OptionCopyIsVirtual) {
678
+ if (mi.isCopy ()) return false ;
679
+ }
680
+ return SwplSched.isPseudo (mi);
676
681
}
677
-
0 commit comments