; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s ; ; SMAX ; define @smax_i8_pos( %a) { ; CHECK-LABEL: smax_i8_pos ; CHECK: smax z0.b, z0.b, #27 ; CHECK-NEXT: ret %elt = insertelement undef, i8 27, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp sgt %a, %splat %res = select %cmp, %a, %splat ret %res } define @smax_i8_neg( %a) { ; CHECK-LABEL: smax_i8_neg ; CHECK: smax z0.b, z0.b, #-58 ; CHECK-NEXT: ret %elt = insertelement undef, i8 -58, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp sgt %a, %splat %res = select %cmp, %a, %splat ret %res } define @smax_i16_pos( %a) { ; CHECK-LABEL: smax_i16_pos ; CHECK: smax z0.h, z0.h, #27 ; CHECK-NEXT: ret %elt = insertelement undef, i16 27, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp sgt %a, %splat %res = select %cmp, %a, %splat ret %res } define @smax_i16_neg( %a) { ; CHECK-LABEL: smax_i16_neg ; CHECK: smax z0.h, z0.h, #-58 ; CHECK-NEXT: ret %elt = insertelement undef, i16 -58, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp sgt %a, %splat %res = select %cmp, %a, %splat ret %res } define @smax_i32_pos( %a) { ; CHECK-LABEL: smax_i32_pos ; CHECK: smax z0.s, z0.s, #27 ; CHECK: ret %elt = insertelement undef, i32 27, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp sgt %a, %splat %res = select %cmp, %a, %splat ret %res } define @smax_i32_neg( %a) { ; CHECK-LABEL: smax_i32_neg ; CHECK: smax z0.s, z0.s, #-58 ; CHECK-NEXT: ret %elt = insertelement undef, i32 -58, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp sgt %a, %splat %res = select %cmp, %a, %splat ret %res } define @smax_i64_pos( %a) { ; CHECK-LABEL: smax_i64_pos ; CHECK: smax z0.d, z0.d, #27 ; CHECK-NEXT: ret %elt = insertelement undef, i64 27, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp sgt %a, %splat %res = select %cmp, %a, %splat ret %res } define @smax_i64_neg( %a) { ; CHECK-LABEL: smax_i64_neg ; CHECK: smax z0.d, z0.d, #-58 ; CHECK-NEXT: ret %elt = insertelement undef, i64 -58, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp sgt %a, %splat %res = select %cmp, %a, %splat ret %res } ; ; SMIN ; define @smin_i8_pos( %a) { ; CHECK-LABEL: smin_i8_pos ; CHECK: smin z0.b, z0.b, #27 ; CHECK-NEXT: ret %elt = insertelement undef, i8 27, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp slt %a, %splat %res = select %cmp, %a, %splat ret %res } define @smin_i8_neg( %a) { ; CHECK-LABEL: smin_i8_neg ; CHECK: smin z0.b, z0.b, #-58 ; CHECK-NEXT: ret %elt = insertelement undef, i8 -58, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp slt %a, %splat %res = select %cmp, %a, %splat ret %res } define @smin_i16_pos( %a) { ; CHECK-LABEL: smin_i16_pos ; CHECK: smin z0.h, z0.h, #27 ; CHECK-NEXT: ret %elt = insertelement undef, i16 27, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp slt %a, %splat %res = select %cmp, %a, %splat ret %res } define @smin_i16_neg( %a) { ; CHECK-LABEL: smin_i16_neg ; CHECK: smin z0.h, z0.h, #-58 ; CHECK-NEXT: ret %elt = insertelement undef, i16 -58, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp slt %a, %splat %res = select %cmp, %a, %splat ret %res } define @smin_i32_pos( %a) { ; CHECK-LABEL: smin_i32_pos ; CHECK: smin z0.s, z0.s, #27 ; CHECK-NEXT: ret %elt = insertelement undef, i32 27, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp slt %a, %splat %res = select %cmp, %a, %splat ret %res } define @smin_i32_neg( %a) { ; CHECK-LABEL: smin_i32_neg ; CHECK: smin z0.s, z0.s, #-58 ; CHECK-NEXT: ret %elt = insertelement undef, i32 -58, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp slt %a, %splat %res = select %cmp, %a, %splat ret %res } define @smin_i64_pos( %a) { ; CHECK-LABEL: smin_i64_pos ; CHECK: smin z0.d, z0.d, #27 ; CHECK-NEXT: ret %elt = insertelement undef, i64 27, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp slt %a, %splat %res = select %cmp, %a, %splat ret %res } define @smin_i64_neg( %a) { ; CHECK-LABEL: smin_i64_neg ; CHECK: smin z0.d, z0.d, #-58 ; CHECK-NEXT: ret %elt = insertelement undef, i64 -58, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp slt %a, %splat %res = select %cmp, %a, %splat ret %res } ; ; UMAX ; define @umax_i8_pos( %a) { ; CHECK-LABEL: umax_i8_pos ; CHECK: umax z0.b, z0.b, #27 ; CHECK-NEXT: ret %elt = insertelement undef, i8 27, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp ugt %a, %splat %res = select %cmp, %a, %splat ret %res } define @umax_i8_large( %a) { ; CHECK-LABEL: umax_i8_large ; CHECK: umax z0.b, z0.b, #129 ; CHECK-NEXT: ret %elt = insertelement undef, i8 129, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp ugt %a, %splat %res = select %cmp, %a, %splat ret %res } define @umax_i16_pos( %a) { ; CHECK-LABEL: umax_i16_pos ; CHECK: umax z0.h, z0.h, #27 ; CHECK-NEXT: ret %elt = insertelement undef, i16 27, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp ugt %a, %splat %res = select %cmp, %a, %splat ret %res } define @umax_i16_large( %a) { ; CHECK-LABEL: umax_i16_large ; CHECK: umax z0.h, z0.h, #129 ; CHECK-NEXT: ret %elt = insertelement undef, i16 129, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp ugt %a, %splat %res = select %cmp, %a, %splat ret %res } define @umax_i32_pos( %a) { ; CHECK-LABEL: umax_i32_pos ; CHECK: umax z0.s, z0.s, #27 ; CHECK-NEXT: ret %elt = insertelement undef, i32 27, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp ugt %a, %splat %res = select %cmp, %a, %splat ret %res } define @umax_i32_large( %a) { ; CHECK-LABEL: umax_i32_large ; CHECK: umax z0.s, z0.s, #129 ; CHECK-NEXT: ret %elt = insertelement undef, i32 129, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp ugt %a, %splat %res = select %cmp, %a, %splat ret %res } define @umax_i64_pos( %a) { ; CHECK-LABEL: umax_i64_pos ; CHECK: umax z0.d, z0.d, #27 ; CHECK-NEXT: ret %elt = insertelement undef, i64 27, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp ugt %a, %splat %res = select %cmp, %a, %splat ret %res } define @umax_i64_large( %a) { ; CHECK-LABEL: umax_i64_large ; CHECK: umax z0.d, z0.d, #129 ; CHECK-NEXT: ret %elt = insertelement undef, i64 129, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp ugt %a, %splat %res = select %cmp, %a, %splat ret %res } ; ; UMIN ; define @umin_i8_pos( %a) { ; CHECK-LABEL: umin_i8_pos ; CHECK: umin z0.b, z0.b, #27 ; CHECK-NEXT: ret %elt = insertelement undef, i8 27, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp ult %a, %splat %res = select %cmp, %a, %splat ret %res } define @umin_i8_large( %a) { ; CHECK-LABEL: umin_i8_large ; CHECK: umin z0.b, z0.b, #129 ; CHECK-NEXT: ret %elt = insertelement undef, i8 129, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp ult %a, %splat %res = select %cmp, %a, %splat ret %res } define @umin_i16_pos( %a) { ; CHECK-LABEL: umin_i16_pos ; CHECK: umin z0.h, z0.h, #27 ; CHECK-NEXT: ret %elt = insertelement undef, i16 27, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp ult %a, %splat %res = select %cmp, %a, %splat ret %res } define @umin_i16_large( %a) { ; CHECK-LABEL: umin_i16_large ; CHECK: umin z0.h, z0.h, #129 ; CHECK-NEXT: ret %elt = insertelement undef, i16 129, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp ult %a, %splat %res = select %cmp, %a, %splat ret %res } define @umin_i32_pos( %a) { ; CHECK-LABEL: umin_i32_pos ; CHECK: umin z0.s, z0.s, #27 ; CHECK-NEXT: ret %elt = insertelement undef, i32 27, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp ult %a, %splat %res = select %cmp, %a, %splat ret %res } define @umin_i32_large( %a) { ; CHECK-LABEL: umin_i32_large ; CHECK: umin z0.s, z0.s, #129 ; CHECK-NEXT: ret %elt = insertelement undef, i32 129, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp ult %a, %splat %res = select %cmp, %a, %splat ret %res } define @umin_i64_pos( %a) { ; CHECK-LABEL: umin_i64_pos ; CHECK: umin z0.d, z0.d, #27 ; CHECK-NEXT: ret %elt = insertelement undef, i64 27, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp ult %a, %splat %res = select %cmp, %a, %splat ret %res } define @umin_i64_large( %a) { ; CHECK-LABEL: umin_i64_large ; CHECK: umin z0.d, z0.d, #129 ; CHECK-NEXT: ret %elt = insertelement undef, i64 129, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %cmp = icmp ult %a, %splat %res = select %cmp, %a, %splat ret %res } ; ; MUL ; define @mul_i8_neg( %a) { ; CHECK-LABEL: mul_i8_neg ; CHECK: mul z0.b, z0.b, #-17 ; CHECK-NEXT: ret %elt = insertelement undef, i8 -17, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %res = mul %a, %splat ret %res } define @mul_i8_pos( %a) { ; CHECK-LABEL: mul_i8_pos ; CHECK: mul z0.b, z0.b, #105 ; CHECK-NEXT: ret %elt = insertelement undef, i8 105, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %res = mul %a, %splat ret %res } define @mul_i16_neg( %a) { ; CHECK-LABEL: mul_i16_neg ; CHECK: mul z0.h, z0.h, #-17 ; CHECK-NEXT: ret %elt = insertelement undef, i16 -17, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %res = mul %a, %splat ret %res } define @mul_i16_pos( %a) { ; CHECK-LABEL: mul_i16_pos ; CHECK: mul z0.h, z0.h, #105 ; CHECK-NEXT: ret %elt = insertelement undef, i16 105, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %res = mul %a, %splat ret %res } define @mul_i32_neg( %a) { ; CHECK-LABEL: mul_i32_neg ; CHECK: mul z0.s, z0.s, #-17 ; CHECK-NEXT: ret %elt = insertelement undef, i32 -17, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %res = mul %a, %splat ret %res } define @mul_i32_pos( %a) { ; CHECK-LABEL: mul_i32_pos ; CHECK: mul z0.s, z0.s, #105 ; CHECK-NEXT: ret %elt = insertelement undef, i32 105, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %res = mul %a, %splat ret %res } define @mul_i64_neg( %a) { ; CHECK-LABEL: mul_i64_neg ; CHECK: mul z0.d, z0.d, #-17 ; CHECK-NEXT: ret %elt = insertelement undef, i64 -17, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %res = mul %a, %splat ret %res } define @mul_i64_pos( %a) { ; CHECK-LABEL: mul_i64_pos ; CHECK: mul z0.d, z0.d, #105 ; CHECK-NEXT: ret %elt = insertelement undef, i64 105, i32 0 %splat = shufflevector %elt, undef, zeroinitializer %res = mul %a, %splat ret %res }