diff options
author | Mirko Brkusanin <Mirko.Brkusanin@rt-rk.com> | 2019-12-12 11:19:41 +0100 |
---|---|---|
committer | Mirko Brkusanin <Mirko.Brkusanin@rt-rk.com> | 2019-12-12 11:32:37 +0100 |
commit | d7357c52a40a136f25c1cf5ae31a699d51885e49 (patch) | |
tree | 7b9a31ece0caeb8da5506893c3eb87c9b8d01638 /llvm/test/CodeGen/Mips | |
parent | f798eb21eca97dc44ed40da52ece22780fb74230 (diff) | |
download | bcm5719-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.ll | 158 | ||||
-rw-r--r-- | llvm/test/CodeGen/Mips/atomic-min-max.ll | 4674 | ||||
-rw-r--r-- | llvm/test/CodeGen/Mips/atomic.ll | 2 |
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 |