summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/Mips
diff options
context:
space:
mode:
authorMirko Brkusanin <Mirko.Brkusanin@rt-rk.com>2019-12-12 11:19:41 +0100
committerMirko Brkusanin <Mirko.Brkusanin@rt-rk.com>2019-12-12 11:32:37 +0100
commitd7357c52a40a136f25c1cf5ae31a699d51885e49 (patch)
tree7b9a31ece0caeb8da5506893c3eb87c9b8d01638 /llvm/test/CodeGen/Mips
parentf798eb21eca97dc44ed40da52ece22780fb74230 (diff)
downloadbcm5719-llvm-d7357c52a40a136f25c1cf5ae31a699d51885e49.tar.gz
bcm5719-llvm-d7357c52a40a136f25c1cf5ae31a699d51885e49.zip
[Mips] Add support for min/max/umin/umax atomics
In order to properly implement these atomic we need one register more than other binary atomics. It is used for storing result from comparing values in addition to the one that is used for actual result of operation. https://reviews.llvm.org/D71028
Diffstat (limited to 'llvm/test/CodeGen/Mips')
-rw-r--r--llvm/test/CodeGen/Mips/atomic-min-max-64.ll158
-rw-r--r--llvm/test/CodeGen/Mips/atomic-min-max.ll4674
-rw-r--r--llvm/test/CodeGen/Mips/atomic.ll2
3 files changed, 4833 insertions, 1 deletions
diff --git a/llvm/test/CodeGen/Mips/atomic-min-max-64.ll b/llvm/test/CodeGen/Mips/atomic-min-max-64.ll
new file mode 100644
index 00000000000..6b71fe6e195
--- /dev/null
+++ b/llvm/test/CodeGen/Mips/atomic-min-max-64.ll
@@ -0,0 +1,158 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -march=mips64 -O0 -mcpu=mips64r2 -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=MIPS
+; RUN: llc -march=mips64el -O0 -mcpu=mips64r2 -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=MIPS
+; RUN: llc -march=mips64 -O0 -mcpu=mips64r6 -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=MIPSR6
+; RUN: llc -march=mips64el -O0 -mcpu=mips64r6 -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=MIPSR6
+
+define i64 @test_max(i64* nocapture %ptr, i64 signext %val) {
+; MIPS-LABEL: test_max:
+; MIPS: # %bb.0: # %entry
+; MIPS-NEXT: sync
+; MIPS-NEXT: .LBB0_1: # %entry
+; MIPS-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS-NEXT: lld $2, 0($4)
+; MIPS-NEXT: slt $3, $2, $5
+; MIPS-NEXT: move $1, $2
+; MIPS-NEXT: movn $1, $5, $3
+; MIPS-NEXT: scd $1, 0($4)
+; MIPS-NEXT: beqz $1, .LBB0_1
+; MIPS-NEXT: nop
+; MIPS-NEXT: # %bb.2: # %entry
+; MIPS-NEXT: sync
+; MIPS-NEXT: jr $ra
+; MIPS-NEXT: nop
+;
+; MIPSR6-LABEL: test_max:
+; MIPSR6: # %bb.0: # %entry
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: .LBB0_1: # %entry
+; MIPSR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSR6-NEXT: lld $2, 0($4)
+; MIPSR6-NEXT: slt $3, $2, $5
+; MIPSR6-NEXT: seleqz $1, $2, $3
+; MIPSR6-NEXT: selnez $3, $5, $3
+; MIPSR6-NEXT: or $1, $1, $3
+; MIPSR6-NEXT: scd $1, 0($4)
+; MIPSR6-NEXT: beqzc $1, .LBB0_1
+; MIPSR6-NEXT: # %bb.2: # %entry
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: jrc $ra
+entry:
+ %0 = atomicrmw max i64* %ptr, i64 %val seq_cst
+ ret i64 %0
+}
+
+define i64 @test_min(i64* nocapture %ptr, i64 signext %val) {
+; MIPS-LABEL: test_min:
+; MIPS: # %bb.0: # %entry
+; MIPS-NEXT: sync
+; MIPS-NEXT: .LBB1_1: # %entry
+; MIPS-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS-NEXT: lld $2, 0($4)
+; MIPS-NEXT: slt $3, $2, $5
+; MIPS-NEXT: move $1, $2
+; MIPS-NEXT: movz $1, $5, $3
+; MIPS-NEXT: scd $1, 0($4)
+; MIPS-NEXT: beqz $1, .LBB1_1
+; MIPS-NEXT: nop
+; MIPS-NEXT: # %bb.2: # %entry
+; MIPS-NEXT: sync
+; MIPS-NEXT: jr $ra
+; MIPS-NEXT: nop
+;
+; MIPSR6-LABEL: test_min:
+; MIPSR6: # %bb.0: # %entry
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: .LBB1_1: # %entry
+; MIPSR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSR6-NEXT: lld $2, 0($4)
+; MIPSR6-NEXT: slt $3, $2, $5
+; MIPSR6-NEXT: selnez $1, $2, $3
+; MIPSR6-NEXT: seleqz $3, $5, $3
+; MIPSR6-NEXT: or $1, $1, $3
+; MIPSR6-NEXT: scd $1, 0($4)
+; MIPSR6-NEXT: beqzc $1, .LBB1_1
+; MIPSR6-NEXT: # %bb.2: # %entry
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: jrc $ra
+entry:
+ %0 = atomicrmw min i64* %ptr, i64 %val seq_cst
+ ret i64 %0
+}
+
+define i64 @test_umax(i64* nocapture %ptr, i64 zeroext %val) {
+; MIPS-LABEL: test_umax:
+; MIPS: # %bb.0: # %entry
+; MIPS-NEXT: sync
+; MIPS-NEXT: .LBB2_1: # %entry
+; MIPS-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS-NEXT: lld $2, 0($4)
+; MIPS-NEXT: sltu $3, $2, $5
+; MIPS-NEXT: move $1, $2
+; MIPS-NEXT: movn $1, $5, $3
+; MIPS-NEXT: scd $1, 0($4)
+; MIPS-NEXT: beqz $1, .LBB2_1
+; MIPS-NEXT: nop
+; MIPS-NEXT: # %bb.2: # %entry
+; MIPS-NEXT: sync
+; MIPS-NEXT: jr $ra
+; MIPS-NEXT: nop
+;
+; MIPSR6-LABEL: test_umax:
+; MIPSR6: # %bb.0: # %entry
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: .LBB2_1: # %entry
+; MIPSR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSR6-NEXT: lld $2, 0($4)
+; MIPSR6-NEXT: sltu $3, $2, $5
+; MIPSR6-NEXT: seleqz $1, $2, $3
+; MIPSR6-NEXT: selnez $3, $5, $3
+; MIPSR6-NEXT: or $1, $1, $3
+; MIPSR6-NEXT: scd $1, 0($4)
+; MIPSR6-NEXT: beqzc $1, .LBB2_1
+; MIPSR6-NEXT: # %bb.2: # %entry
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: jrc $ra
+entry:
+ %0 = atomicrmw umax i64* %ptr, i64 %val seq_cst
+ ret i64 %0
+}
+
+define i64 @test_umin(i64* nocapture %ptr, i64 zeroext %val) {
+; MIPS-LABEL: test_umin:
+; MIPS: # %bb.0: # %entry
+; MIPS-NEXT: sync
+; MIPS-NEXT: .LBB3_1: # %entry
+; MIPS-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS-NEXT: lld $2, 0($4)
+; MIPS-NEXT: sltu $3, $2, $5
+; MIPS-NEXT: move $1, $2
+; MIPS-NEXT: movz $1, $5, $3
+; MIPS-NEXT: scd $1, 0($4)
+; MIPS-NEXT: beqz $1, .LBB3_1
+; MIPS-NEXT: nop
+; MIPS-NEXT: # %bb.2: # %entry
+; MIPS-NEXT: sync
+; MIPS-NEXT: jr $ra
+; MIPS-NEXT: nop
+;
+; MIPSR6-LABEL: test_umin:
+; MIPSR6: # %bb.0: # %entry
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: .LBB3_1: # %entry
+; MIPSR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSR6-NEXT: lld $2, 0($4)
+; MIPSR6-NEXT: sltu $3, $2, $5
+; MIPSR6-NEXT: selnez $1, $2, $3
+; MIPSR6-NEXT: seleqz $3, $5, $3
+; MIPSR6-NEXT: or $1, $1, $3
+; MIPSR6-NEXT: scd $1, 0($4)
+; MIPSR6-NEXT: beqzc $1, .LBB3_1
+; MIPSR6-NEXT: # %bb.2: # %entry
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: jrc $ra
+entry:
+ %0 = atomicrmw umin i64* %ptr, i64 %val seq_cst
+ ret i64 %0
+}
+
diff --git a/llvm/test/CodeGen/Mips/atomic-min-max.ll b/llvm/test/CodeGen/Mips/atomic-min-max.ll
new file mode 100644
index 00000000000..a6200851940
--- /dev/null
+++ b/llvm/test/CodeGen/Mips/atomic-min-max.ll
@@ -0,0 +1,4674 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -march=mips -O0 -mcpu=mips32r2 -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=MIPS
+; RUN: llc -march=mips -O0 -mcpu=mips32r6 -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=MIPSR6
+; RUN: llc -march=mips -O0 -mcpu=mips32r2 -mattr=+micromips -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=MM
+; RUN: llc -march=mips -O0 -mcpu=mips32r6 -mattr=+micromips -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=MMR6
+; RUN: llc -march=mipsel -O0 -mcpu=mips32r2 -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=MIPSEL
+; RUN: llc -march=mipsel -O0 -mcpu=mips32r6 -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=MIPSELR6
+; RUN: llc -march=mipsel -O0 -mcpu=mips32r2 -mattr=+micromips -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=MMEL
+; RUN: llc -march=mipsel -O0 -mcpu=mips32r6 -mattr=+micromips -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=MMELR6
+; RUN: llc -march=mips64 -O0 -mcpu=mips64r2 -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=MIPS64
+; RUN: llc -march=mips64 -O0 -mcpu=mips64r6 -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=MIPS64R6
+; RUN: llc -march=mips64el -O0 -mcpu=mips64r2 -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=MIPS64EL
+; RUN: llc -march=mips64el -O0 -mcpu=mips64r6 -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=MIPS64ELR6
+
+define i32 @test_max_32(i32* nocapture %ptr, i32 signext %val) {
+; MIPS-LABEL: test_max_32:
+; MIPS: # %bb.0: # %entry
+; MIPS-NEXT: sync
+; MIPS-NEXT: $BB0_1: # %entry
+; MIPS-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS-NEXT: ll $2, 0($4)
+; MIPS-NEXT: slt $3, $2, $5
+; MIPS-NEXT: move $1, $2
+; MIPS-NEXT: movn $1, $5, $3
+; MIPS-NEXT: sc $1, 0($4)
+; MIPS-NEXT: beqz $1, $BB0_1
+; MIPS-NEXT: nop
+; MIPS-NEXT: # %bb.2: # %entry
+; MIPS-NEXT: sync
+; MIPS-NEXT: jr $ra
+; MIPS-NEXT: nop
+;
+; MIPSR6-LABEL: test_max_32:
+; MIPSR6: # %bb.0: # %entry
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: $BB0_1: # %entry
+; MIPSR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSR6-NEXT: ll $2, 0($4)
+; MIPSR6-NEXT: slt $3, $2, $5
+; MIPSR6-NEXT: seleqz $1, $2, $3
+; MIPSR6-NEXT: selnez $3, $5, $3
+; MIPSR6-NEXT: or $1, $1, $3
+; MIPSR6-NEXT: sc $1, 0($4)
+; MIPSR6-NEXT: beqzc $1, $BB0_1
+; MIPSR6-NEXT: # %bb.2: # %entry
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: jrc $ra
+;
+; MM-LABEL: test_max_32:
+; MM: # %bb.0: # %entry
+; MM-NEXT: sync
+; MM-NEXT: $BB0_1: # %entry
+; MM-NEXT: # =>This Inner Loop Header: Depth=1
+; MM-NEXT: ll $2, 0($4)
+; MM-NEXT: slt $3, $2, $5
+; MM-NEXT: or $1, $2, $zero
+; MM-NEXT: movn $1, $5, $3
+; MM-NEXT: sc $1, 0($4)
+; MM-NEXT: beqzc $1, $BB0_1
+; MM-NEXT: # %bb.2: # %entry
+; MM-NEXT: sync
+; MM-NEXT: jrc $ra
+;
+; MMR6-LABEL: test_max_32:
+; MMR6: # %bb.0: # %entry
+; MMR6-NEXT: sync
+; MMR6-NEXT: $BB0_1: # %entry
+; MMR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MMR6-NEXT: ll $2, 0($4)
+; MMR6-NEXT: slt $3, $2, $5
+; MMR6-NEXT: seleqz $1, $2, $3
+; MMR6-NEXT: selnez $3, $5, $3
+; MMR6-NEXT: or $1, $1, $3
+; MMR6-NEXT: sc $1, 0($4)
+; MMR6-NEXT: beqc $1, $zero, $BB0_1
+; MMR6-NEXT: # %bb.2: # %entry
+; MMR6-NEXT: sync
+; MMR6-NEXT: jrc $ra
+;
+; MIPSEL-LABEL: test_max_32:
+; MIPSEL: # %bb.0: # %entry
+; MIPSEL-NEXT: sync
+; MIPSEL-NEXT: $BB0_1: # %entry
+; MIPSEL-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSEL-NEXT: ll $2, 0($4)
+; MIPSEL-NEXT: slt $3, $2, $5
+; MIPSEL-NEXT: move $1, $2
+; MIPSEL-NEXT: movn $1, $5, $3
+; MIPSEL-NEXT: sc $1, 0($4)
+; MIPSEL-NEXT: beqz $1, $BB0_1
+; MIPSEL-NEXT: nop
+; MIPSEL-NEXT: # %bb.2: # %entry
+; MIPSEL-NEXT: sync
+; MIPSEL-NEXT: jr $ra
+; MIPSEL-NEXT: nop
+;
+; MIPSELR6-LABEL: test_max_32:
+; MIPSELR6: # %bb.0: # %entry
+; MIPSELR6-NEXT: sync
+; MIPSELR6-NEXT: $BB0_1: # %entry
+; MIPSELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSELR6-NEXT: ll $2, 0($4)
+; MIPSELR6-NEXT: slt $3, $2, $5
+; MIPSELR6-NEXT: seleqz $1, $2, $3
+; MIPSELR6-NEXT: selnez $3, $5, $3
+; MIPSELR6-NEXT: or $1, $1, $3
+; MIPSELR6-NEXT: sc $1, 0($4)
+; MIPSELR6-NEXT: beqzc $1, $BB0_1
+; MIPSELR6-NEXT: # %bb.2: # %entry
+; MIPSELR6-NEXT: sync
+; MIPSELR6-NEXT: jrc $ra
+;
+; MMEL-LABEL: test_max_32:
+; MMEL: # %bb.0: # %entry
+; MMEL-NEXT: sync
+; MMEL-NEXT: $BB0_1: # %entry
+; MMEL-NEXT: # =>This Inner Loop Header: Depth=1
+; MMEL-NEXT: ll $2, 0($4)
+; MMEL-NEXT: slt $3, $2, $5
+; MMEL-NEXT: or $1, $2, $zero
+; MMEL-NEXT: movn $1, $5, $3
+; MMEL-NEXT: sc $1, 0($4)
+; MMEL-NEXT: beqzc $1, $BB0_1
+; MMEL-NEXT: # %bb.2: # %entry
+; MMEL-NEXT: sync
+; MMEL-NEXT: jrc $ra
+;
+; MMELR6-LABEL: test_max_32:
+; MMELR6: # %bb.0: # %entry
+; MMELR6-NEXT: sync
+; MMELR6-NEXT: $BB0_1: # %entry
+; MMELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MMELR6-NEXT: ll $2, 0($4)
+; MMELR6-NEXT: slt $3, $2, $5
+; MMELR6-NEXT: seleqz $1, $2, $3
+; MMELR6-NEXT: selnez $3, $5, $3
+; MMELR6-NEXT: or $1, $1, $3
+; MMELR6-NEXT: sc $1, 0($4)
+; MMELR6-NEXT: beqc $1, $zero, $BB0_1
+; MMELR6-NEXT: # %bb.2: # %entry
+; MMELR6-NEXT: sync
+; MMELR6-NEXT: jrc $ra
+;
+; MIPS64-LABEL: test_max_32:
+; MIPS64: # %bb.0: # %entry
+; MIPS64-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64-NEXT: sync
+; MIPS64-NEXT: .LBB0_1: # %entry
+; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64-NEXT: ll $2, 0($4)
+; MIPS64-NEXT: slt $3, $2, $5
+; MIPS64-NEXT: move $1, $2
+; MIPS64-NEXT: movn $1, $5, $3
+; MIPS64-NEXT: sc $1, 0($4)
+; MIPS64-NEXT: beqz $1, .LBB0_1
+; MIPS64-NEXT: nop
+; MIPS64-NEXT: # %bb.2: # %entry
+; MIPS64-NEXT: sync
+; MIPS64-NEXT: jr $ra
+; MIPS64-NEXT: nop
+;
+; MIPS64R6-LABEL: test_max_32:
+; MIPS64R6: # %bb.0: # %entry
+; MIPS64R6-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64R6-NEXT: sync
+; MIPS64R6-NEXT: .LBB0_1: # %entry
+; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64R6-NEXT: ll $2, 0($4)
+; MIPS64R6-NEXT: slt $3, $2, $5
+; MIPS64R6-NEXT: seleqz $1, $2, $3
+; MIPS64R6-NEXT: selnez $3, $5, $3
+; MIPS64R6-NEXT: or $1, $1, $3
+; MIPS64R6-NEXT: sc $1, 0($4)
+; MIPS64R6-NEXT: beqzc $1, .LBB0_1
+; MIPS64R6-NEXT: # %bb.2: # %entry
+; MIPS64R6-NEXT: sync
+; MIPS64R6-NEXT: jrc $ra
+;
+; MIPS64EL-LABEL: test_max_32:
+; MIPS64EL: # %bb.0: # %entry
+; MIPS64EL-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64EL-NEXT: sync
+; MIPS64EL-NEXT: .LBB0_1: # %entry
+; MIPS64EL-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64EL-NEXT: ll $2, 0($4)
+; MIPS64EL-NEXT: slt $3, $2, $5
+; MIPS64EL-NEXT: move $1, $2
+; MIPS64EL-NEXT: movn $1, $5, $3
+; MIPS64EL-NEXT: sc $1, 0($4)
+; MIPS64EL-NEXT: beqz $1, .LBB0_1
+; MIPS64EL-NEXT: nop
+; MIPS64EL-NEXT: # %bb.2: # %entry
+; MIPS64EL-NEXT: sync
+; MIPS64EL-NEXT: jr $ra
+; MIPS64EL-NEXT: nop
+;
+; MIPS64ELR6-LABEL: test_max_32:
+; MIPS64ELR6: # %bb.0: # %entry
+; MIPS64ELR6-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64ELR6-NEXT: sync
+; MIPS64ELR6-NEXT: .LBB0_1: # %entry
+; MIPS64ELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64ELR6-NEXT: ll $2, 0($4)
+; MIPS64ELR6-NEXT: slt $3, $2, $5
+; MIPS64ELR6-NEXT: seleqz $1, $2, $3
+; MIPS64ELR6-NEXT: selnez $3, $5, $3
+; MIPS64ELR6-NEXT: or $1, $1, $3
+; MIPS64ELR6-NEXT: sc $1, 0($4)
+; MIPS64ELR6-NEXT: beqzc $1, .LBB0_1
+; MIPS64ELR6-NEXT: # %bb.2: # %entry
+; MIPS64ELR6-NEXT: sync
+; MIPS64ELR6-NEXT: jrc $ra
+entry:
+ %0 = atomicrmw max i32* %ptr, i32 %val seq_cst
+ ret i32 %0
+}
+
+define i32 @test_min_32(i32* nocapture %ptr, i32 signext %val) {
+; MIPS-LABEL: test_min_32:
+; MIPS: # %bb.0: # %entry
+; MIPS-NEXT: sync
+; MIPS-NEXT: $BB1_1: # %entry
+; MIPS-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS-NEXT: ll $2, 0($4)
+; MIPS-NEXT: slt $3, $2, $5
+; MIPS-NEXT: move $1, $2
+; MIPS-NEXT: movz $1, $5, $3
+; MIPS-NEXT: sc $1, 0($4)
+; MIPS-NEXT: beqz $1, $BB1_1
+; MIPS-NEXT: nop
+; MIPS-NEXT: # %bb.2: # %entry
+; MIPS-NEXT: sync
+; MIPS-NEXT: jr $ra
+; MIPS-NEXT: nop
+;
+; MIPSR6-LABEL: test_min_32:
+; MIPSR6: # %bb.0: # %entry
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: $BB1_1: # %entry
+; MIPSR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSR6-NEXT: ll $2, 0($4)
+; MIPSR6-NEXT: slt $3, $2, $5
+; MIPSR6-NEXT: selnez $1, $2, $3
+; MIPSR6-NEXT: seleqz $3, $5, $3
+; MIPSR6-NEXT: or $1, $1, $3
+; MIPSR6-NEXT: sc $1, 0($4)
+; MIPSR6-NEXT: beqzc $1, $BB1_1
+; MIPSR6-NEXT: # %bb.2: # %entry
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: jrc $ra
+;
+; MM-LABEL: test_min_32:
+; MM: # %bb.0: # %entry
+; MM-NEXT: sync
+; MM-NEXT: $BB1_1: # %entry
+; MM-NEXT: # =>This Inner Loop Header: Depth=1
+; MM-NEXT: ll $2, 0($4)
+; MM-NEXT: slt $3, $2, $5
+; MM-NEXT: or $1, $2, $zero
+; MM-NEXT: movz $1, $5, $3
+; MM-NEXT: sc $1, 0($4)
+; MM-NEXT: beqzc $1, $BB1_1
+; MM-NEXT: # %bb.2: # %entry
+; MM-NEXT: sync
+; MM-NEXT: jrc $ra
+;
+; MMR6-LABEL: test_min_32:
+; MMR6: # %bb.0: # %entry
+; MMR6-NEXT: sync
+; MMR6-NEXT: $BB1_1: # %entry
+; MMR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MMR6-NEXT: ll $2, 0($4)
+; MMR6-NEXT: slt $3, $2, $5
+; MMR6-NEXT: selnez $1, $2, $3
+; MMR6-NEXT: seleqz $3, $5, $3
+; MMR6-NEXT: or $1, $1, $3
+; MMR6-NEXT: sc $1, 0($4)
+; MMR6-NEXT: beqc $1, $zero, $BB1_1
+; MMR6-NEXT: # %bb.2: # %entry
+; MMR6-NEXT: sync
+; MMR6-NEXT: jrc $ra
+;
+; MIPSEL-LABEL: test_min_32:
+; MIPSEL: # %bb.0: # %entry
+; MIPSEL-NEXT: sync
+; MIPSEL-NEXT: $BB1_1: # %entry
+; MIPSEL-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSEL-NEXT: ll $2, 0($4)
+; MIPSEL-NEXT: slt $3, $2, $5
+; MIPSEL-NEXT: move $1, $2
+; MIPSEL-NEXT: movz $1, $5, $3
+; MIPSEL-NEXT: sc $1, 0($4)
+; MIPSEL-NEXT: beqz $1, $BB1_1
+; MIPSEL-NEXT: nop
+; MIPSEL-NEXT: # %bb.2: # %entry
+; MIPSEL-NEXT: sync
+; MIPSEL-NEXT: jr $ra
+; MIPSEL-NEXT: nop
+;
+; MIPSELR6-LABEL: test_min_32:
+; MIPSELR6: # %bb.0: # %entry
+; MIPSELR6-NEXT: sync
+; MIPSELR6-NEXT: $BB1_1: # %entry
+; MIPSELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSELR6-NEXT: ll $2, 0($4)
+; MIPSELR6-NEXT: slt $3, $2, $5
+; MIPSELR6-NEXT: selnez $1, $2, $3
+; MIPSELR6-NEXT: seleqz $3, $5, $3
+; MIPSELR6-NEXT: or $1, $1, $3
+; MIPSELR6-NEXT: sc $1, 0($4)
+; MIPSELR6-NEXT: beqzc $1, $BB1_1
+; MIPSELR6-NEXT: # %bb.2: # %entry
+; MIPSELR6-NEXT: sync
+; MIPSELR6-NEXT: jrc $ra
+;
+; MMEL-LABEL: test_min_32:
+; MMEL: # %bb.0: # %entry
+; MMEL-NEXT: sync
+; MMEL-NEXT: $BB1_1: # %entry
+; MMEL-NEXT: # =>This Inner Loop Header: Depth=1
+; MMEL-NEXT: ll $2, 0($4)
+; MMEL-NEXT: slt $3, $2, $5
+; MMEL-NEXT: or $1, $2, $zero
+; MMEL-NEXT: movz $1, $5, $3
+; MMEL-NEXT: sc $1, 0($4)
+; MMEL-NEXT: beqzc $1, $BB1_1
+; MMEL-NEXT: # %bb.2: # %entry
+; MMEL-NEXT: sync
+; MMEL-NEXT: jrc $ra
+;
+; MMELR6-LABEL: test_min_32:
+; MMELR6: # %bb.0: # %entry
+; MMELR6-NEXT: sync
+; MMELR6-NEXT: $BB1_1: # %entry
+; MMELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MMELR6-NEXT: ll $2, 0($4)
+; MMELR6-NEXT: slt $3, $2, $5
+; MMELR6-NEXT: selnez $1, $2, $3
+; MMELR6-NEXT: seleqz $3, $5, $3
+; MMELR6-NEXT: or $1, $1, $3
+; MMELR6-NEXT: sc $1, 0($4)
+; MMELR6-NEXT: beqc $1, $zero, $BB1_1
+; MMELR6-NEXT: # %bb.2: # %entry
+; MMELR6-NEXT: sync
+; MMELR6-NEXT: jrc $ra
+;
+; MIPS64-LABEL: test_min_32:
+; MIPS64: # %bb.0: # %entry
+; MIPS64-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64-NEXT: sync
+; MIPS64-NEXT: .LBB1_1: # %entry
+; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64-NEXT: ll $2, 0($4)
+; MIPS64-NEXT: slt $3, $2, $5
+; MIPS64-NEXT: move $1, $2
+; MIPS64-NEXT: movz $1, $5, $3
+; MIPS64-NEXT: sc $1, 0($4)
+; MIPS64-NEXT: beqz $1, .LBB1_1
+; MIPS64-NEXT: nop
+; MIPS64-NEXT: # %bb.2: # %entry
+; MIPS64-NEXT: sync
+; MIPS64-NEXT: jr $ra
+; MIPS64-NEXT: nop
+;
+; MIPS64R6-LABEL: test_min_32:
+; MIPS64R6: # %bb.0: # %entry
+; MIPS64R6-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64R6-NEXT: sync
+; MIPS64R6-NEXT: .LBB1_1: # %entry
+; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64R6-NEXT: ll $2, 0($4)
+; MIPS64R6-NEXT: slt $3, $2, $5
+; MIPS64R6-NEXT: selnez $1, $2, $3
+; MIPS64R6-NEXT: seleqz $3, $5, $3
+; MIPS64R6-NEXT: or $1, $1, $3
+; MIPS64R6-NEXT: sc $1, 0($4)
+; MIPS64R6-NEXT: beqzc $1, .LBB1_1
+; MIPS64R6-NEXT: # %bb.2: # %entry
+; MIPS64R6-NEXT: sync
+; MIPS64R6-NEXT: jrc $ra
+;
+; MIPS64EL-LABEL: test_min_32:
+; MIPS64EL: # %bb.0: # %entry
+; MIPS64EL-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64EL-NEXT: sync
+; MIPS64EL-NEXT: .LBB1_1: # %entry
+; MIPS64EL-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64EL-NEXT: ll $2, 0($4)
+; MIPS64EL-NEXT: slt $3, $2, $5
+; MIPS64EL-NEXT: move $1, $2
+; MIPS64EL-NEXT: movz $1, $5, $3
+; MIPS64EL-NEXT: sc $1, 0($4)
+; MIPS64EL-NEXT: beqz $1, .LBB1_1
+; MIPS64EL-NEXT: nop
+; MIPS64EL-NEXT: # %bb.2: # %entry
+; MIPS64EL-NEXT: sync
+; MIPS64EL-NEXT: jr $ra
+; MIPS64EL-NEXT: nop
+;
+; MIPS64ELR6-LABEL: test_min_32:
+; MIPS64ELR6: # %bb.0: # %entry
+; MIPS64ELR6-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64ELR6-NEXT: sync
+; MIPS64ELR6-NEXT: .LBB1_1: # %entry
+; MIPS64ELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64ELR6-NEXT: ll $2, 0($4)
+; MIPS64ELR6-NEXT: slt $3, $2, $5
+; MIPS64ELR6-NEXT: selnez $1, $2, $3
+; MIPS64ELR6-NEXT: seleqz $3, $5, $3
+; MIPS64ELR6-NEXT: or $1, $1, $3
+; MIPS64ELR6-NEXT: sc $1, 0($4)
+; MIPS64ELR6-NEXT: beqzc $1, .LBB1_1
+; MIPS64ELR6-NEXT: # %bb.2: # %entry
+; MIPS64ELR6-NEXT: sync
+; MIPS64ELR6-NEXT: jrc $ra
+entry:
+ %0 = atomicrmw min i32* %ptr, i32 %val seq_cst
+ ret i32 %0
+}
+
+define i32 @test_umax_32(i32* nocapture %ptr, i32 signext %val) {
+; MIPS-LABEL: test_umax_32:
+; MIPS: # %bb.0: # %entry
+; MIPS-NEXT: sync
+; MIPS-NEXT: $BB2_1: # %entry
+; MIPS-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS-NEXT: ll $2, 0($4)
+; MIPS-NEXT: sltu $3, $2, $5
+; MIPS-NEXT: move $1, $2
+; MIPS-NEXT: movn $1, $5, $3
+; MIPS-NEXT: sc $1, 0($4)
+; MIPS-NEXT: beqz $1, $BB2_1
+; MIPS-NEXT: nop
+; MIPS-NEXT: # %bb.2: # %entry
+; MIPS-NEXT: sync
+; MIPS-NEXT: jr $ra
+; MIPS-NEXT: nop
+;
+; MIPSR6-LABEL: test_umax_32:
+; MIPSR6: # %bb.0: # %entry
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: $BB2_1: # %entry
+; MIPSR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSR6-NEXT: ll $2, 0($4)
+; MIPSR6-NEXT: sltu $3, $2, $5
+; MIPSR6-NEXT: seleqz $1, $2, $3
+; MIPSR6-NEXT: selnez $3, $5, $3
+; MIPSR6-NEXT: or $1, $1, $3
+; MIPSR6-NEXT: sc $1, 0($4)
+; MIPSR6-NEXT: beqzc $1, $BB2_1
+; MIPSR6-NEXT: # %bb.2: # %entry
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: jrc $ra
+;
+; MM-LABEL: test_umax_32:
+; MM: # %bb.0: # %entry
+; MM-NEXT: sync
+; MM-NEXT: $BB2_1: # %entry
+; MM-NEXT: # =>This Inner Loop Header: Depth=1
+; MM-NEXT: ll $2, 0($4)
+; MM-NEXT: sltu $3, $2, $5
+; MM-NEXT: or $1, $2, $zero
+; MM-NEXT: movn $1, $5, $3
+; MM-NEXT: sc $1, 0($4)
+; MM-NEXT: beqzc $1, $BB2_1
+; MM-NEXT: # %bb.2: # %entry
+; MM-NEXT: sync
+; MM-NEXT: jrc $ra
+;
+; MMR6-LABEL: test_umax_32:
+; MMR6: # %bb.0: # %entry
+; MMR6-NEXT: sync
+; MMR6-NEXT: $BB2_1: # %entry
+; MMR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MMR6-NEXT: ll $2, 0($4)
+; MMR6-NEXT: sltu $3, $2, $5
+; MMR6-NEXT: seleqz $1, $2, $3
+; MMR6-NEXT: selnez $3, $5, $3
+; MMR6-NEXT: or $1, $1, $3
+; MMR6-NEXT: sc $1, 0($4)
+; MMR6-NEXT: beqc $1, $zero, $BB2_1
+; MMR6-NEXT: # %bb.2: # %entry
+; MMR6-NEXT: sync
+; MMR6-NEXT: jrc $ra
+;
+; MIPSEL-LABEL: test_umax_32:
+; MIPSEL: # %bb.0: # %entry
+; MIPSEL-NEXT: sync
+; MIPSEL-NEXT: $BB2_1: # %entry
+; MIPSEL-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSEL-NEXT: ll $2, 0($4)
+; MIPSEL-NEXT: sltu $3, $2, $5
+; MIPSEL-NEXT: move $1, $2
+; MIPSEL-NEXT: movn $1, $5, $3
+; MIPSEL-NEXT: sc $1, 0($4)
+; MIPSEL-NEXT: beqz $1, $BB2_1
+; MIPSEL-NEXT: nop
+; MIPSEL-NEXT: # %bb.2: # %entry
+; MIPSEL-NEXT: sync
+; MIPSEL-NEXT: jr $ra
+; MIPSEL-NEXT: nop
+;
+; MIPSELR6-LABEL: test_umax_32:
+; MIPSELR6: # %bb.0: # %entry
+; MIPSELR6-NEXT: sync
+; MIPSELR6-NEXT: $BB2_1: # %entry
+; MIPSELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSELR6-NEXT: ll $2, 0($4)
+; MIPSELR6-NEXT: sltu $3, $2, $5
+; MIPSELR6-NEXT: seleqz $1, $2, $3
+; MIPSELR6-NEXT: selnez $3, $5, $3
+; MIPSELR6-NEXT: or $1, $1, $3
+; MIPSELR6-NEXT: sc $1, 0($4)
+; MIPSELR6-NEXT: beqzc $1, $BB2_1
+; MIPSELR6-NEXT: # %bb.2: # %entry
+; MIPSELR6-NEXT: sync
+; MIPSELR6-NEXT: jrc $ra
+;
+; MMEL-LABEL: test_umax_32:
+; MMEL: # %bb.0: # %entry
+; MMEL-NEXT: sync
+; MMEL-NEXT: $BB2_1: # %entry
+; MMEL-NEXT: # =>This Inner Loop Header: Depth=1
+; MMEL-NEXT: ll $2, 0($4)
+; MMEL-NEXT: sltu $3, $2, $5
+; MMEL-NEXT: or $1, $2, $zero
+; MMEL-NEXT: movn $1, $5, $3
+; MMEL-NEXT: sc $1, 0($4)
+; MMEL-NEXT: beqzc $1, $BB2_1
+; MMEL-NEXT: # %bb.2: # %entry
+; MMEL-NEXT: sync
+; MMEL-NEXT: jrc $ra
+;
+; MMELR6-LABEL: test_umax_32:
+; MMELR6: # %bb.0: # %entry
+; MMELR6-NEXT: sync
+; MMELR6-NEXT: $BB2_1: # %entry
+; MMELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MMELR6-NEXT: ll $2, 0($4)
+; MMELR6-NEXT: sltu $3, $2, $5
+; MMELR6-NEXT: seleqz $1, $2, $3
+; MMELR6-NEXT: selnez $3, $5, $3
+; MMELR6-NEXT: or $1, $1, $3
+; MMELR6-NEXT: sc $1, 0($4)
+; MMELR6-NEXT: beqc $1, $zero, $BB2_1
+; MMELR6-NEXT: # %bb.2: # %entry
+; MMELR6-NEXT: sync
+; MMELR6-NEXT: jrc $ra
+;
+; MIPS64-LABEL: test_umax_32:
+; MIPS64: # %bb.0: # %entry
+; MIPS64-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64-NEXT: sync
+; MIPS64-NEXT: .LBB2_1: # %entry
+; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64-NEXT: ll $2, 0($4)
+; MIPS64-NEXT: sltu $3, $2, $5
+; MIPS64-NEXT: move $1, $2
+; MIPS64-NEXT: movn $1, $5, $3
+; MIPS64-NEXT: sc $1, 0($4)
+; MIPS64-NEXT: beqz $1, .LBB2_1
+; MIPS64-NEXT: nop
+; MIPS64-NEXT: # %bb.2: # %entry
+; MIPS64-NEXT: sync
+; MIPS64-NEXT: jr $ra
+; MIPS64-NEXT: nop
+;
+; MIPS64R6-LABEL: test_umax_32:
+; MIPS64R6: # %bb.0: # %entry
+; MIPS64R6-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64R6-NEXT: sync
+; MIPS64R6-NEXT: .LBB2_1: # %entry
+; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64R6-NEXT: ll $2, 0($4)
+; MIPS64R6-NEXT: sltu $3, $2, $5
+; MIPS64R6-NEXT: seleqz $1, $2, $3
+; MIPS64R6-NEXT: selnez $3, $5, $3
+; MIPS64R6-NEXT: or $1, $1, $3
+; MIPS64R6-NEXT: sc $1, 0($4)
+; MIPS64R6-NEXT: beqzc $1, .LBB2_1
+; MIPS64R6-NEXT: # %bb.2: # %entry
+; MIPS64R6-NEXT: sync
+; MIPS64R6-NEXT: jrc $ra
+;
+; MIPS64EL-LABEL: test_umax_32:
+; MIPS64EL: # %bb.0: # %entry
+; MIPS64EL-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64EL-NEXT: sync
+; MIPS64EL-NEXT: .LBB2_1: # %entry
+; MIPS64EL-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64EL-NEXT: ll $2, 0($4)
+; MIPS64EL-NEXT: sltu $3, $2, $5
+; MIPS64EL-NEXT: move $1, $2
+; MIPS64EL-NEXT: movn $1, $5, $3
+; MIPS64EL-NEXT: sc $1, 0($4)
+; MIPS64EL-NEXT: beqz $1, .LBB2_1
+; MIPS64EL-NEXT: nop
+; MIPS64EL-NEXT: # %bb.2: # %entry
+; MIPS64EL-NEXT: sync
+; MIPS64EL-NEXT: jr $ra
+; MIPS64EL-NEXT: nop
+;
+; MIPS64ELR6-LABEL: test_umax_32:
+; MIPS64ELR6: # %bb.0: # %entry
+; MIPS64ELR6-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64ELR6-NEXT: sync
+; MIPS64ELR6-NEXT: .LBB2_1: # %entry
+; MIPS64ELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64ELR6-NEXT: ll $2, 0($4)
+; MIPS64ELR6-NEXT: sltu $3, $2, $5
+; MIPS64ELR6-NEXT: seleqz $1, $2, $3
+; MIPS64ELR6-NEXT: selnez $3, $5, $3
+; MIPS64ELR6-NEXT: or $1, $1, $3
+; MIPS64ELR6-NEXT: sc $1, 0($4)
+; MIPS64ELR6-NEXT: beqzc $1, .LBB2_1
+; MIPS64ELR6-NEXT: # %bb.2: # %entry
+; MIPS64ELR6-NEXT: sync
+; MIPS64ELR6-NEXT: jrc $ra
+entry:
+ %0 = atomicrmw umax i32* %ptr, i32 %val seq_cst
+ ret i32 %0
+}
+
+define i32 @test_umin_32(i32* nocapture %ptr, i32 signext %val) {
+; MIPS-LABEL: test_umin_32:
+; MIPS: # %bb.0: # %entry
+; MIPS-NEXT: sync
+; MIPS-NEXT: $BB3_1: # %entry
+; MIPS-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS-NEXT: ll $2, 0($4)
+; MIPS-NEXT: sltu $3, $2, $5
+; MIPS-NEXT: move $1, $2
+; MIPS-NEXT: movz $1, $5, $3
+; MIPS-NEXT: sc $1, 0($4)
+; MIPS-NEXT: beqz $1, $BB3_1
+; MIPS-NEXT: nop
+; MIPS-NEXT: # %bb.2: # %entry
+; MIPS-NEXT: sync
+; MIPS-NEXT: jr $ra
+; MIPS-NEXT: nop
+;
+; MIPSR6-LABEL: test_umin_32:
+; MIPSR6: # %bb.0: # %entry
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: $BB3_1: # %entry
+; MIPSR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSR6-NEXT: ll $2, 0($4)
+; MIPSR6-NEXT: sltu $3, $2, $5
+; MIPSR6-NEXT: selnez $1, $2, $3
+; MIPSR6-NEXT: seleqz $3, $5, $3
+; MIPSR6-NEXT: or $1, $1, $3
+; MIPSR6-NEXT: sc $1, 0($4)
+; MIPSR6-NEXT: beqzc $1, $BB3_1
+; MIPSR6-NEXT: # %bb.2: # %entry
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: jrc $ra
+;
+; MM-LABEL: test_umin_32:
+; MM: # %bb.0: # %entry
+; MM-NEXT: sync
+; MM-NEXT: $BB3_1: # %entry
+; MM-NEXT: # =>This Inner Loop Header: Depth=1
+; MM-NEXT: ll $2, 0($4)
+; MM-NEXT: sltu $3, $2, $5
+; MM-NEXT: or $1, $2, $zero
+; MM-NEXT: movz $1, $5, $3
+; MM-NEXT: sc $1, 0($4)
+; MM-NEXT: beqzc $1, $BB3_1
+; MM-NEXT: # %bb.2: # %entry
+; MM-NEXT: sync
+; MM-NEXT: jrc $ra
+;
+; MMR6-LABEL: test_umin_32:
+; MMR6: # %bb.0: # %entry
+; MMR6-NEXT: sync
+; MMR6-NEXT: $BB3_1: # %entry
+; MMR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MMR6-NEXT: ll $2, 0($4)
+; MMR6-NEXT: sltu $3, $2, $5
+; MMR6-NEXT: selnez $1, $2, $3
+; MMR6-NEXT: seleqz $3, $5, $3
+; MMR6-NEXT: or $1, $1, $3
+; MMR6-NEXT: sc $1, 0($4)
+; MMR6-NEXT: beqc $1, $zero, $BB3_1
+; MMR6-NEXT: # %bb.2: # %entry
+; MMR6-NEXT: sync
+; MMR6-NEXT: jrc $ra
+;
+; MIPSEL-LABEL: test_umin_32:
+; MIPSEL: # %bb.0: # %entry
+; MIPSEL-NEXT: sync
+; MIPSEL-NEXT: $BB3_1: # %entry
+; MIPSEL-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSEL-NEXT: ll $2, 0($4)
+; MIPSEL-NEXT: sltu $3, $2, $5
+; MIPSEL-NEXT: move $1, $2
+; MIPSEL-NEXT: movz $1, $5, $3
+; MIPSEL-NEXT: sc $1, 0($4)
+; MIPSEL-NEXT: beqz $1, $BB3_1
+; MIPSEL-NEXT: nop
+; MIPSEL-NEXT: # %bb.2: # %entry
+; MIPSEL-NEXT: sync
+; MIPSEL-NEXT: jr $ra
+; MIPSEL-NEXT: nop
+;
+; MIPSELR6-LABEL: test_umin_32:
+; MIPSELR6: # %bb.0: # %entry
+; MIPSELR6-NEXT: sync
+; MIPSELR6-NEXT: $BB3_1: # %entry
+; MIPSELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSELR6-NEXT: ll $2, 0($4)
+; MIPSELR6-NEXT: sltu $3, $2, $5
+; MIPSELR6-NEXT: selnez $1, $2, $3
+; MIPSELR6-NEXT: seleqz $3, $5, $3
+; MIPSELR6-NEXT: or $1, $1, $3
+; MIPSELR6-NEXT: sc $1, 0($4)
+; MIPSELR6-NEXT: beqzc $1, $BB3_1
+; MIPSELR6-NEXT: # %bb.2: # %entry
+; MIPSELR6-NEXT: sync
+; MIPSELR6-NEXT: jrc $ra
+;
+; MMEL-LABEL: test_umin_32:
+; MMEL: # %bb.0: # %entry
+; MMEL-NEXT: sync
+; MMEL-NEXT: $BB3_1: # %entry
+; MMEL-NEXT: # =>This Inner Loop Header: Depth=1
+; MMEL-NEXT: ll $2, 0($4)
+; MMEL-NEXT: sltu $3, $2, $5
+; MMEL-NEXT: or $1, $2, $zero
+; MMEL-NEXT: movz $1, $5, $3
+; MMEL-NEXT: sc $1, 0($4)
+; MMEL-NEXT: beqzc $1, $BB3_1
+; MMEL-NEXT: # %bb.2: # %entry
+; MMEL-NEXT: sync
+; MMEL-NEXT: jrc $ra
+;
+; MMELR6-LABEL: test_umin_32:
+; MMELR6: # %bb.0: # %entry
+; MMELR6-NEXT: sync
+; MMELR6-NEXT: $BB3_1: # %entry
+; MMELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MMELR6-NEXT: ll $2, 0($4)
+; MMELR6-NEXT: sltu $3, $2, $5
+; MMELR6-NEXT: selnez $1, $2, $3
+; MMELR6-NEXT: seleqz $3, $5, $3
+; MMELR6-NEXT: or $1, $1, $3
+; MMELR6-NEXT: sc $1, 0($4)
+; MMELR6-NEXT: beqc $1, $zero, $BB3_1
+; MMELR6-NEXT: # %bb.2: # %entry
+; MMELR6-NEXT: sync
+; MMELR6-NEXT: jrc $ra
+;
+; MIPS64-LABEL: test_umin_32:
+; MIPS64: # %bb.0: # %entry
+; MIPS64-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64-NEXT: sync
+; MIPS64-NEXT: .LBB3_1: # %entry
+; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64-NEXT: ll $2, 0($4)
+; MIPS64-NEXT: sltu $3, $2, $5
+; MIPS64-NEXT: move $1, $2
+; MIPS64-NEXT: movz $1, $5, $3
+; MIPS64-NEXT: sc $1, 0($4)
+; MIPS64-NEXT: beqz $1, .LBB3_1
+; MIPS64-NEXT: nop
+; MIPS64-NEXT: # %bb.2: # %entry
+; MIPS64-NEXT: sync
+; MIPS64-NEXT: jr $ra
+; MIPS64-NEXT: nop
+;
+; MIPS64R6-LABEL: test_umin_32:
+; MIPS64R6: # %bb.0: # %entry
+; MIPS64R6-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64R6-NEXT: sync
+; MIPS64R6-NEXT: .LBB3_1: # %entry
+; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64R6-NEXT: ll $2, 0($4)
+; MIPS64R6-NEXT: sltu $3, $2, $5
+; MIPS64R6-NEXT: selnez $1, $2, $3
+; MIPS64R6-NEXT: seleqz $3, $5, $3
+; MIPS64R6-NEXT: or $1, $1, $3
+; MIPS64R6-NEXT: sc $1, 0($4)
+; MIPS64R6-NEXT: beqzc $1, .LBB3_1
+; MIPS64R6-NEXT: # %bb.2: # %entry
+; MIPS64R6-NEXT: sync
+; MIPS64R6-NEXT: jrc $ra
+;
+; MIPS64EL-LABEL: test_umin_32:
+; MIPS64EL: # %bb.0: # %entry
+; MIPS64EL-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64EL-NEXT: sync
+; MIPS64EL-NEXT: .LBB3_1: # %entry
+; MIPS64EL-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64EL-NEXT: ll $2, 0($4)
+; MIPS64EL-NEXT: sltu $3, $2, $5
+; MIPS64EL-NEXT: move $1, $2
+; MIPS64EL-NEXT: movz $1, $5, $3
+; MIPS64EL-NEXT: sc $1, 0($4)
+; MIPS64EL-NEXT: beqz $1, .LBB3_1
+; MIPS64EL-NEXT: nop
+; MIPS64EL-NEXT: # %bb.2: # %entry
+; MIPS64EL-NEXT: sync
+; MIPS64EL-NEXT: jr $ra
+; MIPS64EL-NEXT: nop
+;
+; MIPS64ELR6-LABEL: test_umin_32:
+; MIPS64ELR6: # %bb.0: # %entry
+; MIPS64ELR6-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64ELR6-NEXT: sync
+; MIPS64ELR6-NEXT: .LBB3_1: # %entry
+; MIPS64ELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64ELR6-NEXT: ll $2, 0($4)
+; MIPS64ELR6-NEXT: sltu $3, $2, $5
+; MIPS64ELR6-NEXT: selnez $1, $2, $3
+; MIPS64ELR6-NEXT: seleqz $3, $5, $3
+; MIPS64ELR6-NEXT: or $1, $1, $3
+; MIPS64ELR6-NEXT: sc $1, 0($4)
+; MIPS64ELR6-NEXT: beqzc $1, .LBB3_1
+; MIPS64ELR6-NEXT: # %bb.2: # %entry
+; MIPS64ELR6-NEXT: sync
+; MIPS64ELR6-NEXT: jrc $ra
+entry:
+ %0 = atomicrmw umin i32* %ptr, i32 %val seq_cst
+ ret i32 %0
+}
+
+define i16 @test_max_16(i16* nocapture %ptr, i16 signext %val) {
+; MIPS-LABEL: test_max_16:
+; MIPS: # %bb.0: # %entry
+; MIPS-NEXT: addiu $sp, $sp, -8
+; MIPS-NEXT: .cfi_def_cfa_offset 8
+; MIPS-NEXT: move $1, $5
+; MIPS-NEXT: sync
+; MIPS-NEXT: addiu $2, $zero, -4
+; MIPS-NEXT: and $2, $4, $2
+; MIPS-NEXT: andi $3, $4, 3
+; MIPS-NEXT: xori $3, $3, 2
+; MIPS-NEXT: sll $3, $3, 3
+; MIPS-NEXT: ori $4, $zero, 65535
+; MIPS-NEXT: sllv $4, $4, $3
+; MIPS-NEXT: nor $6, $zero, $4
+; MIPS-NEXT: sllv $5, $5, $3
+; MIPS-NEXT: $BB4_1: # %entry
+; MIPS-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS-NEXT: ll $8, 0($2)
+; MIPS-NEXT: slt $11, $8, $5
+; MIPS-NEXT: move $9, $8
+; MIPS-NEXT: movn $9, $5, $11
+; MIPS-NEXT: and $9, $9, $4
+; MIPS-NEXT: and $10, $8, $6
+; MIPS-NEXT: or $10, $10, $9
+; MIPS-NEXT: sc $10, 0($2)
+; MIPS-NEXT: beqz $10, $BB4_1
+; MIPS-NEXT: nop
+; MIPS-NEXT: # %bb.2: # %entry
+; MIPS-NEXT: and $7, $8, $4
+; MIPS-NEXT: srlv $7, $7, $3
+; MIPS-NEXT: seh $7, $7
+; MIPS-NEXT: # %bb.3: # %entry
+; MIPS-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPS-NEXT: # %bb.4: # %entry
+; MIPS-NEXT: sync
+; MIPS-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPS-NEXT: addiu $sp, $sp, 8
+; MIPS-NEXT: jr $ra
+; MIPS-NEXT: nop
+;
+; MIPSR6-LABEL: test_max_16:
+; MIPSR6: # %bb.0: # %entry
+; MIPSR6-NEXT: addiu $sp, $sp, -8
+; MIPSR6-NEXT: .cfi_def_cfa_offset 8
+; MIPSR6-NEXT: move $1, $5
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: addiu $2, $zero, -4
+; MIPSR6-NEXT: and $2, $4, $2
+; MIPSR6-NEXT: andi $3, $4, 3
+; MIPSR6-NEXT: xori $3, $3, 2
+; MIPSR6-NEXT: sll $3, $3, 3
+; MIPSR6-NEXT: ori $4, $zero, 65535
+; MIPSR6-NEXT: sllv $4, $4, $3
+; MIPSR6-NEXT: nor $6, $zero, $4
+; MIPSR6-NEXT: sllv $5, $5, $3
+; MIPSR6-NEXT: $BB4_1: # %entry
+; MIPSR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSR6-NEXT: ll $8, 0($2)
+; MIPSR6-NEXT: slt $11, $8, $5
+; MIPSR6-NEXT: seleqz $9, $8, $11
+; MIPSR6-NEXT: selnez $11, $5, $11
+; MIPSR6-NEXT: or $9, $9, $11
+; MIPSR6-NEXT: and $9, $9, $4
+; MIPSR6-NEXT: and $10, $8, $6
+; MIPSR6-NEXT: or $10, $10, $9
+; MIPSR6-NEXT: sc $10, 0($2)
+; MIPSR6-NEXT: beqzc $10, $BB4_1
+; MIPSR6-NEXT: # %bb.2: # %entry
+; MIPSR6-NEXT: and $7, $8, $4
+; MIPSR6-NEXT: srlv $7, $7, $3
+; MIPSR6-NEXT: seh $7, $7
+; MIPSR6-NEXT: # %bb.3: # %entry
+; MIPSR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPSR6-NEXT: # %bb.4: # %entry
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPSR6-NEXT: addiu $sp, $sp, 8
+; MIPSR6-NEXT: jrc $ra
+;
+; MM-LABEL: test_max_16:
+; MM: # %bb.0: # %entry
+; MM-NEXT: addiu $sp, $sp, -8
+; MM-NEXT: .cfi_def_cfa_offset 8
+; MM-NEXT: move $1, $5
+; MM-NEXT: sync
+; MM-NEXT: addiu $2, $zero, -4
+; MM-NEXT: and $2, $4, $2
+; MM-NEXT: andi $3, $4, 3
+; MM-NEXT: xori $3, $3, 2
+; MM-NEXT: sll $3, $3, 3
+; MM-NEXT: ori $4, $zero, 65535
+; MM-NEXT: sllv $4, $4, $3
+; MM-NEXT: nor $6, $zero, $4
+; MM-NEXT: sllv $5, $5, $3
+; MM-NEXT: $BB4_1: # %entry
+; MM-NEXT: # =>This Inner Loop Header: Depth=1
+; MM-NEXT: ll $8, 0($2)
+; MM-NEXT: slt $11, $8, $5
+; MM-NEXT: or $9, $8, $zero
+; MM-NEXT: movn $9, $5, $11
+; MM-NEXT: and $9, $9, $4
+; MM-NEXT: and $10, $8, $6
+; MM-NEXT: or $10, $10, $9
+; MM-NEXT: sc $10, 0($2)
+; MM-NEXT: beqzc $10, $BB4_1
+; MM-NEXT: # %bb.2: # %entry
+; MM-NEXT: and $7, $8, $4
+; MM-NEXT: srlv $7, $7, $3
+; MM-NEXT: seh $7, $7
+; MM-NEXT: # %bb.3: # %entry
+; MM-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MM-NEXT: # %bb.4: # %entry
+; MM-NEXT: sync
+; MM-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MM-NEXT: addiusp 8
+; MM-NEXT: jrc $ra
+;
+; MMR6-LABEL: test_max_16:
+; MMR6: # %bb.0: # %entry
+; MMR6-NEXT: addiu $sp, $sp, -8
+; MMR6-NEXT: .cfi_def_cfa_offset 8
+; MMR6-NEXT: move $1, $5
+; MMR6-NEXT: sync
+; MMR6-NEXT: addiu $2, $zero, -4
+; MMR6-NEXT: and $2, $4, $2
+; MMR6-NEXT: andi $3, $4, 3
+; MMR6-NEXT: xori $3, $3, 2
+; MMR6-NEXT: sll $3, $3, 3
+; MMR6-NEXT: ori $4, $zero, 65535
+; MMR6-NEXT: sllv $4, $4, $3
+; MMR6-NEXT: nor $6, $zero, $4
+; MMR6-NEXT: sllv $5, $5, $3
+; MMR6-NEXT: $BB4_1: # %entry
+; MMR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MMR6-NEXT: ll $8, 0($2)
+; MMR6-NEXT: slt $11, $8, $5
+; MMR6-NEXT: seleqz $9, $8, $11
+; MMR6-NEXT: selnez $11, $5, $11
+; MMR6-NEXT: or $9, $9, $11
+; MMR6-NEXT: and $9, $9, $4
+; MMR6-NEXT: and $10, $8, $6
+; MMR6-NEXT: or $10, $10, $9
+; MMR6-NEXT: sc $10, 0($2)
+; MMR6-NEXT: beqc $10, $zero, $BB4_1
+; MMR6-NEXT: # %bb.2: # %entry
+; MMR6-NEXT: and $7, $8, $4
+; MMR6-NEXT: srlv $7, $7, $3
+; MMR6-NEXT: seh $7, $7
+; MMR6-NEXT: # %bb.3: # %entry
+; MMR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MMR6-NEXT: # %bb.4: # %entry
+; MMR6-NEXT: sync
+; MMR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MMR6-NEXT: addiu $sp, $sp, 8
+; MMR6-NEXT: jrc $ra
+;
+; MIPSEL-LABEL: test_max_16:
+; MIPSEL: # %bb.0: # %entry
+; MIPSEL-NEXT: addiu $sp, $sp, -8
+; MIPSEL-NEXT: .cfi_def_cfa_offset 8
+; MIPSEL-NEXT: move $1, $5
+; MIPSEL-NEXT: sync
+; MIPSEL-NEXT: addiu $2, $zero, -4
+; MIPSEL-NEXT: and $2, $4, $2
+; MIPSEL-NEXT: andi $3, $4, 3
+; MIPSEL-NEXT: sll $3, $3, 3
+; MIPSEL-NEXT: ori $4, $zero, 65535
+; MIPSEL-NEXT: sllv $4, $4, $3
+; MIPSEL-NEXT: nor $6, $zero, $4
+; MIPSEL-NEXT: sllv $5, $5, $3
+; MIPSEL-NEXT: $BB4_1: # %entry
+; MIPSEL-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSEL-NEXT: ll $8, 0($2)
+; MIPSEL-NEXT: and $8, $8, $4
+; MIPSEL-NEXT: and $5, $5, $4
+; MIPSEL-NEXT: slt $11, $8, $5
+; MIPSEL-NEXT: move $9, $8
+; MIPSEL-NEXT: movn $9, $5, $11
+; MIPSEL-NEXT: and $9, $9, $4
+; MIPSEL-NEXT: and $10, $8, $6
+; MIPSEL-NEXT: or $10, $10, $9
+; MIPSEL-NEXT: sc $10, 0($2)
+; MIPSEL-NEXT: beqz $10, $BB4_1
+; MIPSEL-NEXT: nop
+; MIPSEL-NEXT: # %bb.2: # %entry
+; MIPSEL-NEXT: and $7, $8, $4
+; MIPSEL-NEXT: srlv $7, $7, $3
+; MIPSEL-NEXT: seh $7, $7
+; MIPSEL-NEXT: # %bb.3: # %entry
+; MIPSEL-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPSEL-NEXT: # %bb.4: # %entry
+; MIPSEL-NEXT: sync
+; MIPSEL-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPSEL-NEXT: addiu $sp, $sp, 8
+; MIPSEL-NEXT: jr $ra
+; MIPSEL-NEXT: nop
+;
+; MIPSELR6-LABEL: test_max_16:
+; MIPSELR6: # %bb.0: # %entry
+; MIPSELR6-NEXT: addiu $sp, $sp, -8
+; MIPSELR6-NEXT: .cfi_def_cfa_offset 8
+; MIPSELR6-NEXT: move $1, $5
+; MIPSELR6-NEXT: sync
+; MIPSELR6-NEXT: addiu $2, $zero, -4
+; MIPSELR6-NEXT: and $2, $4, $2
+; MIPSELR6-NEXT: andi $3, $4, 3
+; MIPSELR6-NEXT: sll $3, $3, 3
+; MIPSELR6-NEXT: ori $4, $zero, 65535
+; MIPSELR6-NEXT: sllv $4, $4, $3
+; MIPSELR6-NEXT: nor $6, $zero, $4
+; MIPSELR6-NEXT: sllv $5, $5, $3
+; MIPSELR6-NEXT: $BB4_1: # %entry
+; MIPSELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSELR6-NEXT: ll $8, 0($2)
+; MIPSELR6-NEXT: and $8, $8, $4
+; MIPSELR6-NEXT: and $5, $5, $4
+; MIPSELR6-NEXT: slt $11, $8, $5
+; MIPSELR6-NEXT: seleqz $9, $8, $11
+; MIPSELR6-NEXT: selnez $11, $5, $11
+; MIPSELR6-NEXT: or $9, $9, $11
+; MIPSELR6-NEXT: and $9, $9, $4
+; MIPSELR6-NEXT: and $10, $8, $6
+; MIPSELR6-NEXT: or $10, $10, $9
+; MIPSELR6-NEXT: sc $10, 0($2)
+; MIPSELR6-NEXT: beqzc $10, $BB4_1
+; MIPSELR6-NEXT: # %bb.2: # %entry
+; MIPSELR6-NEXT: and $7, $8, $4
+; MIPSELR6-NEXT: srlv $7, $7, $3
+; MIPSELR6-NEXT: seh $7, $7
+; MIPSELR6-NEXT: # %bb.3: # %entry
+; MIPSELR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPSELR6-NEXT: # %bb.4: # %entry
+; MIPSELR6-NEXT: sync
+; MIPSELR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPSELR6-NEXT: addiu $sp, $sp, 8
+; MIPSELR6-NEXT: jrc $ra
+;
+; MMEL-LABEL: test_max_16:
+; MMEL: # %bb.0: # %entry
+; MMEL-NEXT: addiu $sp, $sp, -8
+; MMEL-NEXT: .cfi_def_cfa_offset 8
+; MMEL-NEXT: move $1, $5
+; MMEL-NEXT: sync
+; MMEL-NEXT: addiu $2, $zero, -4
+; MMEL-NEXT: and $2, $4, $2
+; MMEL-NEXT: andi $3, $4, 3
+; MMEL-NEXT: sll $3, $3, 3
+; MMEL-NEXT: ori $4, $zero, 65535
+; MMEL-NEXT: sllv $4, $4, $3
+; MMEL-NEXT: nor $6, $zero, $4
+; MMEL-NEXT: sllv $5, $5, $3
+; MMEL-NEXT: $BB4_1: # %entry
+; MMEL-NEXT: # =>This Inner Loop Header: Depth=1
+; MMEL-NEXT: ll $8, 0($2)
+; MMEL-NEXT: and $8, $8, $4
+; MMEL-NEXT: and $5, $5, $4
+; MMEL-NEXT: slt $11, $8, $5
+; MMEL-NEXT: or $9, $8, $zero
+; MMEL-NEXT: movn $9, $5, $11
+; MMEL-NEXT: and $9, $9, $4
+; MMEL-NEXT: and $10, $8, $6
+; MMEL-NEXT: or $10, $10, $9
+; MMEL-NEXT: sc $10, 0($2)
+; MMEL-NEXT: beqzc $10, $BB4_1
+; MMEL-NEXT: # %bb.2: # %entry
+; MMEL-NEXT: and $7, $8, $4
+; MMEL-NEXT: srlv $7, $7, $3
+; MMEL-NEXT: seh $7, $7
+; MMEL-NEXT: # %bb.3: # %entry
+; MMEL-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MMEL-NEXT: # %bb.4: # %entry
+; MMEL-NEXT: sync
+; MMEL-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MMEL-NEXT: addiusp 8
+; MMEL-NEXT: jrc $ra
+;
+; MMELR6-LABEL: test_max_16:
+; MMELR6: # %bb.0: # %entry
+; MMELR6-NEXT: addiu $sp, $sp, -8
+; MMELR6-NEXT: .cfi_def_cfa_offset 8
+; MMELR6-NEXT: move $1, $5
+; MMELR6-NEXT: sync
+; MMELR6-NEXT: addiu $2, $zero, -4
+; MMELR6-NEXT: and $2, $4, $2
+; MMELR6-NEXT: andi $3, $4, 3
+; MMELR6-NEXT: sll $3, $3, 3
+; MMELR6-NEXT: ori $4, $zero, 65535
+; MMELR6-NEXT: sllv $4, $4, $3
+; MMELR6-NEXT: nor $6, $zero, $4
+; MMELR6-NEXT: sllv $5, $5, $3
+; MMELR6-NEXT: $BB4_1: # %entry
+; MMELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MMELR6-NEXT: ll $8, 0($2)
+; MMELR6-NEXT: and $8, $8, $4
+; MMELR6-NEXT: and $5, $5, $4
+; MMELR6-NEXT: slt $11, $8, $5
+; MMELR6-NEXT: seleqz $9, $8, $11
+; MMELR6-NEXT: selnez $11, $5, $11
+; MMELR6-NEXT: or $9, $9, $11
+; MMELR6-NEXT: and $9, $9, $4
+; MMELR6-NEXT: and $10, $8, $6
+; MMELR6-NEXT: or $10, $10, $9
+; MMELR6-NEXT: sc $10, 0($2)
+; MMELR6-NEXT: beqc $10, $zero, $BB4_1
+; MMELR6-NEXT: # %bb.2: # %entry
+; MMELR6-NEXT: and $7, $8, $4
+; MMELR6-NEXT: srlv $7, $7, $3
+; MMELR6-NEXT: seh $7, $7
+; MMELR6-NEXT: # %bb.3: # %entry
+; MMELR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MMELR6-NEXT: # %bb.4: # %entry
+; MMELR6-NEXT: sync
+; MMELR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MMELR6-NEXT: addiu $sp, $sp, 8
+; MMELR6-NEXT: jrc $ra
+;
+; MIPS64-LABEL: test_max_16:
+; MIPS64: # %bb.0: # %entry
+; MIPS64-NEXT: daddiu $sp, $sp, -16
+; MIPS64-NEXT: .cfi_def_cfa_offset 16
+; MIPS64-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64-NEXT: sync
+; MIPS64-NEXT: daddiu $1, $zero, -4
+; MIPS64-NEXT: and $1, $4, $1
+; MIPS64-NEXT: andi $2, $4, 3
+; MIPS64-NEXT: xori $2, $2, 2
+; MIPS64-NEXT: sll $2, $2, 3
+; MIPS64-NEXT: ori $3, $zero, 65535
+; MIPS64-NEXT: sllv $3, $3, $2
+; MIPS64-NEXT: nor $6, $zero, $3
+; MIPS64-NEXT: sllv $5, $5, $2
+; MIPS64-NEXT: .LBB4_1: # %entry
+; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64-NEXT: ll $8, 0($1)
+; MIPS64-NEXT: slt $11, $8, $5
+; MIPS64-NEXT: move $9, $8
+; MIPS64-NEXT: movn $9, $5, $11
+; MIPS64-NEXT: and $9, $9, $3
+; MIPS64-NEXT: and $10, $8, $6
+; MIPS64-NEXT: or $10, $10, $9
+; MIPS64-NEXT: sc $10, 0($1)
+; MIPS64-NEXT: beqz $10, .LBB4_1
+; MIPS64-NEXT: nop
+; MIPS64-NEXT: # %bb.2: # %entry
+; MIPS64-NEXT: and $7, $8, $3
+; MIPS64-NEXT: srlv $7, $7, $2
+; MIPS64-NEXT: seh $7, $7
+; MIPS64-NEXT: # %bb.3: # %entry
+; MIPS64-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64-NEXT: # %bb.4: # %entry
+; MIPS64-NEXT: sync
+; MIPS64-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64-NEXT: daddiu $sp, $sp, 16
+; MIPS64-NEXT: jr $ra
+; MIPS64-NEXT: nop
+;
+; MIPS64R6-LABEL: test_max_16:
+; MIPS64R6: # %bb.0: # %entry
+; MIPS64R6-NEXT: daddiu $sp, $sp, -16
+; MIPS64R6-NEXT: .cfi_def_cfa_offset 16
+; MIPS64R6-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64R6-NEXT: sync
+; MIPS64R6-NEXT: daddiu $1, $zero, -4
+; MIPS64R6-NEXT: and $1, $4, $1
+; MIPS64R6-NEXT: andi $2, $4, 3
+; MIPS64R6-NEXT: xori $2, $2, 2
+; MIPS64R6-NEXT: sll $2, $2, 3
+; MIPS64R6-NEXT: ori $3, $zero, 65535
+; MIPS64R6-NEXT: sllv $3, $3, $2
+; MIPS64R6-NEXT: nor $6, $zero, $3
+; MIPS64R6-NEXT: sllv $5, $5, $2
+; MIPS64R6-NEXT: .LBB4_1: # %entry
+; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64R6-NEXT: ll $8, 0($1)
+; MIPS64R6-NEXT: slt $11, $8, $5
+; MIPS64R6-NEXT: seleqz $9, $8, $11
+; MIPS64R6-NEXT: selnez $11, $5, $11
+; MIPS64R6-NEXT: or $9, $9, $11
+; MIPS64R6-NEXT: and $9, $9, $3
+; MIPS64R6-NEXT: and $10, $8, $6
+; MIPS64R6-NEXT: or $10, $10, $9
+; MIPS64R6-NEXT: sc $10, 0($1)
+; MIPS64R6-NEXT: beqzc $10, .LBB4_1
+; MIPS64R6-NEXT: # %bb.2: # %entry
+; MIPS64R6-NEXT: and $7, $8, $3
+; MIPS64R6-NEXT: srlv $7, $7, $2
+; MIPS64R6-NEXT: seh $7, $7
+; MIPS64R6-NEXT: # %bb.3: # %entry
+; MIPS64R6-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64R6-NEXT: # %bb.4: # %entry
+; MIPS64R6-NEXT: sync
+; MIPS64R6-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64R6-NEXT: daddiu $sp, $sp, 16
+; MIPS64R6-NEXT: jrc $ra
+;
+; MIPS64EL-LABEL: test_max_16:
+; MIPS64EL: # %bb.0: # %entry
+; MIPS64EL-NEXT: daddiu $sp, $sp, -16
+; MIPS64EL-NEXT: .cfi_def_cfa_offset 16
+; MIPS64EL-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64EL-NEXT: sync
+; MIPS64EL-NEXT: daddiu $1, $zero, -4
+; MIPS64EL-NEXT: and $1, $4, $1
+; MIPS64EL-NEXT: andi $2, $4, 3
+; MIPS64EL-NEXT: sll $2, $2, 3
+; MIPS64EL-NEXT: ori $3, $zero, 65535
+; MIPS64EL-NEXT: sllv $3, $3, $2
+; MIPS64EL-NEXT: nor $6, $zero, $3
+; MIPS64EL-NEXT: sllv $5, $5, $2
+; MIPS64EL-NEXT: .LBB4_1: # %entry
+; MIPS64EL-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64EL-NEXT: ll $8, 0($1)
+; MIPS64EL-NEXT: and $8, $8, $3
+; MIPS64EL-NEXT: and $5, $5, $3
+; MIPS64EL-NEXT: slt $11, $8, $5
+; MIPS64EL-NEXT: move $9, $8
+; MIPS64EL-NEXT: movn $9, $5, $11
+; MIPS64EL-NEXT: and $9, $9, $3
+; MIPS64EL-NEXT: and $10, $8, $6
+; MIPS64EL-NEXT: or $10, $10, $9
+; MIPS64EL-NEXT: sc $10, 0($1)
+; MIPS64EL-NEXT: beqz $10, .LBB4_1
+; MIPS64EL-NEXT: nop
+; MIPS64EL-NEXT: # %bb.2: # %entry
+; MIPS64EL-NEXT: and $7, $8, $3
+; MIPS64EL-NEXT: srlv $7, $7, $2
+; MIPS64EL-NEXT: seh $7, $7
+; MIPS64EL-NEXT: # %bb.3: # %entry
+; MIPS64EL-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64EL-NEXT: # %bb.4: # %entry
+; MIPS64EL-NEXT: sync
+; MIPS64EL-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64EL-NEXT: daddiu $sp, $sp, 16
+; MIPS64EL-NEXT: jr $ra
+; MIPS64EL-NEXT: nop
+;
+; MIPS64ELR6-LABEL: test_max_16:
+; MIPS64ELR6: # %bb.0: # %entry
+; MIPS64ELR6-NEXT: daddiu $sp, $sp, -16
+; MIPS64ELR6-NEXT: .cfi_def_cfa_offset 16
+; MIPS64ELR6-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64ELR6-NEXT: sync
+; MIPS64ELR6-NEXT: daddiu $1, $zero, -4
+; MIPS64ELR6-NEXT: and $1, $4, $1
+; MIPS64ELR6-NEXT: andi $2, $4, 3
+; MIPS64ELR6-NEXT: sll $2, $2, 3
+; MIPS64ELR6-NEXT: ori $3, $zero, 65535
+; MIPS64ELR6-NEXT: sllv $3, $3, $2
+; MIPS64ELR6-NEXT: nor $6, $zero, $3
+; MIPS64ELR6-NEXT: sllv $5, $5, $2
+; MIPS64ELR6-NEXT: .LBB4_1: # %entry
+; MIPS64ELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64ELR6-NEXT: ll $8, 0($1)
+; MIPS64ELR6-NEXT: and $8, $8, $3
+; MIPS64ELR6-NEXT: and $5, $5, $3
+; MIPS64ELR6-NEXT: slt $11, $8, $5
+; MIPS64ELR6-NEXT: seleqz $9, $8, $11
+; MIPS64ELR6-NEXT: selnez $11, $5, $11
+; MIPS64ELR6-NEXT: or $9, $9, $11
+; MIPS64ELR6-NEXT: and $9, $9, $3
+; MIPS64ELR6-NEXT: and $10, $8, $6
+; MIPS64ELR6-NEXT: or $10, $10, $9
+; MIPS64ELR6-NEXT: sc $10, 0($1)
+; MIPS64ELR6-NEXT: beqzc $10, .LBB4_1
+; MIPS64ELR6-NEXT: # %bb.2: # %entry
+; MIPS64ELR6-NEXT: and $7, $8, $3
+; MIPS64ELR6-NEXT: srlv $7, $7, $2
+; MIPS64ELR6-NEXT: seh $7, $7
+; MIPS64ELR6-NEXT: # %bb.3: # %entry
+; MIPS64ELR6-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64ELR6-NEXT: # %bb.4: # %entry
+; MIPS64ELR6-NEXT: sync
+; MIPS64ELR6-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64ELR6-NEXT: daddiu $sp, $sp, 16
+; MIPS64ELR6-NEXT: jrc $ra
+entry:
+ %0 = atomicrmw max i16* %ptr, i16 %val seq_cst
+ ret i16 %0
+}
+
+define i16 @test_min_16(i16* nocapture %ptr, i16 signext %val) {
+; MIPS-LABEL: test_min_16:
+; MIPS: # %bb.0: # %entry
+; MIPS-NEXT: addiu $sp, $sp, -8
+; MIPS-NEXT: .cfi_def_cfa_offset 8
+; MIPS-NEXT: move $1, $5
+; MIPS-NEXT: sync
+; MIPS-NEXT: addiu $2, $zero, -4
+; MIPS-NEXT: and $2, $4, $2
+; MIPS-NEXT: andi $3, $4, 3
+; MIPS-NEXT: xori $3, $3, 2
+; MIPS-NEXT: sll $3, $3, 3
+; MIPS-NEXT: ori $4, $zero, 65535
+; MIPS-NEXT: sllv $4, $4, $3
+; MIPS-NEXT: nor $6, $zero, $4
+; MIPS-NEXT: sllv $5, $5, $3
+; MIPS-NEXT: $BB5_1: # %entry
+; MIPS-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS-NEXT: ll $8, 0($2)
+; MIPS-NEXT: slt $11, $8, $5
+; MIPS-NEXT: move $9, $8
+; MIPS-NEXT: movz $9, $5, $11
+; MIPS-NEXT: and $9, $9, $4
+; MIPS-NEXT: and $10, $8, $6
+; MIPS-NEXT: or $10, $10, $9
+; MIPS-NEXT: sc $10, 0($2)
+; MIPS-NEXT: beqz $10, $BB5_1
+; MIPS-NEXT: nop
+; MIPS-NEXT: # %bb.2: # %entry
+; MIPS-NEXT: and $7, $8, $4
+; MIPS-NEXT: srlv $7, $7, $3
+; MIPS-NEXT: seh $7, $7
+; MIPS-NEXT: # %bb.3: # %entry
+; MIPS-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPS-NEXT: # %bb.4: # %entry
+; MIPS-NEXT: sync
+; MIPS-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPS-NEXT: addiu $sp, $sp, 8
+; MIPS-NEXT: jr $ra
+; MIPS-NEXT: nop
+;
+; MIPSR6-LABEL: test_min_16:
+; MIPSR6: # %bb.0: # %entry
+; MIPSR6-NEXT: addiu $sp, $sp, -8
+; MIPSR6-NEXT: .cfi_def_cfa_offset 8
+; MIPSR6-NEXT: move $1, $5
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: addiu $2, $zero, -4
+; MIPSR6-NEXT: and $2, $4, $2
+; MIPSR6-NEXT: andi $3, $4, 3
+; MIPSR6-NEXT: xori $3, $3, 2
+; MIPSR6-NEXT: sll $3, $3, 3
+; MIPSR6-NEXT: ori $4, $zero, 65535
+; MIPSR6-NEXT: sllv $4, $4, $3
+; MIPSR6-NEXT: nor $6, $zero, $4
+; MIPSR6-NEXT: sllv $5, $5, $3
+; MIPSR6-NEXT: $BB5_1: # %entry
+; MIPSR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSR6-NEXT: ll $8, 0($2)
+; MIPSR6-NEXT: slt $11, $8, $5
+; MIPSR6-NEXT: selnez $9, $8, $11
+; MIPSR6-NEXT: seleqz $11, $5, $11
+; MIPSR6-NEXT: or $9, $9, $11
+; MIPSR6-NEXT: and $9, $9, $4
+; MIPSR6-NEXT: and $10, $8, $6
+; MIPSR6-NEXT: or $10, $10, $9
+; MIPSR6-NEXT: sc $10, 0($2)
+; MIPSR6-NEXT: beqzc $10, $BB5_1
+; MIPSR6-NEXT: # %bb.2: # %entry
+; MIPSR6-NEXT: and $7, $8, $4
+; MIPSR6-NEXT: srlv $7, $7, $3
+; MIPSR6-NEXT: seh $7, $7
+; MIPSR6-NEXT: # %bb.3: # %entry
+; MIPSR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPSR6-NEXT: # %bb.4: # %entry
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPSR6-NEXT: addiu $sp, $sp, 8
+; MIPSR6-NEXT: jrc $ra
+;
+; MM-LABEL: test_min_16:
+; MM: # %bb.0: # %entry
+; MM-NEXT: addiu $sp, $sp, -8
+; MM-NEXT: .cfi_def_cfa_offset 8
+; MM-NEXT: move $1, $5
+; MM-NEXT: sync
+; MM-NEXT: addiu $2, $zero, -4
+; MM-NEXT: and $2, $4, $2
+; MM-NEXT: andi $3, $4, 3
+; MM-NEXT: xori $3, $3, 2
+; MM-NEXT: sll $3, $3, 3
+; MM-NEXT: ori $4, $zero, 65535
+; MM-NEXT: sllv $4, $4, $3
+; MM-NEXT: nor $6, $zero, $4
+; MM-NEXT: sllv $5, $5, $3
+; MM-NEXT: $BB5_1: # %entry
+; MM-NEXT: # =>This Inner Loop Header: Depth=1
+; MM-NEXT: ll $8, 0($2)
+; MM-NEXT: slt $11, $8, $5
+; MM-NEXT: or $9, $8, $zero
+; MM-NEXT: movz $9, $5, $11
+; MM-NEXT: and $9, $9, $4
+; MM-NEXT: and $10, $8, $6
+; MM-NEXT: or $10, $10, $9
+; MM-NEXT: sc $10, 0($2)
+; MM-NEXT: beqzc $10, $BB5_1
+; MM-NEXT: # %bb.2: # %entry
+; MM-NEXT: and $7, $8, $4
+; MM-NEXT: srlv $7, $7, $3
+; MM-NEXT: seh $7, $7
+; MM-NEXT: # %bb.3: # %entry
+; MM-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MM-NEXT: # %bb.4: # %entry
+; MM-NEXT: sync
+; MM-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MM-NEXT: addiusp 8
+; MM-NEXT: jrc $ra
+;
+; MMR6-LABEL: test_min_16:
+; MMR6: # %bb.0: # %entry
+; MMR6-NEXT: addiu $sp, $sp, -8
+; MMR6-NEXT: .cfi_def_cfa_offset 8
+; MMR6-NEXT: move $1, $5
+; MMR6-NEXT: sync
+; MMR6-NEXT: addiu $2, $zero, -4
+; MMR6-NEXT: and $2, $4, $2
+; MMR6-NEXT: andi $3, $4, 3
+; MMR6-NEXT: xori $3, $3, 2
+; MMR6-NEXT: sll $3, $3, 3
+; MMR6-NEXT: ori $4, $zero, 65535
+; MMR6-NEXT: sllv $4, $4, $3
+; MMR6-NEXT: nor $6, $zero, $4
+; MMR6-NEXT: sllv $5, $5, $3
+; MMR6-NEXT: $BB5_1: # %entry
+; MMR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MMR6-NEXT: ll $8, 0($2)
+; MMR6-NEXT: slt $11, $8, $5
+; MMR6-NEXT: selnez $9, $8, $11
+; MMR6-NEXT: seleqz $11, $5, $11
+; MMR6-NEXT: or $9, $9, $11
+; MMR6-NEXT: and $9, $9, $4
+; MMR6-NEXT: and $10, $8, $6
+; MMR6-NEXT: or $10, $10, $9
+; MMR6-NEXT: sc $10, 0($2)
+; MMR6-NEXT: beqc $10, $zero, $BB5_1
+; MMR6-NEXT: # %bb.2: # %entry
+; MMR6-NEXT: and $7, $8, $4
+; MMR6-NEXT: srlv $7, $7, $3
+; MMR6-NEXT: seh $7, $7
+; MMR6-NEXT: # %bb.3: # %entry
+; MMR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MMR6-NEXT: # %bb.4: # %entry
+; MMR6-NEXT: sync
+; MMR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MMR6-NEXT: addiu $sp, $sp, 8
+; MMR6-NEXT: jrc $ra
+;
+; MIPSEL-LABEL: test_min_16:
+; MIPSEL: # %bb.0: # %entry
+; MIPSEL-NEXT: addiu $sp, $sp, -8
+; MIPSEL-NEXT: .cfi_def_cfa_offset 8
+; MIPSEL-NEXT: move $1, $5
+; MIPSEL-NEXT: sync
+; MIPSEL-NEXT: addiu $2, $zero, -4
+; MIPSEL-NEXT: and $2, $4, $2
+; MIPSEL-NEXT: andi $3, $4, 3
+; MIPSEL-NEXT: sll $3, $3, 3
+; MIPSEL-NEXT: ori $4, $zero, 65535
+; MIPSEL-NEXT: sllv $4, $4, $3
+; MIPSEL-NEXT: nor $6, $zero, $4
+; MIPSEL-NEXT: sllv $5, $5, $3
+; MIPSEL-NEXT: $BB5_1: # %entry
+; MIPSEL-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSEL-NEXT: ll $8, 0($2)
+; MIPSEL-NEXT: and $8, $8, $4
+; MIPSEL-NEXT: and $5, $5, $4
+; MIPSEL-NEXT: slt $11, $8, $5
+; MIPSEL-NEXT: move $9, $8
+; MIPSEL-NEXT: movz $9, $5, $11
+; MIPSEL-NEXT: and $9, $9, $4
+; MIPSEL-NEXT: and $10, $8, $6
+; MIPSEL-NEXT: or $10, $10, $9
+; MIPSEL-NEXT: sc $10, 0($2)
+; MIPSEL-NEXT: beqz $10, $BB5_1
+; MIPSEL-NEXT: nop
+; MIPSEL-NEXT: # %bb.2: # %entry
+; MIPSEL-NEXT: and $7, $8, $4
+; MIPSEL-NEXT: srlv $7, $7, $3
+; MIPSEL-NEXT: seh $7, $7
+; MIPSEL-NEXT: # %bb.3: # %entry
+; MIPSEL-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPSEL-NEXT: # %bb.4: # %entry
+; MIPSEL-NEXT: sync
+; MIPSEL-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPSEL-NEXT: addiu $sp, $sp, 8
+; MIPSEL-NEXT: jr $ra
+; MIPSEL-NEXT: nop
+;
+; MIPSELR6-LABEL: test_min_16:
+; MIPSELR6: # %bb.0: # %entry
+; MIPSELR6-NEXT: addiu $sp, $sp, -8
+; MIPSELR6-NEXT: .cfi_def_cfa_offset 8
+; MIPSELR6-NEXT: move $1, $5
+; MIPSELR6-NEXT: sync
+; MIPSELR6-NEXT: addiu $2, $zero, -4
+; MIPSELR6-NEXT: and $2, $4, $2
+; MIPSELR6-NEXT: andi $3, $4, 3
+; MIPSELR6-NEXT: sll $3, $3, 3
+; MIPSELR6-NEXT: ori $4, $zero, 65535
+; MIPSELR6-NEXT: sllv $4, $4, $3
+; MIPSELR6-NEXT: nor $6, $zero, $4
+; MIPSELR6-NEXT: sllv $5, $5, $3
+; MIPSELR6-NEXT: $BB5_1: # %entry
+; MIPSELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSELR6-NEXT: ll $8, 0($2)
+; MIPSELR6-NEXT: and $8, $8, $4
+; MIPSELR6-NEXT: and $5, $5, $4
+; MIPSELR6-NEXT: slt $11, $8, $5
+; MIPSELR6-NEXT: selnez $9, $8, $11
+; MIPSELR6-NEXT: seleqz $11, $5, $11
+; MIPSELR6-NEXT: or $9, $9, $11
+; MIPSELR6-NEXT: and $9, $9, $4
+; MIPSELR6-NEXT: and $10, $8, $6
+; MIPSELR6-NEXT: or $10, $10, $9
+; MIPSELR6-NEXT: sc $10, 0($2)
+; MIPSELR6-NEXT: beqzc $10, $BB5_1
+; MIPSELR6-NEXT: # %bb.2: # %entry
+; MIPSELR6-NEXT: and $7, $8, $4
+; MIPSELR6-NEXT: srlv $7, $7, $3
+; MIPSELR6-NEXT: seh $7, $7
+; MIPSELR6-NEXT: # %bb.3: # %entry
+; MIPSELR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPSELR6-NEXT: # %bb.4: # %entry
+; MIPSELR6-NEXT: sync
+; MIPSELR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPSELR6-NEXT: addiu $sp, $sp, 8
+; MIPSELR6-NEXT: jrc $ra
+;
+; MMEL-LABEL: test_min_16:
+; MMEL: # %bb.0: # %entry
+; MMEL-NEXT: addiu $sp, $sp, -8
+; MMEL-NEXT: .cfi_def_cfa_offset 8
+; MMEL-NEXT: move $1, $5
+; MMEL-NEXT: sync
+; MMEL-NEXT: addiu $2, $zero, -4
+; MMEL-NEXT: and $2, $4, $2
+; MMEL-NEXT: andi $3, $4, 3
+; MMEL-NEXT: sll $3, $3, 3
+; MMEL-NEXT: ori $4, $zero, 65535
+; MMEL-NEXT: sllv $4, $4, $3
+; MMEL-NEXT: nor $6, $zero, $4
+; MMEL-NEXT: sllv $5, $5, $3
+; MMEL-NEXT: $BB5_1: # %entry
+; MMEL-NEXT: # =>This Inner Loop Header: Depth=1
+; MMEL-NEXT: ll $8, 0($2)
+; MMEL-NEXT: and $8, $8, $4
+; MMEL-NEXT: and $5, $5, $4
+; MMEL-NEXT: slt $11, $8, $5
+; MMEL-NEXT: or $9, $8, $zero
+; MMEL-NEXT: movz $9, $5, $11
+; MMEL-NEXT: and $9, $9, $4
+; MMEL-NEXT: and $10, $8, $6
+; MMEL-NEXT: or $10, $10, $9
+; MMEL-NEXT: sc $10, 0($2)
+; MMEL-NEXT: beqzc $10, $BB5_1
+; MMEL-NEXT: # %bb.2: # %entry
+; MMEL-NEXT: and $7, $8, $4
+; MMEL-NEXT: srlv $7, $7, $3
+; MMEL-NEXT: seh $7, $7
+; MMEL-NEXT: # %bb.3: # %entry
+; MMEL-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MMEL-NEXT: # %bb.4: # %entry
+; MMEL-NEXT: sync
+; MMEL-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MMEL-NEXT: addiusp 8
+; MMEL-NEXT: jrc $ra
+;
+; MMELR6-LABEL: test_min_16:
+; MMELR6: # %bb.0: # %entry
+; MMELR6-NEXT: addiu $sp, $sp, -8
+; MMELR6-NEXT: .cfi_def_cfa_offset 8
+; MMELR6-NEXT: move $1, $5
+; MMELR6-NEXT: sync
+; MMELR6-NEXT: addiu $2, $zero, -4
+; MMELR6-NEXT: and $2, $4, $2
+; MMELR6-NEXT: andi $3, $4, 3
+; MMELR6-NEXT: sll $3, $3, 3
+; MMELR6-NEXT: ori $4, $zero, 65535
+; MMELR6-NEXT: sllv $4, $4, $3
+; MMELR6-NEXT: nor $6, $zero, $4
+; MMELR6-NEXT: sllv $5, $5, $3
+; MMELR6-NEXT: $BB5_1: # %entry
+; MMELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MMELR6-NEXT: ll $8, 0($2)
+; MMELR6-NEXT: and $8, $8, $4
+; MMELR6-NEXT: and $5, $5, $4
+; MMELR6-NEXT: slt $11, $8, $5
+; MMELR6-NEXT: selnez $9, $8, $11
+; MMELR6-NEXT: seleqz $11, $5, $11
+; MMELR6-NEXT: or $9, $9, $11
+; MMELR6-NEXT: and $9, $9, $4
+; MMELR6-NEXT: and $10, $8, $6
+; MMELR6-NEXT: or $10, $10, $9
+; MMELR6-NEXT: sc $10, 0($2)
+; MMELR6-NEXT: beqc $10, $zero, $BB5_1
+; MMELR6-NEXT: # %bb.2: # %entry
+; MMELR6-NEXT: and $7, $8, $4
+; MMELR6-NEXT: srlv $7, $7, $3
+; MMELR6-NEXT: seh $7, $7
+; MMELR6-NEXT: # %bb.3: # %entry
+; MMELR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MMELR6-NEXT: # %bb.4: # %entry
+; MMELR6-NEXT: sync
+; MMELR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MMELR6-NEXT: addiu $sp, $sp, 8
+; MMELR6-NEXT: jrc $ra
+;
+; MIPS64-LABEL: test_min_16:
+; MIPS64: # %bb.0: # %entry
+; MIPS64-NEXT: daddiu $sp, $sp, -16
+; MIPS64-NEXT: .cfi_def_cfa_offset 16
+; MIPS64-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64-NEXT: sync
+; MIPS64-NEXT: daddiu $1, $zero, -4
+; MIPS64-NEXT: and $1, $4, $1
+; MIPS64-NEXT: andi $2, $4, 3
+; MIPS64-NEXT: xori $2, $2, 2
+; MIPS64-NEXT: sll $2, $2, 3
+; MIPS64-NEXT: ori $3, $zero, 65535
+; MIPS64-NEXT: sllv $3, $3, $2
+; MIPS64-NEXT: nor $6, $zero, $3
+; MIPS64-NEXT: sllv $5, $5, $2
+; MIPS64-NEXT: .LBB5_1: # %entry
+; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64-NEXT: ll $8, 0($1)
+; MIPS64-NEXT: slt $11, $8, $5
+; MIPS64-NEXT: move $9, $8
+; MIPS64-NEXT: movz $9, $5, $11
+; MIPS64-NEXT: and $9, $9, $3
+; MIPS64-NEXT: and $10, $8, $6
+; MIPS64-NEXT: or $10, $10, $9
+; MIPS64-NEXT: sc $10, 0($1)
+; MIPS64-NEXT: beqz $10, .LBB5_1
+; MIPS64-NEXT: nop
+; MIPS64-NEXT: # %bb.2: # %entry
+; MIPS64-NEXT: and $7, $8, $3
+; MIPS64-NEXT: srlv $7, $7, $2
+; MIPS64-NEXT: seh $7, $7
+; MIPS64-NEXT: # %bb.3: # %entry
+; MIPS64-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64-NEXT: # %bb.4: # %entry
+; MIPS64-NEXT: sync
+; MIPS64-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64-NEXT: daddiu $sp, $sp, 16
+; MIPS64-NEXT: jr $ra
+; MIPS64-NEXT: nop
+;
+; MIPS64R6-LABEL: test_min_16:
+; MIPS64R6: # %bb.0: # %entry
+; MIPS64R6-NEXT: daddiu $sp, $sp, -16
+; MIPS64R6-NEXT: .cfi_def_cfa_offset 16
+; MIPS64R6-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64R6-NEXT: sync
+; MIPS64R6-NEXT: daddiu $1, $zero, -4
+; MIPS64R6-NEXT: and $1, $4, $1
+; MIPS64R6-NEXT: andi $2, $4, 3
+; MIPS64R6-NEXT: xori $2, $2, 2
+; MIPS64R6-NEXT: sll $2, $2, 3
+; MIPS64R6-NEXT: ori $3, $zero, 65535
+; MIPS64R6-NEXT: sllv $3, $3, $2
+; MIPS64R6-NEXT: nor $6, $zero, $3
+; MIPS64R6-NEXT: sllv $5, $5, $2
+; MIPS64R6-NEXT: .LBB5_1: # %entry
+; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64R6-NEXT: ll $8, 0($1)
+; MIPS64R6-NEXT: slt $11, $8, $5
+; MIPS64R6-NEXT: selnez $9, $8, $11
+; MIPS64R6-NEXT: seleqz $11, $5, $11
+; MIPS64R6-NEXT: or $9, $9, $11
+; MIPS64R6-NEXT: and $9, $9, $3
+; MIPS64R6-NEXT: and $10, $8, $6
+; MIPS64R6-NEXT: or $10, $10, $9
+; MIPS64R6-NEXT: sc $10, 0($1)
+; MIPS64R6-NEXT: beqzc $10, .LBB5_1
+; MIPS64R6-NEXT: # %bb.2: # %entry
+; MIPS64R6-NEXT: and $7, $8, $3
+; MIPS64R6-NEXT: srlv $7, $7, $2
+; MIPS64R6-NEXT: seh $7, $7
+; MIPS64R6-NEXT: # %bb.3: # %entry
+; MIPS64R6-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64R6-NEXT: # %bb.4: # %entry
+; MIPS64R6-NEXT: sync
+; MIPS64R6-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64R6-NEXT: daddiu $sp, $sp, 16
+; MIPS64R6-NEXT: jrc $ra
+;
+; MIPS64EL-LABEL: test_min_16:
+; MIPS64EL: # %bb.0: # %entry
+; MIPS64EL-NEXT: daddiu $sp, $sp, -16
+; MIPS64EL-NEXT: .cfi_def_cfa_offset 16
+; MIPS64EL-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64EL-NEXT: sync
+; MIPS64EL-NEXT: daddiu $1, $zero, -4
+; MIPS64EL-NEXT: and $1, $4, $1
+; MIPS64EL-NEXT: andi $2, $4, 3
+; MIPS64EL-NEXT: sll $2, $2, 3
+; MIPS64EL-NEXT: ori $3, $zero, 65535
+; MIPS64EL-NEXT: sllv $3, $3, $2
+; MIPS64EL-NEXT: nor $6, $zero, $3
+; MIPS64EL-NEXT: sllv $5, $5, $2
+; MIPS64EL-NEXT: .LBB5_1: # %entry
+; MIPS64EL-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64EL-NEXT: ll $8, 0($1)
+; MIPS64EL-NEXT: and $8, $8, $3
+; MIPS64EL-NEXT: and $5, $5, $3
+; MIPS64EL-NEXT: slt $11, $8, $5
+; MIPS64EL-NEXT: move $9, $8
+; MIPS64EL-NEXT: movz $9, $5, $11
+; MIPS64EL-NEXT: and $9, $9, $3
+; MIPS64EL-NEXT: and $10, $8, $6
+; MIPS64EL-NEXT: or $10, $10, $9
+; MIPS64EL-NEXT: sc $10, 0($1)
+; MIPS64EL-NEXT: beqz $10, .LBB5_1
+; MIPS64EL-NEXT: nop
+; MIPS64EL-NEXT: # %bb.2: # %entry
+; MIPS64EL-NEXT: and $7, $8, $3
+; MIPS64EL-NEXT: srlv $7, $7, $2
+; MIPS64EL-NEXT: seh $7, $7
+; MIPS64EL-NEXT: # %bb.3: # %entry
+; MIPS64EL-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64EL-NEXT: # %bb.4: # %entry
+; MIPS64EL-NEXT: sync
+; MIPS64EL-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64EL-NEXT: daddiu $sp, $sp, 16
+; MIPS64EL-NEXT: jr $ra
+; MIPS64EL-NEXT: nop
+;
+; MIPS64ELR6-LABEL: test_min_16:
+; MIPS64ELR6: # %bb.0: # %entry
+; MIPS64ELR6-NEXT: daddiu $sp, $sp, -16
+; MIPS64ELR6-NEXT: .cfi_def_cfa_offset 16
+; MIPS64ELR6-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64ELR6-NEXT: sync
+; MIPS64ELR6-NEXT: daddiu $1, $zero, -4
+; MIPS64ELR6-NEXT: and $1, $4, $1
+; MIPS64ELR6-NEXT: andi $2, $4, 3
+; MIPS64ELR6-NEXT: sll $2, $2, 3
+; MIPS64ELR6-NEXT: ori $3, $zero, 65535
+; MIPS64ELR6-NEXT: sllv $3, $3, $2
+; MIPS64ELR6-NEXT: nor $6, $zero, $3
+; MIPS64ELR6-NEXT: sllv $5, $5, $2
+; MIPS64ELR6-NEXT: .LBB5_1: # %entry
+; MIPS64ELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64ELR6-NEXT: ll $8, 0($1)
+; MIPS64ELR6-NEXT: and $8, $8, $3
+; MIPS64ELR6-NEXT: and $5, $5, $3
+; MIPS64ELR6-NEXT: slt $11, $8, $5
+; MIPS64ELR6-NEXT: selnez $9, $8, $11
+; MIPS64ELR6-NEXT: seleqz $11, $5, $11
+; MIPS64ELR6-NEXT: or $9, $9, $11
+; MIPS64ELR6-NEXT: and $9, $9, $3
+; MIPS64ELR6-NEXT: and $10, $8, $6
+; MIPS64ELR6-NEXT: or $10, $10, $9
+; MIPS64ELR6-NEXT: sc $10, 0($1)
+; MIPS64ELR6-NEXT: beqzc $10, .LBB5_1
+; MIPS64ELR6-NEXT: # %bb.2: # %entry
+; MIPS64ELR6-NEXT: and $7, $8, $3
+; MIPS64ELR6-NEXT: srlv $7, $7, $2
+; MIPS64ELR6-NEXT: seh $7, $7
+; MIPS64ELR6-NEXT: # %bb.3: # %entry
+; MIPS64ELR6-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64ELR6-NEXT: # %bb.4: # %entry
+; MIPS64ELR6-NEXT: sync
+; MIPS64ELR6-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64ELR6-NEXT: daddiu $sp, $sp, 16
+; MIPS64ELR6-NEXT: jrc $ra
+entry:
+ %0 = atomicrmw min i16* %ptr, i16 %val seq_cst
+ ret i16 %0
+}
+
+define i16 @test_umax_16(i16* nocapture %ptr, i16 signext %val) {
+; MIPS-LABEL: test_umax_16:
+; MIPS: # %bb.0: # %entry
+; MIPS-NEXT: addiu $sp, $sp, -8
+; MIPS-NEXT: .cfi_def_cfa_offset 8
+; MIPS-NEXT: move $1, $5
+; MIPS-NEXT: sync
+; MIPS-NEXT: addiu $2, $zero, -4
+; MIPS-NEXT: and $2, $4, $2
+; MIPS-NEXT: andi $3, $4, 3
+; MIPS-NEXT: xori $3, $3, 2
+; MIPS-NEXT: sll $3, $3, 3
+; MIPS-NEXT: ori $4, $zero, 65535
+; MIPS-NEXT: sllv $4, $4, $3
+; MIPS-NEXT: nor $6, $zero, $4
+; MIPS-NEXT: sllv $5, $5, $3
+; MIPS-NEXT: $BB6_1: # %entry
+; MIPS-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS-NEXT: ll $8, 0($2)
+; MIPS-NEXT: sltu $11, $8, $5
+; MIPS-NEXT: move $9, $8
+; MIPS-NEXT: movn $9, $5, $11
+; MIPS-NEXT: and $9, $9, $4
+; MIPS-NEXT: and $10, $8, $6
+; MIPS-NEXT: or $10, $10, $9
+; MIPS-NEXT: sc $10, 0($2)
+; MIPS-NEXT: beqz $10, $BB6_1
+; MIPS-NEXT: nop
+; MIPS-NEXT: # %bb.2: # %entry
+; MIPS-NEXT: and $7, $8, $4
+; MIPS-NEXT: srlv $7, $7, $3
+; MIPS-NEXT: seh $7, $7
+; MIPS-NEXT: # %bb.3: # %entry
+; MIPS-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPS-NEXT: # %bb.4: # %entry
+; MIPS-NEXT: sync
+; MIPS-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPS-NEXT: addiu $sp, $sp, 8
+; MIPS-NEXT: jr $ra
+; MIPS-NEXT: nop
+;
+; MIPSR6-LABEL: test_umax_16:
+; MIPSR6: # %bb.0: # %entry
+; MIPSR6-NEXT: addiu $sp, $sp, -8
+; MIPSR6-NEXT: .cfi_def_cfa_offset 8
+; MIPSR6-NEXT: move $1, $5
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: addiu $2, $zero, -4
+; MIPSR6-NEXT: and $2, $4, $2
+; MIPSR6-NEXT: andi $3, $4, 3
+; MIPSR6-NEXT: xori $3, $3, 2
+; MIPSR6-NEXT: sll $3, $3, 3
+; MIPSR6-NEXT: ori $4, $zero, 65535
+; MIPSR6-NEXT: sllv $4, $4, $3
+; MIPSR6-NEXT: nor $6, $zero, $4
+; MIPSR6-NEXT: sllv $5, $5, $3
+; MIPSR6-NEXT: $BB6_1: # %entry
+; MIPSR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSR6-NEXT: ll $8, 0($2)
+; MIPSR6-NEXT: sltu $11, $8, $5
+; MIPSR6-NEXT: seleqz $9, $8, $11
+; MIPSR6-NEXT: selnez $11, $5, $11
+; MIPSR6-NEXT: or $9, $9, $11
+; MIPSR6-NEXT: and $9, $9, $4
+; MIPSR6-NEXT: and $10, $8, $6
+; MIPSR6-NEXT: or $10, $10, $9
+; MIPSR6-NEXT: sc $10, 0($2)
+; MIPSR6-NEXT: beqzc $10, $BB6_1
+; MIPSR6-NEXT: # %bb.2: # %entry
+; MIPSR6-NEXT: and $7, $8, $4
+; MIPSR6-NEXT: srlv $7, $7, $3
+; MIPSR6-NEXT: seh $7, $7
+; MIPSR6-NEXT: # %bb.3: # %entry
+; MIPSR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPSR6-NEXT: # %bb.4: # %entry
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPSR6-NEXT: addiu $sp, $sp, 8
+; MIPSR6-NEXT: jrc $ra
+;
+; MM-LABEL: test_umax_16:
+; MM: # %bb.0: # %entry
+; MM-NEXT: addiu $sp, $sp, -8
+; MM-NEXT: .cfi_def_cfa_offset 8
+; MM-NEXT: move $1, $5
+; MM-NEXT: sync
+; MM-NEXT: addiu $2, $zero, -4
+; MM-NEXT: and $2, $4, $2
+; MM-NEXT: andi $3, $4, 3
+; MM-NEXT: xori $3, $3, 2
+; MM-NEXT: sll $3, $3, 3
+; MM-NEXT: ori $4, $zero, 65535
+; MM-NEXT: sllv $4, $4, $3
+; MM-NEXT: nor $6, $zero, $4
+; MM-NEXT: sllv $5, $5, $3
+; MM-NEXT: $BB6_1: # %entry
+; MM-NEXT: # =>This Inner Loop Header: Depth=1
+; MM-NEXT: ll $8, 0($2)
+; MM-NEXT: sltu $11, $8, $5
+; MM-NEXT: or $9, $8, $zero
+; MM-NEXT: movn $9, $5, $11
+; MM-NEXT: and $9, $9, $4
+; MM-NEXT: and $10, $8, $6
+; MM-NEXT: or $10, $10, $9
+; MM-NEXT: sc $10, 0($2)
+; MM-NEXT: beqzc $10, $BB6_1
+; MM-NEXT: # %bb.2: # %entry
+; MM-NEXT: and $7, $8, $4
+; MM-NEXT: srlv $7, $7, $3
+; MM-NEXT: seh $7, $7
+; MM-NEXT: # %bb.3: # %entry
+; MM-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MM-NEXT: # %bb.4: # %entry
+; MM-NEXT: sync
+; MM-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MM-NEXT: addiusp 8
+; MM-NEXT: jrc $ra
+;
+; MMR6-LABEL: test_umax_16:
+; MMR6: # %bb.0: # %entry
+; MMR6-NEXT: addiu $sp, $sp, -8
+; MMR6-NEXT: .cfi_def_cfa_offset 8
+; MMR6-NEXT: move $1, $5
+; MMR6-NEXT: sync
+; MMR6-NEXT: addiu $2, $zero, -4
+; MMR6-NEXT: and $2, $4, $2
+; MMR6-NEXT: andi $3, $4, 3
+; MMR6-NEXT: xori $3, $3, 2
+; MMR6-NEXT: sll $3, $3, 3
+; MMR6-NEXT: ori $4, $zero, 65535
+; MMR6-NEXT: sllv $4, $4, $3
+; MMR6-NEXT: nor $6, $zero, $4
+; MMR6-NEXT: sllv $5, $5, $3
+; MMR6-NEXT: $BB6_1: # %entry
+; MMR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MMR6-NEXT: ll $8, 0($2)
+; MMR6-NEXT: sltu $11, $8, $5
+; MMR6-NEXT: seleqz $9, $8, $11
+; MMR6-NEXT: selnez $11, $5, $11
+; MMR6-NEXT: or $9, $9, $11
+; MMR6-NEXT: and $9, $9, $4
+; MMR6-NEXT: and $10, $8, $6
+; MMR6-NEXT: or $10, $10, $9
+; MMR6-NEXT: sc $10, 0($2)
+; MMR6-NEXT: beqc $10, $zero, $BB6_1
+; MMR6-NEXT: # %bb.2: # %entry
+; MMR6-NEXT: and $7, $8, $4
+; MMR6-NEXT: srlv $7, $7, $3
+; MMR6-NEXT: seh $7, $7
+; MMR6-NEXT: # %bb.3: # %entry
+; MMR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MMR6-NEXT: # %bb.4: # %entry
+; MMR6-NEXT: sync
+; MMR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MMR6-NEXT: addiu $sp, $sp, 8
+; MMR6-NEXT: jrc $ra
+;
+; MIPSEL-LABEL: test_umax_16:
+; MIPSEL: # %bb.0: # %entry
+; MIPSEL-NEXT: addiu $sp, $sp, -8
+; MIPSEL-NEXT: .cfi_def_cfa_offset 8
+; MIPSEL-NEXT: move $1, $5
+; MIPSEL-NEXT: sync
+; MIPSEL-NEXT: addiu $2, $zero, -4
+; MIPSEL-NEXT: and $2, $4, $2
+; MIPSEL-NEXT: andi $3, $4, 3
+; MIPSEL-NEXT: sll $3, $3, 3
+; MIPSEL-NEXT: ori $4, $zero, 65535
+; MIPSEL-NEXT: sllv $4, $4, $3
+; MIPSEL-NEXT: nor $6, $zero, $4
+; MIPSEL-NEXT: sllv $5, $5, $3
+; MIPSEL-NEXT: $BB6_1: # %entry
+; MIPSEL-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSEL-NEXT: ll $8, 0($2)
+; MIPSEL-NEXT: and $8, $8, $4
+; MIPSEL-NEXT: and $5, $5, $4
+; MIPSEL-NEXT: sltu $11, $8, $5
+; MIPSEL-NEXT: move $9, $8
+; MIPSEL-NEXT: movn $9, $5, $11
+; MIPSEL-NEXT: and $9, $9, $4
+; MIPSEL-NEXT: and $10, $8, $6
+; MIPSEL-NEXT: or $10, $10, $9
+; MIPSEL-NEXT: sc $10, 0($2)
+; MIPSEL-NEXT: beqz $10, $BB6_1
+; MIPSEL-NEXT: nop
+; MIPSEL-NEXT: # %bb.2: # %entry
+; MIPSEL-NEXT: and $7, $8, $4
+; MIPSEL-NEXT: srlv $7, $7, $3
+; MIPSEL-NEXT: seh $7, $7
+; MIPSEL-NEXT: # %bb.3: # %entry
+; MIPSEL-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPSEL-NEXT: # %bb.4: # %entry
+; MIPSEL-NEXT: sync
+; MIPSEL-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPSEL-NEXT: addiu $sp, $sp, 8
+; MIPSEL-NEXT: jr $ra
+; MIPSEL-NEXT: nop
+;
+; MIPSELR6-LABEL: test_umax_16:
+; MIPSELR6: # %bb.0: # %entry
+; MIPSELR6-NEXT: addiu $sp, $sp, -8
+; MIPSELR6-NEXT: .cfi_def_cfa_offset 8
+; MIPSELR6-NEXT: move $1, $5
+; MIPSELR6-NEXT: sync
+; MIPSELR6-NEXT: addiu $2, $zero, -4
+; MIPSELR6-NEXT: and $2, $4, $2
+; MIPSELR6-NEXT: andi $3, $4, 3
+; MIPSELR6-NEXT: sll $3, $3, 3
+; MIPSELR6-NEXT: ori $4, $zero, 65535
+; MIPSELR6-NEXT: sllv $4, $4, $3
+; MIPSELR6-NEXT: nor $6, $zero, $4
+; MIPSELR6-NEXT: sllv $5, $5, $3
+; MIPSELR6-NEXT: $BB6_1: # %entry
+; MIPSELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSELR6-NEXT: ll $8, 0($2)
+; MIPSELR6-NEXT: and $8, $8, $4
+; MIPSELR6-NEXT: and $5, $5, $4
+; MIPSELR6-NEXT: sltu $11, $8, $5
+; MIPSELR6-NEXT: seleqz $9, $8, $11
+; MIPSELR6-NEXT: selnez $11, $5, $11
+; MIPSELR6-NEXT: or $9, $9, $11
+; MIPSELR6-NEXT: and $9, $9, $4
+; MIPSELR6-NEXT: and $10, $8, $6
+; MIPSELR6-NEXT: or $10, $10, $9
+; MIPSELR6-NEXT: sc $10, 0($2)
+; MIPSELR6-NEXT: beqzc $10, $BB6_1
+; MIPSELR6-NEXT: # %bb.2: # %entry
+; MIPSELR6-NEXT: and $7, $8, $4
+; MIPSELR6-NEXT: srlv $7, $7, $3
+; MIPSELR6-NEXT: seh $7, $7
+; MIPSELR6-NEXT: # %bb.3: # %entry
+; MIPSELR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPSELR6-NEXT: # %bb.4: # %entry
+; MIPSELR6-NEXT: sync
+; MIPSELR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPSELR6-NEXT: addiu $sp, $sp, 8
+; MIPSELR6-NEXT: jrc $ra
+;
+; MMEL-LABEL: test_umax_16:
+; MMEL: # %bb.0: # %entry
+; MMEL-NEXT: addiu $sp, $sp, -8
+; MMEL-NEXT: .cfi_def_cfa_offset 8
+; MMEL-NEXT: move $1, $5
+; MMEL-NEXT: sync
+; MMEL-NEXT: addiu $2, $zero, -4
+; MMEL-NEXT: and $2, $4, $2
+; MMEL-NEXT: andi $3, $4, 3
+; MMEL-NEXT: sll $3, $3, 3
+; MMEL-NEXT: ori $4, $zero, 65535
+; MMEL-NEXT: sllv $4, $4, $3
+; MMEL-NEXT: nor $6, $zero, $4
+; MMEL-NEXT: sllv $5, $5, $3
+; MMEL-NEXT: $BB6_1: # %entry
+; MMEL-NEXT: # =>This Inner Loop Header: Depth=1
+; MMEL-NEXT: ll $8, 0($2)
+; MMEL-NEXT: and $8, $8, $4
+; MMEL-NEXT: and $5, $5, $4
+; MMEL-NEXT: sltu $11, $8, $5
+; MMEL-NEXT: or $9, $8, $zero
+; MMEL-NEXT: movn $9, $5, $11
+; MMEL-NEXT: and $9, $9, $4
+; MMEL-NEXT: and $10, $8, $6
+; MMEL-NEXT: or $10, $10, $9
+; MMEL-NEXT: sc $10, 0($2)
+; MMEL-NEXT: beqzc $10, $BB6_1
+; MMEL-NEXT: # %bb.2: # %entry
+; MMEL-NEXT: and $7, $8, $4
+; MMEL-NEXT: srlv $7, $7, $3
+; MMEL-NEXT: seh $7, $7
+; MMEL-NEXT: # %bb.3: # %entry
+; MMEL-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MMEL-NEXT: # %bb.4: # %entry
+; MMEL-NEXT: sync
+; MMEL-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MMEL-NEXT: addiusp 8
+; MMEL-NEXT: jrc $ra
+;
+; MMELR6-LABEL: test_umax_16:
+; MMELR6: # %bb.0: # %entry
+; MMELR6-NEXT: addiu $sp, $sp, -8
+; MMELR6-NEXT: .cfi_def_cfa_offset 8
+; MMELR6-NEXT: move $1, $5
+; MMELR6-NEXT: sync
+; MMELR6-NEXT: addiu $2, $zero, -4
+; MMELR6-NEXT: and $2, $4, $2
+; MMELR6-NEXT: andi $3, $4, 3
+; MMELR6-NEXT: sll $3, $3, 3
+; MMELR6-NEXT: ori $4, $zero, 65535
+; MMELR6-NEXT: sllv $4, $4, $3
+; MMELR6-NEXT: nor $6, $zero, $4
+; MMELR6-NEXT: sllv $5, $5, $3
+; MMELR6-NEXT: $BB6_1: # %entry
+; MMELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MMELR6-NEXT: ll $8, 0($2)
+; MMELR6-NEXT: and $8, $8, $4
+; MMELR6-NEXT: and $5, $5, $4
+; MMELR6-NEXT: sltu $11, $8, $5
+; MMELR6-NEXT: seleqz $9, $8, $11
+; MMELR6-NEXT: selnez $11, $5, $11
+; MMELR6-NEXT: or $9, $9, $11
+; MMELR6-NEXT: and $9, $9, $4
+; MMELR6-NEXT: and $10, $8, $6
+; MMELR6-NEXT: or $10, $10, $9
+; MMELR6-NEXT: sc $10, 0($2)
+; MMELR6-NEXT: beqc $10, $zero, $BB6_1
+; MMELR6-NEXT: # %bb.2: # %entry
+; MMELR6-NEXT: and $7, $8, $4
+; MMELR6-NEXT: srlv $7, $7, $3
+; MMELR6-NEXT: seh $7, $7
+; MMELR6-NEXT: # %bb.3: # %entry
+; MMELR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MMELR6-NEXT: # %bb.4: # %entry
+; MMELR6-NEXT: sync
+; MMELR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MMELR6-NEXT: addiu $sp, $sp, 8
+; MMELR6-NEXT: jrc $ra
+;
+; MIPS64-LABEL: test_umax_16:
+; MIPS64: # %bb.0: # %entry
+; MIPS64-NEXT: daddiu $sp, $sp, -16
+; MIPS64-NEXT: .cfi_def_cfa_offset 16
+; MIPS64-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64-NEXT: sync
+; MIPS64-NEXT: daddiu $1, $zero, -4
+; MIPS64-NEXT: and $1, $4, $1
+; MIPS64-NEXT: andi $2, $4, 3
+; MIPS64-NEXT: xori $2, $2, 2
+; MIPS64-NEXT: sll $2, $2, 3
+; MIPS64-NEXT: ori $3, $zero, 65535
+; MIPS64-NEXT: sllv $3, $3, $2
+; MIPS64-NEXT: nor $6, $zero, $3
+; MIPS64-NEXT: sllv $5, $5, $2
+; MIPS64-NEXT: .LBB6_1: # %entry
+; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64-NEXT: ll $8, 0($1)
+; MIPS64-NEXT: sltu $11, $8, $5
+; MIPS64-NEXT: move $9, $8
+; MIPS64-NEXT: movn $9, $5, $11
+; MIPS64-NEXT: and $9, $9, $3
+; MIPS64-NEXT: and $10, $8, $6
+; MIPS64-NEXT: or $10, $10, $9
+; MIPS64-NEXT: sc $10, 0($1)
+; MIPS64-NEXT: beqz $10, .LBB6_1
+; MIPS64-NEXT: nop
+; MIPS64-NEXT: # %bb.2: # %entry
+; MIPS64-NEXT: and $7, $8, $3
+; MIPS64-NEXT: srlv $7, $7, $2
+; MIPS64-NEXT: seh $7, $7
+; MIPS64-NEXT: # %bb.3: # %entry
+; MIPS64-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64-NEXT: # %bb.4: # %entry
+; MIPS64-NEXT: sync
+; MIPS64-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64-NEXT: daddiu $sp, $sp, 16
+; MIPS64-NEXT: jr $ra
+; MIPS64-NEXT: nop
+;
+; MIPS64R6-LABEL: test_umax_16:
+; MIPS64R6: # %bb.0: # %entry
+; MIPS64R6-NEXT: daddiu $sp, $sp, -16
+; MIPS64R6-NEXT: .cfi_def_cfa_offset 16
+; MIPS64R6-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64R6-NEXT: sync
+; MIPS64R6-NEXT: daddiu $1, $zero, -4
+; MIPS64R6-NEXT: and $1, $4, $1
+; MIPS64R6-NEXT: andi $2, $4, 3
+; MIPS64R6-NEXT: xori $2, $2, 2
+; MIPS64R6-NEXT: sll $2, $2, 3
+; MIPS64R6-NEXT: ori $3, $zero, 65535
+; MIPS64R6-NEXT: sllv $3, $3, $2
+; MIPS64R6-NEXT: nor $6, $zero, $3
+; MIPS64R6-NEXT: sllv $5, $5, $2
+; MIPS64R6-NEXT: .LBB6_1: # %entry
+; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64R6-NEXT: ll $8, 0($1)
+; MIPS64R6-NEXT: sltu $11, $8, $5
+; MIPS64R6-NEXT: seleqz $9, $8, $11
+; MIPS64R6-NEXT: selnez $11, $5, $11
+; MIPS64R6-NEXT: or $9, $9, $11
+; MIPS64R6-NEXT: and $9, $9, $3
+; MIPS64R6-NEXT: and $10, $8, $6
+; MIPS64R6-NEXT: or $10, $10, $9
+; MIPS64R6-NEXT: sc $10, 0($1)
+; MIPS64R6-NEXT: beqzc $10, .LBB6_1
+; MIPS64R6-NEXT: # %bb.2: # %entry
+; MIPS64R6-NEXT: and $7, $8, $3
+; MIPS64R6-NEXT: srlv $7, $7, $2
+; MIPS64R6-NEXT: seh $7, $7
+; MIPS64R6-NEXT: # %bb.3: # %entry
+; MIPS64R6-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64R6-NEXT: # %bb.4: # %entry
+; MIPS64R6-NEXT: sync
+; MIPS64R6-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64R6-NEXT: daddiu $sp, $sp, 16
+; MIPS64R6-NEXT: jrc $ra
+;
+; MIPS64EL-LABEL: test_umax_16:
+; MIPS64EL: # %bb.0: # %entry
+; MIPS64EL-NEXT: daddiu $sp, $sp, -16
+; MIPS64EL-NEXT: .cfi_def_cfa_offset 16
+; MIPS64EL-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64EL-NEXT: sync
+; MIPS64EL-NEXT: daddiu $1, $zero, -4
+; MIPS64EL-NEXT: and $1, $4, $1
+; MIPS64EL-NEXT: andi $2, $4, 3
+; MIPS64EL-NEXT: sll $2, $2, 3
+; MIPS64EL-NEXT: ori $3, $zero, 65535
+; MIPS64EL-NEXT: sllv $3, $3, $2
+; MIPS64EL-NEXT: nor $6, $zero, $3
+; MIPS64EL-NEXT: sllv $5, $5, $2
+; MIPS64EL-NEXT: .LBB6_1: # %entry
+; MIPS64EL-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64EL-NEXT: ll $8, 0($1)
+; MIPS64EL-NEXT: and $8, $8, $3
+; MIPS64EL-NEXT: and $5, $5, $3
+; MIPS64EL-NEXT: sltu $11, $8, $5
+; MIPS64EL-NEXT: move $9, $8
+; MIPS64EL-NEXT: movn $9, $5, $11
+; MIPS64EL-NEXT: and $9, $9, $3
+; MIPS64EL-NEXT: and $10, $8, $6
+; MIPS64EL-NEXT: or $10, $10, $9
+; MIPS64EL-NEXT: sc $10, 0($1)
+; MIPS64EL-NEXT: beqz $10, .LBB6_1
+; MIPS64EL-NEXT: nop
+; MIPS64EL-NEXT: # %bb.2: # %entry
+; MIPS64EL-NEXT: and $7, $8, $3
+; MIPS64EL-NEXT: srlv $7, $7, $2
+; MIPS64EL-NEXT: seh $7, $7
+; MIPS64EL-NEXT: # %bb.3: # %entry
+; MIPS64EL-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64EL-NEXT: # %bb.4: # %entry
+; MIPS64EL-NEXT: sync
+; MIPS64EL-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64EL-NEXT: daddiu $sp, $sp, 16
+; MIPS64EL-NEXT: jr $ra
+; MIPS64EL-NEXT: nop
+;
+; MIPS64ELR6-LABEL: test_umax_16:
+; MIPS64ELR6: # %bb.0: # %entry
+; MIPS64ELR6-NEXT: daddiu $sp, $sp, -16
+; MIPS64ELR6-NEXT: .cfi_def_cfa_offset 16
+; MIPS64ELR6-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64ELR6-NEXT: sync
+; MIPS64ELR6-NEXT: daddiu $1, $zero, -4
+; MIPS64ELR6-NEXT: and $1, $4, $1
+; MIPS64ELR6-NEXT: andi $2, $4, 3
+; MIPS64ELR6-NEXT: sll $2, $2, 3
+; MIPS64ELR6-NEXT: ori $3, $zero, 65535
+; MIPS64ELR6-NEXT: sllv $3, $3, $2
+; MIPS64ELR6-NEXT: nor $6, $zero, $3
+; MIPS64ELR6-NEXT: sllv $5, $5, $2
+; MIPS64ELR6-NEXT: .LBB6_1: # %entry
+; MIPS64ELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64ELR6-NEXT: ll $8, 0($1)
+; MIPS64ELR6-NEXT: and $8, $8, $3
+; MIPS64ELR6-NEXT: and $5, $5, $3
+; MIPS64ELR6-NEXT: sltu $11, $8, $5
+; MIPS64ELR6-NEXT: seleqz $9, $8, $11
+; MIPS64ELR6-NEXT: selnez $11, $5, $11
+; MIPS64ELR6-NEXT: or $9, $9, $11
+; MIPS64ELR6-NEXT: and $9, $9, $3
+; MIPS64ELR6-NEXT: and $10, $8, $6
+; MIPS64ELR6-NEXT: or $10, $10, $9
+; MIPS64ELR6-NEXT: sc $10, 0($1)
+; MIPS64ELR6-NEXT: beqzc $10, .LBB6_1
+; MIPS64ELR6-NEXT: # %bb.2: # %entry
+; MIPS64ELR6-NEXT: and $7, $8, $3
+; MIPS64ELR6-NEXT: srlv $7, $7, $2
+; MIPS64ELR6-NEXT: seh $7, $7
+; MIPS64ELR6-NEXT: # %bb.3: # %entry
+; MIPS64ELR6-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64ELR6-NEXT: # %bb.4: # %entry
+; MIPS64ELR6-NEXT: sync
+; MIPS64ELR6-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64ELR6-NEXT: daddiu $sp, $sp, 16
+; MIPS64ELR6-NEXT: jrc $ra
+entry:
+ %0 = atomicrmw umax i16* %ptr, i16 %val seq_cst
+ ret i16 %0
+}
+
+define i16 @test_umin_16(i16* nocapture %ptr, i16 signext %val) {
+; MIPS-LABEL: test_umin_16:
+; MIPS: # %bb.0: # %entry
+; MIPS-NEXT: addiu $sp, $sp, -8
+; MIPS-NEXT: .cfi_def_cfa_offset 8
+; MIPS-NEXT: move $1, $5
+; MIPS-NEXT: sync
+; MIPS-NEXT: addiu $2, $zero, -4
+; MIPS-NEXT: and $2, $4, $2
+; MIPS-NEXT: andi $3, $4, 3
+; MIPS-NEXT: xori $3, $3, 2
+; MIPS-NEXT: sll $3, $3, 3
+; MIPS-NEXT: ori $4, $zero, 65535
+; MIPS-NEXT: sllv $4, $4, $3
+; MIPS-NEXT: nor $6, $zero, $4
+; MIPS-NEXT: sllv $5, $5, $3
+; MIPS-NEXT: $BB7_1: # %entry
+; MIPS-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS-NEXT: ll $8, 0($2)
+; MIPS-NEXT: sltu $11, $8, $5
+; MIPS-NEXT: move $9, $8
+; MIPS-NEXT: movz $9, $5, $11
+; MIPS-NEXT: and $9, $9, $4
+; MIPS-NEXT: and $10, $8, $6
+; MIPS-NEXT: or $10, $10, $9
+; MIPS-NEXT: sc $10, 0($2)
+; MIPS-NEXT: beqz $10, $BB7_1
+; MIPS-NEXT: nop
+; MIPS-NEXT: # %bb.2: # %entry
+; MIPS-NEXT: and $7, $8, $4
+; MIPS-NEXT: srlv $7, $7, $3
+; MIPS-NEXT: seh $7, $7
+; MIPS-NEXT: # %bb.3: # %entry
+; MIPS-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPS-NEXT: # %bb.4: # %entry
+; MIPS-NEXT: sync
+; MIPS-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPS-NEXT: addiu $sp, $sp, 8
+; MIPS-NEXT: jr $ra
+; MIPS-NEXT: nop
+;
+; MIPSR6-LABEL: test_umin_16:
+; MIPSR6: # %bb.0: # %entry
+; MIPSR6-NEXT: addiu $sp, $sp, -8
+; MIPSR6-NEXT: .cfi_def_cfa_offset 8
+; MIPSR6-NEXT: move $1, $5
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: addiu $2, $zero, -4
+; MIPSR6-NEXT: and $2, $4, $2
+; MIPSR6-NEXT: andi $3, $4, 3
+; MIPSR6-NEXT: xori $3, $3, 2
+; MIPSR6-NEXT: sll $3, $3, 3
+; MIPSR6-NEXT: ori $4, $zero, 65535
+; MIPSR6-NEXT: sllv $4, $4, $3
+; MIPSR6-NEXT: nor $6, $zero, $4
+; MIPSR6-NEXT: sllv $5, $5, $3
+; MIPSR6-NEXT: $BB7_1: # %entry
+; MIPSR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSR6-NEXT: ll $8, 0($2)
+; MIPSR6-NEXT: sltu $11, $8, $5
+; MIPSR6-NEXT: selnez $9, $8, $11
+; MIPSR6-NEXT: seleqz $11, $5, $11
+; MIPSR6-NEXT: or $9, $9, $11
+; MIPSR6-NEXT: and $9, $9, $4
+; MIPSR6-NEXT: and $10, $8, $6
+; MIPSR6-NEXT: or $10, $10, $9
+; MIPSR6-NEXT: sc $10, 0($2)
+; MIPSR6-NEXT: beqzc $10, $BB7_1
+; MIPSR6-NEXT: # %bb.2: # %entry
+; MIPSR6-NEXT: and $7, $8, $4
+; MIPSR6-NEXT: srlv $7, $7, $3
+; MIPSR6-NEXT: seh $7, $7
+; MIPSR6-NEXT: # %bb.3: # %entry
+; MIPSR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPSR6-NEXT: # %bb.4: # %entry
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPSR6-NEXT: addiu $sp, $sp, 8
+; MIPSR6-NEXT: jrc $ra
+;
+; MM-LABEL: test_umin_16:
+; MM: # %bb.0: # %entry
+; MM-NEXT: addiu $sp, $sp, -8
+; MM-NEXT: .cfi_def_cfa_offset 8
+; MM-NEXT: move $1, $5
+; MM-NEXT: sync
+; MM-NEXT: addiu $2, $zero, -4
+; MM-NEXT: and $2, $4, $2
+; MM-NEXT: andi $3, $4, 3
+; MM-NEXT: xori $3, $3, 2
+; MM-NEXT: sll $3, $3, 3
+; MM-NEXT: ori $4, $zero, 65535
+; MM-NEXT: sllv $4, $4, $3
+; MM-NEXT: nor $6, $zero, $4
+; MM-NEXT: sllv $5, $5, $3
+; MM-NEXT: $BB7_1: # %entry
+; MM-NEXT: # =>This Inner Loop Header: Depth=1
+; MM-NEXT: ll $8, 0($2)
+; MM-NEXT: sltu $11, $8, $5
+; MM-NEXT: or $9, $8, $zero
+; MM-NEXT: movz $9, $5, $11
+; MM-NEXT: and $9, $9, $4
+; MM-NEXT: and $10, $8, $6
+; MM-NEXT: or $10, $10, $9
+; MM-NEXT: sc $10, 0($2)
+; MM-NEXT: beqzc $10, $BB7_1
+; MM-NEXT: # %bb.2: # %entry
+; MM-NEXT: and $7, $8, $4
+; MM-NEXT: srlv $7, $7, $3
+; MM-NEXT: seh $7, $7
+; MM-NEXT: # %bb.3: # %entry
+; MM-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MM-NEXT: # %bb.4: # %entry
+; MM-NEXT: sync
+; MM-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MM-NEXT: addiusp 8
+; MM-NEXT: jrc $ra
+;
+; MMR6-LABEL: test_umin_16:
+; MMR6: # %bb.0: # %entry
+; MMR6-NEXT: addiu $sp, $sp, -8
+; MMR6-NEXT: .cfi_def_cfa_offset 8
+; MMR6-NEXT: move $1, $5
+; MMR6-NEXT: sync
+; MMR6-NEXT: addiu $2, $zero, -4
+; MMR6-NEXT: and $2, $4, $2
+; MMR6-NEXT: andi $3, $4, 3
+; MMR6-NEXT: xori $3, $3, 2
+; MMR6-NEXT: sll $3, $3, 3
+; MMR6-NEXT: ori $4, $zero, 65535
+; MMR6-NEXT: sllv $4, $4, $3
+; MMR6-NEXT: nor $6, $zero, $4
+; MMR6-NEXT: sllv $5, $5, $3
+; MMR6-NEXT: $BB7_1: # %entry
+; MMR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MMR6-NEXT: ll $8, 0($2)
+; MMR6-NEXT: sltu $11, $8, $5
+; MMR6-NEXT: selnez $9, $8, $11
+; MMR6-NEXT: seleqz $11, $5, $11
+; MMR6-NEXT: or $9, $9, $11
+; MMR6-NEXT: and $9, $9, $4
+; MMR6-NEXT: and $10, $8, $6
+; MMR6-NEXT: or $10, $10, $9
+; MMR6-NEXT: sc $10, 0($2)
+; MMR6-NEXT: beqc $10, $zero, $BB7_1
+; MMR6-NEXT: # %bb.2: # %entry
+; MMR6-NEXT: and $7, $8, $4
+; MMR6-NEXT: srlv $7, $7, $3
+; MMR6-NEXT: seh $7, $7
+; MMR6-NEXT: # %bb.3: # %entry
+; MMR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MMR6-NEXT: # %bb.4: # %entry
+; MMR6-NEXT: sync
+; MMR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MMR6-NEXT: addiu $sp, $sp, 8
+; MMR6-NEXT: jrc $ra
+;
+; MIPSEL-LABEL: test_umin_16:
+; MIPSEL: # %bb.0: # %entry
+; MIPSEL-NEXT: addiu $sp, $sp, -8
+; MIPSEL-NEXT: .cfi_def_cfa_offset 8
+; MIPSEL-NEXT: move $1, $5
+; MIPSEL-NEXT: sync
+; MIPSEL-NEXT: addiu $2, $zero, -4
+; MIPSEL-NEXT: and $2, $4, $2
+; MIPSEL-NEXT: andi $3, $4, 3
+; MIPSEL-NEXT: sll $3, $3, 3
+; MIPSEL-NEXT: ori $4, $zero, 65535
+; MIPSEL-NEXT: sllv $4, $4, $3
+; MIPSEL-NEXT: nor $6, $zero, $4
+; MIPSEL-NEXT: sllv $5, $5, $3
+; MIPSEL-NEXT: $BB7_1: # %entry
+; MIPSEL-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSEL-NEXT: ll $8, 0($2)
+; MIPSEL-NEXT: and $8, $8, $4
+; MIPSEL-NEXT: and $5, $5, $4
+; MIPSEL-NEXT: sltu $11, $8, $5
+; MIPSEL-NEXT: move $9, $8
+; MIPSEL-NEXT: movz $9, $5, $11
+; MIPSEL-NEXT: and $9, $9, $4
+; MIPSEL-NEXT: and $10, $8, $6
+; MIPSEL-NEXT: or $10, $10, $9
+; MIPSEL-NEXT: sc $10, 0($2)
+; MIPSEL-NEXT: beqz $10, $BB7_1
+; MIPSEL-NEXT: nop
+; MIPSEL-NEXT: # %bb.2: # %entry
+; MIPSEL-NEXT: and $7, $8, $4
+; MIPSEL-NEXT: srlv $7, $7, $3
+; MIPSEL-NEXT: seh $7, $7
+; MIPSEL-NEXT: # %bb.3: # %entry
+; MIPSEL-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPSEL-NEXT: # %bb.4: # %entry
+; MIPSEL-NEXT: sync
+; MIPSEL-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPSEL-NEXT: addiu $sp, $sp, 8
+; MIPSEL-NEXT: jr $ra
+; MIPSEL-NEXT: nop
+;
+; MIPSELR6-LABEL: test_umin_16:
+; MIPSELR6: # %bb.0: # %entry
+; MIPSELR6-NEXT: addiu $sp, $sp, -8
+; MIPSELR6-NEXT: .cfi_def_cfa_offset 8
+; MIPSELR6-NEXT: move $1, $5
+; MIPSELR6-NEXT: sync
+; MIPSELR6-NEXT: addiu $2, $zero, -4
+; MIPSELR6-NEXT: and $2, $4, $2
+; MIPSELR6-NEXT: andi $3, $4, 3
+; MIPSELR6-NEXT: sll $3, $3, 3
+; MIPSELR6-NEXT: ori $4, $zero, 65535
+; MIPSELR6-NEXT: sllv $4, $4, $3
+; MIPSELR6-NEXT: nor $6, $zero, $4
+; MIPSELR6-NEXT: sllv $5, $5, $3
+; MIPSELR6-NEXT: $BB7_1: # %entry
+; MIPSELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSELR6-NEXT: ll $8, 0($2)
+; MIPSELR6-NEXT: and $8, $8, $4
+; MIPSELR6-NEXT: and $5, $5, $4
+; MIPSELR6-NEXT: sltu $11, $8, $5
+; MIPSELR6-NEXT: selnez $9, $8, $11
+; MIPSELR6-NEXT: seleqz $11, $5, $11
+; MIPSELR6-NEXT: or $9, $9, $11
+; MIPSELR6-NEXT: and $9, $9, $4
+; MIPSELR6-NEXT: and $10, $8, $6
+; MIPSELR6-NEXT: or $10, $10, $9
+; MIPSELR6-NEXT: sc $10, 0($2)
+; MIPSELR6-NEXT: beqzc $10, $BB7_1
+; MIPSELR6-NEXT: # %bb.2: # %entry
+; MIPSELR6-NEXT: and $7, $8, $4
+; MIPSELR6-NEXT: srlv $7, $7, $3
+; MIPSELR6-NEXT: seh $7, $7
+; MIPSELR6-NEXT: # %bb.3: # %entry
+; MIPSELR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPSELR6-NEXT: # %bb.4: # %entry
+; MIPSELR6-NEXT: sync
+; MIPSELR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPSELR6-NEXT: addiu $sp, $sp, 8
+; MIPSELR6-NEXT: jrc $ra
+;
+; MMEL-LABEL: test_umin_16:
+; MMEL: # %bb.0: # %entry
+; MMEL-NEXT: addiu $sp, $sp, -8
+; MMEL-NEXT: .cfi_def_cfa_offset 8
+; MMEL-NEXT: move $1, $5
+; MMEL-NEXT: sync
+; MMEL-NEXT: addiu $2, $zero, -4
+; MMEL-NEXT: and $2, $4, $2
+; MMEL-NEXT: andi $3, $4, 3
+; MMEL-NEXT: sll $3, $3, 3
+; MMEL-NEXT: ori $4, $zero, 65535
+; MMEL-NEXT: sllv $4, $4, $3
+; MMEL-NEXT: nor $6, $zero, $4
+; MMEL-NEXT: sllv $5, $5, $3
+; MMEL-NEXT: $BB7_1: # %entry
+; MMEL-NEXT: # =>This Inner Loop Header: Depth=1
+; MMEL-NEXT: ll $8, 0($2)
+; MMEL-NEXT: and $8, $8, $4
+; MMEL-NEXT: and $5, $5, $4
+; MMEL-NEXT: sltu $11, $8, $5
+; MMEL-NEXT: or $9, $8, $zero
+; MMEL-NEXT: movz $9, $5, $11
+; MMEL-NEXT: and $9, $9, $4
+; MMEL-NEXT: and $10, $8, $6
+; MMEL-NEXT: or $10, $10, $9
+; MMEL-NEXT: sc $10, 0($2)
+; MMEL-NEXT: beqzc $10, $BB7_1
+; MMEL-NEXT: # %bb.2: # %entry
+; MMEL-NEXT: and $7, $8, $4
+; MMEL-NEXT: srlv $7, $7, $3
+; MMEL-NEXT: seh $7, $7
+; MMEL-NEXT: # %bb.3: # %entry
+; MMEL-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MMEL-NEXT: # %bb.4: # %entry
+; MMEL-NEXT: sync
+; MMEL-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MMEL-NEXT: addiusp 8
+; MMEL-NEXT: jrc $ra
+;
+; MMELR6-LABEL: test_umin_16:
+; MMELR6: # %bb.0: # %entry
+; MMELR6-NEXT: addiu $sp, $sp, -8
+; MMELR6-NEXT: .cfi_def_cfa_offset 8
+; MMELR6-NEXT: move $1, $5
+; MMELR6-NEXT: sync
+; MMELR6-NEXT: addiu $2, $zero, -4
+; MMELR6-NEXT: and $2, $4, $2
+; MMELR6-NEXT: andi $3, $4, 3
+; MMELR6-NEXT: sll $3, $3, 3
+; MMELR6-NEXT: ori $4, $zero, 65535
+; MMELR6-NEXT: sllv $4, $4, $3
+; MMELR6-NEXT: nor $6, $zero, $4
+; MMELR6-NEXT: sllv $5, $5, $3
+; MMELR6-NEXT: $BB7_1: # %entry
+; MMELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MMELR6-NEXT: ll $8, 0($2)
+; MMELR6-NEXT: and $8, $8, $4
+; MMELR6-NEXT: and $5, $5, $4
+; MMELR6-NEXT: sltu $11, $8, $5
+; MMELR6-NEXT: selnez $9, $8, $11
+; MMELR6-NEXT: seleqz $11, $5, $11
+; MMELR6-NEXT: or $9, $9, $11
+; MMELR6-NEXT: and $9, $9, $4
+; MMELR6-NEXT: and $10, $8, $6
+; MMELR6-NEXT: or $10, $10, $9
+; MMELR6-NEXT: sc $10, 0($2)
+; MMELR6-NEXT: beqc $10, $zero, $BB7_1
+; MMELR6-NEXT: # %bb.2: # %entry
+; MMELR6-NEXT: and $7, $8, $4
+; MMELR6-NEXT: srlv $7, $7, $3
+; MMELR6-NEXT: seh $7, $7
+; MMELR6-NEXT: # %bb.3: # %entry
+; MMELR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MMELR6-NEXT: # %bb.4: # %entry
+; MMELR6-NEXT: sync
+; MMELR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MMELR6-NEXT: addiu $sp, $sp, 8
+; MMELR6-NEXT: jrc $ra
+;
+; MIPS64-LABEL: test_umin_16:
+; MIPS64: # %bb.0: # %entry
+; MIPS64-NEXT: daddiu $sp, $sp, -16
+; MIPS64-NEXT: .cfi_def_cfa_offset 16
+; MIPS64-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64-NEXT: sync
+; MIPS64-NEXT: daddiu $1, $zero, -4
+; MIPS64-NEXT: and $1, $4, $1
+; MIPS64-NEXT: andi $2, $4, 3
+; MIPS64-NEXT: xori $2, $2, 2
+; MIPS64-NEXT: sll $2, $2, 3
+; MIPS64-NEXT: ori $3, $zero, 65535
+; MIPS64-NEXT: sllv $3, $3, $2
+; MIPS64-NEXT: nor $6, $zero, $3
+; MIPS64-NEXT: sllv $5, $5, $2
+; MIPS64-NEXT: .LBB7_1: # %entry
+; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64-NEXT: ll $8, 0($1)
+; MIPS64-NEXT: sltu $11, $8, $5
+; MIPS64-NEXT: move $9, $8
+; MIPS64-NEXT: movz $9, $5, $11
+; MIPS64-NEXT: and $9, $9, $3
+; MIPS64-NEXT: and $10, $8, $6
+; MIPS64-NEXT: or $10, $10, $9
+; MIPS64-NEXT: sc $10, 0($1)
+; MIPS64-NEXT: beqz $10, .LBB7_1
+; MIPS64-NEXT: nop
+; MIPS64-NEXT: # %bb.2: # %entry
+; MIPS64-NEXT: and $7, $8, $3
+; MIPS64-NEXT: srlv $7, $7, $2
+; MIPS64-NEXT: seh $7, $7
+; MIPS64-NEXT: # %bb.3: # %entry
+; MIPS64-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64-NEXT: # %bb.4: # %entry
+; MIPS64-NEXT: sync
+; MIPS64-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64-NEXT: daddiu $sp, $sp, 16
+; MIPS64-NEXT: jr $ra
+; MIPS64-NEXT: nop
+;
+; MIPS64R6-LABEL: test_umin_16:
+; MIPS64R6: # %bb.0: # %entry
+; MIPS64R6-NEXT: daddiu $sp, $sp, -16
+; MIPS64R6-NEXT: .cfi_def_cfa_offset 16
+; MIPS64R6-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64R6-NEXT: sync
+; MIPS64R6-NEXT: daddiu $1, $zero, -4
+; MIPS64R6-NEXT: and $1, $4, $1
+; MIPS64R6-NEXT: andi $2, $4, 3
+; MIPS64R6-NEXT: xori $2, $2, 2
+; MIPS64R6-NEXT: sll $2, $2, 3
+; MIPS64R6-NEXT: ori $3, $zero, 65535
+; MIPS64R6-NEXT: sllv $3, $3, $2
+; MIPS64R6-NEXT: nor $6, $zero, $3
+; MIPS64R6-NEXT: sllv $5, $5, $2
+; MIPS64R6-NEXT: .LBB7_1: # %entry
+; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64R6-NEXT: ll $8, 0($1)
+; MIPS64R6-NEXT: sltu $11, $8, $5
+; MIPS64R6-NEXT: selnez $9, $8, $11
+; MIPS64R6-NEXT: seleqz $11, $5, $11
+; MIPS64R6-NEXT: or $9, $9, $11
+; MIPS64R6-NEXT: and $9, $9, $3
+; MIPS64R6-NEXT: and $10, $8, $6
+; MIPS64R6-NEXT: or $10, $10, $9
+; MIPS64R6-NEXT: sc $10, 0($1)
+; MIPS64R6-NEXT: beqzc $10, .LBB7_1
+; MIPS64R6-NEXT: # %bb.2: # %entry
+; MIPS64R6-NEXT: and $7, $8, $3
+; MIPS64R6-NEXT: srlv $7, $7, $2
+; MIPS64R6-NEXT: seh $7, $7
+; MIPS64R6-NEXT: # %bb.3: # %entry
+; MIPS64R6-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64R6-NEXT: # %bb.4: # %entry
+; MIPS64R6-NEXT: sync
+; MIPS64R6-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64R6-NEXT: daddiu $sp, $sp, 16
+; MIPS64R6-NEXT: jrc $ra
+;
+; MIPS64EL-LABEL: test_umin_16:
+; MIPS64EL: # %bb.0: # %entry
+; MIPS64EL-NEXT: daddiu $sp, $sp, -16
+; MIPS64EL-NEXT: .cfi_def_cfa_offset 16
+; MIPS64EL-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64EL-NEXT: sync
+; MIPS64EL-NEXT: daddiu $1, $zero, -4
+; MIPS64EL-NEXT: and $1, $4, $1
+; MIPS64EL-NEXT: andi $2, $4, 3
+; MIPS64EL-NEXT: sll $2, $2, 3
+; MIPS64EL-NEXT: ori $3, $zero, 65535
+; MIPS64EL-NEXT: sllv $3, $3, $2
+; MIPS64EL-NEXT: nor $6, $zero, $3
+; MIPS64EL-NEXT: sllv $5, $5, $2
+; MIPS64EL-NEXT: .LBB7_1: # %entry
+; MIPS64EL-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64EL-NEXT: ll $8, 0($1)
+; MIPS64EL-NEXT: and $8, $8, $3
+; MIPS64EL-NEXT: and $5, $5, $3
+; MIPS64EL-NEXT: sltu $11, $8, $5
+; MIPS64EL-NEXT: move $9, $8
+; MIPS64EL-NEXT: movz $9, $5, $11
+; MIPS64EL-NEXT: and $9, $9, $3
+; MIPS64EL-NEXT: and $10, $8, $6
+; MIPS64EL-NEXT: or $10, $10, $9
+; MIPS64EL-NEXT: sc $10, 0($1)
+; MIPS64EL-NEXT: beqz $10, .LBB7_1
+; MIPS64EL-NEXT: nop
+; MIPS64EL-NEXT: # %bb.2: # %entry
+; MIPS64EL-NEXT: and $7, $8, $3
+; MIPS64EL-NEXT: srlv $7, $7, $2
+; MIPS64EL-NEXT: seh $7, $7
+; MIPS64EL-NEXT: # %bb.3: # %entry
+; MIPS64EL-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64EL-NEXT: # %bb.4: # %entry
+; MIPS64EL-NEXT: sync
+; MIPS64EL-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64EL-NEXT: daddiu $sp, $sp, 16
+; MIPS64EL-NEXT: jr $ra
+; MIPS64EL-NEXT: nop
+;
+; MIPS64ELR6-LABEL: test_umin_16:
+; MIPS64ELR6: # %bb.0: # %entry
+; MIPS64ELR6-NEXT: daddiu $sp, $sp, -16
+; MIPS64ELR6-NEXT: .cfi_def_cfa_offset 16
+; MIPS64ELR6-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64ELR6-NEXT: sync
+; MIPS64ELR6-NEXT: daddiu $1, $zero, -4
+; MIPS64ELR6-NEXT: and $1, $4, $1
+; MIPS64ELR6-NEXT: andi $2, $4, 3
+; MIPS64ELR6-NEXT: sll $2, $2, 3
+; MIPS64ELR6-NEXT: ori $3, $zero, 65535
+; MIPS64ELR6-NEXT: sllv $3, $3, $2
+; MIPS64ELR6-NEXT: nor $6, $zero, $3
+; MIPS64ELR6-NEXT: sllv $5, $5, $2
+; MIPS64ELR6-NEXT: .LBB7_1: # %entry
+; MIPS64ELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64ELR6-NEXT: ll $8, 0($1)
+; MIPS64ELR6-NEXT: and $8, $8, $3
+; MIPS64ELR6-NEXT: and $5, $5, $3
+; MIPS64ELR6-NEXT: sltu $11, $8, $5
+; MIPS64ELR6-NEXT: selnez $9, $8, $11
+; MIPS64ELR6-NEXT: seleqz $11, $5, $11
+; MIPS64ELR6-NEXT: or $9, $9, $11
+; MIPS64ELR6-NEXT: and $9, $9, $3
+; MIPS64ELR6-NEXT: and $10, $8, $6
+; MIPS64ELR6-NEXT: or $10, $10, $9
+; MIPS64ELR6-NEXT: sc $10, 0($1)
+; MIPS64ELR6-NEXT: beqzc $10, .LBB7_1
+; MIPS64ELR6-NEXT: # %bb.2: # %entry
+; MIPS64ELR6-NEXT: and $7, $8, $3
+; MIPS64ELR6-NEXT: srlv $7, $7, $2
+; MIPS64ELR6-NEXT: seh $7, $7
+; MIPS64ELR6-NEXT: # %bb.3: # %entry
+; MIPS64ELR6-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64ELR6-NEXT: # %bb.4: # %entry
+; MIPS64ELR6-NEXT: sync
+; MIPS64ELR6-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64ELR6-NEXT: daddiu $sp, $sp, 16
+; MIPS64ELR6-NEXT: jrc $ra
+entry:
+ %0 = atomicrmw umin i16* %ptr, i16 %val seq_cst
+ ret i16 %0
+}
+
+
+define i8 @test_max_8(i8* nocapture %ptr, i8 signext %val) {
+; MIPS-LABEL: test_max_8:
+; MIPS: # %bb.0: # %entry
+; MIPS-NEXT: addiu $sp, $sp, -8
+; MIPS-NEXT: .cfi_def_cfa_offset 8
+; MIPS-NEXT: move $1, $5
+; MIPS-NEXT: sync
+; MIPS-NEXT: addiu $2, $zero, -4
+; MIPS-NEXT: and $2, $4, $2
+; MIPS-NEXT: andi $3, $4, 3
+; MIPS-NEXT: xori $3, $3, 3
+; MIPS-NEXT: sll $3, $3, 3
+; MIPS-NEXT: ori $4, $zero, 255
+; MIPS-NEXT: sllv $4, $4, $3
+; MIPS-NEXT: nor $6, $zero, $4
+; MIPS-NEXT: sllv $5, $5, $3
+; MIPS-NEXT: $BB8_1: # %entry
+; MIPS-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS-NEXT: ll $8, 0($2)
+; MIPS-NEXT: slt $11, $8, $5
+; MIPS-NEXT: move $9, $8
+; MIPS-NEXT: movn $9, $5, $11
+; MIPS-NEXT: and $9, $9, $4
+; MIPS-NEXT: and $10, $8, $6
+; MIPS-NEXT: or $10, $10, $9
+; MIPS-NEXT: sc $10, 0($2)
+; MIPS-NEXT: beqz $10, $BB8_1
+; MIPS-NEXT: nop
+; MIPS-NEXT: # %bb.2: # %entry
+; MIPS-NEXT: and $7, $8, $4
+; MIPS-NEXT: srlv $7, $7, $3
+; MIPS-NEXT: seh $7, $7
+; MIPS-NEXT: # %bb.3: # %entry
+; MIPS-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPS-NEXT: # %bb.4: # %entry
+; MIPS-NEXT: sync
+; MIPS-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPS-NEXT: addiu $sp, $sp, 8
+; MIPS-NEXT: jr $ra
+; MIPS-NEXT: nop
+;
+; MIPSR6-LABEL: test_max_8:
+; MIPSR6: # %bb.0: # %entry
+; MIPSR6-NEXT: addiu $sp, $sp, -8
+; MIPSR6-NEXT: .cfi_def_cfa_offset 8
+; MIPSR6-NEXT: move $1, $5
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: addiu $2, $zero, -4
+; MIPSR6-NEXT: and $2, $4, $2
+; MIPSR6-NEXT: andi $3, $4, 3
+; MIPSR6-NEXT: xori $3, $3, 3
+; MIPSR6-NEXT: sll $3, $3, 3
+; MIPSR6-NEXT: ori $4, $zero, 255
+; MIPSR6-NEXT: sllv $4, $4, $3
+; MIPSR6-NEXT: nor $6, $zero, $4
+; MIPSR6-NEXT: sllv $5, $5, $3
+; MIPSR6-NEXT: $BB8_1: # %entry
+; MIPSR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSR6-NEXT: ll $8, 0($2)
+; MIPSR6-NEXT: slt $11, $8, $5
+; MIPSR6-NEXT: seleqz $9, $8, $11
+; MIPSR6-NEXT: selnez $11, $5, $11
+; MIPSR6-NEXT: or $9, $9, $11
+; MIPSR6-NEXT: and $9, $9, $4
+; MIPSR6-NEXT: and $10, $8, $6
+; MIPSR6-NEXT: or $10, $10, $9
+; MIPSR6-NEXT: sc $10, 0($2)
+; MIPSR6-NEXT: beqzc $10, $BB8_1
+; MIPSR6-NEXT: # %bb.2: # %entry
+; MIPSR6-NEXT: and $7, $8, $4
+; MIPSR6-NEXT: srlv $7, $7, $3
+; MIPSR6-NEXT: seh $7, $7
+; MIPSR6-NEXT: # %bb.3: # %entry
+; MIPSR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPSR6-NEXT: # %bb.4: # %entry
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPSR6-NEXT: addiu $sp, $sp, 8
+; MIPSR6-NEXT: jrc $ra
+;
+; MM-LABEL: test_max_8:
+; MM: # %bb.0: # %entry
+; MM-NEXT: addiu $sp, $sp, -8
+; MM-NEXT: .cfi_def_cfa_offset 8
+; MM-NEXT: move $1, $5
+; MM-NEXT: sync
+; MM-NEXT: addiu $2, $zero, -4
+; MM-NEXT: and $2, $4, $2
+; MM-NEXT: andi $3, $4, 3
+; MM-NEXT: xori $3, $3, 3
+; MM-NEXT: sll $3, $3, 3
+; MM-NEXT: ori $4, $zero, 255
+; MM-NEXT: sllv $4, $4, $3
+; MM-NEXT: nor $6, $zero, $4
+; MM-NEXT: sllv $5, $5, $3
+; MM-NEXT: $BB8_1: # %entry
+; MM-NEXT: # =>This Inner Loop Header: Depth=1
+; MM-NEXT: ll $8, 0($2)
+; MM-NEXT: slt $11, $8, $5
+; MM-NEXT: or $9, $8, $zero
+; MM-NEXT: movn $9, $5, $11
+; MM-NEXT: and $9, $9, $4
+; MM-NEXT: and $10, $8, $6
+; MM-NEXT: or $10, $10, $9
+; MM-NEXT: sc $10, 0($2)
+; MM-NEXT: beqzc $10, $BB8_1
+; MM-NEXT: # %bb.2: # %entry
+; MM-NEXT: and $7, $8, $4
+; MM-NEXT: srlv $7, $7, $3
+; MM-NEXT: seh $7, $7
+; MM-NEXT: # %bb.3: # %entry
+; MM-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MM-NEXT: # %bb.4: # %entry
+; MM-NEXT: sync
+; MM-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MM-NEXT: addiusp 8
+; MM-NEXT: jrc $ra
+;
+; MMR6-LABEL: test_max_8:
+; MMR6: # %bb.0: # %entry
+; MMR6-NEXT: addiu $sp, $sp, -8
+; MMR6-NEXT: .cfi_def_cfa_offset 8
+; MMR6-NEXT: move $1, $5
+; MMR6-NEXT: sync
+; MMR6-NEXT: addiu $2, $zero, -4
+; MMR6-NEXT: and $2, $4, $2
+; MMR6-NEXT: andi $3, $4, 3
+; MMR6-NEXT: xori $3, $3, 3
+; MMR6-NEXT: sll $3, $3, 3
+; MMR6-NEXT: ori $4, $zero, 255
+; MMR6-NEXT: sllv $4, $4, $3
+; MMR6-NEXT: nor $6, $zero, $4
+; MMR6-NEXT: sllv $5, $5, $3
+; MMR6-NEXT: $BB8_1: # %entry
+; MMR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MMR6-NEXT: ll $8, 0($2)
+; MMR6-NEXT: slt $11, $8, $5
+; MMR6-NEXT: seleqz $9, $8, $11
+; MMR6-NEXT: selnez $11, $5, $11
+; MMR6-NEXT: or $9, $9, $11
+; MMR6-NEXT: and $9, $9, $4
+; MMR6-NEXT: and $10, $8, $6
+; MMR6-NEXT: or $10, $10, $9
+; MMR6-NEXT: sc $10, 0($2)
+; MMR6-NEXT: beqc $10, $zero, $BB8_1
+; MMR6-NEXT: # %bb.2: # %entry
+; MMR6-NEXT: and $7, $8, $4
+; MMR6-NEXT: srlv $7, $7, $3
+; MMR6-NEXT: seh $7, $7
+; MMR6-NEXT: # %bb.3: # %entry
+; MMR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MMR6-NEXT: # %bb.4: # %entry
+; MMR6-NEXT: sync
+; MMR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MMR6-NEXT: addiu $sp, $sp, 8
+; MMR6-NEXT: jrc $ra
+;
+; MIPSEL-LABEL: test_max_8:
+; MIPSEL: # %bb.0: # %entry
+; MIPSEL-NEXT: addiu $sp, $sp, -8
+; MIPSEL-NEXT: .cfi_def_cfa_offset 8
+; MIPSEL-NEXT: move $1, $5
+; MIPSEL-NEXT: sync
+; MIPSEL-NEXT: addiu $2, $zero, -4
+; MIPSEL-NEXT: and $2, $4, $2
+; MIPSEL-NEXT: andi $3, $4, 3
+; MIPSEL-NEXT: sll $3, $3, 3
+; MIPSEL-NEXT: ori $4, $zero, 255
+; MIPSEL-NEXT: sllv $4, $4, $3
+; MIPSEL-NEXT: nor $6, $zero, $4
+; MIPSEL-NEXT: sllv $5, $5, $3
+; MIPSEL-NEXT: $BB8_1: # %entry
+; MIPSEL-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSEL-NEXT: ll $8, 0($2)
+; MIPSEL-NEXT: and $8, $8, $4
+; MIPSEL-NEXT: and $5, $5, $4
+; MIPSEL-NEXT: slt $11, $8, $5
+; MIPSEL-NEXT: move $9, $8
+; MIPSEL-NEXT: movn $9, $5, $11
+; MIPSEL-NEXT: and $9, $9, $4
+; MIPSEL-NEXT: and $10, $8, $6
+; MIPSEL-NEXT: or $10, $10, $9
+; MIPSEL-NEXT: sc $10, 0($2)
+; MIPSEL-NEXT: beqz $10, $BB8_1
+; MIPSEL-NEXT: nop
+; MIPSEL-NEXT: # %bb.2: # %entry
+; MIPSEL-NEXT: and $7, $8, $4
+; MIPSEL-NEXT: srlv $7, $7, $3
+; MIPSEL-NEXT: seh $7, $7
+; MIPSEL-NEXT: # %bb.3: # %entry
+; MIPSEL-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPSEL-NEXT: # %bb.4: # %entry
+; MIPSEL-NEXT: sync
+; MIPSEL-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPSEL-NEXT: addiu $sp, $sp, 8
+; MIPSEL-NEXT: jr $ra
+; MIPSEL-NEXT: nop
+;
+; MIPSELR6-LABEL: test_max_8:
+; MIPSELR6: # %bb.0: # %entry
+; MIPSELR6-NEXT: addiu $sp, $sp, -8
+; MIPSELR6-NEXT: .cfi_def_cfa_offset 8
+; MIPSELR6-NEXT: move $1, $5
+; MIPSELR6-NEXT: sync
+; MIPSELR6-NEXT: addiu $2, $zero, -4
+; MIPSELR6-NEXT: and $2, $4, $2
+; MIPSELR6-NEXT: andi $3, $4, 3
+; MIPSELR6-NEXT: sll $3, $3, 3
+; MIPSELR6-NEXT: ori $4, $zero, 255
+; MIPSELR6-NEXT: sllv $4, $4, $3
+; MIPSELR6-NEXT: nor $6, $zero, $4
+; MIPSELR6-NEXT: sllv $5, $5, $3
+; MIPSELR6-NEXT: $BB8_1: # %entry
+; MIPSELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSELR6-NEXT: ll $8, 0($2)
+; MIPSELR6-NEXT: and $8, $8, $4
+; MIPSELR6-NEXT: and $5, $5, $4
+; MIPSELR6-NEXT: slt $11, $8, $5
+; MIPSELR6-NEXT: seleqz $9, $8, $11
+; MIPSELR6-NEXT: selnez $11, $5, $11
+; MIPSELR6-NEXT: or $9, $9, $11
+; MIPSELR6-NEXT: and $9, $9, $4
+; MIPSELR6-NEXT: and $10, $8, $6
+; MIPSELR6-NEXT: or $10, $10, $9
+; MIPSELR6-NEXT: sc $10, 0($2)
+; MIPSELR6-NEXT: beqzc $10, $BB8_1
+; MIPSELR6-NEXT: # %bb.2: # %entry
+; MIPSELR6-NEXT: and $7, $8, $4
+; MIPSELR6-NEXT: srlv $7, $7, $3
+; MIPSELR6-NEXT: seh $7, $7
+; MIPSELR6-NEXT: # %bb.3: # %entry
+; MIPSELR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPSELR6-NEXT: # %bb.4: # %entry
+; MIPSELR6-NEXT: sync
+; MIPSELR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPSELR6-NEXT: addiu $sp, $sp, 8
+; MIPSELR6-NEXT: jrc $ra
+;
+; MMEL-LABEL: test_max_8:
+; MMEL: # %bb.0: # %entry
+; MMEL-NEXT: addiu $sp, $sp, -8
+; MMEL-NEXT: .cfi_def_cfa_offset 8
+; MMEL-NEXT: move $1, $5
+; MMEL-NEXT: sync
+; MMEL-NEXT: addiu $2, $zero, -4
+; MMEL-NEXT: and $2, $4, $2
+; MMEL-NEXT: andi $3, $4, 3
+; MMEL-NEXT: sll $3, $3, 3
+; MMEL-NEXT: ori $4, $zero, 255
+; MMEL-NEXT: sllv $4, $4, $3
+; MMEL-NEXT: nor $6, $zero, $4
+; MMEL-NEXT: sllv $5, $5, $3
+; MMEL-NEXT: $BB8_1: # %entry
+; MMEL-NEXT: # =>This Inner Loop Header: Depth=1
+; MMEL-NEXT: ll $8, 0($2)
+; MMEL-NEXT: and $8, $8, $4
+; MMEL-NEXT: and $5, $5, $4
+; MMEL-NEXT: slt $11, $8, $5
+; MMEL-NEXT: or $9, $8, $zero
+; MMEL-NEXT: movn $9, $5, $11
+; MMEL-NEXT: and $9, $9, $4
+; MMEL-NEXT: and $10, $8, $6
+; MMEL-NEXT: or $10, $10, $9
+; MMEL-NEXT: sc $10, 0($2)
+; MMEL-NEXT: beqzc $10, $BB8_1
+; MMEL-NEXT: # %bb.2: # %entry
+; MMEL-NEXT: and $7, $8, $4
+; MMEL-NEXT: srlv $7, $7, $3
+; MMEL-NEXT: seh $7, $7
+; MMEL-NEXT: # %bb.3: # %entry
+; MMEL-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MMEL-NEXT: # %bb.4: # %entry
+; MMEL-NEXT: sync
+; MMEL-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MMEL-NEXT: addiusp 8
+; MMEL-NEXT: jrc $ra
+;
+; MMELR6-LABEL: test_max_8:
+; MMELR6: # %bb.0: # %entry
+; MMELR6-NEXT: addiu $sp, $sp, -8
+; MMELR6-NEXT: .cfi_def_cfa_offset 8
+; MMELR6-NEXT: move $1, $5
+; MMELR6-NEXT: sync
+; MMELR6-NEXT: addiu $2, $zero, -4
+; MMELR6-NEXT: and $2, $4, $2
+; MMELR6-NEXT: andi $3, $4, 3
+; MMELR6-NEXT: sll $3, $3, 3
+; MMELR6-NEXT: ori $4, $zero, 255
+; MMELR6-NEXT: sllv $4, $4, $3
+; MMELR6-NEXT: nor $6, $zero, $4
+; MMELR6-NEXT: sllv $5, $5, $3
+; MMELR6-NEXT: $BB8_1: # %entry
+; MMELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MMELR6-NEXT: ll $8, 0($2)
+; MMELR6-NEXT: and $8, $8, $4
+; MMELR6-NEXT: and $5, $5, $4
+; MMELR6-NEXT: slt $11, $8, $5
+; MMELR6-NEXT: seleqz $9, $8, $11
+; MMELR6-NEXT: selnez $11, $5, $11
+; MMELR6-NEXT: or $9, $9, $11
+; MMELR6-NEXT: and $9, $9, $4
+; MMELR6-NEXT: and $10, $8, $6
+; MMELR6-NEXT: or $10, $10, $9
+; MMELR6-NEXT: sc $10, 0($2)
+; MMELR6-NEXT: beqc $10, $zero, $BB8_1
+; MMELR6-NEXT: # %bb.2: # %entry
+; MMELR6-NEXT: and $7, $8, $4
+; MMELR6-NEXT: srlv $7, $7, $3
+; MMELR6-NEXT: seh $7, $7
+; MMELR6-NEXT: # %bb.3: # %entry
+; MMELR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MMELR6-NEXT: # %bb.4: # %entry
+; MMELR6-NEXT: sync
+; MMELR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MMELR6-NEXT: addiu $sp, $sp, 8
+; MMELR6-NEXT: jrc $ra
+;
+; MIPS64-LABEL: test_max_8:
+; MIPS64: # %bb.0: # %entry
+; MIPS64-NEXT: daddiu $sp, $sp, -16
+; MIPS64-NEXT: .cfi_def_cfa_offset 16
+; MIPS64-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64-NEXT: sync
+; MIPS64-NEXT: daddiu $1, $zero, -4
+; MIPS64-NEXT: and $1, $4, $1
+; MIPS64-NEXT: andi $2, $4, 3
+; MIPS64-NEXT: xori $2, $2, 3
+; MIPS64-NEXT: sll $2, $2, 3
+; MIPS64-NEXT: ori $3, $zero, 255
+; MIPS64-NEXT: sllv $3, $3, $2
+; MIPS64-NEXT: nor $6, $zero, $3
+; MIPS64-NEXT: sllv $5, $5, $2
+; MIPS64-NEXT: .LBB8_1: # %entry
+; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64-NEXT: ll $8, 0($1)
+; MIPS64-NEXT: slt $11, $8, $5
+; MIPS64-NEXT: move $9, $8
+; MIPS64-NEXT: movn $9, $5, $11
+; MIPS64-NEXT: and $9, $9, $3
+; MIPS64-NEXT: and $10, $8, $6
+; MIPS64-NEXT: or $10, $10, $9
+; MIPS64-NEXT: sc $10, 0($1)
+; MIPS64-NEXT: beqz $10, .LBB8_1
+; MIPS64-NEXT: nop
+; MIPS64-NEXT: # %bb.2: # %entry
+; MIPS64-NEXT: and $7, $8, $3
+; MIPS64-NEXT: srlv $7, $7, $2
+; MIPS64-NEXT: seh $7, $7
+; MIPS64-NEXT: # %bb.3: # %entry
+; MIPS64-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64-NEXT: # %bb.4: # %entry
+; MIPS64-NEXT: sync
+; MIPS64-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64-NEXT: daddiu $sp, $sp, 16
+; MIPS64-NEXT: jr $ra
+; MIPS64-NEXT: nop
+;
+; MIPS64R6-LABEL: test_max_8:
+; MIPS64R6: # %bb.0: # %entry
+; MIPS64R6-NEXT: daddiu $sp, $sp, -16
+; MIPS64R6-NEXT: .cfi_def_cfa_offset 16
+; MIPS64R6-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64R6-NEXT: sync
+; MIPS64R6-NEXT: daddiu $1, $zero, -4
+; MIPS64R6-NEXT: and $1, $4, $1
+; MIPS64R6-NEXT: andi $2, $4, 3
+; MIPS64R6-NEXT: xori $2, $2, 3
+; MIPS64R6-NEXT: sll $2, $2, 3
+; MIPS64R6-NEXT: ori $3, $zero, 255
+; MIPS64R6-NEXT: sllv $3, $3, $2
+; MIPS64R6-NEXT: nor $6, $zero, $3
+; MIPS64R6-NEXT: sllv $5, $5, $2
+; MIPS64R6-NEXT: .LBB8_1: # %entry
+; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64R6-NEXT: ll $8, 0($1)
+; MIPS64R6-NEXT: slt $11, $8, $5
+; MIPS64R6-NEXT: seleqz $9, $8, $11
+; MIPS64R6-NEXT: selnez $11, $5, $11
+; MIPS64R6-NEXT: or $9, $9, $11
+; MIPS64R6-NEXT: and $9, $9, $3
+; MIPS64R6-NEXT: and $10, $8, $6
+; MIPS64R6-NEXT: or $10, $10, $9
+; MIPS64R6-NEXT: sc $10, 0($1)
+; MIPS64R6-NEXT: beqzc $10, .LBB8_1
+; MIPS64R6-NEXT: # %bb.2: # %entry
+; MIPS64R6-NEXT: and $7, $8, $3
+; MIPS64R6-NEXT: srlv $7, $7, $2
+; MIPS64R6-NEXT: seh $7, $7
+; MIPS64R6-NEXT: # %bb.3: # %entry
+; MIPS64R6-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64R6-NEXT: # %bb.4: # %entry
+; MIPS64R6-NEXT: sync
+; MIPS64R6-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64R6-NEXT: daddiu $sp, $sp, 16
+; MIPS64R6-NEXT: jrc $ra
+;
+; MIPS64EL-LABEL: test_max_8:
+; MIPS64EL: # %bb.0: # %entry
+; MIPS64EL-NEXT: daddiu $sp, $sp, -16
+; MIPS64EL-NEXT: .cfi_def_cfa_offset 16
+; MIPS64EL-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64EL-NEXT: sync
+; MIPS64EL-NEXT: daddiu $1, $zero, -4
+; MIPS64EL-NEXT: and $1, $4, $1
+; MIPS64EL-NEXT: andi $2, $4, 3
+; MIPS64EL-NEXT: sll $2, $2, 3
+; MIPS64EL-NEXT: ori $3, $zero, 255
+; MIPS64EL-NEXT: sllv $3, $3, $2
+; MIPS64EL-NEXT: nor $6, $zero, $3
+; MIPS64EL-NEXT: sllv $5, $5, $2
+; MIPS64EL-NEXT: .LBB8_1: # %entry
+; MIPS64EL-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64EL-NEXT: ll $8, 0($1)
+; MIPS64EL-NEXT: and $8, $8, $3
+; MIPS64EL-NEXT: and $5, $5, $3
+; MIPS64EL-NEXT: slt $11, $8, $5
+; MIPS64EL-NEXT: move $9, $8
+; MIPS64EL-NEXT: movn $9, $5, $11
+; MIPS64EL-NEXT: and $9, $9, $3
+; MIPS64EL-NEXT: and $10, $8, $6
+; MIPS64EL-NEXT: or $10, $10, $9
+; MIPS64EL-NEXT: sc $10, 0($1)
+; MIPS64EL-NEXT: beqz $10, .LBB8_1
+; MIPS64EL-NEXT: nop
+; MIPS64EL-NEXT: # %bb.2: # %entry
+; MIPS64EL-NEXT: and $7, $8, $3
+; MIPS64EL-NEXT: srlv $7, $7, $2
+; MIPS64EL-NEXT: seh $7, $7
+; MIPS64EL-NEXT: # %bb.3: # %entry
+; MIPS64EL-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64EL-NEXT: # %bb.4: # %entry
+; MIPS64EL-NEXT: sync
+; MIPS64EL-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64EL-NEXT: daddiu $sp, $sp, 16
+; MIPS64EL-NEXT: jr $ra
+; MIPS64EL-NEXT: nop
+;
+; MIPS64ELR6-LABEL: test_max_8:
+; MIPS64ELR6: # %bb.0: # %entry
+; MIPS64ELR6-NEXT: daddiu $sp, $sp, -16
+; MIPS64ELR6-NEXT: .cfi_def_cfa_offset 16
+; MIPS64ELR6-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64ELR6-NEXT: sync
+; MIPS64ELR6-NEXT: daddiu $1, $zero, -4
+; MIPS64ELR6-NEXT: and $1, $4, $1
+; MIPS64ELR6-NEXT: andi $2, $4, 3
+; MIPS64ELR6-NEXT: sll $2, $2, 3
+; MIPS64ELR6-NEXT: ori $3, $zero, 255
+; MIPS64ELR6-NEXT: sllv $3, $3, $2
+; MIPS64ELR6-NEXT: nor $6, $zero, $3
+; MIPS64ELR6-NEXT: sllv $5, $5, $2
+; MIPS64ELR6-NEXT: .LBB8_1: # %entry
+; MIPS64ELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64ELR6-NEXT: ll $8, 0($1)
+; MIPS64ELR6-NEXT: and $8, $8, $3
+; MIPS64ELR6-NEXT: and $5, $5, $3
+; MIPS64ELR6-NEXT: slt $11, $8, $5
+; MIPS64ELR6-NEXT: seleqz $9, $8, $11
+; MIPS64ELR6-NEXT: selnez $11, $5, $11
+; MIPS64ELR6-NEXT: or $9, $9, $11
+; MIPS64ELR6-NEXT: and $9, $9, $3
+; MIPS64ELR6-NEXT: and $10, $8, $6
+; MIPS64ELR6-NEXT: or $10, $10, $9
+; MIPS64ELR6-NEXT: sc $10, 0($1)
+; MIPS64ELR6-NEXT: beqzc $10, .LBB8_1
+; MIPS64ELR6-NEXT: # %bb.2: # %entry
+; MIPS64ELR6-NEXT: and $7, $8, $3
+; MIPS64ELR6-NEXT: srlv $7, $7, $2
+; MIPS64ELR6-NEXT: seh $7, $7
+; MIPS64ELR6-NEXT: # %bb.3: # %entry
+; MIPS64ELR6-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64ELR6-NEXT: # %bb.4: # %entry
+; MIPS64ELR6-NEXT: sync
+; MIPS64ELR6-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64ELR6-NEXT: daddiu $sp, $sp, 16
+; MIPS64ELR6-NEXT: jrc $ra
+entry:
+ %0 = atomicrmw max i8* %ptr, i8 %val seq_cst
+ ret i8 %0
+}
+
+define i8 @test_min_8(i8* nocapture %ptr, i8 signext %val) {
+; MIPS-LABEL: test_min_8:
+; MIPS: # %bb.0: # %entry
+; MIPS-NEXT: addiu $sp, $sp, -8
+; MIPS-NEXT: .cfi_def_cfa_offset 8
+; MIPS-NEXT: move $1, $5
+; MIPS-NEXT: sync
+; MIPS-NEXT: addiu $2, $zero, -4
+; MIPS-NEXT: and $2, $4, $2
+; MIPS-NEXT: andi $3, $4, 3
+; MIPS-NEXT: xori $3, $3, 3
+; MIPS-NEXT: sll $3, $3, 3
+; MIPS-NEXT: ori $4, $zero, 255
+; MIPS-NEXT: sllv $4, $4, $3
+; MIPS-NEXT: nor $6, $zero, $4
+; MIPS-NEXT: sllv $5, $5, $3
+; MIPS-NEXT: $BB9_1: # %entry
+; MIPS-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS-NEXT: ll $8, 0($2)
+; MIPS-NEXT: slt $11, $8, $5
+; MIPS-NEXT: move $9, $8
+; MIPS-NEXT: movz $9, $5, $11
+; MIPS-NEXT: and $9, $9, $4
+; MIPS-NEXT: and $10, $8, $6
+; MIPS-NEXT: or $10, $10, $9
+; MIPS-NEXT: sc $10, 0($2)
+; MIPS-NEXT: beqz $10, $BB9_1
+; MIPS-NEXT: nop
+; MIPS-NEXT: # %bb.2: # %entry
+; MIPS-NEXT: and $7, $8, $4
+; MIPS-NEXT: srlv $7, $7, $3
+; MIPS-NEXT: seh $7, $7
+; MIPS-NEXT: # %bb.3: # %entry
+; MIPS-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPS-NEXT: # %bb.4: # %entry
+; MIPS-NEXT: sync
+; MIPS-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPS-NEXT: addiu $sp, $sp, 8
+; MIPS-NEXT: jr $ra
+; MIPS-NEXT: nop
+;
+; MIPSR6-LABEL: test_min_8:
+; MIPSR6: # %bb.0: # %entry
+; MIPSR6-NEXT: addiu $sp, $sp, -8
+; MIPSR6-NEXT: .cfi_def_cfa_offset 8
+; MIPSR6-NEXT: move $1, $5
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: addiu $2, $zero, -4
+; MIPSR6-NEXT: and $2, $4, $2
+; MIPSR6-NEXT: andi $3, $4, 3
+; MIPSR6-NEXT: xori $3, $3, 3
+; MIPSR6-NEXT: sll $3, $3, 3
+; MIPSR6-NEXT: ori $4, $zero, 255
+; MIPSR6-NEXT: sllv $4, $4, $3
+; MIPSR6-NEXT: nor $6, $zero, $4
+; MIPSR6-NEXT: sllv $5, $5, $3
+; MIPSR6-NEXT: $BB9_1: # %entry
+; MIPSR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSR6-NEXT: ll $8, 0($2)
+; MIPSR6-NEXT: slt $11, $8, $5
+; MIPSR6-NEXT: selnez $9, $8, $11
+; MIPSR6-NEXT: seleqz $11, $5, $11
+; MIPSR6-NEXT: or $9, $9, $11
+; MIPSR6-NEXT: and $9, $9, $4
+; MIPSR6-NEXT: and $10, $8, $6
+; MIPSR6-NEXT: or $10, $10, $9
+; MIPSR6-NEXT: sc $10, 0($2)
+; MIPSR6-NEXT: beqzc $10, $BB9_1
+; MIPSR6-NEXT: # %bb.2: # %entry
+; MIPSR6-NEXT: and $7, $8, $4
+; MIPSR6-NEXT: srlv $7, $7, $3
+; MIPSR6-NEXT: seh $7, $7
+; MIPSR6-NEXT: # %bb.3: # %entry
+; MIPSR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPSR6-NEXT: # %bb.4: # %entry
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPSR6-NEXT: addiu $sp, $sp, 8
+; MIPSR6-NEXT: jrc $ra
+;
+; MM-LABEL: test_min_8:
+; MM: # %bb.0: # %entry
+; MM-NEXT: addiu $sp, $sp, -8
+; MM-NEXT: .cfi_def_cfa_offset 8
+; MM-NEXT: move $1, $5
+; MM-NEXT: sync
+; MM-NEXT: addiu $2, $zero, -4
+; MM-NEXT: and $2, $4, $2
+; MM-NEXT: andi $3, $4, 3
+; MM-NEXT: xori $3, $3, 3
+; MM-NEXT: sll $3, $3, 3
+; MM-NEXT: ori $4, $zero, 255
+; MM-NEXT: sllv $4, $4, $3
+; MM-NEXT: nor $6, $zero, $4
+; MM-NEXT: sllv $5, $5, $3
+; MM-NEXT: $BB9_1: # %entry
+; MM-NEXT: # =>This Inner Loop Header: Depth=1
+; MM-NEXT: ll $8, 0($2)
+; MM-NEXT: slt $11, $8, $5
+; MM-NEXT: or $9, $8, $zero
+; MM-NEXT: movz $9, $5, $11
+; MM-NEXT: and $9, $9, $4
+; MM-NEXT: and $10, $8, $6
+; MM-NEXT: or $10, $10, $9
+; MM-NEXT: sc $10, 0($2)
+; MM-NEXT: beqzc $10, $BB9_1
+; MM-NEXT: # %bb.2: # %entry
+; MM-NEXT: and $7, $8, $4
+; MM-NEXT: srlv $7, $7, $3
+; MM-NEXT: seh $7, $7
+; MM-NEXT: # %bb.3: # %entry
+; MM-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MM-NEXT: # %bb.4: # %entry
+; MM-NEXT: sync
+; MM-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MM-NEXT: addiusp 8
+; MM-NEXT: jrc $ra
+;
+; MMR6-LABEL: test_min_8:
+; MMR6: # %bb.0: # %entry
+; MMR6-NEXT: addiu $sp, $sp, -8
+; MMR6-NEXT: .cfi_def_cfa_offset 8
+; MMR6-NEXT: move $1, $5
+; MMR6-NEXT: sync
+; MMR6-NEXT: addiu $2, $zero, -4
+; MMR6-NEXT: and $2, $4, $2
+; MMR6-NEXT: andi $3, $4, 3
+; MMR6-NEXT: xori $3, $3, 3
+; MMR6-NEXT: sll $3, $3, 3
+; MMR6-NEXT: ori $4, $zero, 255
+; MMR6-NEXT: sllv $4, $4, $3
+; MMR6-NEXT: nor $6, $zero, $4
+; MMR6-NEXT: sllv $5, $5, $3
+; MMR6-NEXT: $BB9_1: # %entry
+; MMR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MMR6-NEXT: ll $8, 0($2)
+; MMR6-NEXT: slt $11, $8, $5
+; MMR6-NEXT: selnez $9, $8, $11
+; MMR6-NEXT: seleqz $11, $5, $11
+; MMR6-NEXT: or $9, $9, $11
+; MMR6-NEXT: and $9, $9, $4
+; MMR6-NEXT: and $10, $8, $6
+; MMR6-NEXT: or $10, $10, $9
+; MMR6-NEXT: sc $10, 0($2)
+; MMR6-NEXT: beqc $10, $zero, $BB9_1
+; MMR6-NEXT: # %bb.2: # %entry
+; MMR6-NEXT: and $7, $8, $4
+; MMR6-NEXT: srlv $7, $7, $3
+; MMR6-NEXT: seh $7, $7
+; MMR6-NEXT: # %bb.3: # %entry
+; MMR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MMR6-NEXT: # %bb.4: # %entry
+; MMR6-NEXT: sync
+; MMR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MMR6-NEXT: addiu $sp, $sp, 8
+; MMR6-NEXT: jrc $ra
+;
+; MIPSEL-LABEL: test_min_8:
+; MIPSEL: # %bb.0: # %entry
+; MIPSEL-NEXT: addiu $sp, $sp, -8
+; MIPSEL-NEXT: .cfi_def_cfa_offset 8
+; MIPSEL-NEXT: move $1, $5
+; MIPSEL-NEXT: sync
+; MIPSEL-NEXT: addiu $2, $zero, -4
+; MIPSEL-NEXT: and $2, $4, $2
+; MIPSEL-NEXT: andi $3, $4, 3
+; MIPSEL-NEXT: sll $3, $3, 3
+; MIPSEL-NEXT: ori $4, $zero, 255
+; MIPSEL-NEXT: sllv $4, $4, $3
+; MIPSEL-NEXT: nor $6, $zero, $4
+; MIPSEL-NEXT: sllv $5, $5, $3
+; MIPSEL-NEXT: $BB9_1: # %entry
+; MIPSEL-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSEL-NEXT: ll $8, 0($2)
+; MIPSEL-NEXT: and $8, $8, $4
+; MIPSEL-NEXT: and $5, $5, $4
+; MIPSEL-NEXT: slt $11, $8, $5
+; MIPSEL-NEXT: move $9, $8
+; MIPSEL-NEXT: movz $9, $5, $11
+; MIPSEL-NEXT: and $9, $9, $4
+; MIPSEL-NEXT: and $10, $8, $6
+; MIPSEL-NEXT: or $10, $10, $9
+; MIPSEL-NEXT: sc $10, 0($2)
+; MIPSEL-NEXT: beqz $10, $BB9_1
+; MIPSEL-NEXT: nop
+; MIPSEL-NEXT: # %bb.2: # %entry
+; MIPSEL-NEXT: and $7, $8, $4
+; MIPSEL-NEXT: srlv $7, $7, $3
+; MIPSEL-NEXT: seh $7, $7
+; MIPSEL-NEXT: # %bb.3: # %entry
+; MIPSEL-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPSEL-NEXT: # %bb.4: # %entry
+; MIPSEL-NEXT: sync
+; MIPSEL-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPSEL-NEXT: addiu $sp, $sp, 8
+; MIPSEL-NEXT: jr $ra
+; MIPSEL-NEXT: nop
+;
+; MIPSELR6-LABEL: test_min_8:
+; MIPSELR6: # %bb.0: # %entry
+; MIPSELR6-NEXT: addiu $sp, $sp, -8
+; MIPSELR6-NEXT: .cfi_def_cfa_offset 8
+; MIPSELR6-NEXT: move $1, $5
+; MIPSELR6-NEXT: sync
+; MIPSELR6-NEXT: addiu $2, $zero, -4
+; MIPSELR6-NEXT: and $2, $4, $2
+; MIPSELR6-NEXT: andi $3, $4, 3
+; MIPSELR6-NEXT: sll $3, $3, 3
+; MIPSELR6-NEXT: ori $4, $zero, 255
+; MIPSELR6-NEXT: sllv $4, $4, $3
+; MIPSELR6-NEXT: nor $6, $zero, $4
+; MIPSELR6-NEXT: sllv $5, $5, $3
+; MIPSELR6-NEXT: $BB9_1: # %entry
+; MIPSELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSELR6-NEXT: ll $8, 0($2)
+; MIPSELR6-NEXT: and $8, $8, $4
+; MIPSELR6-NEXT: and $5, $5, $4
+; MIPSELR6-NEXT: slt $11, $8, $5
+; MIPSELR6-NEXT: selnez $9, $8, $11
+; MIPSELR6-NEXT: seleqz $11, $5, $11
+; MIPSELR6-NEXT: or $9, $9, $11
+; MIPSELR6-NEXT: and $9, $9, $4
+; MIPSELR6-NEXT: and $10, $8, $6
+; MIPSELR6-NEXT: or $10, $10, $9
+; MIPSELR6-NEXT: sc $10, 0($2)
+; MIPSELR6-NEXT: beqzc $10, $BB9_1
+; MIPSELR6-NEXT: # %bb.2: # %entry
+; MIPSELR6-NEXT: and $7, $8, $4
+; MIPSELR6-NEXT: srlv $7, $7, $3
+; MIPSELR6-NEXT: seh $7, $7
+; MIPSELR6-NEXT: # %bb.3: # %entry
+; MIPSELR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPSELR6-NEXT: # %bb.4: # %entry
+; MIPSELR6-NEXT: sync
+; MIPSELR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPSELR6-NEXT: addiu $sp, $sp, 8
+; MIPSELR6-NEXT: jrc $ra
+;
+; MMEL-LABEL: test_min_8:
+; MMEL: # %bb.0: # %entry
+; MMEL-NEXT: addiu $sp, $sp, -8
+; MMEL-NEXT: .cfi_def_cfa_offset 8
+; MMEL-NEXT: move $1, $5
+; MMEL-NEXT: sync
+; MMEL-NEXT: addiu $2, $zero, -4
+; MMEL-NEXT: and $2, $4, $2
+; MMEL-NEXT: andi $3, $4, 3
+; MMEL-NEXT: sll $3, $3, 3
+; MMEL-NEXT: ori $4, $zero, 255
+; MMEL-NEXT: sllv $4, $4, $3
+; MMEL-NEXT: nor $6, $zero, $4
+; MMEL-NEXT: sllv $5, $5, $3
+; MMEL-NEXT: $BB9_1: # %entry
+; MMEL-NEXT: # =>This Inner Loop Header: Depth=1
+; MMEL-NEXT: ll $8, 0($2)
+; MMEL-NEXT: and $8, $8, $4
+; MMEL-NEXT: and $5, $5, $4
+; MMEL-NEXT: slt $11, $8, $5
+; MMEL-NEXT: or $9, $8, $zero
+; MMEL-NEXT: movz $9, $5, $11
+; MMEL-NEXT: and $9, $9, $4
+; MMEL-NEXT: and $10, $8, $6
+; MMEL-NEXT: or $10, $10, $9
+; MMEL-NEXT: sc $10, 0($2)
+; MMEL-NEXT: beqzc $10, $BB9_1
+; MMEL-NEXT: # %bb.2: # %entry
+; MMEL-NEXT: and $7, $8, $4
+; MMEL-NEXT: srlv $7, $7, $3
+; MMEL-NEXT: seh $7, $7
+; MMEL-NEXT: # %bb.3: # %entry
+; MMEL-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MMEL-NEXT: # %bb.4: # %entry
+; MMEL-NEXT: sync
+; MMEL-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MMEL-NEXT: addiusp 8
+; MMEL-NEXT: jrc $ra
+;
+; MMELR6-LABEL: test_min_8:
+; MMELR6: # %bb.0: # %entry
+; MMELR6-NEXT: addiu $sp, $sp, -8
+; MMELR6-NEXT: .cfi_def_cfa_offset 8
+; MMELR6-NEXT: move $1, $5
+; MMELR6-NEXT: sync
+; MMELR6-NEXT: addiu $2, $zero, -4
+; MMELR6-NEXT: and $2, $4, $2
+; MMELR6-NEXT: andi $3, $4, 3
+; MMELR6-NEXT: sll $3, $3, 3
+; MMELR6-NEXT: ori $4, $zero, 255
+; MMELR6-NEXT: sllv $4, $4, $3
+; MMELR6-NEXT: nor $6, $zero, $4
+; MMELR6-NEXT: sllv $5, $5, $3
+; MMELR6-NEXT: $BB9_1: # %entry
+; MMELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MMELR6-NEXT: ll $8, 0($2)
+; MMELR6-NEXT: and $8, $8, $4
+; MMELR6-NEXT: and $5, $5, $4
+; MMELR6-NEXT: slt $11, $8, $5
+; MMELR6-NEXT: selnez $9, $8, $11
+; MMELR6-NEXT: seleqz $11, $5, $11
+; MMELR6-NEXT: or $9, $9, $11
+; MMELR6-NEXT: and $9, $9, $4
+; MMELR6-NEXT: and $10, $8, $6
+; MMELR6-NEXT: or $10, $10, $9
+; MMELR6-NEXT: sc $10, 0($2)
+; MMELR6-NEXT: beqc $10, $zero, $BB9_1
+; MMELR6-NEXT: # %bb.2: # %entry
+; MMELR6-NEXT: and $7, $8, $4
+; MMELR6-NEXT: srlv $7, $7, $3
+; MMELR6-NEXT: seh $7, $7
+; MMELR6-NEXT: # %bb.3: # %entry
+; MMELR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MMELR6-NEXT: # %bb.4: # %entry
+; MMELR6-NEXT: sync
+; MMELR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MMELR6-NEXT: addiu $sp, $sp, 8
+; MMELR6-NEXT: jrc $ra
+;
+; MIPS64-LABEL: test_min_8:
+; MIPS64: # %bb.0: # %entry
+; MIPS64-NEXT: daddiu $sp, $sp, -16
+; MIPS64-NEXT: .cfi_def_cfa_offset 16
+; MIPS64-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64-NEXT: sync
+; MIPS64-NEXT: daddiu $1, $zero, -4
+; MIPS64-NEXT: and $1, $4, $1
+; MIPS64-NEXT: andi $2, $4, 3
+; MIPS64-NEXT: xori $2, $2, 3
+; MIPS64-NEXT: sll $2, $2, 3
+; MIPS64-NEXT: ori $3, $zero, 255
+; MIPS64-NEXT: sllv $3, $3, $2
+; MIPS64-NEXT: nor $6, $zero, $3
+; MIPS64-NEXT: sllv $5, $5, $2
+; MIPS64-NEXT: .LBB9_1: # %entry
+; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64-NEXT: ll $8, 0($1)
+; MIPS64-NEXT: slt $11, $8, $5
+; MIPS64-NEXT: move $9, $8
+; MIPS64-NEXT: movz $9, $5, $11
+; MIPS64-NEXT: and $9, $9, $3
+; MIPS64-NEXT: and $10, $8, $6
+; MIPS64-NEXT: or $10, $10, $9
+; MIPS64-NEXT: sc $10, 0($1)
+; MIPS64-NEXT: beqz $10, .LBB9_1
+; MIPS64-NEXT: nop
+; MIPS64-NEXT: # %bb.2: # %entry
+; MIPS64-NEXT: and $7, $8, $3
+; MIPS64-NEXT: srlv $7, $7, $2
+; MIPS64-NEXT: seh $7, $7
+; MIPS64-NEXT: # %bb.3: # %entry
+; MIPS64-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64-NEXT: # %bb.4: # %entry
+; MIPS64-NEXT: sync
+; MIPS64-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64-NEXT: daddiu $sp, $sp, 16
+; MIPS64-NEXT: jr $ra
+; MIPS64-NEXT: nop
+;
+; MIPS64R6-LABEL: test_min_8:
+; MIPS64R6: # %bb.0: # %entry
+; MIPS64R6-NEXT: daddiu $sp, $sp, -16
+; MIPS64R6-NEXT: .cfi_def_cfa_offset 16
+; MIPS64R6-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64R6-NEXT: sync
+; MIPS64R6-NEXT: daddiu $1, $zero, -4
+; MIPS64R6-NEXT: and $1, $4, $1
+; MIPS64R6-NEXT: andi $2, $4, 3
+; MIPS64R6-NEXT: xori $2, $2, 3
+; MIPS64R6-NEXT: sll $2, $2, 3
+; MIPS64R6-NEXT: ori $3, $zero, 255
+; MIPS64R6-NEXT: sllv $3, $3, $2
+; MIPS64R6-NEXT: nor $6, $zero, $3
+; MIPS64R6-NEXT: sllv $5, $5, $2
+; MIPS64R6-NEXT: .LBB9_1: # %entry
+; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64R6-NEXT: ll $8, 0($1)
+; MIPS64R6-NEXT: slt $11, $8, $5
+; MIPS64R6-NEXT: selnez $9, $8, $11
+; MIPS64R6-NEXT: seleqz $11, $5, $11
+; MIPS64R6-NEXT: or $9, $9, $11
+; MIPS64R6-NEXT: and $9, $9, $3
+; MIPS64R6-NEXT: and $10, $8, $6
+; MIPS64R6-NEXT: or $10, $10, $9
+; MIPS64R6-NEXT: sc $10, 0($1)
+; MIPS64R6-NEXT: beqzc $10, .LBB9_1
+; MIPS64R6-NEXT: # %bb.2: # %entry
+; MIPS64R6-NEXT: and $7, $8, $3
+; MIPS64R6-NEXT: srlv $7, $7, $2
+; MIPS64R6-NEXT: seh $7, $7
+; MIPS64R6-NEXT: # %bb.3: # %entry
+; MIPS64R6-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64R6-NEXT: # %bb.4: # %entry
+; MIPS64R6-NEXT: sync
+; MIPS64R6-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64R6-NEXT: daddiu $sp, $sp, 16
+; MIPS64R6-NEXT: jrc $ra
+;
+; MIPS64EL-LABEL: test_min_8:
+; MIPS64EL: # %bb.0: # %entry
+; MIPS64EL-NEXT: daddiu $sp, $sp, -16
+; MIPS64EL-NEXT: .cfi_def_cfa_offset 16
+; MIPS64EL-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64EL-NEXT: sync
+; MIPS64EL-NEXT: daddiu $1, $zero, -4
+; MIPS64EL-NEXT: and $1, $4, $1
+; MIPS64EL-NEXT: andi $2, $4, 3
+; MIPS64EL-NEXT: sll $2, $2, 3
+; MIPS64EL-NEXT: ori $3, $zero, 255
+; MIPS64EL-NEXT: sllv $3, $3, $2
+; MIPS64EL-NEXT: nor $6, $zero, $3
+; MIPS64EL-NEXT: sllv $5, $5, $2
+; MIPS64EL-NEXT: .LBB9_1: # %entry
+; MIPS64EL-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64EL-NEXT: ll $8, 0($1)
+; MIPS64EL-NEXT: and $8, $8, $3
+; MIPS64EL-NEXT: and $5, $5, $3
+; MIPS64EL-NEXT: slt $11, $8, $5
+; MIPS64EL-NEXT: move $9, $8
+; MIPS64EL-NEXT: movz $9, $5, $11
+; MIPS64EL-NEXT: and $9, $9, $3
+; MIPS64EL-NEXT: and $10, $8, $6
+; MIPS64EL-NEXT: or $10, $10, $9
+; MIPS64EL-NEXT: sc $10, 0($1)
+; MIPS64EL-NEXT: beqz $10, .LBB9_1
+; MIPS64EL-NEXT: nop
+; MIPS64EL-NEXT: # %bb.2: # %entry
+; MIPS64EL-NEXT: and $7, $8, $3
+; MIPS64EL-NEXT: srlv $7, $7, $2
+; MIPS64EL-NEXT: seh $7, $7
+; MIPS64EL-NEXT: # %bb.3: # %entry
+; MIPS64EL-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64EL-NEXT: # %bb.4: # %entry
+; MIPS64EL-NEXT: sync
+; MIPS64EL-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64EL-NEXT: daddiu $sp, $sp, 16
+; MIPS64EL-NEXT: jr $ra
+; MIPS64EL-NEXT: nop
+;
+; MIPS64ELR6-LABEL: test_min_8:
+; MIPS64ELR6: # %bb.0: # %entry
+; MIPS64ELR6-NEXT: daddiu $sp, $sp, -16
+; MIPS64ELR6-NEXT: .cfi_def_cfa_offset 16
+; MIPS64ELR6-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64ELR6-NEXT: sync
+; MIPS64ELR6-NEXT: daddiu $1, $zero, -4
+; MIPS64ELR6-NEXT: and $1, $4, $1
+; MIPS64ELR6-NEXT: andi $2, $4, 3
+; MIPS64ELR6-NEXT: sll $2, $2, 3
+; MIPS64ELR6-NEXT: ori $3, $zero, 255
+; MIPS64ELR6-NEXT: sllv $3, $3, $2
+; MIPS64ELR6-NEXT: nor $6, $zero, $3
+; MIPS64ELR6-NEXT: sllv $5, $5, $2
+; MIPS64ELR6-NEXT: .LBB9_1: # %entry
+; MIPS64ELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64ELR6-NEXT: ll $8, 0($1)
+; MIPS64ELR6-NEXT: and $8, $8, $3
+; MIPS64ELR6-NEXT: and $5, $5, $3
+; MIPS64ELR6-NEXT: slt $11, $8, $5
+; MIPS64ELR6-NEXT: selnez $9, $8, $11
+; MIPS64ELR6-NEXT: seleqz $11, $5, $11
+; MIPS64ELR6-NEXT: or $9, $9, $11
+; MIPS64ELR6-NEXT: and $9, $9, $3
+; MIPS64ELR6-NEXT: and $10, $8, $6
+; MIPS64ELR6-NEXT: or $10, $10, $9
+; MIPS64ELR6-NEXT: sc $10, 0($1)
+; MIPS64ELR6-NEXT: beqzc $10, .LBB9_1
+; MIPS64ELR6-NEXT: # %bb.2: # %entry
+; MIPS64ELR6-NEXT: and $7, $8, $3
+; MIPS64ELR6-NEXT: srlv $7, $7, $2
+; MIPS64ELR6-NEXT: seh $7, $7
+; MIPS64ELR6-NEXT: # %bb.3: # %entry
+; MIPS64ELR6-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64ELR6-NEXT: # %bb.4: # %entry
+; MIPS64ELR6-NEXT: sync
+; MIPS64ELR6-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64ELR6-NEXT: daddiu $sp, $sp, 16
+; MIPS64ELR6-NEXT: jrc $ra
+entry:
+ %0 = atomicrmw min i8* %ptr, i8 %val seq_cst
+ ret i8 %0
+}
+
+define i8 @test_umax_8(i8* nocapture %ptr, i8 signext %val) {
+; MIPS-LABEL: test_umax_8:
+; MIPS: # %bb.0: # %entry
+; MIPS-NEXT: addiu $sp, $sp, -8
+; MIPS-NEXT: .cfi_def_cfa_offset 8
+; MIPS-NEXT: move $1, $5
+; MIPS-NEXT: sync
+; MIPS-NEXT: addiu $2, $zero, -4
+; MIPS-NEXT: and $2, $4, $2
+; MIPS-NEXT: andi $3, $4, 3
+; MIPS-NEXT: xori $3, $3, 3
+; MIPS-NEXT: sll $3, $3, 3
+; MIPS-NEXT: ori $4, $zero, 255
+; MIPS-NEXT: sllv $4, $4, $3
+; MIPS-NEXT: nor $6, $zero, $4
+; MIPS-NEXT: sllv $5, $5, $3
+; MIPS-NEXT: $BB10_1: # %entry
+; MIPS-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS-NEXT: ll $8, 0($2)
+; MIPS-NEXT: sltu $11, $8, $5
+; MIPS-NEXT: move $9, $8
+; MIPS-NEXT: movn $9, $5, $11
+; MIPS-NEXT: and $9, $9, $4
+; MIPS-NEXT: and $10, $8, $6
+; MIPS-NEXT: or $10, $10, $9
+; MIPS-NEXT: sc $10, 0($2)
+; MIPS-NEXT: beqz $10, $BB10_1
+; MIPS-NEXT: nop
+; MIPS-NEXT: # %bb.2: # %entry
+; MIPS-NEXT: and $7, $8, $4
+; MIPS-NEXT: srlv $7, $7, $3
+; MIPS-NEXT: seh $7, $7
+; MIPS-NEXT: # %bb.3: # %entry
+; MIPS-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPS-NEXT: # %bb.4: # %entry
+; MIPS-NEXT: sync
+; MIPS-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPS-NEXT: addiu $sp, $sp, 8
+; MIPS-NEXT: jr $ra
+; MIPS-NEXT: nop
+;
+; MIPSR6-LABEL: test_umax_8:
+; MIPSR6: # %bb.0: # %entry
+; MIPSR6-NEXT: addiu $sp, $sp, -8
+; MIPSR6-NEXT: .cfi_def_cfa_offset 8
+; MIPSR6-NEXT: move $1, $5
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: addiu $2, $zero, -4
+; MIPSR6-NEXT: and $2, $4, $2
+; MIPSR6-NEXT: andi $3, $4, 3
+; MIPSR6-NEXT: xori $3, $3, 3
+; MIPSR6-NEXT: sll $3, $3, 3
+; MIPSR6-NEXT: ori $4, $zero, 255
+; MIPSR6-NEXT: sllv $4, $4, $3
+; MIPSR6-NEXT: nor $6, $zero, $4
+; MIPSR6-NEXT: sllv $5, $5, $3
+; MIPSR6-NEXT: $BB10_1: # %entry
+; MIPSR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSR6-NEXT: ll $8, 0($2)
+; MIPSR6-NEXT: sltu $11, $8, $5
+; MIPSR6-NEXT: seleqz $9, $8, $11
+; MIPSR6-NEXT: selnez $11, $5, $11
+; MIPSR6-NEXT: or $9, $9, $11
+; MIPSR6-NEXT: and $9, $9, $4
+; MIPSR6-NEXT: and $10, $8, $6
+; MIPSR6-NEXT: or $10, $10, $9
+; MIPSR6-NEXT: sc $10, 0($2)
+; MIPSR6-NEXT: beqzc $10, $BB10_1
+; MIPSR6-NEXT: # %bb.2: # %entry
+; MIPSR6-NEXT: and $7, $8, $4
+; MIPSR6-NEXT: srlv $7, $7, $3
+; MIPSR6-NEXT: seh $7, $7
+; MIPSR6-NEXT: # %bb.3: # %entry
+; MIPSR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPSR6-NEXT: # %bb.4: # %entry
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPSR6-NEXT: addiu $sp, $sp, 8
+; MIPSR6-NEXT: jrc $ra
+;
+; MM-LABEL: test_umax_8:
+; MM: # %bb.0: # %entry
+; MM-NEXT: addiu $sp, $sp, -8
+; MM-NEXT: .cfi_def_cfa_offset 8
+; MM-NEXT: move $1, $5
+; MM-NEXT: sync
+; MM-NEXT: addiu $2, $zero, -4
+; MM-NEXT: and $2, $4, $2
+; MM-NEXT: andi $3, $4, 3
+; MM-NEXT: xori $3, $3, 3
+; MM-NEXT: sll $3, $3, 3
+; MM-NEXT: ori $4, $zero, 255
+; MM-NEXT: sllv $4, $4, $3
+; MM-NEXT: nor $6, $zero, $4
+; MM-NEXT: sllv $5, $5, $3
+; MM-NEXT: $BB10_1: # %entry
+; MM-NEXT: # =>This Inner Loop Header: Depth=1
+; MM-NEXT: ll $8, 0($2)
+; MM-NEXT: sltu $11, $8, $5
+; MM-NEXT: or $9, $8, $zero
+; MM-NEXT: movn $9, $5, $11
+; MM-NEXT: and $9, $9, $4
+; MM-NEXT: and $10, $8, $6
+; MM-NEXT: or $10, $10, $9
+; MM-NEXT: sc $10, 0($2)
+; MM-NEXT: beqzc $10, $BB10_1
+; MM-NEXT: # %bb.2: # %entry
+; MM-NEXT: and $7, $8, $4
+; MM-NEXT: srlv $7, $7, $3
+; MM-NEXT: seh $7, $7
+; MM-NEXT: # %bb.3: # %entry
+; MM-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MM-NEXT: # %bb.4: # %entry
+; MM-NEXT: sync
+; MM-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MM-NEXT: addiusp 8
+; MM-NEXT: jrc $ra
+;
+; MMR6-LABEL: test_umax_8:
+; MMR6: # %bb.0: # %entry
+; MMR6-NEXT: addiu $sp, $sp, -8
+; MMR6-NEXT: .cfi_def_cfa_offset 8
+; MMR6-NEXT: move $1, $5
+; MMR6-NEXT: sync
+; MMR6-NEXT: addiu $2, $zero, -4
+; MMR6-NEXT: and $2, $4, $2
+; MMR6-NEXT: andi $3, $4, 3
+; MMR6-NEXT: xori $3, $3, 3
+; MMR6-NEXT: sll $3, $3, 3
+; MMR6-NEXT: ori $4, $zero, 255
+; MMR6-NEXT: sllv $4, $4, $3
+; MMR6-NEXT: nor $6, $zero, $4
+; MMR6-NEXT: sllv $5, $5, $3
+; MMR6-NEXT: $BB10_1: # %entry
+; MMR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MMR6-NEXT: ll $8, 0($2)
+; MMR6-NEXT: sltu $11, $8, $5
+; MMR6-NEXT: seleqz $9, $8, $11
+; MMR6-NEXT: selnez $11, $5, $11
+; MMR6-NEXT: or $9, $9, $11
+; MMR6-NEXT: and $9, $9, $4
+; MMR6-NEXT: and $10, $8, $6
+; MMR6-NEXT: or $10, $10, $9
+; MMR6-NEXT: sc $10, 0($2)
+; MMR6-NEXT: beqc $10, $zero, $BB10_1
+; MMR6-NEXT: # %bb.2: # %entry
+; MMR6-NEXT: and $7, $8, $4
+; MMR6-NEXT: srlv $7, $7, $3
+; MMR6-NEXT: seh $7, $7
+; MMR6-NEXT: # %bb.3: # %entry
+; MMR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MMR6-NEXT: # %bb.4: # %entry
+; MMR6-NEXT: sync
+; MMR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MMR6-NEXT: addiu $sp, $sp, 8
+; MMR6-NEXT: jrc $ra
+;
+; MIPSEL-LABEL: test_umax_8:
+; MIPSEL: # %bb.0: # %entry
+; MIPSEL-NEXT: addiu $sp, $sp, -8
+; MIPSEL-NEXT: .cfi_def_cfa_offset 8
+; MIPSEL-NEXT: move $1, $5
+; MIPSEL-NEXT: sync
+; MIPSEL-NEXT: addiu $2, $zero, -4
+; MIPSEL-NEXT: and $2, $4, $2
+; MIPSEL-NEXT: andi $3, $4, 3
+; MIPSEL-NEXT: sll $3, $3, 3
+; MIPSEL-NEXT: ori $4, $zero, 255
+; MIPSEL-NEXT: sllv $4, $4, $3
+; MIPSEL-NEXT: nor $6, $zero, $4
+; MIPSEL-NEXT: sllv $5, $5, $3
+; MIPSEL-NEXT: $BB10_1: # %entry
+; MIPSEL-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSEL-NEXT: ll $8, 0($2)
+; MIPSEL-NEXT: and $8, $8, $4
+; MIPSEL-NEXT: and $5, $5, $4
+; MIPSEL-NEXT: sltu $11, $8, $5
+; MIPSEL-NEXT: move $9, $8
+; MIPSEL-NEXT: movn $9, $5, $11
+; MIPSEL-NEXT: and $9, $9, $4
+; MIPSEL-NEXT: and $10, $8, $6
+; MIPSEL-NEXT: or $10, $10, $9
+; MIPSEL-NEXT: sc $10, 0($2)
+; MIPSEL-NEXT: beqz $10, $BB10_1
+; MIPSEL-NEXT: nop
+; MIPSEL-NEXT: # %bb.2: # %entry
+; MIPSEL-NEXT: and $7, $8, $4
+; MIPSEL-NEXT: srlv $7, $7, $3
+; MIPSEL-NEXT: seh $7, $7
+; MIPSEL-NEXT: # %bb.3: # %entry
+; MIPSEL-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPSEL-NEXT: # %bb.4: # %entry
+; MIPSEL-NEXT: sync
+; MIPSEL-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPSEL-NEXT: addiu $sp, $sp, 8
+; MIPSEL-NEXT: jr $ra
+; MIPSEL-NEXT: nop
+;
+; MIPSELR6-LABEL: test_umax_8:
+; MIPSELR6: # %bb.0: # %entry
+; MIPSELR6-NEXT: addiu $sp, $sp, -8
+; MIPSELR6-NEXT: .cfi_def_cfa_offset 8
+; MIPSELR6-NEXT: move $1, $5
+; MIPSELR6-NEXT: sync
+; MIPSELR6-NEXT: addiu $2, $zero, -4
+; MIPSELR6-NEXT: and $2, $4, $2
+; MIPSELR6-NEXT: andi $3, $4, 3
+; MIPSELR6-NEXT: sll $3, $3, 3
+; MIPSELR6-NEXT: ori $4, $zero, 255
+; MIPSELR6-NEXT: sllv $4, $4, $3
+; MIPSELR6-NEXT: nor $6, $zero, $4
+; MIPSELR6-NEXT: sllv $5, $5, $3
+; MIPSELR6-NEXT: $BB10_1: # %entry
+; MIPSELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSELR6-NEXT: ll $8, 0($2)
+; MIPSELR6-NEXT: and $8, $8, $4
+; MIPSELR6-NEXT: and $5, $5, $4
+; MIPSELR6-NEXT: sltu $11, $8, $5
+; MIPSELR6-NEXT: seleqz $9, $8, $11
+; MIPSELR6-NEXT: selnez $11, $5, $11
+; MIPSELR6-NEXT: or $9, $9, $11
+; MIPSELR6-NEXT: and $9, $9, $4
+; MIPSELR6-NEXT: and $10, $8, $6
+; MIPSELR6-NEXT: or $10, $10, $9
+; MIPSELR6-NEXT: sc $10, 0($2)
+; MIPSELR6-NEXT: beqzc $10, $BB10_1
+; MIPSELR6-NEXT: # %bb.2: # %entry
+; MIPSELR6-NEXT: and $7, $8, $4
+; MIPSELR6-NEXT: srlv $7, $7, $3
+; MIPSELR6-NEXT: seh $7, $7
+; MIPSELR6-NEXT: # %bb.3: # %entry
+; MIPSELR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPSELR6-NEXT: # %bb.4: # %entry
+; MIPSELR6-NEXT: sync
+; MIPSELR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPSELR6-NEXT: addiu $sp, $sp, 8
+; MIPSELR6-NEXT: jrc $ra
+;
+; MMEL-LABEL: test_umax_8:
+; MMEL: # %bb.0: # %entry
+; MMEL-NEXT: addiu $sp, $sp, -8
+; MMEL-NEXT: .cfi_def_cfa_offset 8
+; MMEL-NEXT: move $1, $5
+; MMEL-NEXT: sync
+; MMEL-NEXT: addiu $2, $zero, -4
+; MMEL-NEXT: and $2, $4, $2
+; MMEL-NEXT: andi $3, $4, 3
+; MMEL-NEXT: sll $3, $3, 3
+; MMEL-NEXT: ori $4, $zero, 255
+; MMEL-NEXT: sllv $4, $4, $3
+; MMEL-NEXT: nor $6, $zero, $4
+; MMEL-NEXT: sllv $5, $5, $3
+; MMEL-NEXT: $BB10_1: # %entry
+; MMEL-NEXT: # =>This Inner Loop Header: Depth=1
+; MMEL-NEXT: ll $8, 0($2)
+; MMEL-NEXT: and $8, $8, $4
+; MMEL-NEXT: and $5, $5, $4
+; MMEL-NEXT: sltu $11, $8, $5
+; MMEL-NEXT: or $9, $8, $zero
+; MMEL-NEXT: movn $9, $5, $11
+; MMEL-NEXT: and $9, $9, $4
+; MMEL-NEXT: and $10, $8, $6
+; MMEL-NEXT: or $10, $10, $9
+; MMEL-NEXT: sc $10, 0($2)
+; MMEL-NEXT: beqzc $10, $BB10_1
+; MMEL-NEXT: # %bb.2: # %entry
+; MMEL-NEXT: and $7, $8, $4
+; MMEL-NEXT: srlv $7, $7, $3
+; MMEL-NEXT: seh $7, $7
+; MMEL-NEXT: # %bb.3: # %entry
+; MMEL-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MMEL-NEXT: # %bb.4: # %entry
+; MMEL-NEXT: sync
+; MMEL-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MMEL-NEXT: addiusp 8
+; MMEL-NEXT: jrc $ra
+;
+; MMELR6-LABEL: test_umax_8:
+; MMELR6: # %bb.0: # %entry
+; MMELR6-NEXT: addiu $sp, $sp, -8
+; MMELR6-NEXT: .cfi_def_cfa_offset 8
+; MMELR6-NEXT: move $1, $5
+; MMELR6-NEXT: sync
+; MMELR6-NEXT: addiu $2, $zero, -4
+; MMELR6-NEXT: and $2, $4, $2
+; MMELR6-NEXT: andi $3, $4, 3
+; MMELR6-NEXT: sll $3, $3, 3
+; MMELR6-NEXT: ori $4, $zero, 255
+; MMELR6-NEXT: sllv $4, $4, $3
+; MMELR6-NEXT: nor $6, $zero, $4
+; MMELR6-NEXT: sllv $5, $5, $3
+; MMELR6-NEXT: $BB10_1: # %entry
+; MMELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MMELR6-NEXT: ll $8, 0($2)
+; MMELR6-NEXT: and $8, $8, $4
+; MMELR6-NEXT: and $5, $5, $4
+; MMELR6-NEXT: sltu $11, $8, $5
+; MMELR6-NEXT: seleqz $9, $8, $11
+; MMELR6-NEXT: selnez $11, $5, $11
+; MMELR6-NEXT: or $9, $9, $11
+; MMELR6-NEXT: and $9, $9, $4
+; MMELR6-NEXT: and $10, $8, $6
+; MMELR6-NEXT: or $10, $10, $9
+; MMELR6-NEXT: sc $10, 0($2)
+; MMELR6-NEXT: beqc $10, $zero, $BB10_1
+; MMELR6-NEXT: # %bb.2: # %entry
+; MMELR6-NEXT: and $7, $8, $4
+; MMELR6-NEXT: srlv $7, $7, $3
+; MMELR6-NEXT: seh $7, $7
+; MMELR6-NEXT: # %bb.3: # %entry
+; MMELR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MMELR6-NEXT: # %bb.4: # %entry
+; MMELR6-NEXT: sync
+; MMELR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MMELR6-NEXT: addiu $sp, $sp, 8
+; MMELR6-NEXT: jrc $ra
+;
+; MIPS64-LABEL: test_umax_8:
+; MIPS64: # %bb.0: # %entry
+; MIPS64-NEXT: daddiu $sp, $sp, -16
+; MIPS64-NEXT: .cfi_def_cfa_offset 16
+; MIPS64-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64-NEXT: sync
+; MIPS64-NEXT: daddiu $1, $zero, -4
+; MIPS64-NEXT: and $1, $4, $1
+; MIPS64-NEXT: andi $2, $4, 3
+; MIPS64-NEXT: xori $2, $2, 3
+; MIPS64-NEXT: sll $2, $2, 3
+; MIPS64-NEXT: ori $3, $zero, 255
+; MIPS64-NEXT: sllv $3, $3, $2
+; MIPS64-NEXT: nor $6, $zero, $3
+; MIPS64-NEXT: sllv $5, $5, $2
+; MIPS64-NEXT: .LBB10_1: # %entry
+; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64-NEXT: ll $8, 0($1)
+; MIPS64-NEXT: sltu $11, $8, $5
+; MIPS64-NEXT: move $9, $8
+; MIPS64-NEXT: movn $9, $5, $11
+; MIPS64-NEXT: and $9, $9, $3
+; MIPS64-NEXT: and $10, $8, $6
+; MIPS64-NEXT: or $10, $10, $9
+; MIPS64-NEXT: sc $10, 0($1)
+; MIPS64-NEXT: beqz $10, .LBB10_1
+; MIPS64-NEXT: nop
+; MIPS64-NEXT: # %bb.2: # %entry
+; MIPS64-NEXT: and $7, $8, $3
+; MIPS64-NEXT: srlv $7, $7, $2
+; MIPS64-NEXT: seh $7, $7
+; MIPS64-NEXT: # %bb.3: # %entry
+; MIPS64-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64-NEXT: # %bb.4: # %entry
+; MIPS64-NEXT: sync
+; MIPS64-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64-NEXT: daddiu $sp, $sp, 16
+; MIPS64-NEXT: jr $ra
+; MIPS64-NEXT: nop
+;
+; MIPS64R6-LABEL: test_umax_8:
+; MIPS64R6: # %bb.0: # %entry
+; MIPS64R6-NEXT: daddiu $sp, $sp, -16
+; MIPS64R6-NEXT: .cfi_def_cfa_offset 16
+; MIPS64R6-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64R6-NEXT: sync
+; MIPS64R6-NEXT: daddiu $1, $zero, -4
+; MIPS64R6-NEXT: and $1, $4, $1
+; MIPS64R6-NEXT: andi $2, $4, 3
+; MIPS64R6-NEXT: xori $2, $2, 3
+; MIPS64R6-NEXT: sll $2, $2, 3
+; MIPS64R6-NEXT: ori $3, $zero, 255
+; MIPS64R6-NEXT: sllv $3, $3, $2
+; MIPS64R6-NEXT: nor $6, $zero, $3
+; MIPS64R6-NEXT: sllv $5, $5, $2
+; MIPS64R6-NEXT: .LBB10_1: # %entry
+; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64R6-NEXT: ll $8, 0($1)
+; MIPS64R6-NEXT: sltu $11, $8, $5
+; MIPS64R6-NEXT: seleqz $9, $8, $11
+; MIPS64R6-NEXT: selnez $11, $5, $11
+; MIPS64R6-NEXT: or $9, $9, $11
+; MIPS64R6-NEXT: and $9, $9, $3
+; MIPS64R6-NEXT: and $10, $8, $6
+; MIPS64R6-NEXT: or $10, $10, $9
+; MIPS64R6-NEXT: sc $10, 0($1)
+; MIPS64R6-NEXT: beqzc $10, .LBB10_1
+; MIPS64R6-NEXT: # %bb.2: # %entry
+; MIPS64R6-NEXT: and $7, $8, $3
+; MIPS64R6-NEXT: srlv $7, $7, $2
+; MIPS64R6-NEXT: seh $7, $7
+; MIPS64R6-NEXT: # %bb.3: # %entry
+; MIPS64R6-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64R6-NEXT: # %bb.4: # %entry
+; MIPS64R6-NEXT: sync
+; MIPS64R6-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64R6-NEXT: daddiu $sp, $sp, 16
+; MIPS64R6-NEXT: jrc $ra
+;
+; MIPS64EL-LABEL: test_umax_8:
+; MIPS64EL: # %bb.0: # %entry
+; MIPS64EL-NEXT: daddiu $sp, $sp, -16
+; MIPS64EL-NEXT: .cfi_def_cfa_offset 16
+; MIPS64EL-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64EL-NEXT: sync
+; MIPS64EL-NEXT: daddiu $1, $zero, -4
+; MIPS64EL-NEXT: and $1, $4, $1
+; MIPS64EL-NEXT: andi $2, $4, 3
+; MIPS64EL-NEXT: sll $2, $2, 3
+; MIPS64EL-NEXT: ori $3, $zero, 255
+; MIPS64EL-NEXT: sllv $3, $3, $2
+; MIPS64EL-NEXT: nor $6, $zero, $3
+; MIPS64EL-NEXT: sllv $5, $5, $2
+; MIPS64EL-NEXT: .LBB10_1: # %entry
+; MIPS64EL-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64EL-NEXT: ll $8, 0($1)
+; MIPS64EL-NEXT: and $8, $8, $3
+; MIPS64EL-NEXT: and $5, $5, $3
+; MIPS64EL-NEXT: sltu $11, $8, $5
+; MIPS64EL-NEXT: move $9, $8
+; MIPS64EL-NEXT: movn $9, $5, $11
+; MIPS64EL-NEXT: and $9, $9, $3
+; MIPS64EL-NEXT: and $10, $8, $6
+; MIPS64EL-NEXT: or $10, $10, $9
+; MIPS64EL-NEXT: sc $10, 0($1)
+; MIPS64EL-NEXT: beqz $10, .LBB10_1
+; MIPS64EL-NEXT: nop
+; MIPS64EL-NEXT: # %bb.2: # %entry
+; MIPS64EL-NEXT: and $7, $8, $3
+; MIPS64EL-NEXT: srlv $7, $7, $2
+; MIPS64EL-NEXT: seh $7, $7
+; MIPS64EL-NEXT: # %bb.3: # %entry
+; MIPS64EL-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64EL-NEXT: # %bb.4: # %entry
+; MIPS64EL-NEXT: sync
+; MIPS64EL-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64EL-NEXT: daddiu $sp, $sp, 16
+; MIPS64EL-NEXT: jr $ra
+; MIPS64EL-NEXT: nop
+;
+; MIPS64ELR6-LABEL: test_umax_8:
+; MIPS64ELR6: # %bb.0: # %entry
+; MIPS64ELR6-NEXT: daddiu $sp, $sp, -16
+; MIPS64ELR6-NEXT: .cfi_def_cfa_offset 16
+; MIPS64ELR6-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64ELR6-NEXT: sync
+; MIPS64ELR6-NEXT: daddiu $1, $zero, -4
+; MIPS64ELR6-NEXT: and $1, $4, $1
+; MIPS64ELR6-NEXT: andi $2, $4, 3
+; MIPS64ELR6-NEXT: sll $2, $2, 3
+; MIPS64ELR6-NEXT: ori $3, $zero, 255
+; MIPS64ELR6-NEXT: sllv $3, $3, $2
+; MIPS64ELR6-NEXT: nor $6, $zero, $3
+; MIPS64ELR6-NEXT: sllv $5, $5, $2
+; MIPS64ELR6-NEXT: .LBB10_1: # %entry
+; MIPS64ELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64ELR6-NEXT: ll $8, 0($1)
+; MIPS64ELR6-NEXT: and $8, $8, $3
+; MIPS64ELR6-NEXT: and $5, $5, $3
+; MIPS64ELR6-NEXT: sltu $11, $8, $5
+; MIPS64ELR6-NEXT: seleqz $9, $8, $11
+; MIPS64ELR6-NEXT: selnez $11, $5, $11
+; MIPS64ELR6-NEXT: or $9, $9, $11
+; MIPS64ELR6-NEXT: and $9, $9, $3
+; MIPS64ELR6-NEXT: and $10, $8, $6
+; MIPS64ELR6-NEXT: or $10, $10, $9
+; MIPS64ELR6-NEXT: sc $10, 0($1)
+; MIPS64ELR6-NEXT: beqzc $10, .LBB10_1
+; MIPS64ELR6-NEXT: # %bb.2: # %entry
+; MIPS64ELR6-NEXT: and $7, $8, $3
+; MIPS64ELR6-NEXT: srlv $7, $7, $2
+; MIPS64ELR6-NEXT: seh $7, $7
+; MIPS64ELR6-NEXT: # %bb.3: # %entry
+; MIPS64ELR6-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64ELR6-NEXT: # %bb.4: # %entry
+; MIPS64ELR6-NEXT: sync
+; MIPS64ELR6-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64ELR6-NEXT: daddiu $sp, $sp, 16
+; MIPS64ELR6-NEXT: jrc $ra
+entry:
+ %0 = atomicrmw umax i8* %ptr, i8 %val seq_cst
+ ret i8 %0
+}
+
+define i8 @test_umin_8(i8* nocapture %ptr, i8 signext %val) {
+; MIPS-LABEL: test_umin_8:
+; MIPS: # %bb.0: # %entry
+; MIPS-NEXT: addiu $sp, $sp, -8
+; MIPS-NEXT: .cfi_def_cfa_offset 8
+; MIPS-NEXT: move $1, $5
+; MIPS-NEXT: sync
+; MIPS-NEXT: addiu $2, $zero, -4
+; MIPS-NEXT: and $2, $4, $2
+; MIPS-NEXT: andi $3, $4, 3
+; MIPS-NEXT: xori $3, $3, 3
+; MIPS-NEXT: sll $3, $3, 3
+; MIPS-NEXT: ori $4, $zero, 255
+; MIPS-NEXT: sllv $4, $4, $3
+; MIPS-NEXT: nor $6, $zero, $4
+; MIPS-NEXT: sllv $5, $5, $3
+; MIPS-NEXT: $BB11_1: # %entry
+; MIPS-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS-NEXT: ll $8, 0($2)
+; MIPS-NEXT: sltu $11, $8, $5
+; MIPS-NEXT: move $9, $8
+; MIPS-NEXT: movz $9, $5, $11
+; MIPS-NEXT: and $9, $9, $4
+; MIPS-NEXT: and $10, $8, $6
+; MIPS-NEXT: or $10, $10, $9
+; MIPS-NEXT: sc $10, 0($2)
+; MIPS-NEXT: beqz $10, $BB11_1
+; MIPS-NEXT: nop
+; MIPS-NEXT: # %bb.2: # %entry
+; MIPS-NEXT: and $7, $8, $4
+; MIPS-NEXT: srlv $7, $7, $3
+; MIPS-NEXT: seh $7, $7
+; MIPS-NEXT: # %bb.3: # %entry
+; MIPS-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPS-NEXT: # %bb.4: # %entry
+; MIPS-NEXT: sync
+; MIPS-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPS-NEXT: addiu $sp, $sp, 8
+; MIPS-NEXT: jr $ra
+; MIPS-NEXT: nop
+;
+; MIPSR6-LABEL: test_umin_8:
+; MIPSR6: # %bb.0: # %entry
+; MIPSR6-NEXT: addiu $sp, $sp, -8
+; MIPSR6-NEXT: .cfi_def_cfa_offset 8
+; MIPSR6-NEXT: move $1, $5
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: addiu $2, $zero, -4
+; MIPSR6-NEXT: and $2, $4, $2
+; MIPSR6-NEXT: andi $3, $4, 3
+; MIPSR6-NEXT: xori $3, $3, 3
+; MIPSR6-NEXT: sll $3, $3, 3
+; MIPSR6-NEXT: ori $4, $zero, 255
+; MIPSR6-NEXT: sllv $4, $4, $3
+; MIPSR6-NEXT: nor $6, $zero, $4
+; MIPSR6-NEXT: sllv $5, $5, $3
+; MIPSR6-NEXT: $BB11_1: # %entry
+; MIPSR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSR6-NEXT: ll $8, 0($2)
+; MIPSR6-NEXT: sltu $11, $8, $5
+; MIPSR6-NEXT: selnez $9, $8, $11
+; MIPSR6-NEXT: seleqz $11, $5, $11
+; MIPSR6-NEXT: or $9, $9, $11
+; MIPSR6-NEXT: and $9, $9, $4
+; MIPSR6-NEXT: and $10, $8, $6
+; MIPSR6-NEXT: or $10, $10, $9
+; MIPSR6-NEXT: sc $10, 0($2)
+; MIPSR6-NEXT: beqzc $10, $BB11_1
+; MIPSR6-NEXT: # %bb.2: # %entry
+; MIPSR6-NEXT: and $7, $8, $4
+; MIPSR6-NEXT: srlv $7, $7, $3
+; MIPSR6-NEXT: seh $7, $7
+; MIPSR6-NEXT: # %bb.3: # %entry
+; MIPSR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPSR6-NEXT: # %bb.4: # %entry
+; MIPSR6-NEXT: sync
+; MIPSR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPSR6-NEXT: addiu $sp, $sp, 8
+; MIPSR6-NEXT: jrc $ra
+;
+; MM-LABEL: test_umin_8:
+; MM: # %bb.0: # %entry
+; MM-NEXT: addiu $sp, $sp, -8
+; MM-NEXT: .cfi_def_cfa_offset 8
+; MM-NEXT: move $1, $5
+; MM-NEXT: sync
+; MM-NEXT: addiu $2, $zero, -4
+; MM-NEXT: and $2, $4, $2
+; MM-NEXT: andi $3, $4, 3
+; MM-NEXT: xori $3, $3, 3
+; MM-NEXT: sll $3, $3, 3
+; MM-NEXT: ori $4, $zero, 255
+; MM-NEXT: sllv $4, $4, $3
+; MM-NEXT: nor $6, $zero, $4
+; MM-NEXT: sllv $5, $5, $3
+; MM-NEXT: $BB11_1: # %entry
+; MM-NEXT: # =>This Inner Loop Header: Depth=1
+; MM-NEXT: ll $8, 0($2)
+; MM-NEXT: sltu $11, $8, $5
+; MM-NEXT: or $9, $8, $zero
+; MM-NEXT: movz $9, $5, $11
+; MM-NEXT: and $9, $9, $4
+; MM-NEXT: and $10, $8, $6
+; MM-NEXT: or $10, $10, $9
+; MM-NEXT: sc $10, 0($2)
+; MM-NEXT: beqzc $10, $BB11_1
+; MM-NEXT: # %bb.2: # %entry
+; MM-NEXT: and $7, $8, $4
+; MM-NEXT: srlv $7, $7, $3
+; MM-NEXT: seh $7, $7
+; MM-NEXT: # %bb.3: # %entry
+; MM-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MM-NEXT: # %bb.4: # %entry
+; MM-NEXT: sync
+; MM-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MM-NEXT: addiusp 8
+; MM-NEXT: jrc $ra
+;
+; MMR6-LABEL: test_umin_8:
+; MMR6: # %bb.0: # %entry
+; MMR6-NEXT: addiu $sp, $sp, -8
+; MMR6-NEXT: .cfi_def_cfa_offset 8
+; MMR6-NEXT: move $1, $5
+; MMR6-NEXT: sync
+; MMR6-NEXT: addiu $2, $zero, -4
+; MMR6-NEXT: and $2, $4, $2
+; MMR6-NEXT: andi $3, $4, 3
+; MMR6-NEXT: xori $3, $3, 3
+; MMR6-NEXT: sll $3, $3, 3
+; MMR6-NEXT: ori $4, $zero, 255
+; MMR6-NEXT: sllv $4, $4, $3
+; MMR6-NEXT: nor $6, $zero, $4
+; MMR6-NEXT: sllv $5, $5, $3
+; MMR6-NEXT: $BB11_1: # %entry
+; MMR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MMR6-NEXT: ll $8, 0($2)
+; MMR6-NEXT: sltu $11, $8, $5
+; MMR6-NEXT: selnez $9, $8, $11
+; MMR6-NEXT: seleqz $11, $5, $11
+; MMR6-NEXT: or $9, $9, $11
+; MMR6-NEXT: and $9, $9, $4
+; MMR6-NEXT: and $10, $8, $6
+; MMR6-NEXT: or $10, $10, $9
+; MMR6-NEXT: sc $10, 0($2)
+; MMR6-NEXT: beqc $10, $zero, $BB11_1
+; MMR6-NEXT: # %bb.2: # %entry
+; MMR6-NEXT: and $7, $8, $4
+; MMR6-NEXT: srlv $7, $7, $3
+; MMR6-NEXT: seh $7, $7
+; MMR6-NEXT: # %bb.3: # %entry
+; MMR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MMR6-NEXT: # %bb.4: # %entry
+; MMR6-NEXT: sync
+; MMR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MMR6-NEXT: addiu $sp, $sp, 8
+; MMR6-NEXT: jrc $ra
+;
+; MIPSEL-LABEL: test_umin_8:
+; MIPSEL: # %bb.0: # %entry
+; MIPSEL-NEXT: addiu $sp, $sp, -8
+; MIPSEL-NEXT: .cfi_def_cfa_offset 8
+; MIPSEL-NEXT: move $1, $5
+; MIPSEL-NEXT: sync
+; MIPSEL-NEXT: addiu $2, $zero, -4
+; MIPSEL-NEXT: and $2, $4, $2
+; MIPSEL-NEXT: andi $3, $4, 3
+; MIPSEL-NEXT: sll $3, $3, 3
+; MIPSEL-NEXT: ori $4, $zero, 255
+; MIPSEL-NEXT: sllv $4, $4, $3
+; MIPSEL-NEXT: nor $6, $zero, $4
+; MIPSEL-NEXT: sllv $5, $5, $3
+; MIPSEL-NEXT: $BB11_1: # %entry
+; MIPSEL-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSEL-NEXT: ll $8, 0($2)
+; MIPSEL-NEXT: and $8, $8, $4
+; MIPSEL-NEXT: and $5, $5, $4
+; MIPSEL-NEXT: sltu $11, $8, $5
+; MIPSEL-NEXT: move $9, $8
+; MIPSEL-NEXT: movz $9, $5, $11
+; MIPSEL-NEXT: and $9, $9, $4
+; MIPSEL-NEXT: and $10, $8, $6
+; MIPSEL-NEXT: or $10, $10, $9
+; MIPSEL-NEXT: sc $10, 0($2)
+; MIPSEL-NEXT: beqz $10, $BB11_1
+; MIPSEL-NEXT: nop
+; MIPSEL-NEXT: # %bb.2: # %entry
+; MIPSEL-NEXT: and $7, $8, $4
+; MIPSEL-NEXT: srlv $7, $7, $3
+; MIPSEL-NEXT: seh $7, $7
+; MIPSEL-NEXT: # %bb.3: # %entry
+; MIPSEL-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPSEL-NEXT: # %bb.4: # %entry
+; MIPSEL-NEXT: sync
+; MIPSEL-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPSEL-NEXT: addiu $sp, $sp, 8
+; MIPSEL-NEXT: jr $ra
+; MIPSEL-NEXT: nop
+;
+; MIPSELR6-LABEL: test_umin_8:
+; MIPSELR6: # %bb.0: # %entry
+; MIPSELR6-NEXT: addiu $sp, $sp, -8
+; MIPSELR6-NEXT: .cfi_def_cfa_offset 8
+; MIPSELR6-NEXT: move $1, $5
+; MIPSELR6-NEXT: sync
+; MIPSELR6-NEXT: addiu $2, $zero, -4
+; MIPSELR6-NEXT: and $2, $4, $2
+; MIPSELR6-NEXT: andi $3, $4, 3
+; MIPSELR6-NEXT: sll $3, $3, 3
+; MIPSELR6-NEXT: ori $4, $zero, 255
+; MIPSELR6-NEXT: sllv $4, $4, $3
+; MIPSELR6-NEXT: nor $6, $zero, $4
+; MIPSELR6-NEXT: sllv $5, $5, $3
+; MIPSELR6-NEXT: $BB11_1: # %entry
+; MIPSELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPSELR6-NEXT: ll $8, 0($2)
+; MIPSELR6-NEXT: and $8, $8, $4
+; MIPSELR6-NEXT: and $5, $5, $4
+; MIPSELR6-NEXT: sltu $11, $8, $5
+; MIPSELR6-NEXT: selnez $9, $8, $11
+; MIPSELR6-NEXT: seleqz $11, $5, $11
+; MIPSELR6-NEXT: or $9, $9, $11
+; MIPSELR6-NEXT: and $9, $9, $4
+; MIPSELR6-NEXT: and $10, $8, $6
+; MIPSELR6-NEXT: or $10, $10, $9
+; MIPSELR6-NEXT: sc $10, 0($2)
+; MIPSELR6-NEXT: beqzc $10, $BB11_1
+; MIPSELR6-NEXT: # %bb.2: # %entry
+; MIPSELR6-NEXT: and $7, $8, $4
+; MIPSELR6-NEXT: srlv $7, $7, $3
+; MIPSELR6-NEXT: seh $7, $7
+; MIPSELR6-NEXT: # %bb.3: # %entry
+; MIPSELR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MIPSELR6-NEXT: # %bb.4: # %entry
+; MIPSELR6-NEXT: sync
+; MIPSELR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MIPSELR6-NEXT: addiu $sp, $sp, 8
+; MIPSELR6-NEXT: jrc $ra
+;
+; MMEL-LABEL: test_umin_8:
+; MMEL: # %bb.0: # %entry
+; MMEL-NEXT: addiu $sp, $sp, -8
+; MMEL-NEXT: .cfi_def_cfa_offset 8
+; MMEL-NEXT: move $1, $5
+; MMEL-NEXT: sync
+; MMEL-NEXT: addiu $2, $zero, -4
+; MMEL-NEXT: and $2, $4, $2
+; MMEL-NEXT: andi $3, $4, 3
+; MMEL-NEXT: sll $3, $3, 3
+; MMEL-NEXT: ori $4, $zero, 255
+; MMEL-NEXT: sllv $4, $4, $3
+; MMEL-NEXT: nor $6, $zero, $4
+; MMEL-NEXT: sllv $5, $5, $3
+; MMEL-NEXT: $BB11_1: # %entry
+; MMEL-NEXT: # =>This Inner Loop Header: Depth=1
+; MMEL-NEXT: ll $8, 0($2)
+; MMEL-NEXT: and $8, $8, $4
+; MMEL-NEXT: and $5, $5, $4
+; MMEL-NEXT: sltu $11, $8, $5
+; MMEL-NEXT: or $9, $8, $zero
+; MMEL-NEXT: movz $9, $5, $11
+; MMEL-NEXT: and $9, $9, $4
+; MMEL-NEXT: and $10, $8, $6
+; MMEL-NEXT: or $10, $10, $9
+; MMEL-NEXT: sc $10, 0($2)
+; MMEL-NEXT: beqzc $10, $BB11_1
+; MMEL-NEXT: # %bb.2: # %entry
+; MMEL-NEXT: and $7, $8, $4
+; MMEL-NEXT: srlv $7, $7, $3
+; MMEL-NEXT: seh $7, $7
+; MMEL-NEXT: # %bb.3: # %entry
+; MMEL-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MMEL-NEXT: # %bb.4: # %entry
+; MMEL-NEXT: sync
+; MMEL-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MMEL-NEXT: addiusp 8
+; MMEL-NEXT: jrc $ra
+;
+; MMELR6-LABEL: test_umin_8:
+; MMELR6: # %bb.0: # %entry
+; MMELR6-NEXT: addiu $sp, $sp, -8
+; MMELR6-NEXT: .cfi_def_cfa_offset 8
+; MMELR6-NEXT: move $1, $5
+; MMELR6-NEXT: sync
+; MMELR6-NEXT: addiu $2, $zero, -4
+; MMELR6-NEXT: and $2, $4, $2
+; MMELR6-NEXT: andi $3, $4, 3
+; MMELR6-NEXT: sll $3, $3, 3
+; MMELR6-NEXT: ori $4, $zero, 255
+; MMELR6-NEXT: sllv $4, $4, $3
+; MMELR6-NEXT: nor $6, $zero, $4
+; MMELR6-NEXT: sllv $5, $5, $3
+; MMELR6-NEXT: $BB11_1: # %entry
+; MMELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MMELR6-NEXT: ll $8, 0($2)
+; MMELR6-NEXT: and $8, $8, $4
+; MMELR6-NEXT: and $5, $5, $4
+; MMELR6-NEXT: sltu $11, $8, $5
+; MMELR6-NEXT: selnez $9, $8, $11
+; MMELR6-NEXT: seleqz $11, $5, $11
+; MMELR6-NEXT: or $9, $9, $11
+; MMELR6-NEXT: and $9, $9, $4
+; MMELR6-NEXT: and $10, $8, $6
+; MMELR6-NEXT: or $10, $10, $9
+; MMELR6-NEXT: sc $10, 0($2)
+; MMELR6-NEXT: beqc $10, $zero, $BB11_1
+; MMELR6-NEXT: # %bb.2: # %entry
+; MMELR6-NEXT: and $7, $8, $4
+; MMELR6-NEXT: srlv $7, $7, $3
+; MMELR6-NEXT: seh $7, $7
+; MMELR6-NEXT: # %bb.3: # %entry
+; MMELR6-NEXT: sw $7, 4($sp) # 4-byte Folded Spill
+; MMELR6-NEXT: # %bb.4: # %entry
+; MMELR6-NEXT: sync
+; MMELR6-NEXT: lw $2, 4($sp) # 4-byte Folded Reload
+; MMELR6-NEXT: addiu $sp, $sp, 8
+; MMELR6-NEXT: jrc $ra
+;
+; MIPS64-LABEL: test_umin_8:
+; MIPS64: # %bb.0: # %entry
+; MIPS64-NEXT: daddiu $sp, $sp, -16
+; MIPS64-NEXT: .cfi_def_cfa_offset 16
+; MIPS64-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64-NEXT: sync
+; MIPS64-NEXT: daddiu $1, $zero, -4
+; MIPS64-NEXT: and $1, $4, $1
+; MIPS64-NEXT: andi $2, $4, 3
+; MIPS64-NEXT: xori $2, $2, 3
+; MIPS64-NEXT: sll $2, $2, 3
+; MIPS64-NEXT: ori $3, $zero, 255
+; MIPS64-NEXT: sllv $3, $3, $2
+; MIPS64-NEXT: nor $6, $zero, $3
+; MIPS64-NEXT: sllv $5, $5, $2
+; MIPS64-NEXT: .LBB11_1: # %entry
+; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64-NEXT: ll $8, 0($1)
+; MIPS64-NEXT: sltu $11, $8, $5
+; MIPS64-NEXT: move $9, $8
+; MIPS64-NEXT: movz $9, $5, $11
+; MIPS64-NEXT: and $9, $9, $3
+; MIPS64-NEXT: and $10, $8, $6
+; MIPS64-NEXT: or $10, $10, $9
+; MIPS64-NEXT: sc $10, 0($1)
+; MIPS64-NEXT: beqz $10, .LBB11_1
+; MIPS64-NEXT: nop
+; MIPS64-NEXT: # %bb.2: # %entry
+; MIPS64-NEXT: and $7, $8, $3
+; MIPS64-NEXT: srlv $7, $7, $2
+; MIPS64-NEXT: seh $7, $7
+; MIPS64-NEXT: # %bb.3: # %entry
+; MIPS64-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64-NEXT: # %bb.4: # %entry
+; MIPS64-NEXT: sync
+; MIPS64-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64-NEXT: daddiu $sp, $sp, 16
+; MIPS64-NEXT: jr $ra
+; MIPS64-NEXT: nop
+;
+; MIPS64R6-LABEL: test_umin_8:
+; MIPS64R6: # %bb.0: # %entry
+; MIPS64R6-NEXT: daddiu $sp, $sp, -16
+; MIPS64R6-NEXT: .cfi_def_cfa_offset 16
+; MIPS64R6-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64R6-NEXT: sync
+; MIPS64R6-NEXT: daddiu $1, $zero, -4
+; MIPS64R6-NEXT: and $1, $4, $1
+; MIPS64R6-NEXT: andi $2, $4, 3
+; MIPS64R6-NEXT: xori $2, $2, 3
+; MIPS64R6-NEXT: sll $2, $2, 3
+; MIPS64R6-NEXT: ori $3, $zero, 255
+; MIPS64R6-NEXT: sllv $3, $3, $2
+; MIPS64R6-NEXT: nor $6, $zero, $3
+; MIPS64R6-NEXT: sllv $5, $5, $2
+; MIPS64R6-NEXT: .LBB11_1: # %entry
+; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64R6-NEXT: ll $8, 0($1)
+; MIPS64R6-NEXT: sltu $11, $8, $5
+; MIPS64R6-NEXT: selnez $9, $8, $11
+; MIPS64R6-NEXT: seleqz $11, $5, $11
+; MIPS64R6-NEXT: or $9, $9, $11
+; MIPS64R6-NEXT: and $9, $9, $3
+; MIPS64R6-NEXT: and $10, $8, $6
+; MIPS64R6-NEXT: or $10, $10, $9
+; MIPS64R6-NEXT: sc $10, 0($1)
+; MIPS64R6-NEXT: beqzc $10, .LBB11_1
+; MIPS64R6-NEXT: # %bb.2: # %entry
+; MIPS64R6-NEXT: and $7, $8, $3
+; MIPS64R6-NEXT: srlv $7, $7, $2
+; MIPS64R6-NEXT: seh $7, $7
+; MIPS64R6-NEXT: # %bb.3: # %entry
+; MIPS64R6-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64R6-NEXT: # %bb.4: # %entry
+; MIPS64R6-NEXT: sync
+; MIPS64R6-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64R6-NEXT: daddiu $sp, $sp, 16
+; MIPS64R6-NEXT: jrc $ra
+;
+; MIPS64EL-LABEL: test_umin_8:
+; MIPS64EL: # %bb.0: # %entry
+; MIPS64EL-NEXT: daddiu $sp, $sp, -16
+; MIPS64EL-NEXT: .cfi_def_cfa_offset 16
+; MIPS64EL-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64EL-NEXT: sync
+; MIPS64EL-NEXT: daddiu $1, $zero, -4
+; MIPS64EL-NEXT: and $1, $4, $1
+; MIPS64EL-NEXT: andi $2, $4, 3
+; MIPS64EL-NEXT: sll $2, $2, 3
+; MIPS64EL-NEXT: ori $3, $zero, 255
+; MIPS64EL-NEXT: sllv $3, $3, $2
+; MIPS64EL-NEXT: nor $6, $zero, $3
+; MIPS64EL-NEXT: sllv $5, $5, $2
+; MIPS64EL-NEXT: .LBB11_1: # %entry
+; MIPS64EL-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64EL-NEXT: ll $8, 0($1)
+; MIPS64EL-NEXT: and $8, $8, $3
+; MIPS64EL-NEXT: and $5, $5, $3
+; MIPS64EL-NEXT: sltu $11, $8, $5
+; MIPS64EL-NEXT: move $9, $8
+; MIPS64EL-NEXT: movz $9, $5, $11
+; MIPS64EL-NEXT: and $9, $9, $3
+; MIPS64EL-NEXT: and $10, $8, $6
+; MIPS64EL-NEXT: or $10, $10, $9
+; MIPS64EL-NEXT: sc $10, 0($1)
+; MIPS64EL-NEXT: beqz $10, .LBB11_1
+; MIPS64EL-NEXT: nop
+; MIPS64EL-NEXT: # %bb.2: # %entry
+; MIPS64EL-NEXT: and $7, $8, $3
+; MIPS64EL-NEXT: srlv $7, $7, $2
+; MIPS64EL-NEXT: seh $7, $7
+; MIPS64EL-NEXT: # %bb.3: # %entry
+; MIPS64EL-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64EL-NEXT: # %bb.4: # %entry
+; MIPS64EL-NEXT: sync
+; MIPS64EL-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64EL-NEXT: daddiu $sp, $sp, 16
+; MIPS64EL-NEXT: jr $ra
+; MIPS64EL-NEXT: nop
+;
+; MIPS64ELR6-LABEL: test_umin_8:
+; MIPS64ELR6: # %bb.0: # %entry
+; MIPS64ELR6-NEXT: daddiu $sp, $sp, -16
+; MIPS64ELR6-NEXT: .cfi_def_cfa_offset 16
+; MIPS64ELR6-NEXT: # kill: def $a1 killed $a1 killed $a1_64
+; MIPS64ELR6-NEXT: sync
+; MIPS64ELR6-NEXT: daddiu $1, $zero, -4
+; MIPS64ELR6-NEXT: and $1, $4, $1
+; MIPS64ELR6-NEXT: andi $2, $4, 3
+; MIPS64ELR6-NEXT: sll $2, $2, 3
+; MIPS64ELR6-NEXT: ori $3, $zero, 255
+; MIPS64ELR6-NEXT: sllv $3, $3, $2
+; MIPS64ELR6-NEXT: nor $6, $zero, $3
+; MIPS64ELR6-NEXT: sllv $5, $5, $2
+; MIPS64ELR6-NEXT: .LBB11_1: # %entry
+; MIPS64ELR6-NEXT: # =>This Inner Loop Header: Depth=1
+; MIPS64ELR6-NEXT: ll $8, 0($1)
+; MIPS64ELR6-NEXT: and $8, $8, $3
+; MIPS64ELR6-NEXT: and $5, $5, $3
+; MIPS64ELR6-NEXT: sltu $11, $8, $5
+; MIPS64ELR6-NEXT: selnez $9, $8, $11
+; MIPS64ELR6-NEXT: seleqz $11, $5, $11
+; MIPS64ELR6-NEXT: or $9, $9, $11
+; MIPS64ELR6-NEXT: and $9, $9, $3
+; MIPS64ELR6-NEXT: and $10, $8, $6
+; MIPS64ELR6-NEXT: or $10, $10, $9
+; MIPS64ELR6-NEXT: sc $10, 0($1)
+; MIPS64ELR6-NEXT: beqzc $10, .LBB11_1
+; MIPS64ELR6-NEXT: # %bb.2: # %entry
+; MIPS64ELR6-NEXT: and $7, $8, $3
+; MIPS64ELR6-NEXT: srlv $7, $7, $2
+; MIPS64ELR6-NEXT: seh $7, $7
+; MIPS64ELR6-NEXT: # %bb.3: # %entry
+; MIPS64ELR6-NEXT: sw $7, 12($sp) # 4-byte Folded Spill
+; MIPS64ELR6-NEXT: # %bb.4: # %entry
+; MIPS64ELR6-NEXT: sync
+; MIPS64ELR6-NEXT: lw $2, 12($sp) # 4-byte Folded Reload
+; MIPS64ELR6-NEXT: daddiu $sp, $sp, 16
+; MIPS64ELR6-NEXT: jrc $ra
+entry:
+ %0 = atomicrmw umin i8* %ptr, i8 %val seq_cst
+ ret i8 %0
+}
diff --git a/llvm/test/CodeGen/Mips/atomic.ll b/llvm/test/CodeGen/Mips/atomic.ll
index 85254c46c2a..3846fda47b1 100644
--- a/llvm/test/CodeGen/Mips/atomic.ll
+++ b/llvm/test/CodeGen/Mips/atomic.ll
@@ -1790,7 +1790,7 @@ define i32 @AtomicSwap32(i32 signext %newval) nounwind {
; MM32-NEXT: $BB6_1: # %entry
; MM32-NEXT: # =>This Inner Loop Header: Depth=1
; MM32-NEXT: ll $2, 0($1)
-; MM32-NEXT: move $3, $4
+; MM32-NEXT: or $3, $4, $zero
; MM32-NEXT: sc $3, 0($1)
; MM32-NEXT: beqzc $3, $BB6_1
; MM32-NEXT: # %bb.2: # %entry
OpenPOWER on IntegriCloud