; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mattr=+sve -mtriple=aarch64 %s -o - | FileCheck %s --check-prefixes=CHECK ; These tests just check that the plumbing is in place for @llvm.smax, @llvm.umax, ; @llvm.smin, @llvm.umin. ; tests for smax: define @smax_select_i8( %pg, %a, %b) { ; CHECK-LABEL: smax_select_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: smax z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %sel = call @llvm.smax.nxv16i8( %a, %b) %out = select %pg, %sel, %a ret %out } define @smax_select_i16( %pg, %a, %b) { ; CHECK-LABEL: smax_select_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: smax z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %sel = call @llvm.smax.nxv8i16( %a, %b) %out = select %pg, %sel, %a ret %out } define @smax_select_i32( %pg, %a, %b) { ; CHECK-LABEL: smax_select_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: smax z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %sel = call @llvm.smax.nxv4i32( %a, %b) %out = select %pg, %sel, %a ret %out } define @smax_select_i64( %pg, %a, %b) { ; CHECK-LABEL: smax_select_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: smax z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %sel = call @llvm.smax.nxv2i64( %a, %b) %out = select %pg, %sel, %a ret %out } ; tests for umax: define @umax_select_i8( %pg, %a, %b) { ; CHECK-LABEL: umax_select_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: umax z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %sel = call @llvm.umax.nxv16i8( %a, %b) %out = select %pg, %sel, %a ret %out } define @umax_select_i16( %pg, %a, %b) { ; CHECK-LABEL: umax_select_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: umax z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %sel = call @llvm.umax.nxv8i16( %a, %b) %out = select %pg, %sel, %a ret %out } define @umax_select_i32( %pg, %a, %b) { ; CHECK-LABEL: umax_select_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: umax z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %sel = call @llvm.umax.nxv4i32( %a, %b) %out = select %pg, %sel, %a ret %out } define @umax_select_i64( %pg, %a, %b) { ; CHECK-LABEL: umax_select_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: umax z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %sel = call @llvm.umax.nxv2i64( %a, %b) %out = select %pg, %sel, %a ret %out } ; tests for smin: define @smin_select_i8( %pg, %a, %b) { ; CHECK-LABEL: smin_select_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: smin z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %sel = call @llvm.smin.nxv16i8( %a, %b) %out = select %pg, %sel, %a ret %out } define @smin_select_i16( %pg, %a, %b) { ; CHECK-LABEL: smin_select_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: smin z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %sel = call @llvm.smin.nxv8i16( %a, %b) %out = select %pg, %sel, %a ret %out } define @smin_select_i32( %pg, %a, %b) { ; CHECK-LABEL: smin_select_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: smin z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %sel = call @llvm.smin.nxv4i32( %a, %b) %out = select %pg, %sel, %a ret %out } define @smin_select_i64( %pg, %a, %b) { ; CHECK-LABEL: smin_select_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: smin z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %sel = call @llvm.smin.nxv2i64( %a, %b) %out = select %pg, %sel, %a ret %out } ; tests for umin: define @umin_select_i8( %pg, %a, %b) { ; CHECK-LABEL: umin_select_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: umin z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %sel = call @llvm.umin.nxv16i8( %a, %b) %out = select %pg, %sel, %a ret %out } define @umin_select_i16( %pg, %a, %b) { ; CHECK-LABEL: umin_select_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: umin z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %sel = call @llvm.umin.nxv8i16( %a, %b) %out = select %pg, %sel, %a ret %out } define @umin_select_i32( %pg, %a, %b) { ; CHECK-LABEL: umin_select_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: umin z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %sel = call @llvm.umin.nxv4i32( %a, %b) %out = select %pg, %sel, %a ret %out } define @umin_select_i64( %pg, %a, %b) { ; CHECK-LABEL: umin_select_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: umin z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %sel = call @llvm.umin.nxv2i64( %a, %b) %out = select %pg, %sel, %a ret %out } define @umin_select_i64_multiuse( %pg, %a, %b, ptr %p) { ; CHECK-LABEL: umin_select_i64_multiuse: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p1.d ; CHECK-NEXT: umin z1.d, p1/m, z1.d, z0.d ; CHECK-NEXT: mov z0.d, p0/m, z1.d ; CHECK-NEXT: st1d { z1.d }, p1, [x0] ; CHECK-NEXT: ret %sel = call @llvm.umin.nxv2i64( %a, %b) store %sel, ptr %p %out = select %pg, %sel, %a ret %out } define @smin_select_i64_c( %pg, %a, %b) { ; CHECK-LABEL: smin_select_i64_c: ; CHECK: // %bb.0: ; CHECK-NEXT: smin z1.d, p0/m, z1.d, z0.d ; CHECK-NEXT: mov z0.d, z1.d ; CHECK-NEXT: ret %sel = call @llvm.smin.nxv2i64( %a, %b) %out = select %pg, %sel, %b ret %out } define @smax_select_i64_c( %pg, %a, %b) { ; CHECK-LABEL: smax_select_i64_c: ; CHECK: // %bb.0: ; CHECK-NEXT: smax z1.d, p0/m, z1.d, z0.d ; CHECK-NEXT: mov z0.d, z1.d ; CHECK-NEXT: ret %sel = call @llvm.smax.nxv2i64( %a, %b) %out = select %pg, %sel, %b ret %out } define @umin_select_i64_c( %pg, %a, %b) { ; CHECK-LABEL: umin_select_i64_c: ; CHECK: // %bb.0: ; CHECK-NEXT: umin z1.d, p0/m, z1.d, z0.d ; CHECK-NEXT: mov z0.d, z1.d ; CHECK-NEXT: ret %sel = call @llvm.umin.nxv2i64( %a, %b) %out = select %pg, %sel, %b ret %out } define @umax_select_i64_c( %pg, %a, %b) { ; CHECK-LABEL: umax_select_i64_c: ; CHECK: // %bb.0: ; CHECK-NEXT: umax z1.d, p0/m, z1.d, z0.d ; CHECK-NEXT: mov z0.d, z1.d ; CHECK-NEXT: ret %sel = call @llvm.umax.nxv2i64( %a, %b) %out = select %pg, %sel, %b ret %out } declare @llvm.smax.nxv16i8(, ) declare @llvm.smax.nxv8i16(, ) declare @llvm.smax.nxv4i32(, ) declare @llvm.smax.nxv2i64(, ) declare @llvm.umax.nxv16i8(, ) declare @llvm.umax.nxv8i16(, ) declare @llvm.umax.nxv4i32(, ) declare @llvm.umax.nxv2i64(, ) declare @llvm.smin.nxv16i8(, ) declare @llvm.smin.nxv8i16(, ) declare @llvm.smin.nxv4i32(, ) declare @llvm.smin.nxv2i64(, ) declare @llvm.umin.nxv16i8(, ) declare @llvm.umin.nxv8i16(, ) declare @llvm.umin.nxv4i32(, ) declare @llvm.umin.nxv2i64(, )