@@ -433,23 +433,44 @@ bool MipsExpandPseudo::expandAtomicBinOpSubword(
433
433
Register OldVal = I->getOperand (6 ).getReg ();
434
434
Register BinOpRes = I->getOperand (7 ).getReg ();
435
435
Register StoreVal = I->getOperand (8 ).getReg ();
436
+ bool NoMovnInstr = (IsMin || IsMax) && !STI->hasMips4 () && !STI->hasMips32 ();
436
437
437
438
const BasicBlock *LLVM_BB = BB.getBasicBlock ();
438
439
MachineBasicBlock *loopMBB = MF->CreateMachineBasicBlock (LLVM_BB);
440
+ MachineBasicBlock *loop1MBB;
441
+ MachineBasicBlock *loop2MBB;
442
+ if (NoMovnInstr) {
443
+ loop1MBB = MF->CreateMachineBasicBlock (LLVM_BB);
444
+ loop2MBB = MF->CreateMachineBasicBlock (LLVM_BB);
445
+ }
439
446
MachineBasicBlock *sinkMBB = MF->CreateMachineBasicBlock (LLVM_BB);
440
447
MachineBasicBlock *exitMBB = MF->CreateMachineBasicBlock (LLVM_BB);
441
448
MachineFunction::iterator It = ++BB.getIterator ();
442
449
MF->insert (It, loopMBB);
450
+ if (NoMovnInstr) {
451
+ MF->insert (It, loop1MBB);
452
+ MF->insert (It, loop2MBB);
453
+ }
443
454
MF->insert (It, sinkMBB);
444
455
MF->insert (It, exitMBB);
445
456
446
457
exitMBB->splice (exitMBB->begin (), &BB, std::next (I), BB.end ());
447
458
exitMBB->transferSuccessorsAndUpdatePHIs (&BB);
448
459
449
460
BB.addSuccessor (loopMBB, BranchProbability::getOne ());
450
- loopMBB->addSuccessor (sinkMBB);
451
- loopMBB->addSuccessor (loopMBB);
461
+ if (NoMovnInstr) {
462
+ loopMBB->addSuccessor (loop1MBB);
463
+ loopMBB->addSuccessor (loop2MBB);
464
+ } else {
465
+ loopMBB->addSuccessor (sinkMBB);
466
+ loopMBB->addSuccessor (loopMBB);
467
+ }
452
468
loopMBB->normalizeSuccProbs ();
469
+ if (NoMovnInstr) {
470
+ loop1MBB->addSuccessor (loop2MBB);
471
+ loop2MBB->addSuccessor (loopMBB);
472
+ loop2MBB->addSuccessor (exitMBB, BranchProbability::getOne ());
473
+ }
453
474
454
475
BuildMI (loopMBB, DL, TII->get (LL), OldVal).addReg (Ptr).addImm (0 );
455
476
if (IsNand) {
@@ -526,7 +547,7 @@ bool MipsExpandPseudo::expandAtomicBinOpSubword(
526
547
BuildMI (loopMBB, DL, TII->get (OR), BinOpRes)
527
548
.addReg (BinOpRes)
528
549
.addReg (Scratch4);
529
- } else {
550
+ } else if (STI-> hasMips4 () || STI-> hasMips32 ()) {
530
551
// max: move BinOpRes, StoreVal
531
552
// movn BinOpRes, Incr, Scratch4, BinOpRes
532
553
// min: move BinOpRes, StoreVal
@@ -538,12 +559,59 @@ bool MipsExpandPseudo::expandAtomicBinOpSubword(
538
559
.addReg (Incr)
539
560
.addReg (Scratch4)
540
561
.addReg (BinOpRes);
562
+ } else {
563
+ // if min:
564
+ // loopMBB: move BinOpRes, StoreVal
565
+ // beq Scratch4, 0, loop1MBB
566
+ // j loop2MBB
567
+ // loop1MBB: move BinOpRes, Incr
568
+ // loop2MBB: and BinOpRes, BinOpRes, Mask
569
+ // and StoreVal, OlddVal, Mask2
570
+ // or StoreVal, StoreVal, BinOpRes
571
+ // StoreVal<tied1> = sc StoreVal, 0(Ptr)
572
+ // beq StoreVal, zero, loopMBB
573
+ //
574
+ // if max:
575
+ // loopMBB: move BinOpRes, Incr
576
+ // beq Scratch4, 0, loop1MBB
577
+ // j loop2MBB
578
+ // loop1MBB: move BinOpRes, StoreVal
579
+ // loop2MBB: and BinOpRes, BinOpRes, Mask
580
+ // and StoreVal, OlddVal, Mask2
581
+ // or StoreVal, StoreVal, BinOpRes
582
+ // StoreVal<tied1> = sc StoreVal, 0(Ptr)
583
+ // beq StoreVal, zero, loopMBB
584
+ if (IsMin) {
585
+ BuildMI (loopMBB, DL, TII->get (OR), BinOpRes)
586
+ .addReg (StoreVal)
587
+ .addReg (Mips::ZERO);
588
+ BuildMI (loop1MBB, DL, TII->get (OR), BinOpRes)
589
+ .addReg (Incr)
590
+ .addReg (Mips::ZERO);
591
+ } else {
592
+ BuildMI (loopMBB, DL, TII->get (OR), BinOpRes)
593
+ .addReg (Incr)
594
+ .addReg (Mips::ZERO);
595
+ BuildMI (loop1MBB, DL, TII->get (OR), BinOpRes)
596
+ .addReg (StoreVal)
597
+ .addReg (Mips::ZERO);
598
+ }
599
+ BuildMI (loopMBB, DL, TII->get (BEQ))
600
+ .addReg (Scratch4)
601
+ .addReg (Mips::ZERO)
602
+ .addMBB (loop1MBB);
603
+ BuildMI (loopMBB, DL, TII->get (Mips::J)).addMBB (loop2MBB);
541
604
}
542
605
543
606
// and BinOpRes, BinOpRes, Mask
544
- BuildMI (loopMBB, DL, TII->get (Mips::AND), BinOpRes)
545
- .addReg (BinOpRes)
546
- .addReg (Mask);
607
+ if (NoMovnInstr)
608
+ BuildMI (loop2MBB, DL, TII->get (Mips::AND), BinOpRes)
609
+ .addReg (BinOpRes)
610
+ .addReg (Mask);
611
+ else
612
+ BuildMI (loopMBB, DL, TII->get (Mips::AND), BinOpRes)
613
+ .addReg (BinOpRes)
614
+ .addReg (Mask);
547
615
548
616
} else if (!IsSwap) {
549
617
// <binop> binopres, oldval, incr2
@@ -565,14 +633,37 @@ bool MipsExpandPseudo::expandAtomicBinOpSubword(
565
633
// or StoreVal, StoreVal, BinOpRes
566
634
// StoreVal<tied1> = sc StoreVal, 0(Ptr)
567
635
// beq StoreVal, zero, loopMBB
568
- BuildMI (loopMBB, DL, TII->get (Mips::AND), StoreVal)
569
- .addReg (OldVal).addReg (Mask2);
570
- BuildMI (loopMBB, DL, TII->get (Mips::OR), StoreVal)
571
- .addReg (StoreVal).addReg (BinOpRes);
572
- BuildMI (loopMBB, DL, TII->get (SC), StoreVal)
573
- .addReg (StoreVal).addReg (Ptr).addImm (0 );
574
- BuildMI (loopMBB, DL, TII->get (BEQ))
575
- .addReg (StoreVal).addReg (Mips::ZERO).addMBB (loopMBB);
636
+ if (NoMovnInstr) {
637
+ BuildMI (loop2MBB, DL, TII->get (Mips::AND), StoreVal)
638
+ .addReg (OldVal)
639
+ .addReg (Mask2);
640
+ BuildMI (loop2MBB, DL, TII->get (Mips::OR), StoreVal)
641
+ .addReg (StoreVal)
642
+ .addReg (BinOpRes);
643
+ BuildMI (loop2MBB, DL, TII->get (SC), StoreVal)
644
+ .addReg (StoreVal)
645
+ .addReg (Ptr)
646
+ .addImm (0 );
647
+ BuildMI (loop2MBB, DL, TII->get (BEQ))
648
+ .addReg (StoreVal)
649
+ .addReg (Mips::ZERO)
650
+ .addMBB (loopMBB);
651
+ } else {
652
+ BuildMI (loopMBB, DL, TII->get (Mips::AND), StoreVal)
653
+ .addReg (OldVal)
654
+ .addReg (Mask2);
655
+ BuildMI (loopMBB, DL, TII->get (Mips::OR), StoreVal)
656
+ .addReg (StoreVal)
657
+ .addReg (BinOpRes);
658
+ BuildMI (loopMBB, DL, TII->get (SC), StoreVal)
659
+ .addReg (StoreVal)
660
+ .addReg (Ptr)
661
+ .addImm (0 );
662
+ BuildMI (loopMBB, DL, TII->get (BEQ))
663
+ .addReg (StoreVal)
664
+ .addReg (Mips::ZERO)
665
+ .addMBB (loopMBB);
666
+ }
576
667
577
668
// sinkMBB:
578
669
// and maskedoldval1,oldval,mask
@@ -601,6 +692,10 @@ bool MipsExpandPseudo::expandAtomicBinOpSubword(
601
692
602
693
LivePhysRegs LiveRegs;
603
694
computeAndAddLiveIns (LiveRegs, *loopMBB);
695
+ if (NoMovnInstr) {
696
+ computeAndAddLiveIns (LiveRegs, *loop1MBB);
697
+ computeAndAddLiveIns (LiveRegs, *loop2MBB);
698
+ }
604
699
computeAndAddLiveIns (LiveRegs, *sinkMBB);
605
700
computeAndAddLiveIns (LiveRegs, *exitMBB);
606
701
@@ -747,20 +842,41 @@ bool MipsExpandPseudo::expandAtomicBinOp(MachineBasicBlock &BB,
747
842
llvm_unreachable (" Unknown pseudo atomic!" );
748
843
}
749
844
845
+ bool NoMovnInstr = (IsMin || IsMax) && !STI->hasMips4 () && !STI->hasMips32 ();
750
846
const BasicBlock *LLVM_BB = BB.getBasicBlock ();
751
847
MachineBasicBlock *loopMBB = MF->CreateMachineBasicBlock (LLVM_BB);
848
+ MachineBasicBlock *loop1MBB;
849
+ MachineBasicBlock *loop2MBB;
850
+ if (NoMovnInstr) {
851
+ loop1MBB = MF->CreateMachineBasicBlock (LLVM_BB);
852
+ loop2MBB = MF->CreateMachineBasicBlock (LLVM_BB);
853
+ }
752
854
MachineBasicBlock *exitMBB = MF->CreateMachineBasicBlock (LLVM_BB);
753
855
MachineFunction::iterator It = ++BB.getIterator ();
754
856
MF->insert (It, loopMBB);
857
+ if (NoMovnInstr) {
858
+ MF->insert (It, loop1MBB);
859
+ MF->insert (It, loop2MBB);
860
+ }
755
861
MF->insert (It, exitMBB);
756
862
757
863
exitMBB->splice (exitMBB->begin (), &BB, std::next (I), BB.end ());
758
864
exitMBB->transferSuccessorsAndUpdatePHIs (&BB);
759
865
760
866
BB.addSuccessor (loopMBB, BranchProbability::getOne ());
761
- loopMBB->addSuccessor (exitMBB);
762
- loopMBB->addSuccessor (loopMBB);
867
+ if (NoMovnInstr) {
868
+ loopMBB->addSuccessor (loop1MBB);
869
+ loopMBB->addSuccessor (loop2MBB);
870
+ } else {
871
+ loopMBB->addSuccessor (exitMBB);
872
+ loopMBB->addSuccessor (loopMBB);
873
+ }
763
874
loopMBB->normalizeSuccProbs ();
875
+ if (NoMovnInstr) {
876
+ loop1MBB->addSuccessor (loop2MBB);
877
+ loop2MBB->addSuccessor (loopMBB);
878
+ loop2MBB->addSuccessor (exitMBB, BranchProbability::getOne ());
879
+ }
764
880
765
881
BuildMI (loopMBB, DL, TII->get (LL), OldVal).addReg (Ptr).addImm (0 );
766
882
assert ((OldVal != Ptr) && " Clobbered the wrong ptr reg!" );
@@ -803,7 +919,7 @@ bool MipsExpandPseudo::expandAtomicBinOp(MachineBasicBlock &BB,
803
919
BuildMI (loopMBB, DL, TII->get (OR), Scratch)
804
920
.addReg (Scratch)
805
921
.addReg (Scratch2);
806
- } else {
922
+ } else if (STI-> hasMips4 () || STI-> hasMips32 ()) {
807
923
// max: move Scratch, OldVal
808
924
// movn Scratch, Incr, Scratch2, Scratch
809
925
// min: move Scratch, OldVal
@@ -815,6 +931,38 @@ bool MipsExpandPseudo::expandAtomicBinOp(MachineBasicBlock &BB,
815
931
.addReg (Incr)
816
932
.addReg (Scratch2)
817
933
.addReg (Scratch);
934
+ } else {
935
+ // if min:
936
+ // loopMBB: move Scratch, OldVal
937
+ // beq Scratch2_32, 0, loop1MBB
938
+ // j loop2MBB
939
+ // loop1MBB: move Scratch, Incr
940
+ // loop2MBB: sc $2, 0($4)
941
+ // beqz $2, $BB0_1
942
+ // nop
943
+ //
944
+ // if max:
945
+ // loopMBB: move Scratch, Incr
946
+ // beq Scratch2_32, 0, loop1MBB
947
+ // j loop2MBB
948
+ // loop1MBB: move Scratch, OldVal
949
+ // loop2MBB: sc $2, 0($4)
950
+ // beqz $2, $BB0_1
951
+ // nop
952
+ if (IsMin) {
953
+ BuildMI (loopMBB, DL, TII->get (OR), Scratch).addReg (OldVal).addReg (ZERO);
954
+ BuildMI (loop1MBB, DL, TII->get (OR), Scratch).addReg (Incr).addReg (ZERO);
955
+ } else {
956
+ BuildMI (loopMBB, DL, TII->get (OR), Scratch).addReg (Incr).addReg (ZERO);
957
+ BuildMI (loop1MBB, DL, TII->get (OR), Scratch)
958
+ .addReg (OldVal)
959
+ .addReg (ZERO);
960
+ }
961
+ BuildMI (loopMBB, DL, TII->get (BEQ))
962
+ .addReg (Scratch2_32)
963
+ .addReg (ZERO)
964
+ .addMBB (loop1MBB);
965
+ BuildMI (loopMBB, DL, TII->get (Mips::J)).addMBB (loop2MBB);
818
966
}
819
967
820
968
} else if (Opcode) {
@@ -830,20 +978,35 @@ bool MipsExpandPseudo::expandAtomicBinOp(MachineBasicBlock &BB,
830
978
BuildMI (loopMBB, DL, TII->get (OR), Scratch).addReg (Incr).addReg (ZERO);
831
979
}
832
980
833
- BuildMI (loopMBB, DL, TII->get (SC), Scratch)
834
- .addReg (Scratch)
835
- .addReg (Ptr)
836
- .addImm (0 );
837
- BuildMI (loopMBB, DL, TII->get (BEQ))
838
- .addReg (Scratch)
839
- .addReg (ZERO)
840
- .addMBB (loopMBB);
981
+ if (NoMovnInstr) {
982
+ BuildMI (loop2MBB, DL, TII->get (SC), Scratch)
983
+ .addReg (Scratch)
984
+ .addReg (Ptr)
985
+ .addImm (0 );
986
+ BuildMI (loop2MBB, DL, TII->get (BEQ))
987
+ .addReg (Scratch)
988
+ .addReg (ZERO)
989
+ .addMBB (loopMBB);
990
+ } else {
991
+ BuildMI (loopMBB, DL, TII->get (SC), Scratch)
992
+ .addReg (Scratch)
993
+ .addReg (Ptr)
994
+ .addImm (0 );
995
+ BuildMI (loopMBB, DL, TII->get (BEQ))
996
+ .addReg (Scratch)
997
+ .addReg (ZERO)
998
+ .addMBB (loopMBB);
999
+ }
841
1000
842
1001
NMBBI = BB.end ();
843
1002
I->eraseFromParent ();
844
1003
845
1004
LivePhysRegs LiveRegs;
846
1005
computeAndAddLiveIns (LiveRegs, *loopMBB);
1006
+ if (!STI->hasMips4 () && !STI->hasMips32 ()) {
1007
+ computeAndAddLiveIns (LiveRegs, *loop1MBB);
1008
+ computeAndAddLiveIns (LiveRegs, *loop2MBB);
1009
+ }
847
1010
computeAndAddLiveIns (LiveRegs, *exitMBB);
848
1011
849
1012
return true ;
0 commit comments