[llvm] [Mips] Fix missing sign extension in expansion of sub-word atomic max (PR #77072)

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 8 21:16:20 PST 2024


================
@@ -467,8 +481,34 @@ bool MipsExpandPseudo::expandAtomicBinOpSubword(
           .addReg(OldVal)
           .addReg(Mask);
       BuildMI(loopMBB, DL, TII->get(Mips::AND), Incr).addReg(Incr).addReg(Mask);
-    }
 
+      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)
----------------
topperc wrote:

Do any of the tests cover this code? I only saw SEH and SEB.

https://github.com/llvm/llvm-project/pull/77072


More information about the llvm-commits mailing list