[llvm] 8d5b759 - [AArch64][GlobalISel] implement GPR (U/S)(MIN/MAX) instr support

Ties Stuij via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 5 03:50:50 PST 2023


Author: Ties Stuij
Date: 2023-01-05T11:50:31Z
New Revision: 8d5b759a6c7abd47bdb9ae107584a991b182931e

URL: https://github.com/llvm/llvm-project/commit/8d5b759a6c7abd47bdb9ae107584a991b182931e
DIFF: https://github.com/llvm/llvm-project/commit/8d5b759a6c7abd47bdb9ae107584a991b182931e.diff

LOG: [AArch64][GlobalISel] implement GPR (U/S)(MIN/MAX) instr support

Lower umin, umax, smin, smax intrinsics to corresponding UMIN, UMAX, SMIN, SMAX
instructions when feat CSSC is available.

Reviewed By: aemerson

Differential Revision: https://reviews.llvm.org/D139420

Added: 
    

Modified: 
    llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
    llvm/test/CodeGen/AArch64/min-max.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
index bc0b1116ff864..29df3341916f5 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
@@ -187,8 +187,19 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
       .legalFor({s64, v8s16, v16s8, v4s32})
       .lower();
 
-  getActionDefinitionsBuilder({G_SMIN, G_SMAX, G_UMIN, G_UMAX})
-      .legalFor({v8s8, v16s8, v4s16, v8s16, v2s32, v4s32})
+  auto &MinMaxActions = getActionDefinitionsBuilder(
+      {G_SMIN, G_SMAX, G_UMIN, G_UMAX});
+  if (HasCSSC)
+    MinMaxActions
+        .legalFor({s32, s64, v8s8, v16s8, v4s16, v8s16, v2s32, v4s32})
+        // Making clamping conditional on CSSC extension as without legal types we
+        // lower to CMP which can fold one of the two sxtb's we'd otherwise need
+        // if we detect a type smaller than 32-bit.
+        .minScalar(0, s32);
+  else
+    MinMaxActions
+        .legalFor({v8s8, v16s8, v4s16, v8s16, v2s32, v4s32});
+  MinMaxActions
       .clampNumElements(0, v8s8, v16s8)
       .clampNumElements(0, v4s16, v8s16)
       .clampNumElements(0, v2s32, v4s32)

diff  --git a/llvm/test/CodeGen/AArch64/min-max.ll b/llvm/test/CodeGen/AArch64/min-max.ll
index fb80c13cb9ca2..63d5632b50821 100644
--- a/llvm/test/CodeGen/AArch64/min-max.ll
+++ b/llvm/test/CodeGen/AArch64/min-max.ll
@@ -2,6 +2,7 @@
 ; RUN: llc -mtriple=aarch64-eabi %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-ISEL
 ; RUN: llc -mtriple=aarch64-eabi %s -o - -mattr=+cssc | FileCheck %s --check-prefixes=CHECK,CHECK-ISEL-CSSC
 ; RUN: llc -mtriple=aarch64-eabi -global-isel %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GLOBAL
+; RUN: llc -mtriple=aarch64-eabi -global-isel %s -o - -mattr=+cssc | FileCheck %s --check-prefixes=CHECK,CHECK-GLOBAL-CSSC
 
 ; These tests just check that the plumbing is in place for @llvm.smax, @llvm.umax,
 ; @llvm.smin, @llvm.umin.
@@ -30,6 +31,13 @@ define i8 @smaxi8(i8 %a, i8 %b) {
 ; CHECK-GLOBAL-NEXT:    cmp w8, w1, sxtb
 ; CHECK-GLOBAL-NEXT:    csel w0, w0, w1, gt
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: smaxi8:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    sxtb w8, w0
+; CHECK-GLOBAL-CSSC-NEXT:    sxtb w9, w1
+; CHECK-GLOBAL-CSSC-NEXT:    smax w0, w8, w9
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call i8 @llvm.smax.i8(i8 %a, i8 %b)
   ret i8 %c
 }
@@ -58,6 +66,13 @@ define i16 @smaxi16(i16 %a, i16 %b) {
 ; CHECK-GLOBAL-NEXT:    cmp w8, w1, sxth
 ; CHECK-GLOBAL-NEXT:    csel w0, w0, w1, gt
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: smaxi16:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    sxth w8, w0
+; CHECK-GLOBAL-CSSC-NEXT:    sxth w9, w1
+; CHECK-GLOBAL-CSSC-NEXT:    smax w0, w8, w9
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call i16 @llvm.smax.i16(i16 %a, i16 %b)
   ret i16 %c
 }
