; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mtriple=aarch64 -mattr=+neon,+sve2 -verify-machineinstrs %s -o - | FileCheck %s define @add_v4i32( %z, %x, %y) { ; CHECK-LABEL: add_v4i32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: add z1.s, z1.s, z2.s ; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, #0 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = add %x, %y %b = select %c, %a, %z ret %b } define @add_v8i16( %z, %x, %y) { ; CHECK-LABEL: add_v8i16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: add z1.h, z1.h, z2.h ; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, #0 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = add %x, %y %b = select %c, %a, %z ret %b } define @add_v16i8( %z, %x, %y) { ; CHECK-LABEL: add_v16i8: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: add z1.b, z1.b, z2.b ; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, #0 ; CHECK-NEXT: mov z0.b, p0/m, z1.b ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = add %x, %y %b = select %c, %a, %z ret %b } define @sub_v4i32( %z, %x, %y) { ; CHECK-LABEL: sub_v4i32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: sub z1.s, z1.s, z2.s ; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, #0 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = sub %x, %y %b = select %c, %a, %z ret %b } define @sub_v8i16( %z, %x, %y) { ; CHECK-LABEL: sub_v8i16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: sub z1.h, z1.h, z2.h ; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, #0 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = sub %x, %y %b = select %c, %a, %z ret %b } define @sub_v16i8( %z, %x, %y) { ; CHECK-LABEL: sub_v16i8: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: sub z1.b, z1.b, z2.b ; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, #0 ; CHECK-NEXT: mov z0.b, p0/m, z1.b ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = sub %x, %y %b = select %c, %a, %z ret %b } define @mul_v4i32( %z, %x, %y) { ; CHECK-LABEL: mul_v4i32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: mul z1.s, z1.s, z2.s ; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, #0 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = mul %x, %y %b = select %c, %a, %z ret %b } define @mul_v8i16( %z, %x, %y) { ; CHECK-LABEL: mul_v8i16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: mul z1.h, z1.h, z2.h ; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, #0 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = mul %x, %y %b = select %c, %a, %z ret %b } define @mul_v16i8( %z, %x, %y) { ; CHECK-LABEL: mul_v16i8: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: mul z1.b, z1.b, z2.b ; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, #0 ; CHECK-NEXT: mov z0.b, p0/m, z1.b ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = mul %x, %y %b = select %c, %a, %z ret %b } define @and_v4i32( %z, %x, %y) { ; CHECK-LABEL: and_v4i32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: and z1.d, z1.d, z2.d ; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, #0 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = and %x, %y %b = select %c, %a, %z ret %b } define @and_v8i16( %z, %x, %y) { ; CHECK-LABEL: and_v8i16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: and z1.d, z1.d, z2.d ; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, #0 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = and %x, %y %b = select %c, %a, %z ret %b } define @and_v16i8( %z, %x, %y) { ; CHECK-LABEL: and_v16i8: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: and z1.d, z1.d, z2.d ; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, #0 ; CHECK-NEXT: mov z0.b, p0/m, z1.b ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = and %x, %y %b = select %c, %a, %z ret %b } define @or_v4i32( %z, %x, %y) { ; CHECK-LABEL: or_v4i32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: orr z1.d, z1.d, z2.d ; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, #0 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = or %x, %y %b = select %c, %a, %z ret %b } define @or_v8i16( %z, %x, %y) { ; CHECK-LABEL: or_v8i16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: orr z1.d, z1.d, z2.d ; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, #0 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = or %x, %y %b = select %c, %a, %z ret %b } define @or_v16i8( %z, %x, %y) { ; CHECK-LABEL: or_v16i8: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: orr z1.d, z1.d, z2.d ; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, #0 ; CHECK-NEXT: mov z0.b, p0/m, z1.b ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = or %x, %y %b = select %c, %a, %z ret %b } define @xor_v4i32( %z, %x, %y) { ; CHECK-LABEL: xor_v4i32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: eor z1.d, z1.d, z2.d ; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, #0 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = xor %x, %y %b = select %c, %a, %z ret %b } define @xor_v8i16( %z, %x, %y) { ; CHECK-LABEL: xor_v8i16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: eor z1.d, z1.d, z2.d ; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, #0 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = xor %x, %y %b = select %c, %a, %z ret %b } define @xor_v16i8( %z, %x, %y) { ; CHECK-LABEL: xor_v16i8: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: eor z1.d, z1.d, z2.d ; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, #0 ; CHECK-NEXT: mov z0.b, p0/m, z1.b ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = xor %x, %y %b = select %c, %a, %z ret %b } define @andnot_v4i32( %z, %x, %y) { ; CHECK-LABEL: andnot_v4i32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: bic z1.d, z1.d, z2.d ; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, #0 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %y1 = xor %y, shufflevector ( insertelement ( poison, i32 -1, i32 0), poison, zeroinitializer) %a = and %x, %y1 %b = select %c, %a, %z ret %b } define @andnot_v8i16( %z, %x, %y) { ; CHECK-LABEL: andnot_v8i16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: bic z1.d, z1.d, z2.d ; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, #0 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %y1 = xor %y, shufflevector ( insertelement ( poison, i16 -1, i32 0), poison, zeroinitializer) %a = and %x, %y1 %b = select %c, %a, %z ret %b } define @andnot_v16i8( %z, %x, %y) { ; CHECK-LABEL: andnot_v16i8: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: bic z1.d, z1.d, z2.d ; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, #0 ; CHECK-NEXT: mov z0.b, p0/m, z1.b ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %y1 = xor %y, shufflevector ( insertelement ( poison, i8 -1, i32 0), poison, zeroinitializer) %a = and %x, %y1 %b = select %c, %a, %z ret %b } define @ornot_v4i32( %z, %x, %y) { ; CHECK-LABEL: ornot_v4i32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: mov z3.s, #-1 // =0xffffffffffffffff ; CHECK-NEXT: eor z2.d, z2.d, z3.d ; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, #0 ; CHECK-NEXT: orr z1.d, z1.d, z2.d ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %y1 = xor %y, shufflevector ( insertelement ( poison, i32 -1, i32 0), poison, zeroinitializer) %a = or %x, %y1 %b = select %c, %a, %z ret %b } define @ornot_v8i16( %z, %x, %y) { ; CHECK-LABEL: ornot_v8i16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: mov z3.h, #-1 // =0xffffffffffffffff ; CHECK-NEXT: eor z2.d, z2.d, z3.d ; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, #0 ; CHECK-NEXT: orr z1.d, z1.d, z2.d ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %y1 = xor %y, shufflevector ( insertelement ( poison, i16 -1, i32 0), poison, zeroinitializer) %a = or %x, %y1 %b = select %c, %a, %z ret %b } define @ornot_v16i8( %z, %x, %y) { ; CHECK-LABEL: ornot_v16i8: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: mov z3.b, #-1 // =0xffffffffffffffff ; CHECK-NEXT: eor z2.d, z2.d, z3.d ; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, #0 ; CHECK-NEXT: orr z1.d, z1.d, z2.d ; CHECK-NEXT: mov z0.b, p0/m, z1.b ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %y1 = xor %y, shufflevector ( insertelement ( poison, i8 -1, i32 0), poison, zeroinitializer) %a = or %x, %y1 %b = select %c, %a, %z ret %b } define @fadd_v4f32( %z, %x, %y) { ; CHECK-LABEL: fadd_v4f32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fadd z1.s, z1.s, z2.s ; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, #0.0 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret entry: %c = fcmp oeq %z, zeroinitializer %a = fadd %x, %y %b = select %c, %a, %z ret %b } define @fadd_v8f16( %z, %x, %y) { ; CHECK-LABEL: fadd_v8f16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: fadd z1.h, z1.h, z2.h ; CHECK-NEXT: fcmeq p0.h, p0/z, z0.h, #0.0 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret entry: %c = fcmp oeq %z, zeroinitializer %a = fadd %x, %y %b = select %c, %a, %z ret %b } define @fsub_v4f32( %z, %x, %y) { ; CHECK-LABEL: fsub_v4f32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fsub z1.s, z1.s, z2.s ; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, #0.0 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret entry: %c = fcmp oeq %z, zeroinitializer %a = fsub %x, %y %b = select %c, %a, %z ret %b } define @fsub_v8f16( %z, %x, %y) { ; CHECK-LABEL: fsub_v8f16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: fsub z1.h, z1.h, z2.h ; CHECK-NEXT: fcmeq p0.h, p0/z, z0.h, #0.0 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret entry: %c = fcmp oeq %z, zeroinitializer %a = fsub %x, %y %b = select %c, %a, %z ret %b } define @fmul_v4f32( %z, %x, %y) { ; CHECK-LABEL: fmul_v4f32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fmul z1.s, z1.s, z2.s ; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, #0.0 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret entry: %c = fcmp oeq %z, zeroinitializer %a = fmul %x, %y %b = select %c, %a, %z ret %b } define @fmul_v8f16( %z, %x, %y) { ; CHECK-LABEL: fmul_v8f16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: fmul z1.h, z1.h, z2.h ; CHECK-NEXT: fcmeq p0.h, p0/z, z0.h, #0.0 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret entry: %c = fcmp oeq %z, zeroinitializer %a = fmul %x, %y %b = select %c, %a, %z ret %b } define @icmp_slt_v4i32( %z, %x, %y) { ; CHECK-LABEL: icmp_slt_v4i32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: cmpeq p1.s, p0/z, z0.s, #0 ; CHECK-NEXT: smin z1.s, p0/m, z1.s, z2.s ; CHECK-NEXT: mov z0.s, p1/m, z1.s ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a1 = icmp slt %x, %y %a = select %a1, %x, %y %b = select %c, %a, %z ret %b } define @icmp_slt_v8i16( %z, %x, %y) { ; CHECK-LABEL: icmp_slt_v8i16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: cmpeq p1.h, p0/z, z0.h, #0 ; CHECK-NEXT: smin z1.h, p0/m, z1.h, z2.h ; CHECK-NEXT: mov z0.h, p1/m, z1.h ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a1 = icmp slt %x, %y %a = select %a1, %x, %y %b = select %c, %a, %z ret %b } define @icmp_slt_v16i8( %z, %x, %y) { ; CHECK-LABEL: icmp_slt_v16i8: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: cmpeq p1.b, p0/z, z0.b, #0 ; CHECK-NEXT: smin z1.b, p0/m, z1.b, z2.b ; CHECK-NEXT: mov z0.b, p1/m, z1.b ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a1 = icmp slt %x, %y %a = select %a1, %x, %y %b = select %c, %a, %z ret %b } define @icmp_sgt_v4i32( %z, %x, %y) { ; CHECK-LABEL: icmp_sgt_v4i32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: cmpeq p1.s, p0/z, z0.s, #0 ; CHECK-NEXT: smax z1.s, p0/m, z1.s, z2.s ; CHECK-NEXT: mov z0.s, p1/m, z1.s ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a1 = icmp sgt %x, %y %a = select %a1, %x, %y %b = select %c, %a, %z ret %b } define @icmp_sgt_v8i16( %z, %x, %y) { ; CHECK-LABEL: icmp_sgt_v8i16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: cmpeq p1.h, p0/z, z0.h, #0 ; CHECK-NEXT: smax z1.h, p0/m, z1.h, z2.h ; CHECK-NEXT: mov z0.h, p1/m, z1.h ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a1 = icmp sgt %x, %y %a = select %a1, %x, %y %b = select %c, %a, %z ret %b } define @icmp_sgt_v16i8( %z, %x, %y) { ; CHECK-LABEL: icmp_sgt_v16i8: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: cmpeq p1.b, p0/z, z0.b, #0 ; CHECK-NEXT: smax z1.b, p0/m, z1.b, z2.b ; CHECK-NEXT: mov z0.b, p1/m, z1.b ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a1 = icmp sgt %x, %y %a = select %a1, %x, %y %b = select %c, %a, %z ret %b } define @icmp_ult_v4i32( %z, %x, %y) { ; CHECK-LABEL: icmp_ult_v4i32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: cmpeq p1.s, p0/z, z0.s, #0 ; CHECK-NEXT: umin z1.s, p0/m, z1.s, z2.s ; CHECK-NEXT: mov z0.s, p1/m, z1.s ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a1 = icmp ult %x, %y %a = select %a1, %x, %y %b = select %c, %a, %z ret %b } define @icmp_ult_v8i16( %z, %x, %y) { ; CHECK-LABEL: icmp_ult_v8i16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: cmpeq p1.h, p0/z, z0.h, #0 ; CHECK-NEXT: umin z1.h, p0/m, z1.h, z2.h ; CHECK-NEXT: mov z0.h, p1/m, z1.h ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a1 = icmp ult %x, %y %a = select %a1, %x, %y %b = select %c, %a, %z ret %b } define @icmp_ult_v16i8( %z, %x, %y) { ; CHECK-LABEL: icmp_ult_v16i8: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: cmpeq p1.b, p0/z, z0.b, #0 ; CHECK-NEXT: umin z1.b, p0/m, z1.b, z2.b ; CHECK-NEXT: mov z0.b, p1/m, z1.b ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a1 = icmp ult %x, %y %a = select %a1, %x, %y %b = select %c, %a, %z ret %b } define @icmp_ugt_v4i32( %z, %x, %y) { ; CHECK-LABEL: icmp_ugt_v4i32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: cmpeq p1.s, p0/z, z0.s, #0 ; CHECK-NEXT: umax z1.s, p0/m, z1.s, z2.s ; CHECK-NEXT: mov z0.s, p1/m, z1.s ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a1 = icmp ugt %x, %y %a = select %a1, %x, %y %b = select %c, %a, %z ret %b } define @icmp_ugt_v8i16( %z, %x, %y) { ; CHECK-LABEL: icmp_ugt_v8i16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: cmpeq p1.h, p0/z, z0.h, #0 ; CHECK-NEXT: umax z1.h, p0/m, z1.h, z2.h ; CHECK-NEXT: mov z0.h, p1/m, z1.h ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a1 = icmp ugt %x, %y %a = select %a1, %x, %y %b = select %c, %a, %z ret %b } define @icmp_ugt_v16i8( %z, %x, %y) { ; CHECK-LABEL: icmp_ugt_v16i8: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: cmpeq p1.b, p0/z, z0.b, #0 ; CHECK-NEXT: umax z1.b, p0/m, z1.b, z2.b ; CHECK-NEXT: mov z0.b, p1/m, z1.b ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a1 = icmp ugt %x, %y %a = select %a1, %x, %y %b = select %c, %a, %z ret %b } define @fcmp_fast_olt_v4f32( %z, %x, %y) { ; CHECK-LABEL: fcmp_fast_olt_v4f32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmeq p1.s, p0/z, z0.s, #0.0 ; CHECK-NEXT: fminnm z1.s, p0/m, z1.s, z2.s ; CHECK-NEXT: mov z0.s, p1/m, z1.s ; CHECK-NEXT: ret entry: %c = fcmp oeq %z, zeroinitializer %a1 = fcmp fast olt %x, %y %a = select %a1, %x, %y %b = select %c, %a, %z ret %b } define @fcmp_fast_olt_v8f16( %z, %x, %y) { ; CHECK-LABEL: fcmp_fast_olt_v8f16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: fcmeq p1.h, p0/z, z0.h, #0.0 ; CHECK-NEXT: fminnm z1.h, p0/m, z1.h, z2.h ; CHECK-NEXT: mov z0.h, p1/m, z1.h ; CHECK-NEXT: ret entry: %c = fcmp oeq %z, zeroinitializer %a1 = fcmp fast olt %x, %y %a = select %a1, %x, %y %b = select %c, %a, %z ret %b } define @fcmp_fast_ogt_v4f32( %z, %x, %y) { ; CHECK-LABEL: fcmp_fast_ogt_v4f32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: fcmeq p1.s, p0/z, z0.s, #0.0 ; CHECK-NEXT: fmaxnm z1.s, p0/m, z1.s, z2.s ; CHECK-NEXT: mov z0.s, p1/m, z1.s ; CHECK-NEXT: ret entry: %c = fcmp oeq %z, zeroinitializer %a1 = fcmp fast ogt %x, %y %a = select %a1, %x, %y %b = select %c, %a, %z ret %b } define @fcmp_fast_ogt_v8f16( %z, %x, %y) { ; CHECK-LABEL: fcmp_fast_ogt_v8f16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: fcmeq p1.h, p0/z, z0.h, #0.0 ; CHECK-NEXT: fmaxnm z1.h, p0/m, z1.h, z2.h ; CHECK-NEXT: mov z0.h, p1/m, z1.h ; CHECK-NEXT: ret entry: %c = fcmp oeq %z, zeroinitializer %a1 = fcmp fast ogt %x, %y %a = select %a1, %x, %y %b = select %c, %a, %z ret %b } define @sadd_sat_v4i32( %z, %x, %y) { ; CHECK-LABEL: sadd_sat_v4i32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: sqadd z1.s, z1.s, z2.s ; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, #0 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = call @llvm.sadd.sat.v4i32( %x, %y) %b = select %c, %a, %z ret %b } define @sadd_sat_v8i16( %z, %x, %y) { ; CHECK-LABEL: sadd_sat_v8i16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: sqadd z1.h, z1.h, z2.h ; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, #0 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = call @llvm.sadd.sat.v8i16( %x, %y) %b = select %c, %a, %z ret %b } define @sadd_sat_v16i8( %z, %x, %y) { ; CHECK-LABEL: sadd_sat_v16i8: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: sqadd z1.b, z1.b, z2.b ; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, #0 ; CHECK-NEXT: mov z0.b, p0/m, z1.b ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = call @llvm.sadd.sat.v16i8( %x, %y) %b = select %c, %a, %z ret %b } define @uadd_sat_v4i32( %z, %x, %y) { ; CHECK-LABEL: uadd_sat_v4i32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: uqadd z1.s, z1.s, z2.s ; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, #0 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = call @llvm.uadd.sat.v4i32( %x, %y) %b = select %c, %a, %z ret %b } define @uadd_sat_v8i16( %z, %x, %y) { ; CHECK-LABEL: uadd_sat_v8i16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: uqadd z1.h, z1.h, z2.h ; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, #0 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = call @llvm.uadd.sat.v8i16( %x, %y) %b = select %c, %a, %z ret %b } define @uadd_sat_v16i8( %z, %x, %y) { ; CHECK-LABEL: uadd_sat_v16i8: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: uqadd z1.b, z1.b, z2.b ; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, #0 ; CHECK-NEXT: mov z0.b, p0/m, z1.b ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = call @llvm.uadd.sat.v16i8( %x, %y) %b = select %c, %a, %z ret %b } define @ssub_sat_v4i32( %z, %x, %y) { ; CHECK-LABEL: ssub_sat_v4i32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: sqsub z1.s, z1.s, z2.s ; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, #0 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = call @llvm.ssub.sat.v4i32( %x, %y) %b = select %c, %a, %z ret %b } define @ssub_sat_v8i16( %z, %x, %y) { ; CHECK-LABEL: ssub_sat_v8i16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: sqsub z1.h, z1.h, z2.h ; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, #0 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = call @llvm.ssub.sat.v8i16( %x, %y) %b = select %c, %a, %z ret %b } define @ssub_sat_v16i8( %z, %x, %y) { ; CHECK-LABEL: ssub_sat_v16i8: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: sqsub z1.b, z1.b, z2.b ; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, #0 ; CHECK-NEXT: mov z0.b, p0/m, z1.b ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = call @llvm.ssub.sat.v16i8( %x, %y) %b = select %c, %a, %z ret %b } define @usub_sat_v4i32( %z, %x, %y) { ; CHECK-LABEL: usub_sat_v4i32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: uqsub z1.s, z1.s, z2.s ; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, #0 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = call @llvm.usub.sat.v4i32( %x, %y) %b = select %c, %a, %z ret %b } define @usub_sat_v8i16( %z, %x, %y) { ; CHECK-LABEL: usub_sat_v8i16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: uqsub z1.h, z1.h, z2.h ; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, #0 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = call @llvm.usub.sat.v8i16( %x, %y) %b = select %c, %a, %z ret %b } define @usub_sat_v16i8( %z, %x, %y) { ; CHECK-LABEL: usub_sat_v16i8: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: uqsub z1.b, z1.b, z2.b ; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, #0 ; CHECK-NEXT: mov z0.b, p0/m, z1.b ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %a = call @llvm.usub.sat.v16i8( %x, %y) %b = select %c, %a, %z ret %b } define @addqr_v4i32( %z, %x, i32 %y) { ; CHECK-LABEL: addqr_v4i32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: mov z2.s, w0 ; CHECK-NEXT: add z1.s, z1.s, z2.s ; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, #0 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %i = insertelement undef, i32 %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = add %x, %ys %b = select %c, %a, %z ret %b } define @addqr_v8i16( %z, %x, i16 %y) { ; CHECK-LABEL: addqr_v8i16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: mov z2.h, w0 ; CHECK-NEXT: add z1.h, z1.h, z2.h ; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, #0 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %i = insertelement undef, i16 %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = add %x, %ys %b = select %c, %a, %z ret %b } define @addqr_v16i8( %z, %x, i8 %y) { ; CHECK-LABEL: addqr_v16i8: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: mov z2.b, w0 ; CHECK-NEXT: add z1.b, z1.b, z2.b ; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, #0 ; CHECK-NEXT: mov z0.b, p0/m, z1.b ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %i = insertelement undef, i8 %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = add %x, %ys %b = select %c, %a, %z ret %b } define @subqr_v4i32( %z, %x, i32 %y) { ; CHECK-LABEL: subqr_v4i32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: mov z2.s, w0 ; CHECK-NEXT: sub z1.s, z1.s, z2.s ; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, #0 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %i = insertelement undef, i32 %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = sub %x, %ys %b = select %c, %a, %z ret %b } define @subqr_v8i16( %z, %x, i16 %y) { ; CHECK-LABEL: subqr_v8i16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: mov z2.h, w0 ; CHECK-NEXT: sub z1.h, z1.h, z2.h ; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, #0 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %i = insertelement undef, i16 %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = sub %x, %ys %b = select %c, %a, %z ret %b } define @subqr_v16i8( %z, %x, i8 %y) { ; CHECK-LABEL: subqr_v16i8: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: mov z2.b, w0 ; CHECK-NEXT: sub z1.b, z1.b, z2.b ; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, #0 ; CHECK-NEXT: mov z0.b, p0/m, z1.b ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %i = insertelement undef, i8 %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = sub %x, %ys %b = select %c, %a, %z ret %b } define @mulqr_v4i32( %z, %x, i32 %y) { ; CHECK-LABEL: mulqr_v4i32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: mov z2.s, w0 ; CHECK-NEXT: mul z1.s, z1.s, z2.s ; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, #0 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %i = insertelement undef, i32 %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = mul %x, %ys %b = select %c, %a, %z ret %b } define @mulqr_v8i16( %z, %x, i16 %y) { ; CHECK-LABEL: mulqr_v8i16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: mov z2.h, w0 ; CHECK-NEXT: mul z1.h, z1.h, z2.h ; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, #0 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %i = insertelement undef, i16 %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = mul %x, %ys %b = select %c, %a, %z ret %b } define @mulqr_v16i8( %z, %x, i8 %y) { ; CHECK-LABEL: mulqr_v16i8: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: mov z2.b, w0 ; CHECK-NEXT: mul z1.b, z1.b, z2.b ; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, #0 ; CHECK-NEXT: mov z0.b, p0/m, z1.b ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %i = insertelement undef, i8 %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = mul %x, %ys %b = select %c, %a, %z ret %b } define @faddqr_v4f32( %z, %x, float %y) { ; CHECK-LABEL: faddqr_v4f32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: // kill: def $s2 killed $s2 def $z2 ; CHECK-NEXT: mov z2.s, s2 ; CHECK-NEXT: fadd z1.s, z1.s, z2.s ; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, #0.0 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret entry: %c = fcmp oeq %z, zeroinitializer %i = insertelement undef, float %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = fadd %x, %ys %b = select %c, %a, %z ret %b } define @faddqr_v8f16( %z, %x, half %y) { ; CHECK-LABEL: faddqr_v8f16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: // kill: def $h2 killed $h2 def $z2 ; CHECK-NEXT: mov z2.h, h2 ; CHECK-NEXT: fadd z1.h, z1.h, z2.h ; CHECK-NEXT: fcmeq p0.h, p0/z, z0.h, #0.0 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret entry: %c = fcmp oeq %z, zeroinitializer %i = insertelement undef, half %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = fadd %x, %ys %b = select %c, %a, %z ret %b } define @fsubqr_v4f32( %z, %x, float %y) { ; CHECK-LABEL: fsubqr_v4f32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: // kill: def $s2 killed $s2 def $z2 ; CHECK-NEXT: mov z2.s, s2 ; CHECK-NEXT: fsub z1.s, z1.s, z2.s ; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, #0.0 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret entry: %c = fcmp oeq %z, zeroinitializer %i = insertelement undef, float %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = fsub %x, %ys %b = select %c, %a, %z ret %b } define @fsubqr_v8f16( %z, %x, half %y) { ; CHECK-LABEL: fsubqr_v8f16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: // kill: def $h2 killed $h2 def $z2 ; CHECK-NEXT: mov z2.h, h2 ; CHECK-NEXT: fsub z1.h, z1.h, z2.h ; CHECK-NEXT: fcmeq p0.h, p0/z, z0.h, #0.0 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret entry: %c = fcmp oeq %z, zeroinitializer %i = insertelement undef, half %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = fsub %x, %ys %b = select %c, %a, %z ret %b } define @fmulqr_v4f32( %z, %x, float %y) { ; CHECK-LABEL: fmulqr_v4f32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: // kill: def $s2 killed $s2 def $z2 ; CHECK-NEXT: mov z2.s, s2 ; CHECK-NEXT: fmul z1.s, z1.s, z2.s ; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, #0.0 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret entry: %c = fcmp oeq %z, zeroinitializer %i = insertelement undef, float %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = fmul %x, %ys %b = select %c, %a, %z ret %b } define @fmulqr_v8f16( %z, %x, half %y) { ; CHECK-LABEL: fmulqr_v8f16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: // kill: def $h2 killed $h2 def $z2 ; CHECK-NEXT: mov z2.h, h2 ; CHECK-NEXT: fmul z1.h, z1.h, z2.h ; CHECK-NEXT: fcmeq p0.h, p0/z, z0.h, #0.0 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret entry: %c = fcmp oeq %z, zeroinitializer %i = insertelement undef, half %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = fmul %x, %ys %b = select %c, %a, %z ret %b } define @sadd_satqr_v4i32( %z, %x, i32 %y) { ; CHECK-LABEL: sadd_satqr_v4i32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: mov z2.s, w0 ; CHECK-NEXT: sqadd z1.s, z1.s, z2.s ; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, #0 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %i = insertelement undef, i32 %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = call @llvm.sadd.sat.v4i32( %x, %ys) %b = select %c, %a, %z ret %b } define @sadd_satqr_v8i16( %z, %x, i16 %y) { ; CHECK-LABEL: sadd_satqr_v8i16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: mov z2.h, w0 ; CHECK-NEXT: sqadd z1.h, z1.h, z2.h ; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, #0 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %i = insertelement undef, i16 %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = call @llvm.sadd.sat.v8i16( %x, %ys) %b = select %c, %a, %z ret %b } define @sadd_satqr_v16i8( %z, %x, i8 %y) { ; CHECK-LABEL: sadd_satqr_v16i8: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: mov z2.b, w0 ; CHECK-NEXT: sqadd z1.b, z1.b, z2.b ; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, #0 ; CHECK-NEXT: mov z0.b, p0/m, z1.b ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %i = insertelement undef, i8 %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = call @llvm.sadd.sat.v16i8( %x, %ys) %b = select %c, %a, %z ret %b } define @uadd_satqr_v4i32( %z, %x, i32 %y) { ; CHECK-LABEL: uadd_satqr_v4i32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: mov z2.s, w0 ; CHECK-NEXT: uqadd z1.s, z1.s, z2.s ; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, #0 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %i = insertelement undef, i32 %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = call @llvm.uadd.sat.v4i32( %x, %ys) %b = select %c, %a, %z ret %b } define @uadd_satqr_v8i16( %z, %x, i16 %y) { ; CHECK-LABEL: uadd_satqr_v8i16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: mov z2.h, w0 ; CHECK-NEXT: uqadd z1.h, z1.h, z2.h ; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, #0 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %i = insertelement undef, i16 %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = call @llvm.uadd.sat.v8i16( %x, %ys) %b = select %c, %a, %z ret %b } define @uadd_satqr_v16i8( %z, %x, i8 %y) { ; CHECK-LABEL: uadd_satqr_v16i8: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: mov z2.b, w0 ; CHECK-NEXT: uqadd z1.b, z1.b, z2.b ; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, #0 ; CHECK-NEXT: mov z0.b, p0/m, z1.b ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %i = insertelement undef, i8 %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = call @llvm.uadd.sat.v16i8( %x, %ys) %b = select %c, %a, %z ret %b } define @ssub_satqr_v4i32( %z, %x, i32 %y) { ; CHECK-LABEL: ssub_satqr_v4i32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: mov z2.s, w0 ; CHECK-NEXT: sqsub z1.s, z1.s, z2.s ; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, #0 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %i = insertelement undef, i32 %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = call @llvm.ssub.sat.v4i32( %x, %ys) %b = select %c, %a, %z ret %b } define @ssub_satqr_v8i16( %z, %x, i16 %y) { ; CHECK-LABEL: ssub_satqr_v8i16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: mov z2.h, w0 ; CHECK-NEXT: sqsub z1.h, z1.h, z2.h ; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, #0 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %i = insertelement undef, i16 %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = call @llvm.ssub.sat.v8i16( %x, %ys) %b = select %c, %a, %z ret %b } define @ssub_satqr_v16i8( %z, %x, i8 %y) { ; CHECK-LABEL: ssub_satqr_v16i8: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: mov z2.b, w0 ; CHECK-NEXT: sqsub z1.b, z1.b, z2.b ; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, #0 ; CHECK-NEXT: mov z0.b, p0/m, z1.b ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %i = insertelement undef, i8 %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = call @llvm.ssub.sat.v16i8( %x, %ys) %b = select %c, %a, %z ret %b } define @usub_satqr_v4i32( %z, %x, i32 %y) { ; CHECK-LABEL: usub_satqr_v4i32: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: mov z2.s, w0 ; CHECK-NEXT: uqsub z1.s, z1.s, z2.s ; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, #0 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %i = insertelement undef, i32 %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = call @llvm.usub.sat.v4i32( %x, %ys) %b = select %c, %a, %z ret %b } define @usub_satqr_v8i16( %z, %x, i16 %y) { ; CHECK-LABEL: usub_satqr_v8i16: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: mov z2.h, w0 ; CHECK-NEXT: uqsub z1.h, z1.h, z2.h ; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, #0 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %i = insertelement undef, i16 %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = call @llvm.usub.sat.v8i16( %x, %ys) %b = select %c, %a, %z ret %b } define @usub_satqr_v16i8( %z, %x, i8 %y) { ; CHECK-LABEL: usub_satqr_v16i8: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: mov z2.b, w0 ; CHECK-NEXT: uqsub z1.b, z1.b, z2.b ; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, #0 ; CHECK-NEXT: mov z0.b, p0/m, z1.b ; CHECK-NEXT: ret entry: %c = icmp eq %z, zeroinitializer %i = insertelement undef, i8 %y, i32 0 %ys = shufflevector %i, undef, zeroinitializer %a = call @llvm.usub.sat.v16i8( %x, %ys) %b = select %c, %a, %z ret %b } declare @llvm.sadd.sat.v16i8( %src1, %src2) declare @llvm.sadd.sat.v8i16( %src1, %src2) declare @llvm.sadd.sat.v4i32( %src1, %src2) declare @llvm.uadd.sat.v16i8( %src1, %src2) declare @llvm.uadd.sat.v8i16( %src1, %src2) declare @llvm.uadd.sat.v4i32( %src1, %src2) declare @llvm.ssub.sat.v16i8( %src1, %src2) declare @llvm.ssub.sat.v8i16( %src1, %src2) declare @llvm.ssub.sat.v4i32( %src1, %src2) declare @llvm.usub.sat.v16i8( %src1, %src2) declare @llvm.usub.sat.v8i16( %src1, %src2) declare @llvm.usub.sat.v4i32( %src1, %src2)