@@ -10593,17 +10593,88 @@ PPCTargetLowering::EmitAtomicBinary(MachineInstr &MI, MachineBasicBlock *BB,
10593
10593
return BB;
10594
10594
}
10595
10595
10596
+ static bool isSignExtended(MachineInstr &MI, const PPCInstrInfo *TII) {
10597
+ switch(MI.getOpcode()) {
10598
+ default:
10599
+ return false;
10600
+ case PPC::COPY:
10601
+ return TII->isSignExtended(MI);
10602
+ case PPC::LHA:
10603
+ case PPC::LHA8:
10604
+ case PPC::LHAU:
10605
+ case PPC::LHAU8:
10606
+ case PPC::LHAUX:
10607
+ case PPC::LHAUX8:
10608
+ case PPC::LHAX:
10609
+ case PPC::LHAX8:
10610
+ case PPC::LWA:
10611
+ case PPC::LWAUX:
10612
+ case PPC::LWAX:
10613
+ case PPC::LWAX_32:
10614
+ case PPC::LWA_32:
10615
+ case PPC::PLHA:
10616
+ case PPC::PLHA8:
10617
+ case PPC::PLHA8pc:
10618
+ case PPC::PLHApc:
10619
+ case PPC::PLWA:
10620
+ case PPC::PLWA8:
10621
+ case PPC::PLWA8pc:
10622
+ case PPC::PLWApc:
10623
+ case PPC::EXTSB:
10624
+ case PPC::EXTSB8:
10625
+ case PPC::EXTSB8_32_64:
10626
+ case PPC::EXTSB8_rec:
10627
+ case PPC::EXTSB_rec:
10628
+ case PPC::EXTSH:
10629
+ case PPC::EXTSH8:
10630
+ case PPC::EXTSH8_32_64:
10631
+ case PPC::EXTSH8_rec:
10632
+ case PPC::EXTSH_rec:
10633
+ case PPC::EXTSW:
10634
+ case PPC::EXTSWSLI:
10635
+ case PPC::EXTSWSLI_32_64:
10636
+ case PPC::EXTSWSLI_32_64_rec:
10637
+ case PPC::EXTSWSLI_rec:
10638
+ case PPC::EXTSW_32:
10639
+ case PPC::EXTSW_32_64:
10640
+ case PPC::EXTSW_32_64_rec:
10641
+ case PPC::EXTSW_rec:
10642
+ case PPC::SRAW:
10643
+ case PPC::SRAWI:
10644
+ case PPC::SRAWI_rec:
10645
+ case PPC::SRAW_rec:
10646
+ return true;
10647
+ }
10648
+ return false;
10649
+ }
10650
+
10596
10651
MachineBasicBlock *PPCTargetLowering::EmitPartwordAtomicBinary(
10597
10652
MachineInstr &MI, MachineBasicBlock *BB,
10598
10653
bool is8bit, // operation
10599
10654
unsigned BinOpcode, unsigned CmpOpcode, unsigned CmpPred) const {
10655
+ // This also handles ATOMIC_SWAP, indicated by BinOpcode==0.
10656
+ const PPCInstrInfo *TII = Subtarget.getInstrInfo();
10657
+
10658
+ // If this is a signed comparison and the value being compared is not known
10659
+ // to be sign extended, sign extend it here.
10660
+ DebugLoc dl = MI.getDebugLoc();
10661
+ MachineFunction *F = BB->getParent();
10662
+ MachineRegisterInfo &RegInfo = F->getRegInfo();
10663
+ Register incr = MI.getOperand(3).getReg();
10664
+ bool IsSignExtended = Register::isVirtualRegister(incr) &&
10665
+ isSignExtended(*RegInfo.getVRegDef(incr), TII);
10666
+
10667
+ if (CmpOpcode == PPC::CMPW && !IsSignExtended) {
10668
+ Register ValueReg = RegInfo.createVirtualRegister(&PPC::GPRCRegClass);
10669
+ BuildMI(*BB, MI, dl, TII->get(is8bit ? PPC::EXTSB : PPC::EXTSH), ValueReg)
10670
+ .addReg(MI.getOperand(3).getReg());
10671
+ MI.getOperand(3).setReg(ValueReg);
10672
+ }
10600
10673
// If we support part-word atomic mnemonics, just use them
10601
10674
if (Subtarget.hasPartwordAtomics())
10602
10675
return EmitAtomicBinary(MI, BB, is8bit ? 1 : 2, BinOpcode, CmpOpcode,
10603
10676
CmpPred);
10604
10677
10605
- // This also handles ATOMIC_SWAP, indicated by BinOpcode==0.
10606
- const TargetInstrInfo *TII = Subtarget.getInstrInfo();
10607
10678
// In 64 bit mode we have to use 64 bits for addresses, even though the
10608
10679
// lwarx/stwcx are 32 bits. With the 32-bit atomics we can use address
10609
10680
// registers without caring whether they're 32 or 64, but here we're
@@ -10613,14 +10684,11 @@ MachineBasicBlock *PPCTargetLowering::EmitPartwordAtomicBinary(
10613
10684
unsigned ZeroReg = is64bit ? PPC::ZERO8 : PPC::ZERO;
10614
10685
10615
10686
const BasicBlock *LLVM_BB = BB->getBasicBlock();
10616
- MachineFunction *F = BB->getParent();
10617
10687
MachineFunction::iterator It = ++BB->getIterator();
10618
10688
10619
10689
Register dest = MI.getOperand(0).getReg();
10620
10690
Register ptrA = MI.getOperand(1).getReg();
10621
10691
Register ptrB = MI.getOperand(2).getReg();
10622
- Register incr = MI.getOperand(3).getReg();
10623
- DebugLoc dl = MI.getDebugLoc();
10624
10692
10625
10693
MachineBasicBlock *loopMBB = F->CreateMachineBasicBlock(LLVM_BB);
10626
10694
MachineBasicBlock *loop2MBB =
@@ -10634,7 +10702,6 @@ MachineBasicBlock *PPCTargetLowering::EmitPartwordAtomicBinary(
10634
10702
std::next(MachineBasicBlock::iterator(MI)), BB->end());
10635
10703
exitMBB->transferSuccessorsAndUpdatePHIs(BB);
10636
10704
10637
- MachineRegisterInfo &RegInfo = F->getRegInfo();
10638
10705
const TargetRegisterClass *RC =
10639
10706
is64bit ? &PPC::G8RCRegClass : &PPC::GPRCRegClass;
10640
10707
const TargetRegisterClass *GPRC = &PPC::GPRCRegClass;
0 commit comments