@@ -81,6 +96,11 @@ define i32 @smaxi32(i32 %a, i32 %b) {
 ; CHECK-GLOBAL-NEXT:    cmp w0, w1
 ; CHECK-GLOBAL-NEXT:    csel w0, w0, w1, gt
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: smaxi32:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    smax w0, w0, w1
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call i32 @llvm.smax.i32(i32 %a, i32 %b)
   ret i32 %c
 }
@@ -104,6 +124,11 @@ define i64 @smaxi64(i64 %a, i64 %b) {
 ; CHECK-GLOBAL-NEXT:    cmp x0, x1
 ; CHECK-GLOBAL-NEXT:    csel x0, x0, x1, gt
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: smaxi64:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    smax x0, x0, x1
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call i64 @llvm.smax.i64(i64 %a, i64 %b)
   ret i64 %c
 }
@@ -153,6 +178,13 @@ define void @smax32i8(<32 x i8> %a, <32 x i8> %b, ptr %p) {
 ; CHECK-GLOBAL-NEXT:    smax v1.16b, v1.16b, v3.16b
 ; CHECK-GLOBAL-NEXT:    stp q0, q1, [x0]
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: smax32i8:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    smax v0.16b, v0.16b, v2.16b
+; CHECK-GLOBAL-CSSC-NEXT:    smax v1.16b, v1.16b, v3.16b
+; CHECK-GLOBAL-CSSC-NEXT:    stp q0, q1, [x0]
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call <32 x i8> @llvm.smax.v32i8(<32 x i8> %a, <32 x i8> %b)
   store <32 x i8> %c, ptr %p
   ret void
@@ -203,6 +235,13 @@ define void @smax16i16(<16 x i16> %a, <16 x i16> %b, ptr %p) {
 ; CHECK-GLOBAL-NEXT:    smax v1.8h, v1.8h, v3.8h
 ; CHECK-GLOBAL-NEXT:    stp q0, q1, [x0]
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: smax16i16:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    smax v0.8h, v0.8h, v2.8h
+; CHECK-GLOBAL-CSSC-NEXT:    smax v1.8h, v1.8h, v3.8h
+; CHECK-GLOBAL-CSSC-NEXT:    stp q0, q1, [x0]
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call <16 x i16> @llvm.smax.v16i16(<16 x i16> %a, <16 x i16> %b)
   store <16 x i16> %c, ptr %p
   ret void
@@ -253,6 +292,13 @@ define void @smax8i32(<8 x i32> %a, <8 x i32> %b, ptr %p) {
 ; CHECK-GLOBAL-NEXT:    smax v1.4s, v1.4s, v3.4s
 ; CHECK-GLOBAL-NEXT:    stp q0, q1, [x0]
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: smax8i32:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    smax v0.4s, v0.4s, v2.4s
+; CHECK-GLOBAL-CSSC-NEXT:    smax v1.4s, v1.4s, v3.4s
+; CHECK-GLOBAL-CSSC-NEXT:    stp q0, q1, [x0]
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call <8 x i32>@llvm.smax.v8i32(<8 x i32> %a, <8 x i32> %b)
   store <8 x i32> %c, ptr %p
   ret void
@@ -280,6 +326,14 @@ define <1 x i64> @smax1i64(<1 x i64> %a, <1 x i64> %b) {
 ; CHECK-GLOBAL-NEXT:    cmp x8, x9
 ; CHECK-GLOBAL-NEXT:    fcsel d0, d0, d1, gt
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: smax1i64:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    fmov x8, d0
+; CHECK-GLOBAL-CSSC-NEXT:    fmov x9, d1
+; CHECK-GLOBAL-CSSC-NEXT:    smax x8, x8, x9
+; CHECK-GLOBAL-CSSC-NEXT:    fmov d0, x8
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call <1 x i64> @llvm.smax.v1i64(<1 x i64> %a, <1 x i64> %b)
   ret <1 x i64> %c
 }
@@ -287,23 +341,11 @@ define <1 x i64> @smax1i64(<1 x i64> %a, <1 x i64> %b) {
 declare <2 x i64> @llvm.smax.v2i64(<2 x i64> %a, <2 x i64> %b) readnone
 
 define <2 x i64> @smax2i64(<2 x i64> %a, <2 x i64> %b) {
-; CHECK-ISEL-LABEL: smax2i64:
-; CHECK-ISEL:       // %bb.0:
-; CHECK-ISEL-NEXT:    cmgt v2.2d, v0.2d, v1.2d
-; CHECK-ISEL-NEXT:    bif v0.16b, v1.16b, v2.16b
-; CHECK-ISEL-NEXT:    ret
-;
-; CHECK-ISEL-CSSC-LABEL: smax2i64:
-; CHECK-ISEL-CSSC:       // %bb.0:
-; CHECK-ISEL-CSSC-NEXT:    cmgt v2.2d, v0.2d, v1.2d
-; CHECK-ISEL-CSSC-NEXT:    bif v0.16b, v1.16b, v2.16b
-; CHECK-ISEL-CSSC-NEXT:    ret
-;
-; CHECK-GLOBAL-LABEL: smax2i64:
-; CHECK-GLOBAL:       // %bb.0:
-; CHECK-GLOBAL-NEXT:    cmgt v2.2d, v0.2d, v1.2d
-; CHECK-GLOBAL-NEXT:    bif v0.16b, v1.16b, v2.16b
-; CHECK-GLOBAL-NEXT:    ret
+; CHECK-LABEL: smax2i64:
+; CHECK:       // %bb.0:
+; CHECK-NEXT:    cmgt v2.2d, v0.2d, v1.2d
+; CHECK-NEXT:    bif v0.16b, v1.16b, v2.16b
+; CHECK-NEXT:    ret
   %c = call <2 x i64> @llvm.smax.v2i64(<2 x i64> %a, <2 x i64> %b)
   ret <2 x i64> %c
 }
@@ -337,6 +379,15 @@ define void @smax4i64(<4 x i64> %a, <4 x i64> %b, ptr %p) {
 ; CHECK-GLOBAL-NEXT:    bif v1.16b, v3.16b, v5.16b
 ; CHECK-GLOBAL-NEXT:    stp q0, q1, [x0]
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: smax4i64:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    cmgt v4.2d, v0.2d, v2.2d
+; CHECK-GLOBAL-CSSC-NEXT:    cmgt v5.2d, v1.2d, v3.2d
+; CHECK-GLOBAL-CSSC-NEXT:    bif v0.16b, v2.16b, v4.16b
+; CHECK-GLOBAL-CSSC-NEXT:    bif v1.16b, v3.16b, v5.16b
+; CHECK-GLOBAL-CSSC-NEXT:    stp q0, q1, [x0]
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %a, <4 x i64> %b)
   store <4 x i64> %c, ptr %p
   ret void
@@ -366,6 +417,13 @@ define i8 @umaxi8(i8 %a, i8 %b) {
 ; CHECK-GLOBAL-NEXT:    cmp w8, w1, uxtb
 ; CHECK-GLOBAL-NEXT:    csel w0, w0, w1, hi
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: umaxi8:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    and w8, w0, #0xff
+; CHECK-GLOBAL-CSSC-NEXT:    and w9, w1, #0xff
+; CHECK-GLOBAL-CSSC-NEXT:    umax w0, w8, w9
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call i8 @llvm.umax.i8(i8 %a, i8 %b)
   ret i8 %c
 }
@@ -394,6 +452,13 @@ define i16 @umaxi16(i16 %a, i16 %b) {
 ; CHECK-GLOBAL-NEXT:    cmp w8, w1, uxth
 ; CHECK-GLOBAL-NEXT:    csel w0, w0, w1, hi
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: umaxi16:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    and w8, w0, #0xffff
+; CHECK-GLOBAL-CSSC-NEXT:    and w9, w1, #0xffff
+; CHECK-GLOBAL-CSSC-NEXT:    umax w0, w8, w9
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call i16 @llvm.umax.i16(i16 %a, i16 %b)
   ret i16 %c
 }
@@ -417,6 +482,11 @@ define i32 @umaxi32(i32 %a, i32 %b) {
 ; CHECK-GLOBAL-NEXT:    cmp w0, w1
 ; CHECK-GLOBAL-NEXT:    csel w0, w0, w1, hi
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: umaxi32:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    umax w0, w0, w1
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call i32 @llvm.umax.i32(i32 %a, i32 %b)
   ret i32 %c
 }
@@ -440,6 +510,11 @@ define i64 @umaxi64(i64 %a, i64 %b) {
 ; CHECK-GLOBAL-NEXT:    cmp x0, x1
 ; CHECK-GLOBAL-NEXT:    csel x0, x0, x1, hi
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: umaxi64:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    umax x0, x0, x1
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call i64 @llvm.umax.i64(i64 %a, i64 %b)
   ret i64 %c
 }
@@ -489,6 +564,13 @@ define void @umax32i8(<32 x i8> %a, <32 x i8> %b, ptr %p) {
 ; CHECK-GLOBAL-NEXT:    umax v1.16b, v1.16b, v3.16b
 ; CHECK-GLOBAL-NEXT:    stp q0, q1, [x0]
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: umax32i8:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    umax v0.16b, v0.16b, v2.16b
+; CHECK-GLOBAL-CSSC-NEXT:    umax v1.16b, v1.16b, v3.16b
+; CHECK-GLOBAL-CSSC-NEXT:    stp q0, q1, [x0]
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call <32 x i8> @llvm.umax.v32i8(<32 x i8> %a, <32 x i8> %b)
   store <32 x i8> %c, ptr %p
   ret void
@@ -539,6 +621,13 @@ define void @umax16i16(<16 x i16> %a, <16 x i16> %b, ptr %p) {
 ; CHECK-GLOBAL-NEXT:    umax v1.8h, v1.8h, v3.8h
 ; CHECK-GLOBAL-NEXT:    stp q0, q1, [x0]
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: umax16i16:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    umax v0.8h, v0.8h, v2.8h
+; CHECK-GLOBAL-CSSC-NEXT:    umax v1.8h, v1.8h, v3.8h
+; CHECK-GLOBAL-CSSC-NEXT:    stp q0, q1, [x0]
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call <16 x i16> @llvm.umax.v16i16(<16 x i16> %a, <16 x i16> %b)
   store <16 x i16> %c, ptr %p
   ret void
@@ -589,6 +678,13 @@ define void @umax8i32(<8 x i32> %a, <8 x i32> %b, ptr %p) {
 ; CHECK-GLOBAL-NEXT:    umax v1.4s, v1.4s, v3.4s
 ; CHECK-GLOBAL-NEXT:    stp q0, q1, [x0]
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: umax8i32:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    umax v0.4s, v0.4s, v2.4s
+; CHECK-GLOBAL-CSSC-NEXT:    umax v1.4s, v1.4s, v3.4s
+; CHECK-GLOBAL-CSSC-NEXT:    stp q0, q1, [x0]
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call <8 x i32>@llvm.umax.v8i32(<8 x i32> %a, <8 x i32> %b)
   store <8 x i32> %c, ptr %p
   ret void
@@ -616,6 +712,14 @@ define <1 x i64> @umax1i64(<1 x i64> %a, <1 x i64> %b) {
 ; CHECK-GLOBAL-NEXT:    cmp x8, x9
 ; CHECK-GLOBAL-NEXT:    fcsel d0, d0, d1, hi
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: umax1i64:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    fmov x8, d0
+; CHECK-GLOBAL-CSSC-NEXT:    fmov x9, d1
+; CHECK-GLOBAL-CSSC-NEXT:    umax x8, x8, x9
+; CHECK-GLOBAL-CSSC-NEXT:    fmov d0, x8
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call <1 x i64> @llvm.umax.v1i64(<1 x i64> %a, <1 x i64> %b)
   ret <1 x i64> %c
 }
@@ -623,23 +727,11 @@ define <1 x i64> @umax1i64(<1 x i64> %a, <1 x i64> %b) {
 declare <2 x i64> @llvm.umax.v2i64(<2 x i64> %a, <2 x i64> %b) readnone
 
 define <2 x i64> @umax2i64(<2 x i64> %a, <2 x i64> %b) {
-; CHECK-ISEL-LABEL: umax2i64:
-; CHECK-ISEL:       // %bb.0:
-; CHECK-ISEL-NEXT:    cmhi v2.2d, v0.2d, v1.2d
-; CHECK-ISEL-NEXT:    bif v0.16b, v1.16b, v2.16b
-; CHECK-ISEL-NEXT:    ret
-;
-; CHECK-ISEL-CSSC-LABEL: umax2i64:
-; CHECK-ISEL-CSSC:       // %bb.0:
-; CHECK-ISEL-CSSC-NEXT:    cmhi v2.2d, v0.2d, v1.2d
-; CHECK-ISEL-CSSC-NEXT:    bif v0.16b, v1.16b, v2.16b
-; CHECK-ISEL-CSSC-NEXT:    ret
-;
-; CHECK-GLOBAL-LABEL: umax2i64:
-; CHECK-GLOBAL:       // %bb.0:
-; CHECK-GLOBAL-NEXT:    cmhi v2.2d, v0.2d, v1.2d
-; CHECK-GLOBAL-NEXT:    bif v0.16b, v1.16b, v2.16b
-; CHECK-GLOBAL-NEXT:    ret
+; CHECK-LABEL: umax2i64:
+; CHECK:       // %bb.0:
+; CHECK-NEXT:    cmhi v2.2d, v0.2d, v1.2d
+; CHECK-NEXT:    bif v0.16b, v1.16b, v2.16b
+; CHECK-NEXT:    ret
   %c = call <2 x i64> @llvm.umax.v2i64(<2 x i64> %a, <2 x i64> %b)
   ret <2 x i64> %c
 }
@@ -673,6 +765,15 @@ define void @umax4i64(<4 x i64> %a, <4 x i64> %b, ptr %p) {
 ; CHECK-GLOBAL-NEXT:    bif v1.16b, v3.16b, v5.16b
 ; CHECK-GLOBAL-NEXT:    stp q0, q1, [x0]
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: umax4i64:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    cmhi v4.2d, v0.2d, v2.2d
+; CHECK-GLOBAL-CSSC-NEXT:    cmhi v5.2d, v1.2d, v3.2d
+; CHECK-GLOBAL-CSSC-NEXT:    bif v0.16b, v2.16b, v4.16b
+; CHECK-GLOBAL-CSSC-NEXT:    bif v1.16b, v3.16b, v5.16b
+; CHECK-GLOBAL-CSSC-NEXT:    stp q0, q1, [x0]
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call <4 x i64> @llvm.umax.v4i64(<4 x i64> %a, <4 x i64> %b)
   store <4 x i64> %c, ptr %p
   ret void
@@ -702,6 +803,13 @@ define i8 @smini8(i8 %a, i8 %b) {
 ; CHECK-GLOBAL-NEXT:    cmp w8, w1, sxtb
 ; CHECK-GLOBAL-NEXT:    csel w0, w0, w1, lt
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: smini8:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    sxtb w8, w0
+; CHECK-GLOBAL-CSSC-NEXT:    sxtb w9, w1
+; CHECK-GLOBAL-CSSC-NEXT:    smin w0, w8, w9
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call i8 @llvm.smin.i8(i8 %a, i8 %b)
   ret i8 %c
 }
@@ -730,6 +838,13 @@ define i16 @smini16(i16 %a, i16 %b) {
 ; CHECK-GLOBAL-NEXT:    cmp w8, w1, sxth
 ; CHECK-GLOBAL-NEXT:    csel w0, w0, w1, lt
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: smini16:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    sxth w8, w0
+; CHECK-GLOBAL-CSSC-NEXT:    sxth w9, w1
+; CHECK-GLOBAL-CSSC-NEXT:    smin w0, w8, w9
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call i16 @llvm.smin.i16(i16 %a, i16 %b)
   ret i16 %c
 }
@@ -753,6 +868,11 @@ define i32 @smini32(i32 %a, i32 %b) {
 ; CHECK-GLOBAL-NEXT:    cmp w0, w1
 ; CHECK-GLOBAL-NEXT:    csel w0, w0, w1, lt
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: smini32:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    smin w0, w0, w1
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call i32 @llvm.smin.i32(i32 %a, i32 %b)
   ret i32 %c
 }
@@ -776,6 +896,11 @@ define i64 @smini64(i64 %a, i64 %b) {
 ; CHECK-GLOBAL-NEXT:    cmp x0, x1
 ; CHECK-GLOBAL-NEXT:    csel x0, x0, x1, lt
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: smini64:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    smin x0, x0, x1
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call i64 @llvm.smin.i64(i64 %a, i64 %b)
   ret i64 %c
 }
@@ -825,6 +950,13 @@ define void @smin32i8(<32 x i8> %a, <32 x i8> %b, ptr %p) {
 ; CHECK-GLOBAL-NEXT:    smin v1.16b, v1.16b, v3.16b
 ; CHECK-GLOBAL-NEXT:    stp q0, q1, [x0]
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: smin32i8:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    smin v0.16b, v0.16b, v2.16b
+; CHECK-GLOBAL-CSSC-NEXT:    smin v1.16b, v1.16b, v3.16b
+; CHECK-GLOBAL-CSSC-NEXT:    stp q0, q1, [x0]
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call <32 x i8> @llvm.smin.v32i8(<32 x i8> %a, <32 x i8> %b)
   store <32 x i8> %c, ptr %p
   ret void
@@ -875,6 +1007,13 @@ define void @smin16i16(<16 x i16> %a, <16 x i16> %b, ptr %p) {
 ; CHECK-GLOBAL-NEXT:    smin v1.8h, v1.8h, v3.8h
 ; CHECK-GLOBAL-NEXT:    stp q0, q1, [x0]
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: smin16i16:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    smin v0.8h, v0.8h, v2.8h
+; CHECK-GLOBAL-CSSC-NEXT:    smin v1.8h, v1.8h, v3.8h
+; CHECK-GLOBAL-CSSC-NEXT:    stp q0, q1, [x0]
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call <16 x i16> @llvm.smin.v16i16(<16 x i16> %a, <16 x i16> %b)
   store <16 x i16> %c, ptr %p
   ret void
@@ -925,6 +1064,13 @@ define void @smin8i32(<8 x i32> %a, <8 x i32> %b, ptr %p) {
 ; CHECK-GLOBAL-NEXT:    smin v1.4s, v1.4s, v3.4s
 ; CHECK-GLOBAL-NEXT:    stp q0, q1, [x0]
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: smin8i32:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    smin v0.4s, v0.4s, v2.4s
+; CHECK-GLOBAL-CSSC-NEXT:    smin v1.4s, v1.4s, v3.4s
+; CHECK-GLOBAL-CSSC-NEXT:    stp q0, q1, [x0]
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call <8 x i32>@llvm.smin.v8i32(<8 x i32> %a, <8 x i32> %b)
   store <8 x i32> %c, ptr %p
   ret void
@@ -952,6 +1098,14 @@ define <1 x i64> @smin1i64(<1 x i64> %a, <1 x i64> %b) {
 ; CHECK-GLOBAL-NEXT:    cmp x8, x9
 ; CHECK-GLOBAL-NEXT:    fcsel d0, d0, d1, lt
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: smin1i64:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    fmov x8, d0
+; CHECK-GLOBAL-CSSC-NEXT:    fmov x9, d1
+; CHECK-GLOBAL-CSSC-NEXT:    smin x8, x8, x9
+; CHECK-GLOBAL-CSSC-NEXT:    fmov d0, x8
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call <1 x i64> @llvm.smin.v1i64(<1 x i64> %a, <1 x i64> %b)
   ret <1 x i64> %c
 }
@@ -959,23 +1113,11 @@ define <1 x i64> @smin1i64(<1 x i64> %a, <1 x i64> %b) {
 declare <2 x i64> @llvm.smin.v2i64(<2 x i64> %a, <2 x i64> %b) readnone
 
 define <2 x i64> @smin2i64(<2 x i64> %a, <2 x i64> %b) {
-; CHECK-ISEL-LABEL: smin2i64:
-; CHECK-ISEL:       // %bb.0:
-; CHECK-ISEL-NEXT:    cmgt v2.2d, v1.2d, v0.2d
-; CHECK-ISEL-NEXT:    bif v0.16b, v1.16b, v2.16b
-; CHECK-ISEL-NEXT:    ret
-;
-; CHECK-ISEL-CSSC-LABEL: smin2i64:
-; CHECK-ISEL-CSSC:       // %bb.0:
-; CHECK-ISEL-CSSC-NEXT:    cmgt v2.2d, v1.2d, v0.2d
-; CHECK-ISEL-CSSC-NEXT:    bif v0.16b, v1.16b, v2.16b
-; CHECK-ISEL-CSSC-NEXT:    ret
-;
-; CHECK-GLOBAL-LABEL: smin2i64:
-; CHECK-GLOBAL:       // %bb.0:
-; CHECK-GLOBAL-NEXT:    cmgt v2.2d, v1.2d, v0.2d
-; CHECK-GLOBAL-NEXT:    bif v0.16b, v1.16b, v2.16b
-; CHECK-GLOBAL-NEXT:    ret
+; CHECK-LABEL: smin2i64:
+; CHECK:       // %bb.0:
+; CHECK-NEXT:    cmgt v2.2d, v1.2d, v0.2d
+; CHECK-NEXT:    bif v0.16b, v1.16b, v2.16b
+; CHECK-NEXT:    ret
   %c = call <2 x i64> @llvm.smin.v2i64(<2 x i64> %a, <2 x i64> %b)
   ret <2 x i64> %c
 }
@@ -1009,6 +1151,15 @@ define void @smin4i64(<4 x i64> %a, <4 x i64> %b, ptr %p) {
 ; CHECK-GLOBAL-NEXT:    bif v1.16b, v3.16b, v5.16b
 ; CHECK-GLOBAL-NEXT:    stp q0, q1, [x0]
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: smin4i64:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    cmgt v4.2d, v2.2d, v0.2d
+; CHECK-GLOBAL-CSSC-NEXT:    cmgt v5.2d, v3.2d, v1.2d
+; CHECK-GLOBAL-CSSC-NEXT:    bif v0.16b, v2.16b, v4.16b
+; CHECK-GLOBAL-CSSC-NEXT:    bif v1.16b, v3.16b, v5.16b
+; CHECK-GLOBAL-CSSC-NEXT:    stp q0, q1, [x0]
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call <4 x i64> @llvm.smin.v4i64(<4 x i64> %a, <4 x i64> %b)
   store <4 x i64> %c, ptr %p
   ret void
@@ -1038,6 +1189,13 @@ define i8 @umini8(i8 %a, i8 %b) {
 ; CHECK-GLOBAL-NEXT:    cmp w8, w1, uxtb
 ; CHECK-GLOBAL-NEXT:    csel w0, w0, w1, lo
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: umini8:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    and w8, w0, #0xff
+; CHECK-GLOBAL-CSSC-NEXT:    and w9, w1, #0xff
+; CHECK-GLOBAL-CSSC-NEXT:    umin w0, w8, w9
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call i8 @llvm.umin.i8(i8 %a, i8 %b)
   ret i8 %c
 }
@@ -1066,6 +1224,13 @@ define i16 @umini16(i16 %a, i16 %b) {
 ; CHECK-GLOBAL-NEXT:    cmp w8, w1, uxth
 ; CHECK-GLOBAL-NEXT:    csel w0, w0, w1, lo
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: umini16:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    and w8, w0, #0xffff
+; CHECK-GLOBAL-CSSC-NEXT:    and w9, w1, #0xffff
+; CHECK-GLOBAL-CSSC-NEXT:    umin w0, w8, w9
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call i16 @llvm.umin.i16(i16 %a, i16 %b)
   ret i16 %c
 }
@@ -1089,6 +1254,11 @@ define i32 @umini32(i32 %a, i32 %b) {
 ; CHECK-GLOBAL-NEXT:    cmp w0, w1
 ; CHECK-GLOBAL-NEXT:    csel w0, w0, w1, lo
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: umini32:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    umin w0, w0, w1
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call i32 @llvm.umin.i32(i32 %a, i32 %b)
   ret i32 %c
 }
@@ -1112,6 +1282,11 @@ define i64 @umini64(i64 %a, i64 %b) {
 ; CHECK-GLOBAL-NEXT:    cmp x0, x1
 ; CHECK-GLOBAL-NEXT:    csel x0, x0, x1, lo
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: umini64:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    umin x0, x0, x1
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call i64 @llvm.umin.i64(i64 %a, i64 %b)
   ret i64 %c
 }
@@ -1161,6 +1336,13 @@ define void @umin32i8(<32 x i8> %a, <32 x i8> %b, ptr %p) {
 ; CHECK-GLOBAL-NEXT:    umin v1.16b, v1.16b, v3.16b
 ; CHECK-GLOBAL-NEXT:    stp q0, q1, [x0]
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: umin32i8:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    umin v0.16b, v0.16b, v2.16b
+; CHECK-GLOBAL-CSSC-NEXT:    umin v1.16b, v1.16b, v3.16b
+; CHECK-GLOBAL-CSSC-NEXT:    stp q0, q1, [x0]
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call <32 x i8> @llvm.umin.v32i8(<32 x i8> %a, <32 x i8> %b)
   store <32 x i8> %c, ptr %p
   ret void
@@ -1211,6 +1393,13 @@ define void @umin16i16(<16 x i16> %a, <16 x i16> %b, ptr %p) {
 ; CHECK-GLOBAL-NEXT:    umin v1.8h, v1.8h, v3.8h
 ; CHECK-GLOBAL-NEXT:    stp q0, q1, [x0]
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: umin16i16:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    umin v0.8h, v0.8h, v2.8h
+; CHECK-GLOBAL-CSSC-NEXT:    umin v1.8h, v1.8h, v3.8h
+; CHECK-GLOBAL-CSSC-NEXT:    stp q0, q1, [x0]
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call <16 x i16> @llvm.umin.v16i16(<16 x i16> %a, <16 x i16> %b)
   store <16 x i16> %c, ptr %p
   ret void
@@ -1261,6 +1450,13 @@ define void @umin8i32(<8 x i32> %a, <8 x i32> %b, ptr %p) {
 ; CHECK-GLOBAL-NEXT:    umin v1.4s, v1.4s, v3.4s
 ; CHECK-GLOBAL-NEXT:    stp q0, q1, [x0]
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: umin8i32:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    umin v0.4s, v0.4s, v2.4s
+; CHECK-GLOBAL-CSSC-NEXT:    umin v1.4s, v1.4s, v3.4s
+; CHECK-GLOBAL-CSSC-NEXT:    stp q0, q1, [x0]
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call <8 x i32>@llvm.umin.v8i32(<8 x i32> %a, <8 x i32> %b)
   store <8 x i32> %c, ptr %p
   ret void
@@ -1288,6 +1484,14 @@ define <1 x i64> @umin1i64(<1 x i64> %a, <1 x i64> %b) {
 ; CHECK-GLOBAL-NEXT:    cmp x8, x9
 ; CHECK-GLOBAL-NEXT:    fcsel d0, d0, d1, lo
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: umin1i64:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    fmov x8, d0
+; CHECK-GLOBAL-CSSC-NEXT:    fmov x9, d1
+; CHECK-GLOBAL-CSSC-NEXT:    umin x8, x8, x9
+; CHECK-GLOBAL-CSSC-NEXT:    fmov d0, x8
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call <1 x i64> @llvm.umin.v1i64(<1 x i64> %a, <1 x i64> %b)
   ret <1 x i64> %c
 }
@@ -1295,24 +1499,12 @@ define <1 x i64> @umin1i64(<1 x i64> %a, <1 x i64> %b) {
 declare <2 x i64> @llvm.umin.v2i64(<2 x i64> %a, <2 x i64> %b) readnone
 
 define <2 x i64> @umin2i64(<2 x i64> %a, <2 x i64> %b) {
-; CHECK-ISEL-LABEL: umin2i64:
-; CHECK-ISEL:       // %bb.0:
-; CHECK-ISEL-NEXT:    cmhi v2.2d, v1.2d, v0.2d
-; CHECK-ISEL-NEXT:    bif v0.16b, v1.16b, v2.16b
-; CHECK-ISEL-NEXT:    ret
-;
-; CHECK-ISEL-CSSC-LABEL: umin2i64:
-; CHECK-ISEL-CSSC:       // %bb.0:
-; CHECK-ISEL-CSSC-NEXT:    cmhi v2.2d, v1.2d, v0.2d
-; CHECK-ISEL-CSSC-NEXT:    bif v0.16b, v1.16b, v2.16b
-; CHECK-ISEL-CSSC-NEXT:    ret
-;
-; CHECK-GLOBAL-LABEL: umin2i64:
-; CHECK-GLOBAL:       // %bb.0:
-; CHECK-GLOBAL-NEXT:    cmhi v2.2d, v1.2d, v0.2d
-; CHECK-GLOBAL-NEXT:    bif v0.16b, v1.16b, v2.16b
-; CHECK-GLOBAL-NEXT:    ret
-%c = call <2 x i64> @llvm.umin.v2i64(<2 x i64> %a, <2 x i64> %b)
+; CHECK-LABEL: umin2i64:
+; CHECK:       // %bb.0:
+; CHECK-NEXT:    cmhi v2.2d, v1.2d, v0.2d
+; CHECK-NEXT:    bif v0.16b, v1.16b, v2.16b
+; CHECK-NEXT:    ret
+  %c = call <2 x i64> @llvm.umin.v2i64(<2 x i64> %a, <2 x i64> %b)
   ret <2 x i64> %c
 }
 
@@ -1345,6 +1537,15 @@ define void @umin4i64(<4 x i64> %a, <4 x i64> %b, ptr %p) {
 ; CHECK-GLOBAL-NEXT:    bif v1.16b, v3.16b, v5.16b
 ; CHECK-GLOBAL-NEXT:    stp q0, q1, [x0]
 ; CHECK-GLOBAL-NEXT:    ret
+;
+; CHECK-GLOBAL-CSSC-LABEL: umin4i64:
+; CHECK-GLOBAL-CSSC:       // %bb.0:
+; CHECK-GLOBAL-CSSC-NEXT:    cmhi v4.2d, v2.2d, v0.2d
+; CHECK-GLOBAL-CSSC-NEXT:    cmhi v5.2d, v3.2d, v1.2d
+; CHECK-GLOBAL-CSSC-NEXT:    bif v0.16b, v2.16b, v4.16b
+; CHECK-GLOBAL-CSSC-NEXT:    bif v1.16b, v3.16b, v5.16b
+; CHECK-GLOBAL-CSSC-NEXT:    stp q0, q1, [x0]
+; CHECK-GLOBAL-CSSC-NEXT:    ret
   %c = call <4 x i64> @llvm.umin.v4i64(<4 x i64> %a, <4 x i64> %b)
   store <4 x i64> %c, ptr %p
   ret void


        


More information about the llvm-commits mailing list