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