diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2016-12-10 15:02:05 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2016-12-10 15:02:05 +0000 | 
| commit | 6421cca32f69ac849537a3cff78c352195e99f1b (patch) | |
| tree | 419f8e5570d50a27957e4d3d80abb6639549126f /lib | |
| parent | 2cf3bd4601bbc6fc1f3ffe845eb57c2da2dff02c (diff) | |
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/Target/AArch64/AArch64ExpandPseudoInsts.cpp | 20 | ||||
| -rw-r--r-- | lib/Target/AArch64/AArch64ISelLowering.cpp | 19 | ||||
| -rw-r--r-- | lib/Target/ARM/ARMExpandPseudoInsts.cpp | 11 | 
3 files changed, 31 insertions, 19 deletions
| diff --git a/lib/Target/AArch64/AArch64ExpandPseudoInsts.cpp b/lib/Target/AArch64/AArch64ExpandPseudoInsts.cpp index 5e477d39e074a..a1c98251cec48 100644 --- a/lib/Target/AArch64/AArch64ExpandPseudoInsts.cpp +++ b/lib/Target/AArch64/AArch64ExpandPseudoInsts.cpp @@ -718,13 +718,21 @@ bool AArch64ExpandPseudo::expandCMP_SWAP_128(        .addReg(DestLo.getReg(), getKillRegState(DestLo.isDead()))        .addOperand(DesiredLo)        .addImm(0); -  BuildMI(LoadCmpBB, DL, TII->get(AArch64::SBCSXr), AArch64::XZR) +  BuildMI(LoadCmpBB, DL, TII->get(AArch64::CSINCWr), StatusReg) +    .addReg(AArch64::WZR) +    .addReg(AArch64::WZR) +    .addImm(AArch64CC::EQ); +  BuildMI(LoadCmpBB, DL, TII->get(AArch64::SUBSXrs), AArch64::XZR)        .addReg(DestHi.getReg(), getKillRegState(DestHi.isDead())) -      .addOperand(DesiredHi); -  BuildMI(LoadCmpBB, DL, TII->get(AArch64::Bcc)) -      .addImm(AArch64CC::NE) -      .addMBB(DoneBB) -      .addReg(AArch64::NZCV, RegState::Implicit | RegState::Kill); +      .addOperand(DesiredHi) +      .addImm(0); +  BuildMI(LoadCmpBB, DL, TII->get(AArch64::CSINCWr), StatusReg) +      .addReg(StatusReg, RegState::Kill) +      .addReg(StatusReg, RegState::Kill) +      .addImm(AArch64CC::EQ); +  BuildMI(LoadCmpBB, DL, TII->get(AArch64::CBNZW)) +      .addReg(StatusReg, RegState::Kill) +      .addMBB(DoneBB);    LoadCmpBB->addSuccessor(DoneBB);    LoadCmpBB->addSuccessor(StoreBB); diff --git a/lib/Target/AArch64/AArch64ISelLowering.cpp b/lib/Target/AArch64/AArch64ISelLowering.cpp index ac7de1b422e06..06bfe340e7589 100644 --- a/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -10083,17 +10083,24 @@ static void ReplaceReductionResults(SDNode *N,    Results.push_back(SplitVal);  } +static std::pair<SDValue, SDValue> splitInt128(SDValue N, SelectionDAG &DAG) { +  SDLoc DL(N); +  SDValue Lo = DAG.getNode(ISD::TRUNCATE, DL, MVT::i64, N); +  SDValue Hi = DAG.getNode(ISD::TRUNCATE, DL, MVT::i64, +                           DAG.getNode(ISD::SRL, DL, MVT::i128, N, +                                       DAG.getConstant(64, DL, MVT::i64))); +  return std::make_pair(Lo, Hi); +} +  static void ReplaceCMP_SWAP_128Results(SDNode *N,                                         SmallVectorImpl<SDValue> & Results,                                         SelectionDAG &DAG) {    assert(N->getValueType(0) == MVT::i128 &&           "AtomicCmpSwap on types less than 128 should be legal"); -  SDValue Ops[] = {N->getOperand(1), -                   N->getOperand(2)->getOperand(0), -                   N->getOperand(2)->getOperand(1), -                   N->getOperand(3)->getOperand(0), -                   N->getOperand(3)->getOperand(1), -                   N->getOperand(0)}; +  auto Desired = splitInt128(N->getOperand(2), DAG); +  auto New = splitInt128(N->getOperand(3), DAG); +  SDValue Ops[] = {N->getOperand(1), Desired.first, Desired.second, +                   New.first,        New.second,    N->getOperand(0)};    SDNode *CmpSwap = DAG.getMachineNode(        AArch64::CMP_SWAP_128, SDLoc(N),        DAG.getVTList(MVT::i64, MVT::i64, MVT::i32, MVT::Other), Ops); diff --git a/lib/Target/ARM/ARMExpandPseudoInsts.cpp b/lib/Target/ARM/ARMExpandPseudoInsts.cpp index 56f5728ecfb89..a7b299677c1cc 100644 --- a/lib/Target/ARM/ARMExpandPseudoInsts.cpp +++ b/lib/Target/ARM/ARMExpandPseudoInsts.cpp @@ -932,13 +932,10 @@ bool ARMExpandPseudo::ExpandCMP_SWAP_64(MachineBasicBlock &MBB,                       .addReg(DestLo, getKillRegState(Dest.isDead()))                       .addReg(DesiredLo, getKillRegState(Desired.isDead()))); -  unsigned SBCrr = IsThumb ? ARM::t2SBCrr : ARM::SBCrr; -  MIB = BuildMI(LoadCmpBB, DL, TII->get(SBCrr)) -            .addReg(StatusReg, RegState::Define | RegState::Dead) -            .addReg(DestHi, getKillRegState(Dest.isDead())) -            .addReg(DesiredHi, getKillRegState(Desired.isDead())); -  AddDefaultPred(MIB); -  MIB.addReg(ARM::CPSR, RegState::Kill); +  BuildMI(LoadCmpBB, DL, TII->get(CMPrr)) +      .addReg(DestHi, getKillRegState(Dest.isDead())) +      .addReg(DesiredHi, getKillRegState(Desired.isDead())) +      .addImm(ARMCC::EQ).addReg(ARM::CPSR, RegState::Kill);    unsigned Bcc = IsThumb ? ARM::tBcc : ARM::Bcc;    BuildMI(LoadCmpBB, DL, TII->get(Bcc)) | 
