Skip to content

Commit e1aa162

Browse files
authored
[Mips] Use ANDi in for zero-extend in subword atomic umax/umin for both r2 and pre-R2 (#89881)
About unsigned max/min, ANDi is available for all ISA revisions in extend before slt insn. So that we can reduce one instruction.
1 parent 50082d6 commit e1aa162

File tree

2 files changed

+7
-11
lines changed

2 files changed

+7
-11
lines changed

llvm/lib/Target/Mips/MipsExpandPseudo.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -479,13 +479,13 @@ bool MipsExpandPseudo::expandAtomicBinOpSubword(
479479
BuildMI(loopMBB, DL, TII->get(Mips::SRAV), StoreVal)
480480
.addReg(OldVal)
481481
.addReg(ShiftAmnt);
482-
if (STI->hasMips32r2() && !IsUnsigned) {
483-
BuildMI(loopMBB, DL, TII->get(SEOp), StoreVal).addReg(StoreVal);
484-
} else if (STI->hasMips32r2() && IsUnsigned) {
482+
if (IsUnsigned) {
485483
const unsigned OpMask = SEOp == Mips::SEH ? 0xffff : 0xff;
486484
BuildMI(loopMBB, DL, TII->get(Mips::ANDi), StoreVal)
487485
.addReg(StoreVal)
488486
.addImm(OpMask);
487+
} else if (STI->hasMips32r2()) {
488+
BuildMI(loopMBB, DL, TII->get(SEOp), StoreVal).addReg(StoreVal);
489489
} else {
490490
const unsigned ShiftImm = SEOp == Mips::SEH ? 16 : 24;
491491
const unsigned SROp = IsUnsigned ? Mips::SRL : Mips::SRA;

llvm/test/CodeGen/Mips/atomic-min-max.ll

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2156,8 +2156,7 @@ define i16 @test_umax_16(ptr nocapture %ptr, i16 signext %val) {
21562156
; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1
21572157
; MIPS32-NEXT: ll $2, 0($6)
21582158
; MIPS32-NEXT: srav $4, $2, $10
2159-
; MIPS32-NEXT: sll $4, $4, 16
2160-
; MIPS32-NEXT: srl $4, $4, 16
2159+
; MIPS32-NEXT: andi $4, $4, 65535
21612160
; MIPS32-NEXT: or $1, $zero, $4
21622161
; MIPS32-NEXT: sllv $4, $4, $10
21632162
; MIPS32-NEXT: sltu $5, $4, $7
@@ -2695,8 +2694,7 @@ define i16 @test_umin_16(ptr nocapture %ptr, i16 signext %val) {
26952694
; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1
26962695
; MIPS32-NEXT: ll $2, 0($6)
26972696
; MIPS32-NEXT: srav $4, $2, $10
2698-
; MIPS32-NEXT: sll $4, $4, 16
2699-
; MIPS32-NEXT: srl $4, $4, 16
2697+
; MIPS32-NEXT: andi $4, $4, 65535
27002698
; MIPS32-NEXT: or $1, $zero, $4
27012699
; MIPS32-NEXT: sllv $4, $4, $10
27022700
; MIPS32-NEXT: sltu $5, $4, $7
@@ -4313,8 +4311,7 @@ define i8 @test_umax_8(ptr nocapture %ptr, i8 signext %val) {
43134311
; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1
43144312
; MIPS32-NEXT: ll $2, 0($6)
43154313
; MIPS32-NEXT: srav $4, $2, $10
4316-
; MIPS32-NEXT: sll $4, $4, 24
4317-
; MIPS32-NEXT: srl $4, $4, 24
4314+
; MIPS32-NEXT: andi $4, $4, 255
43184315
; MIPS32-NEXT: or $1, $zero, $4
43194316
; MIPS32-NEXT: sllv $4, $4, $10
43204317
; MIPS32-NEXT: sltu $5, $4, $7
@@ -4852,8 +4849,7 @@ define i8 @test_umin_8(ptr nocapture %ptr, i8 signext %val) {
48524849
; MIPS32-NEXT: # =>This Inner Loop Header: Depth=1
48534850
; MIPS32-NEXT: ll $2, 0($6)
48544851
; MIPS32-NEXT: srav $4, $2, $10
4855-
; MIPS32-NEXT: sll $4, $4, 24
4856-
; MIPS32-NEXT: srl $4, $4, 24
4852+
; MIPS32-NEXT: andi $4, $4, 255
48574853
; MIPS32-NEXT: or $1, $zero, $4
48584854
; MIPS32-NEXT: sllv $4, $4, $10
48594855
; MIPS32-NEXT: sltu $5, $4, $7

0 commit comments

Comments
 (0)