Skip to content

Commit c8b484f

Browse files
committed
[Mips] Fix missing sign extension in expansion of sub-word atomic max
Add sign extension "SEB/SEH" before compare. Fix #61881
1 parent b662c9a commit c8b484f

File tree

2 files changed

+594
-27
lines changed

2 files changed

+594
-27
lines changed

llvm/lib/Target/Mips/MipsExpandPseudo.cpp

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -388,18 +388,32 @@ bool MipsExpandPseudo::expandAtomicBinOpSubword(
388388
Opcode = Mips::XOR;
389389
break;
390390
case Mips::ATOMIC_LOAD_UMIN_I8_POSTRA:
391+
IsUnsigned = true;
392+
IsMin = true;
393+
break;
391394
case Mips::ATOMIC_LOAD_UMIN_I16_POSTRA:
392395
IsUnsigned = true;
393-
[[fallthrough]];
396+
IsMin = true;
397+
break;
394398
case Mips::ATOMIC_LOAD_MIN_I8_POSTRA:
399+
SEOp = Mips::SEB;
400+
IsMin = true;
401+
break;
395402
case Mips::ATOMIC_LOAD_MIN_I16_POSTRA:
396403
IsMin = true;
397404
break;
398405
case Mips::ATOMIC_LOAD_UMAX_I8_POSTRA:
406+
IsUnsigned = true;
407+
IsMax = true;
408+
break;
399409
case Mips::ATOMIC_LOAD_UMAX_I16_POSTRA:
400410
IsUnsigned = true;
401-
[[fallthrough]];
411+
IsMax = true;
412+
break;
402413
case Mips::ATOMIC_LOAD_MAX_I8_POSTRA:
414+
SEOp = Mips::SEB;
415+
IsMax = true;
416+
break;
403417
case Mips::ATOMIC_LOAD_MAX_I16_POSTRA:
404418
IsMax = true;
405419
break;
@@ -467,8 +481,34 @@ bool MipsExpandPseudo::expandAtomicBinOpSubword(
467481
.addReg(OldVal)
468482
.addReg(Mask);
469483
BuildMI(loopMBB, DL, TII->get(Mips::AND), Incr).addReg(Incr).addReg(Mask);
470-
}
471484

485+
if (!IsUnsigned) {
486+
BuildMI(loopMBB, DL, TII->get(Mips::SRAV), OldVal)
487+
.addReg(OldVal)
488+
.addReg(ShiftAmnt);
489+
BuildMI(loopMBB, DL, TII->get(Mips::SRAV), Incr)
490+
.addReg(Incr)
491+
.addReg(ShiftAmnt);
492+
if (STI->hasMips32r2()) {
493+
BuildMI(loopMBB, DL, TII->get(SEOp), OldVal).addReg(OldVal);
494+
BuildMI(loopMBB, DL, TII->get(SEOp), Incr).addReg(Incr);
495+
} else {
496+
const unsigned ShiftImm = SEOp == Mips::SEH ? 16 : 24;
497+
BuildMI(loopMBB, DL, TII->get(Mips::SLL), OldVal)
498+
.addReg(OldVal, RegState::Kill)
499+
.addImm(ShiftImm);
500+
BuildMI(loopMBB, DL, TII->get(Mips::SRA), OldVal)
501+
.addReg(OldVal, RegState::Kill)
502+
.addImm(ShiftImm);
503+
BuildMI(loopMBB, DL, TII->get(Mips::SLL), Incr)
504+
.addReg(Incr, RegState::Kill)
505+
.addImm(ShiftImm);
506+
BuildMI(loopMBB, DL, TII->get(Mips::SRA), Incr)
507+
.addReg(Incr, RegState::Kill)
508+
.addImm(ShiftImm);
509+
}
510+
}
511+
}
472512
// unsigned: sltu Scratch4, oldVal, Incr
473513
// signed: slt Scratch4, oldVal, Incr
474514
BuildMI(loopMBB, DL, TII->get(SLTScratch4), Scratch4)

0 commit comments

Comments
 (0)