diff --git a/llvm/lib/Target/Mips/MipsExpandPseudo.cpp b/llvm/lib/Target/Mips/MipsExpandPseudo.cpp index c30129743a96..68ae56f97c94 100644 --- a/llvm/lib/Target/Mips/MipsExpandPseudo.cpp +++ b/llvm/lib/Target/Mips/MipsExpandPseudo.cpp @@ -342,6 +342,7 @@ bool MipsExpandPseudo::expandAtomicBinOpSubword( bool IsMin = false; bool IsMax = false; bool IsUnsigned = false; + bool DestOK = false; unsigned Opcode = 0; switch (I->getOpcode()) { @@ -473,48 +474,32 @@ bool MipsExpandPseudo::expandAtomicBinOpSubword( unsigned SELOldVal = IsMax ? SELEQZ : SELNEZ; unsigned MOVIncr = IsMax ? MOVN : MOVZ; - // For little endian we need to clear uninterested bits. - if (STI->isLittle()) { - if (!IsUnsigned) { - BuildMI(loopMBB, DL, TII->get(Mips::SRAV), OldVal) - .addReg(OldVal) - .addReg(ShiftAmnt); - BuildMI(loopMBB, DL, TII->get(Mips::SRAV), Incr) - .addReg(Incr) - .addReg(ShiftAmnt); - if (STI->hasMips32r2()) { - BuildMI(loopMBB, DL, TII->get(SEOp), OldVal).addReg(OldVal); - BuildMI(loopMBB, DL, TII->get(SEOp), Incr).addReg(Incr); - } else { - const unsigned ShiftImm = SEOp == Mips::SEH ? 16 : 24; - BuildMI(loopMBB, DL, TII->get(Mips::SLL), OldVal) - .addReg(OldVal, RegState::Kill) - .addImm(ShiftImm); - BuildMI(loopMBB, DL, TII->get(Mips::SRA), OldVal) - .addReg(OldVal, RegState::Kill) - .addImm(ShiftImm); - BuildMI(loopMBB, DL, TII->get(Mips::SLL), Incr) - .addReg(Incr, RegState::Kill) - .addImm(ShiftImm); - BuildMI(loopMBB, DL, TII->get(Mips::SRA), Incr) - .addReg(Incr, RegState::Kill) - .addImm(ShiftImm); - } - } else { - // and OldVal, OldVal, Mask - // and Incr, Incr, Mask - BuildMI(loopMBB, DL, TII->get(Mips::AND), OldVal) - .addReg(OldVal) - .addReg(Mask); - BuildMI(loopMBB, DL, TII->get(Mips::AND), Incr) - .addReg(Incr) - .addReg(Mask); - } + BuildMI(loopMBB, DL, TII->get(Mips::SRAV), StoreVal) + .addReg(OldVal) + .addReg(ShiftAmnt); + if (STI->hasMips32r2()) { + BuildMI(loopMBB, DL, TII->get(SEOp), StoreVal).addReg(StoreVal); + } else { + const unsigned ShiftImm = SEOp == Mips::SEH ? 16 : 24; + BuildMI(loopMBB, DL, TII->get(Mips::SLL), StoreVal) + .addReg(StoreVal, RegState::Kill) + .addImm(ShiftImm); + BuildMI(loopMBB, DL, TII->get(Mips::SRA), StoreVal) + .addReg(StoreVal, RegState::Kill) + .addImm(ShiftImm); } - // unsigned: sltu Scratch4, oldVal, Incr - // signed: slt Scratch4, oldVal, Incr + BuildMI(loopMBB, DL, TII->get(Mips::OR), Dest) + .addReg(Mips::ZERO) + .addReg(StoreVal); + DestOK = true; + BuildMI(loopMBB, DL, TII->get(Mips::SLLV), StoreVal) + .addReg(StoreVal) + .addReg(ShiftAmnt); + + // unsigned: sltu Scratch4, StoreVal, Incr + // signed: slt Scratch4, StoreVal, Incr BuildMI(loopMBB, DL, TII->get(SLTScratch4), Scratch4) - .addReg(OldVal) + .addReg(StoreVal) .addReg(Incr); if (STI->hasMips64r6() || STI->hasMips32r6()) { @@ -525,7 +510,7 @@ bool MipsExpandPseudo::expandAtomicBinOpSubword( // seleqz Scratch4, Incr, Scratch4 // or BinOpRes, BinOpRes, Scratch4 BuildMI(loopMBB, DL, TII->get(SELOldVal), BinOpRes) - .addReg(OldVal) + .addReg(StoreVal) .addReg(Scratch4); BuildMI(loopMBB, DL, TII->get(SELIncr), Scratch4) .addReg(Incr) @@ -534,12 +519,12 @@ bool MipsExpandPseudo::expandAtomicBinOpSubword( .addReg(BinOpRes) .addReg(Scratch4); } else { - // max: move BinOpRes, OldVal + // max: move BinOpRes, StoreVal // movn BinOpRes, Incr, Scratch4, BinOpRes - // min: move BinOpRes, OldVal + // min: move BinOpRes, StoreVal // movz BinOpRes, Incr, Scratch4, BinOpRes BuildMI(loopMBB, DL, TII->get(OR), BinOpRes) - .addReg(OldVal) + .addReg(StoreVal) .addReg(Mips::ZERO); BuildMI(loopMBB, DL, TII->get(MOVIncr), BinOpRes) .addReg(Incr) @@ -586,23 +571,24 @@ bool MipsExpandPseudo::expandAtomicBinOpSubword( // srl srlres,maskedoldval1,shiftamt // sign_extend dest,srlres - sinkMBB->addSuccessor(exitMBB, BranchProbability::getOne()); + if (!DestOK) { + sinkMBB->addSuccessor(exitMBB, BranchProbability::getOne()); + BuildMI(sinkMBB, DL, TII->get(Mips::AND), Dest).addReg(OldVal).addReg(Mask); + BuildMI(sinkMBB, DL, TII->get(Mips::SRLV), Dest) + .addReg(Dest) + .addReg(ShiftAmnt); - BuildMI(sinkMBB, DL, TII->get(Mips::AND), Dest) - .addReg(OldVal).addReg(Mask); - BuildMI(sinkMBB, DL, TII->get(Mips::SRLV), Dest) - .addReg(Dest).addReg(ShiftAmnt); - - if (STI->hasMips32r2()) { - BuildMI(sinkMBB, DL, TII->get(SEOp), Dest).addReg(Dest); - } else { - const unsigned ShiftImm = SEOp == Mips::SEH ? 16 : 24; - BuildMI(sinkMBB, DL, TII->get(Mips::SLL), Dest) - .addReg(Dest, RegState::Kill) - .addImm(ShiftImm); - BuildMI(sinkMBB, DL, TII->get(Mips::SRA), Dest) - .addReg(Dest, RegState::Kill) - .addImm(ShiftImm); + if (STI->hasMips32r2()) { + BuildMI(sinkMBB, DL, TII->get(SEOp), Dest).addReg(Dest); + } else { + const unsigned ShiftImm = SEOp == Mips::SEH ? 16 : 24; + BuildMI(sinkMBB, DL, TII->get(Mips::SLL), Dest) + .addReg(Dest, RegState::Kill) + .addImm(ShiftImm); + BuildMI(sinkMBB, DL, TII->get(Mips::SRA), Dest) + .addReg(Dest, RegState::Kill) + .addImm(ShiftImm); + } } LivePhysRegs LiveRegs;