; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mattr=+sve < %s | FileCheck %s -check-prefixes=CHECK,SVE1 ; RUN: llc -mattr=+sve2 < %s | FileCheck %s -check-prefixes=CHECK,SVE2 target triple = "aarch64-unknown-linux-gnu" ; ; ADD ; define @add_i8( %pg, %a, %b) { ; CHECK-LABEL: add_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: add z0.b, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.add.u.nxv16i8( %pg, %a, %b) ret %out } define @add_i16( %pg, %a, %b) { ; CHECK-LABEL: add_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: add z0.h, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.add.u.nxv8i16( %pg, %a, %b) ret %out } define @add_i32( %pg, %a, %b) { ; CHECK-LABEL: add_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: add z0.s, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.add.u.nxv4i32( %pg, %a, %b) ret %out } define @add_i64( %pg, %a, %b) { ; CHECK-LABEL: add_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: add z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.add.u.nxv2i64( %pg, %a, %b) ret %out } ; ; ADD (immediate) ; define @add_imm_i8( %pg, %a) { ; CHECK-LABEL: add_imm_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: add z0.b, z0.b, #3 // =0x3 ; CHECK-NEXT: ret %imm = insertelement undef, i8 3, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.add.u.nxv16i8( %pg, %a, %imm.splat) ret %out } define @add_imm_i16( %pg, %a) { ; CHECK-LABEL: add_imm_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: add z0.h, z0.h, #4 // =0x4 ; CHECK-NEXT: ret %imm = insertelement undef, i16 4, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.add.u.nxv8i16( %pg, %a, %imm.splat) ret %out } define @add_imm_i32( %pg, %a) { ; CHECK-LABEL: add_imm_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: add z0.s, z0.s, #5 // =0x5 ; CHECK-NEXT: ret %imm = insertelement undef, i32 5, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.add.u.nxv4i32( %pg, %a, %imm.splat) ret %out } define @add_imm_i64( %pg, %a) { ; CHECK-LABEL: add_imm_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: add z0.d, z0.d, #6 // =0x6 ; CHECK-NEXT: ret %imm = insertelement undef, i64 6, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.add.u.nxv2i64( %pg, %a, %imm.splat) ret %out } ; ; MLA ; define @mla_i8( %pg, %a, %b, %c) { ; CHECK-LABEL: mla_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: mla z0.b, p0/m, z1.b, z2.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.mla.u.nxv16i8( %pg, %a, %b, %c) ret %out } define @mla_i16( %pg, %a, %b, %c) { ; CHECK-LABEL: mla_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: mla z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.mla.u.nxv8i16( %pg, %a, %b, %c) ret %out } define @mla_i32( %pg, %a, %b, %c) { ; CHECK-LABEL: mla_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: mla z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.mla.u.nxv4i32( %pg, %a, %b, %c) ret %out } define @mla_i64( %pg, %a, %b, %c) { ; CHECK-LABEL: mla_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: mla z0.d, p0/m, z1.d, z2.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.mla.u.nxv2i64( %pg, %a, %b, %c) ret %out } ; ; MLS ; define @mls_i8( %pg, %a, %b, %c) { ; CHECK-LABEL: mls_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: mls z0.b, p0/m, z1.b, z2.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.mls.u.nxv16i8( %pg, %a, %b, %c) ret %out } define @mls_i16( %pg, %a, %b, %c) { ; CHECK-LABEL: mls_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: mls z0.h, p0/m, z1.h, z2.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.mls.u.nxv8i16( %pg, %a, %b, %c) ret %out } define @mls_i32( %pg, %a, %b, %c) { ; CHECK-LABEL: mls_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: mls z0.s, p0/m, z1.s, z2.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.mls.u.nxv4i32( %pg, %a, %b, %c) ret %out } define @mls_i64( %pg, %a, %b, %c) { ; CHECK-LABEL: mls_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: mls z0.d, p0/m, z1.d, z2.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.mls.u.nxv2i64( %pg, %a, %b, %c) ret %out } ; ; MUL ; define @mul_i8( %pg, %a, %b) { ; SVE1-LABEL: mul_i8: ; SVE1: // %bb.0: ; SVE1-NEXT: mul z0.b, p0/m, z0.b, z1.b ; SVE1-NEXT: ret ; ; SVE2-LABEL: mul_i8: ; SVE2: // %bb.0: ; SVE2-NEXT: mul z0.b, z0.b, z1.b ; SVE2-NEXT: ret %out = call @llvm.aarch64.sve.mul.u.nxv16i8( %pg, %a, %b) ret %out } define @mul_i16( %pg, %a, %b) { ; SVE1-LABEL: mul_i16: ; SVE1: // %bb.0: ; SVE1-NEXT: mul z0.h, p0/m, z0.h, z1.h ; SVE1-NEXT: ret ; ; SVE2-LABEL: mul_i16: ; SVE2: // %bb.0: ; SVE2-NEXT: mul z0.h, z0.h, z1.h ; SVE2-NEXT: ret %out = call @llvm.aarch64.sve.mul.u.nxv8i16( %pg, %a, %b) ret %out } define @mul_i32( %pg, %a, %b) { ; SVE1-LABEL: mul_i32: ; SVE1: // %bb.0: ; SVE1-NEXT: mul z0.s, p0/m, z0.s, z1.s ; SVE1-NEXT: ret ; ; SVE2-LABEL: mul_i32: ; SVE2: // %bb.0: ; SVE2-NEXT: mul z0.s, z0.s, z1.s ; SVE2-NEXT: ret %out = call @llvm.aarch64.sve.mul.u.nxv4i32( %pg, %a, %b) ret %out } define @mul_i64( %pg, %a, %b) { ; SVE1-LABEL: mul_i64: ; SVE1: // %bb.0: ; SVE1-NEXT: mul z0.d, p0/m, z0.d, z1.d ; SVE1-NEXT: ret ; ; SVE2-LABEL: mul_i64: ; SVE2: // %bb.0: ; SVE2-NEXT: mul z0.d, z0.d, z1.d ; SVE2-NEXT: ret %out = call @llvm.aarch64.sve.mul.u.nxv2i64( %pg, %a, %b) ret %out } ; ; MUL (immediate) ; define @mul_imm_i8( %pg, %a) { ; CHECK-LABEL: mul_imm_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: mul z0.b, z0.b, #3 ; CHECK-NEXT: ret %imm = insertelement undef, i8 3, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.mul.u.nxv16i8( %pg, %a, %imm.splat) ret %out } define @mul_imm_i16( %pg, %a) { ; CHECK-LABEL: mul_imm_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: mul z0.h, z0.h, #4 ; CHECK-NEXT: ret %imm = insertelement undef, i16 4, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.mul.u.nxv8i16( %pg, %a, %imm.splat) ret %out } define @mul_imm_i32( %pg, %a) { ; CHECK-LABEL: mul_imm_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: mul z0.s, z0.s, #5 ; CHECK-NEXT: ret %imm = insertelement undef, i32 5, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.mul.u.nxv4i32( %pg, %a, %imm.splat) ret %out } define @mul_imm_i64( %pg, %a) { ; CHECK-LABEL: mul_imm_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: mul z0.d, z0.d, #6 ; CHECK-NEXT: ret %imm = insertelement undef, i64 6, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.mul.u.nxv2i64( %pg, %a, %imm.splat) ret %out } ; ; SABD ; define @sabd_i8( %pg, %a, %b) { ; CHECK-LABEL: sabd_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: sabd z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sabd.u.nxv16i8( %pg, %a, %b) ret %out } define @sabd_i16( %pg, %a, %b) { ; CHECK-LABEL: sabd_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: sabd z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sabd.u.nxv8i16( %pg, %a, %b) ret %out } define @sabd_i32( %pg, %a, %b) { ; CHECK-LABEL: sabd_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: sabd z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sabd.u.nxv4i32( %pg, %a, %b) ret %out } define @sabd_i64( %pg, %a, %b) { ; CHECK-LABEL: sabd_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: sabd z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sabd.u.nxv2i64( %pg, %a, %b) ret %out } ; ; SDIV ; define @sdiv_i32( %pg, %a, %b) { ; CHECK-LABEL: sdiv_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sdiv z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sdiv.u.nxv4i32( %pg, %a, %b) ret %out } define @sdiv_i64( %pg, %a, %b) { ; CHECK-LABEL: sdiv_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sdiv z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sdiv.u.nxv2i64( %pg, %a, %b) ret %out } ; ; SDIVR ; define @sdivr_i32( %pg, %a, %b) { ; CHECK-LABEL: sdivr_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sdivr z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sdiv.u.nxv4i32( %pg, %b, %a) ret %out } define @sdivr_i64( %pg, %a, %b) { ; CHECK-LABEL: sdivr_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sdivr z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sdiv.u.nxv2i64( %pg, %b, %a) ret %out } ; ; SMAX ; define @smax_i8( %pg, %a, %b) { ; CHECK-LABEL: smax_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: smax z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.smax.u.nxv16i8( %pg, %a, %b) ret %out } define @smax_i16( %pg, %a, %b) { ; CHECK-LABEL: smax_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: smax z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.smax.u.nxv8i16( %pg, %a, %b) ret %out } define @smax_i32( %pg, %a, %b) { ; CHECK-LABEL: smax_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: smax z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.smax.u.nxv4i32( %pg, %a, %b) ret %out } define @smax_i64( %pg, %a, %b) { ; CHECK-LABEL: smax_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: smax z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.smax.u.nxv2i64( %pg, %a, %b) ret %out } ; ; SMAX (immediate) ; define @smax_imm_i8( %pg, %a) { ; CHECK-LABEL: smax_imm_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: smax z0.b, z0.b, #3 ; CHECK-NEXT: ret %imm = insertelement undef, i8 3, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.smax.u.nxv16i8( %pg, %a, %imm.splat) ret %out } define @smax_imm_i16( %pg, %a) { ; CHECK-LABEL: smax_imm_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: smax z0.h, z0.h, #4 ; CHECK-NEXT: ret %imm = insertelement undef, i16 4, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.smax.u.nxv8i16( %pg, %a, %imm.splat) ret %out } define @smax_imm_i32( %pg, %a) { ; CHECK-LABEL: smax_imm_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: smax z0.s, z0.s, #5 ; CHECK-NEXT: ret %imm = insertelement undef, i32 5, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.smax.u.nxv4i32( %pg, %a, %imm.splat) ret %out } define @smax_imm_i64( %pg, %a) { ; CHECK-LABEL: smax_imm_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: smax z0.d, z0.d, #6 ; CHECK-NEXT: ret %imm = insertelement undef, i64 6, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.smax.u.nxv2i64( %pg, %a, %imm.splat) ret %out } ; ; SMIN ; define @smin_i8( %pg, %a, %b) { ; CHECK-LABEL: smin_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: smin z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.smin.u.nxv16i8( %pg, %a, %b) ret %out } define @smin_i16( %pg, %a, %b) { ; CHECK-LABEL: smin_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: smin z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.smin.u.nxv8i16( %pg, %a, %b) ret %out } define @smin_i32( %pg, %a, %b) { ; CHECK-LABEL: smin_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: smin z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.smin.u.nxv4i32( %pg, %a, %b) ret %out } define @smin_i64( %pg, %a, %b) { ; CHECK-LABEL: smin_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: smin z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.smin.u.nxv2i64( %pg, %a, %b) ret %out } ; ; SMIN (immediate) ; define @smin_imm_i8( %pg, %a) { ; CHECK-LABEL: smin_imm_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: smin z0.b, z0.b, #3 ; CHECK-NEXT: ret %imm = insertelement undef, i8 3, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.smin.u.nxv16i8( %pg, %a, %imm.splat) ret %out } define @smin_imm_i16( %pg, %a) { ; CHECK-LABEL: smin_imm_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: smin z0.h, z0.h, #4 ; CHECK-NEXT: ret %imm = insertelement undef, i16 4, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.smin.u.nxv8i16( %pg, %a, %imm.splat) ret %out } define @smin_imm_i32( %pg, %a) { ; CHECK-LABEL: smin_imm_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: smin z0.s, z0.s, #5 ; CHECK-NEXT: ret %imm = insertelement undef, i32 5, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.smin.u.nxv4i32( %pg, %a, %imm.splat) ret %out } define @smin_imm_i64( %pg, %a) { ; CHECK-LABEL: smin_imm_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: smin z0.d, z0.d, #6 ; CHECK-NEXT: ret %imm = insertelement undef, i64 6, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.smin.u.nxv2i64( %pg, %a, %imm.splat) ret %out } ; ; SMULH ; define @smulh_i8( %pg, %a, %b) { ; SVE1-LABEL: smulh_i8: ; SVE1: // %bb.0: ; SVE1-NEXT: smulh z0.b, p0/m, z0.b, z1.b ; SVE1-NEXT: ret ; ; SVE2-LABEL: smulh_i8: ; SVE2: // %bb.0: ; SVE2-NEXT: smulh z0.b, z0.b, z1.b ; SVE2-NEXT: ret %out = call @llvm.aarch64.sve.smulh.u.nxv16i8( %pg, %a, %b) ret %out } define @smulh_i16( %pg, %a, %b) { ; SVE1-LABEL: smulh_i16: ; SVE1: // %bb.0: ; SVE1-NEXT: smulh z0.h, p0/m, z0.h, z1.h ; SVE1-NEXT: ret ; ; SVE2-LABEL: smulh_i16: ; SVE2: // %bb.0: ; SVE2-NEXT: smulh z0.h, z0.h, z1.h ; SVE2-NEXT: ret %out = call @llvm.aarch64.sve.smulh.u.nxv8i16( %pg, %a, %b) ret %out } define @smulh_i32( %pg, %a, %b) { ; SVE1-LABEL: smulh_i32: ; SVE1: // %bb.0: ; SVE1-NEXT: smulh z0.s, p0/m, z0.s, z1.s ; SVE1-NEXT: ret ; ; SVE2-LABEL: smulh_i32: ; SVE2: // %bb.0: ; SVE2-NEXT: smulh z0.s, z0.s, z1.s ; SVE2-NEXT: ret %out = call @llvm.aarch64.sve.smulh.u.nxv4i32( %pg, %a, %b) ret %out } define @smulh_i64( %pg, %a, %b) { ; SVE1-LABEL: smulh_i64: ; SVE1: // %bb.0: ; SVE1-NEXT: smulh z0.d, p0/m, z0.d, z1.d ; SVE1-NEXT: ret ; ; SVE2-LABEL: smulh_i64: ; SVE2: // %bb.0: ; SVE2-NEXT: smulh z0.d, z0.d, z1.d ; SVE2-NEXT: ret %out = call @llvm.aarch64.sve.smulh.u.nxv2i64( %pg, %a, %b) ret %out } ; ; SUB ; define @sub_i8( %pg, %a, %b) { ; CHECK-LABEL: sub_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: sub z0.b, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sub.u.nxv16i8( %pg, %a, %b) ret %out } define @sub_i16( %pg, %a, %b) { ; CHECK-LABEL: sub_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: sub z0.h, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sub.u.nxv8i16( %pg, %a, %b) ret %out } define @sub_i32( %pg, %a, %b) { ; CHECK-LABEL: sub_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sub z0.s, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sub.u.nxv4i32( %pg, %a, %b) ret %out } define @sub_i64( %pg, %a, %b) { ; CHECK-LABEL: sub_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sub z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sub.u.nxv2i64( %pg, %a, %b) ret %out } ; ; SUB (immediate) ; define @sub_imm_i8( %pg, %a) { ; CHECK-LABEL: sub_imm_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: sub z0.b, z0.b, #3 // =0x3 ; CHECK-NEXT: ret %imm = insertelement undef, i8 3, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.sub.u.nxv16i8( %pg, %a, %imm.splat) ret %out } define @sub_imm_i16( %pg, %a) { ; CHECK-LABEL: sub_imm_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: sub z0.h, z0.h, #4 // =0x4 ; CHECK-NEXT: ret %imm = insertelement undef, i16 4, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.sub.u.nxv8i16( %pg, %a, %imm.splat) ret %out } define @sub_imm_i32( %pg, %a) { ; CHECK-LABEL: sub_imm_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sub z0.s, z0.s, #5 // =0x5 ; CHECK-NEXT: ret %imm = insertelement undef, i32 5, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.sub.u.nxv4i32( %pg, %a, %imm.splat) ret %out } define @sub_imm_i64( %pg, %a) { ; CHECK-LABEL: sub_imm_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sub z0.d, z0.d, #6 // =0x6 ; CHECK-NEXT: ret %imm = insertelement undef, i64 6, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.sub.u.nxv2i64( %pg, %a, %imm.splat) ret %out } ; ; SUBR ; define @subr_i8( %pg, %a, %b) { ; CHECK-LABEL: subr_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: sub z0.b, z1.b, z0.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sub.u.nxv16i8( %pg, %b, %a) ret %out } define @subr_i16( %pg, %a, %b) { ; CHECK-LABEL: subr_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: sub z0.h, z1.h, z0.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sub.u.nxv8i16( %pg, %b, %a) ret %out } define @subr_i32( %pg, %a, %b) { ; CHECK-LABEL: subr_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sub z0.s, z1.s, z0.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sub.u.nxv4i32( %pg, %b, %a) ret %out } define @subr_i64( %pg, %a, %b) { ; CHECK-LABEL: subr_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sub z0.d, z1.d, z0.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sub.u.nxv2i64( %pg, %b, %a) ret %out } ; ; SUBR (immediate) ; define @subr_imm_i8( %pg, %a) { ; CHECK-LABEL: subr_imm_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: subr z0.b, z0.b, #3 // =0x3 ; CHECK-NEXT: ret %imm = insertelement undef, i8 3, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.sub.u.nxv16i8( %pg, %imm.splat, %a) ret %out } define @subr_imm_i16( %pg, %a) { ; CHECK-LABEL: subr_imm_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: subr z0.h, z0.h, #4 // =0x4 ; CHECK-NEXT: ret %imm = insertelement undef, i16 4, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.sub.u.nxv8i16( %pg, %imm.splat, %a) ret %out } define @subr_imm_i32( %pg, %a) { ; CHECK-LABEL: subr_imm_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: subr z0.s, z0.s, #5 // =0x5 ; CHECK-NEXT: ret %imm = insertelement undef, i32 5, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.sub.u.nxv4i32( %pg, %imm.splat, %a) ret %out } define @subr_imm_i64( %pg, %a) { ; CHECK-LABEL: subr_imm_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: subr z0.d, z0.d, #6 // =0x6 ; CHECK-NEXT: ret %imm = insertelement undef, i64 6, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.sub.u.nxv2i64( %pg, %imm.splat, %a) ret %out } ; ; UABD ; define @uabd_i8( %pg, %a, %b) { ; CHECK-LABEL: uabd_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: uabd z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uabd.u.nxv16i8( %pg, %a, %b) ret %out } define @uabd_i16( %pg, %a, %b) { ; CHECK-LABEL: uabd_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: uabd z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uabd.u.nxv8i16( %pg, %a, %b) ret %out } define @uabd_i32( %pg, %a, %b) { ; CHECK-LABEL: uabd_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: uabd z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uabd.u.nxv4i32( %pg, %a, %b) ret %out } define @uabd_i64( %pg, %a, %b) { ; CHECK-LABEL: uabd_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: uabd z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uabd.u.nxv2i64( %pg, %a, %b) ret %out } ; ; UDIV ; define @udiv_i32( %pg, %a, %b) { ; CHECK-LABEL: udiv_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: udiv z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.udiv.u.nxv4i32( %pg, %a, %b) ret %out } define @udiv_i64( %pg, %a, %b) { ; CHECK-LABEL: udiv_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: udiv z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.udiv.u.nxv2i64( %pg, %a, %b) ret %out } ; ; UDIVR ; define @udivr_i32( %pg, %a, %b) { ; CHECK-LABEL: udivr_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: udivr z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.udiv.u.nxv4i32( %pg, %b, %a) ret %out } define @udivr_i64( %pg, %a, %b) { ; CHECK-LABEL: udivr_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: udivr z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.udiv.u.nxv2i64( %pg, %b, %a) ret %out } ; ; UMAX ; define @umax_i8( %pg, %a, %b) { ; CHECK-LABEL: umax_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: umax z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.umax.u.nxv16i8( %pg, %a, %b) ret %out } define @umax_i16( %pg, %a, %b) { ; CHECK-LABEL: umax_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: umax z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.umax.u.nxv8i16( %pg, %a, %b) ret %out } define @umax_i32( %pg, %a, %b) { ; CHECK-LABEL: umax_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: umax z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.umax.u.nxv4i32( %pg, %a, %b) ret %out } define @umax_i64( %pg, %a, %b) { ; CHECK-LABEL: umax_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: umax z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.umax.u.nxv2i64( %pg, %a, %b) ret %out } ; ; UMAX (immediate) ; define @umax_imm_i8( %pg, %a) { ; CHECK-LABEL: umax_imm_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: umax z0.b, z0.b, #3 ; CHECK-NEXT: ret %imm = insertelement undef, i8 3, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.umax.u.nxv16i8( %pg, %a, %imm.splat) ret %out } define @umax_imm_i16( %pg, %a) { ; CHECK-LABEL: umax_imm_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: umax z0.h, z0.h, #4 ; CHECK-NEXT: ret %imm = insertelement undef, i16 4, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.umax.u.nxv8i16( %pg, %a, %imm.splat) ret %out } define @umax_imm_i32( %pg, %a) { ; CHECK-LABEL: umax_imm_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: umax z0.s, z0.s, #5 ; CHECK-NEXT: ret %imm = insertelement undef, i32 5, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.umax.u.nxv4i32( %pg, %a, %imm.splat) ret %out } define @umax_imm_i64( %pg, %a) { ; CHECK-LABEL: umax_imm_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: umax z0.d, z0.d, #6 ; CHECK-NEXT: ret %imm = insertelement undef, i64 6, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.umax.u.nxv2i64( %pg, %a, %imm.splat) ret %out } ; ; UMIN ; define @umin_i8( %pg, %a, %b) { ; CHECK-LABEL: umin_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: umin z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.umin.u.nxv16i8( %pg, %a, %b) ret %out } define @umin_i16( %pg, %a, %b) { ; CHECK-LABEL: umin_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: umin z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.umin.u.nxv8i16( %pg, %a, %b) ret %out } define @umin_i32( %pg, %a, %b) { ; CHECK-LABEL: umin_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: umin z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.umin.u.nxv4i32( %pg, %a, %b) ret %out } define @umin_i64( %pg, %a, %b) { ; CHECK-LABEL: umin_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: umin z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.umin.u.nxv2i64( %pg, %a, %b) ret %out } ; ; UMIN (immediate) ; define @umin_imm_i8( %pg, %a) { ; CHECK-LABEL: umin_imm_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: umin z0.b, z0.b, #3 ; CHECK-NEXT: ret %imm = insertelement undef, i8 3, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.umin.u.nxv16i8( %pg, %a, %imm.splat) ret %out } define @umin_imm_i16( %pg, %a) { ; CHECK-LABEL: umin_imm_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: umin z0.h, z0.h, #4 ; CHECK-NEXT: ret %imm = insertelement undef, i16 4, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.umin.u.nxv8i16( %pg, %a, %imm.splat) ret %out } define @umin_imm_i32( %pg, %a) { ; CHECK-LABEL: umin_imm_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: umin z0.s, z0.s, #5 ; CHECK-NEXT: ret %imm = insertelement undef, i32 5, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.umin.u.nxv4i32( %pg, %a, %imm.splat) ret %out } define @umin_imm_i64( %pg, %a) { ; CHECK-LABEL: umin_imm_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: umin z0.d, z0.d, #6 ; CHECK-NEXT: ret %imm = insertelement undef, i64 6, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.umin.u.nxv2i64( %pg, %a, %imm.splat) ret %out } ; ; UMULH ; define @umulh_i8( %pg, %a, %b) { ; SVE1-LABEL: umulh_i8: ; SVE1: // %bb.0: ; SVE1-NEXT: umulh z0.b, p0/m, z0.b, z1.b ; SVE1-NEXT: ret ; ; SVE2-LABEL: umulh_i8: ; SVE2: // %bb.0: ; SVE2-NEXT: umulh z0.b, z0.b, z1.b ; SVE2-NEXT: ret %out = call @llvm.aarch64.sve.umulh.u.nxv16i8( %pg, %a, %b) ret %out } define @umulh_i16( %pg, %a, %b) { ; SVE1-LABEL: umulh_i16: ; SVE1: // %bb.0: ; SVE1-NEXT: umulh z0.h, p0/m, z0.h, z1.h ; SVE1-NEXT: ret ; ; SVE2-LABEL: umulh_i16: ; SVE2: // %bb.0: ; SVE2-NEXT: umulh z0.h, z0.h, z1.h ; SVE2-NEXT: ret %out = call @llvm.aarch64.sve.umulh.u.nxv8i16( %pg, %a, %b) ret %out } define @umulh_i32( %pg, %a, %b) { ; SVE1-LABEL: umulh_i32: ; SVE1: // %bb.0: ; SVE1-NEXT: umulh z0.s, p0/m, z0.s, z1.s ; SVE1-NEXT: ret ; ; SVE2-LABEL: umulh_i32: ; SVE2: // %bb.0: ; SVE2-NEXT: umulh z0.s, z0.s, z1.s ; SVE2-NEXT: ret %out = call @llvm.aarch64.sve.umulh.u.nxv4i32( %pg, %a, %b) ret %out } define @umulh_i64( %pg, %a, %b) { ; SVE1-LABEL: umulh_i64: ; SVE1: // %bb.0: ; SVE1-NEXT: umulh z0.d, p0/m, z0.d, z1.d ; SVE1-NEXT: ret ; ; SVE2-LABEL: umulh_i64: ; SVE2: // %bb.0: ; SVE2-NEXT: umulh z0.d, z0.d, z1.d ; SVE2-NEXT: ret %out = call @llvm.aarch64.sve.umulh.u.nxv2i64( %pg, %a, %b) ret %out } declare @llvm.aarch64.sve.add.u.nxv16i8(, , ) declare @llvm.aarch64.sve.add.u.nxv8i16(, , ) declare @llvm.aarch64.sve.add.u.nxv4i32(, , ) declare @llvm.aarch64.sve.add.u.nxv2i64(, , ) declare @llvm.aarch64.sve.mla.u.nxv16i8(, , , ) declare @llvm.aarch64.sve.mla.u.nxv8i16(, , , ) declare @llvm.aarch64.sve.mla.u.nxv4i32(, , , ) declare @llvm.aarch64.sve.mla.u.nxv2i64(, , , ) declare @llvm.aarch64.sve.mls.u.nxv16i8(, , , ) declare @llvm.aarch64.sve.mls.u.nxv8i16(, , , ) declare @llvm.aarch64.sve.mls.u.nxv4i32(, , , ) declare @llvm.aarch64.sve.mls.u.nxv2i64(, , , ) declare @llvm.aarch64.sve.mul.u.nxv16i8(, , ) declare @llvm.aarch64.sve.mul.u.nxv8i16(, , ) declare @llvm.aarch64.sve.mul.u.nxv4i32(, , ) declare @llvm.aarch64.sve.mul.u.nxv2i64(, , ) declare @llvm.aarch64.sve.sabd.u.nxv16i8(, , ) declare @llvm.aarch64.sve.sabd.u.nxv8i16(, , ) declare @llvm.aarch64.sve.sabd.u.nxv4i32(, , ) declare @llvm.aarch64.sve.sabd.u.nxv2i64(, , ) declare @llvm.aarch64.sve.sdiv.u.nxv4i32(, , ) declare @llvm.aarch64.sve.sdiv.u.nxv2i64(, , ) declare @llvm.aarch64.sve.smax.u.nxv16i8(, , ) declare @llvm.aarch64.sve.smax.u.nxv8i16(, , ) declare @llvm.aarch64.sve.smax.u.nxv4i32(, , ) declare @llvm.aarch64.sve.smax.u.nxv2i64(, , ) declare @llvm.aarch64.sve.smin.u.nxv16i8(, , ) declare @llvm.aarch64.sve.smin.u.nxv8i16(, , ) declare @llvm.aarch64.sve.smin.u.nxv4i32(, , ) declare @llvm.aarch64.sve.smin.u.nxv2i64(, , ) declare @llvm.aarch64.sve.smulh.u.nxv16i8(, , ) declare @llvm.aarch64.sve.smulh.u.nxv8i16(, , ) declare @llvm.aarch64.sve.smulh.u.nxv4i32(, , ) declare @llvm.aarch64.sve.smulh.u.nxv2i64(, , ) declare @llvm.aarch64.sve.sub.u.nxv16i8(, , ) declare @llvm.aarch64.sve.sub.u.nxv8i16(, , ) declare @llvm.aarch64.sve.sub.u.nxv4i32(, , ) declare @llvm.aarch64.sve.sub.u.nxv2i64(, , ) declare @llvm.aarch64.sve.uabd.u.nxv16i8(, , ) declare @llvm.aarch64.sve.uabd.u.nxv8i16(, , ) declare @llvm.aarch64.sve.uabd.u.nxv4i32(, , ) declare @llvm.aarch64.sve.uabd.u.nxv2i64(, , ) declare @llvm.aarch64.sve.udiv.u.nxv4i32(, , ) declare @llvm.aarch64.sve.udiv.u.nxv2i64(, , ) declare @llvm.aarch64.sve.umax.u.nxv16i8(, , ) declare @llvm.aarch64.sve.umax.u.nxv8i16(, , ) declare @llvm.aarch64.sve.umax.u.nxv4i32(, , ) declare @llvm.aarch64.sve.umax.u.nxv2i64(, , ) declare @llvm.aarch64.sve.umin.u.nxv16i8(, , ) declare @llvm.aarch64.sve.umin.u.nxv8i16(, , ) declare @llvm.aarch64.sve.umin.u.nxv4i32(, , ) declare @llvm.aarch64.sve.umin.u.nxv2i64(, , ) declare @llvm.aarch64.sve.umulh.u.nxv16i8(, , ) declare @llvm.aarch64.sve.umulh.u.nxv8i16(, , ) declare @llvm.aarch64.sve.umulh.u.nxv4i32(, , ) declare @llvm.aarch64.sve.umulh.u.nxv2i64(, , )