; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve2 < %s | FileCheck %s ; ; SABA ; define @saba_i8( %a, %b, %c) { ; CHECK-LABEL: saba_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: saba z0.b, z1.b, z2.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.saba.nxv16i8( %a, %b, %c) ret %out } define @saba_i16( %a, %b, %c) { ; CHECK-LABEL: saba_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: saba z0.h, z1.h, z2.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.saba.nxv8i16( %a, %b, %c) ret %out } define @saba_i32( %a, %b, %c) { ; CHECK-LABEL: saba_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: saba z0.s, z1.s, z2.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.saba.nxv4i32( %a, %b, %c) ret %out } define @saba_i64( %a, %b, %c) { ; CHECK-LABEL: saba_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: saba z0.d, z1.d, z2.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.saba.nxv2i64( %a, %b, %c) ret %out } ; ; SHADD ; define @shadd_i8( %pg, %a, %b) { ; CHECK-LABEL: shadd_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: shadd z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shadd.nxv16i8( %pg, %a, %b) ret %out } define @shadd_i16( %pg, %a, %b) { ; CHECK-LABEL: shadd_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: shadd z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shadd.nxv8i16( %pg, %a, %b) ret %out } define @shadd_i32( %pg, %a, %b) { ; CHECK-LABEL: shadd_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: shadd z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shadd.nxv4i32( %pg, %a, %b) ret %out } define @shadd_i64( %pg, %a, %b) { ; CHECK-LABEL: shadd_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: shadd z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shadd.nxv2i64( %pg, %a, %b) ret %out } ; ; SHSUB ; define @shsub_i8( %pg, %a, %b) { ; CHECK-LABEL: shsub_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: shsub z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shsub.nxv16i8( %pg, %a, %b) ret %out } define @shsub_i16( %pg, %a, %b) { ; CHECK-LABEL: shsub_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: shsub z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shsub.nxv8i16( %pg, %a, %b) ret %out } define @shsub_i32( %pg, %a, %b) { ; CHECK-LABEL: shsub_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: shsub z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shsub.nxv4i32( %pg, %a, %b) ret %out } define @shsub_i64( %pg, %a, %b) { ; CHECK-LABEL: shsub_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: shsub z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shsub.nxv2i64( %pg, %a, %b) ret %out } ; ; SHSUBR ; define @shsubr_i8( %pg, %a, %b) { ; CHECK-LABEL: shsubr_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: shsubr z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shsubr.nxv16i8( %pg, %a, %b) ret %out } define @shsubr_i16( %pg, %a, %b) { ; CHECK-LABEL: shsubr_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: shsubr z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shsubr.nxv8i16( %pg, %a, %b) ret %out } define @shsubr_i32( %pg, %a, %b) { ; CHECK-LABEL: shsubr_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: shsubr z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shsubr.nxv4i32( %pg, %a, %b) ret %out } define @shsubr_i64( %pg, %a, %b) { ; CHECK-LABEL: shsubr_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: shsubr z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shsubr.nxv2i64( %pg, %a, %b) ret %out } ; ; SLI ; define @sli_i8( %a, %b) { ; CHECK-LABEL: sli_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: sli z0.b, z1.b, #0 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sli.nxv16i8( %a, %b, i32 0) ret %out } define @sli_i16( %a, %b) { ; CHECK-LABEL: sli_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: sli z0.h, z1.h, #1 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sli.nxv8i16( %a, %b, i32 1) ret %out } define @sli_i32( %a, %b) { ; CHECK-LABEL: sli_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sli z0.s, z1.s, #30 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sli.nxv4i32( %a, %b, i32 30); ret %out } define @sli_i64( %a, %b) { ; CHECK-LABEL: sli_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sli z0.d, z1.d, #63 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sli.nxv2i64( %a, %b, i32 63) ret %out } ; ; SQABS ; define @sqabs_i8( %a, %pg, %b) { ; CHECK-LABEL: sqabs_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: sqabs z0.b, p0/m, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqabs.nxv16i8( %a, %pg, %b) ret %out } define @sqabs_i16( %a, %pg, %b) { ; CHECK-LABEL: sqabs_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: sqabs z0.h, p0/m, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqabs.nxv8i16( %a, %pg, %b) ret %out } define @sqabs_i32( %a, %pg, %b) { ; CHECK-LABEL: sqabs_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sqabs z0.s, p0/m, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqabs.nxv4i32( %a, %pg, %b) ret %out } define @sqabs_i64( %a, %pg, %b) { ; CHECK-LABEL: sqabs_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sqabs z0.d, p0/m, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqabs.nxv2i64( %a, %pg, %b) ret %out } ; ; SQADD ; define @sqadd_i8( %pg, %a, %b) { ; CHECK-LABEL: sqadd_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: sqadd z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqadd.nxv16i8( %pg, %a, %b) ret %out } define @sqadd_i16( %pg, %a, %b) { ; CHECK-LABEL: sqadd_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: sqadd z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqadd.nxv8i16( %pg, %a, %b) ret %out } define @sqadd_i32( %pg, %a, %b) { ; CHECK-LABEL: sqadd_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sqadd z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqadd.nxv4i32( %pg, %a, %b) ret %out } define @sqadd_i64( %pg, %a, %b) { ; CHECK-LABEL: sqadd_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sqadd z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqadd.nxv2i64( %pg, %a, %b) ret %out } ; ; SQDMULH (Vector) ; define @sqdmulh_i8( %a, %b) { ; CHECK-LABEL: sqdmulh_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: sqdmulh z0.b, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqdmulh.nxv16i8( %a, %b) ret %out } define @sqdmulh_i16( %a, %b) { ; CHECK-LABEL: sqdmulh_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: sqdmulh z0.h, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqdmulh.nxv8i16( %a, %b) ret %out } define @sqdmulh_i32( %a, %b) { ; CHECK-LABEL: sqdmulh_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sqdmulh z0.s, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqdmulh.nxv4i32( %a, %b) ret %out } define @sqdmulh_i64( %a, %b) { ; CHECK-LABEL: sqdmulh_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sqdmulh z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqdmulh.nxv2i64( %a, %b) ret %out } ; ; SQDMULH (Indexed) ; define @sqdmulh_lane_i16( %a, %b) { ; CHECK-LABEL: sqdmulh_lane_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: sqdmulh z0.h, z0.h, z1.h[7] ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqdmulh.lane.nxv8i16( %a, %b, i32 7) ret %out } define @sqdmulh_lane_i32( %a, %b) { ; CHECK-LABEL: sqdmulh_lane_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sqdmulh z0.s, z0.s, z1.s[3] ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqdmulh.lane.nxv4i32( %a, %b, i32 3); ret %out } define @sqdmulh_lane_i64( %a, %b) { ; CHECK-LABEL: sqdmulh_lane_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sqdmulh z0.d, z0.d, z1.d[1] ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqdmulh.lane.nxv2i64( %a, %b, i32 1) ret %out } ; ; SQNEG ; define @sqneg_i8( %a, %pg, %b) { ; CHECK-LABEL: sqneg_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: sqneg z0.b, p0/m, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqneg.nxv16i8( %a, %pg, %b) ret %out } define @sqneg_i16( %a, %pg, %b) { ; CHECK-LABEL: sqneg_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: sqneg z0.h, p0/m, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqneg.nxv8i16( %a, %pg, %b) ret %out } define @sqneg_i32( %a, %pg, %b) { ; CHECK-LABEL: sqneg_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sqneg z0.s, p0/m, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqneg.nxv4i32( %a, %pg, %b) ret %out } define @sqneg_i64( %a, %pg, %b) { ; CHECK-LABEL: sqneg_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sqneg z0.d, p0/m, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqneg.nxv2i64( %a, %pg, %b) ret %out } ; ; SQRDMALH (Vectors) ; define @sqrdmlah_i8( %a, %b, %c) { ; CHECK-LABEL: sqrdmlah_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrdmlah z0.b, z1.b, z2.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrdmlah.nxv16i8( %a, %b, %c) ret %out } define @sqrdmlah_i16( %a, %b, %c) { ; CHECK-LABEL: sqrdmlah_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrdmlah z0.h, z1.h, z2.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrdmlah.nxv8i16( %a, %b, %c) ret %out } define @sqrdmlah_i32( %a, %b, %c) { ; CHECK-LABEL: sqrdmlah_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrdmlah z0.s, z1.s, z2.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrdmlah.nxv4i32( %a, %b, %c) ret %out } define @sqrdmlah_i64( %a, %b, %c) { ; CHECK-LABEL: sqrdmlah_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrdmlah z0.d, z1.d, z2.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrdmlah.nxv2i64( %a, %b, %c) ret %out } ; ; SQRDMALH (Indexed) ; define @sqrdmlah_lane_i16( %a, %b, %c) { ; CHECK-LABEL: sqrdmlah_lane_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrdmlah z0.h, z1.h, z2.h[5] ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrdmlah.lane.nxv8i16( %a, %b, %c, i32 5) ret %out } define @sqrdmlah_lane_i32( %a, %b, %c) { ; CHECK-LABEL: sqrdmlah_lane_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrdmlah z0.s, z1.s, z2.s[1] ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrdmlah.lane.nxv4i32( %a, %b, %c, i32 1); ret %out } define @sqrdmlah_lane_i64( %a, %b, %c) { ; CHECK-LABEL: sqrdmlah_lane_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrdmlah z0.d, z1.d, z2.d[1] ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrdmlah.lane.nxv2i64( %a, %b, %c, i32 1) ret %out } ; ; SQRDMSLH (Vectors) ; define @sqrdmlsh_i8( %a, %b, %c) { ; CHECK-LABEL: sqrdmlsh_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrdmlsh z0.b, z1.b, z2.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrdmlsh.nxv16i8( %a, %b, %c) ret %out } define @sqrdmlsh_i16( %a, %b, %c) { ; CHECK-LABEL: sqrdmlsh_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrdmlsh z0.h, z1.h, z2.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrdmlsh.nxv8i16( %a, %b, %c) ret %out } define @sqrdmlsh_i32( %a, %b, %c) { ; CHECK-LABEL: sqrdmlsh_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrdmlsh z0.s, z1.s, z2.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrdmlsh.nxv4i32( %a, %b, %c) ret %out } define @sqrdmlsh_i64( %a, %b, %c) { ; CHECK-LABEL: sqrdmlsh_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrdmlsh z0.d, z1.d, z2.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrdmlsh.nxv2i64( %a, %b, %c) ret %out } ; ; SQRDMSLH (Indexed) ; define @sqrdmlsh_lane_i16( %a, %b, %c) { ; CHECK-LABEL: sqrdmlsh_lane_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrdmlsh z0.h, z1.h, z2.h[4] ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrdmlsh.lane.nxv8i16( %a, %b, %c, i32 4) ret %out } define @sqrdmlsh_lane_i32( %a, %b, %c) { ; CHECK-LABEL: sqrdmlsh_lane_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrdmlsh z0.s, z1.s, z2.s[0] ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrdmlsh.lane.nxv4i32( %a, %b, %c, i32 0); ret %out } define @sqrdmlsh_lane_i64( %a, %b, %c) { ; CHECK-LABEL: sqrdmlsh_lane_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrdmlsh z0.d, z1.d, z2.d[1] ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrdmlsh.lane.nxv2i64( %a, %b, %c, i32 1) ret %out } ; ; SQRDMULH (Vectors) ; define @sqrdmulh_i8( %a, %b) { ; CHECK-LABEL: sqrdmulh_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrdmulh z0.b, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrdmulh.nxv16i8( %a, %b) ret %out } define @sqrdmulh_i16( %a, %b) { ; CHECK-LABEL: sqrdmulh_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrdmulh z0.h, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrdmulh.nxv8i16( %a, %b) ret %out } define @sqrdmulh_i32( %a, %b) { ; CHECK-LABEL: sqrdmulh_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrdmulh z0.s, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrdmulh.nxv4i32( %a, %b) ret %out } define @sqrdmulh_i64( %a, %b) { ; CHECK-LABEL: sqrdmulh_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrdmulh z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrdmulh.nxv2i64( %a, %b) ret %out } ; ; SQRDMULH (Indexed) ; define @sqrdmulh_lane_i16( %a, %b) { ; CHECK-LABEL: sqrdmulh_lane_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrdmulh z0.h, z0.h, z1.h[6] ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrdmulh.lane.nxv8i16( %a, %b, i32 6) ret %out } define @sqrdmulh_lane_i32( %a, %b) { ; CHECK-LABEL: sqrdmulh_lane_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrdmulh z0.s, z0.s, z1.s[2] ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrdmulh.lane.nxv4i32( %a, %b, i32 2); ret %out } define @sqrdmulh_lane_i64( %a, %b) { ; CHECK-LABEL: sqrdmulh_lane_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrdmulh z0.d, z0.d, z1.d[1] ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrdmulh.lane.nxv2i64( %a, %b, i32 1) ret %out } ; ; SQRSHL ; define @sqrshl_i8( %pg, %a, %b) { ; CHECK-LABEL: sqrshl_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrshl z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrshl.nxv16i8( %pg, %a, %b) ret %out } define @sqrshl_i16( %pg, %a, %b) { ; CHECK-LABEL: sqrshl_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrshl z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrshl.nxv8i16( %pg, %a, %b) ret %out } define @sqrshl_i32( %pg, %a, %b) { ; CHECK-LABEL: sqrshl_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrshl z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrshl.nxv4i32( %pg, %a, %b) ret %out } define @sqrshl_i64( %pg, %a, %b) { ; CHECK-LABEL: sqrshl_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrshl z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrshl.nxv2i64( %pg, %a, %b) ret %out } ; ; SQRSHLR ; define @sqrshlr_i8( %a, %b) { ; CHECK-LABEL: sqrshlr_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: sqrshlr z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %pg = call @llvm.aarch64.sve.ptrue.nxv16i1(i32 31) %out = call @llvm.aarch64.sve.sqrshl.nxv16i8( %pg, %b, %a) ret %out } define @sqrshlr_i16( %a, %b) { ; CHECK-LABEL: sqrshlr_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: sqrshlr z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %pg = call @llvm.aarch64.sve.ptrue.nxv8i1(i32 31) %out = call @llvm.aarch64.sve.sqrshl.nxv8i16( %pg, %b, %a) ret %out } define @sqrshlr_i32( %a, %b) { ; CHECK-LABEL: sqrshlr_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: sqrshlr z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %pg = call @llvm.aarch64.sve.ptrue.nxv4i1(i32 31) %out = call @llvm.aarch64.sve.sqrshl.nxv4i32( %pg, %b, %a) ret %out } define @sqrshlr_i64( %a, %b) { ; CHECK-LABEL: sqrshlr_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: sqrshlr z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %pg = call @llvm.aarch64.sve.ptrue.nxv2i1(i32 31) %out = call @llvm.aarch64.sve.sqrshl.nxv2i64( %pg, %b, %a) ret %out } define @sqrshlr_i64_noptrue( %pg, %a, %b) { ; CHECK-LABEL: sqrshlr_i64_noptrue: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrshl z1.d, p0/m, z1.d, z0.d ; CHECK-NEXT: mov z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrshl.nxv2i64( %pg, %b, %a) ret %out } ; ; SQSHL (Vectors) ; define @sqshl_i8( %pg, %a, %b) { ; CHECK-LABEL: sqshl_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: sqshl z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshl.nxv16i8( %pg, %a, %b) ret %out } define @sqshl_i16( %pg, %a, %b) { ; CHECK-LABEL: sqshl_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: sqshl z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshl.nxv8i16( %pg, %a, %b) ret %out } define @sqshl_i32( %pg, %a, %b) { ; CHECK-LABEL: sqshl_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sqshl z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshl.nxv4i32( %pg, %a, %b) ret %out } define @sqshl_i64( %pg, %a, %b) { ; CHECK-LABEL: sqshl_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sqshl z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshl.nxv2i64( %pg, %a, %b) ret %out } ; ; SQSHLR ; define @sqshlr_i8( %a, %b) { ; CHECK-LABEL: sqshlr_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: sqshlr z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %pg = call @llvm.aarch64.sve.ptrue.nxv16i1(i32 31) %out = call @llvm.aarch64.sve.sqshl.nxv16i8( %pg, %b, %a) ret %out } define @sqshlr_i16( %a, %b) { ; CHECK-LABEL: sqshlr_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: sqshlr z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %pg = call @llvm.aarch64.sve.ptrue.nxv8i1(i32 31) %out = call @llvm.aarch64.sve.sqshl.nxv8i16( %pg, %b, %a) ret %out } define @sqshlr_i32( %a, %b) { ; CHECK-LABEL: sqshlr_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: sqshlr z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %pg = call @llvm.aarch64.sve.ptrue.nxv4i1(i32 31) %out = call @llvm.aarch64.sve.sqshl.nxv4i32( %pg, %b, %a) ret %out } define @sqshlr_i64( %a, %b) { ; CHECK-LABEL: sqshlr_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: sqshlr z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %pg = call @llvm.aarch64.sve.ptrue.nxv2i1(i32 31) %out = call @llvm.aarch64.sve.sqshl.nxv2i64( %pg, %b, %a) ret %out } define @sqshlr_i64_noptrue( %pg, %a, %b) { ; CHECK-LABEL: sqshlr_i64_noptrue: ; CHECK: // %bb.0: ; CHECK-NEXT: sqshl z1.d, p0/m, z1.d, z0.d ; CHECK-NEXT: mov z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshl.nxv2i64( %pg, %b, %a) ret %out } ; ; SQSHL (Scalar) ; define @sqshl_n_i8( %pg, %a) { ; CHECK-LABEL: sqshl_n_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: sqshl z0.b, p0/m, z0.b, #7 ; CHECK-NEXT: ret %dup = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 7) %out = call @llvm.aarch64.sve.sqshl.nxv16i8( %pg, %a, %dup) ret %out } define @sqshl_n_i16( %pg, %a) { ; CHECK-LABEL: sqshl_n_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: sqshl z0.h, p0/m, z0.h, #15 ; CHECK-NEXT: ret %dup = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 15) %out = call @llvm.aarch64.sve.sqshl.nxv8i16( %pg, %a, %dup) ret %out } define @sqshl_n_i32( %pg, %a) { ; CHECK-LABEL: sqshl_n_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sqshl z0.s, p0/m, z0.s, #31 ; CHECK-NEXT: ret %dup = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 31) %out = call @llvm.aarch64.sve.sqshl.nxv4i32( %pg, %a, %dup) ret %out } define @sqshl_n_i64( %pg, %a) { ; CHECK-LABEL: sqshl_n_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sqshl z0.d, p0/m, z0.d, #63 ; CHECK-NEXT: ret %dup = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 63) %out = call @llvm.aarch64.sve.sqshl.nxv2i64( %pg, %a, %dup) ret %out } define @sqshl_n_i8_range( %pg, %a) { ; CHECK-LABEL: sqshl_n_i8_range: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z1.b, #8 // =0x8 ; CHECK-NEXT: sqshl z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %dup = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 8) %out = call @llvm.aarch64.sve.sqshl.nxv16i8( %pg, %a, %dup) ret %out } define @sqshl_n_i16_range( %pg, %a) { ; CHECK-LABEL: sqshl_n_i16_range: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z1.h, #16 // =0x10 ; CHECK-NEXT: sqshl z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %dup = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 16) %out = call @llvm.aarch64.sve.sqshl.nxv8i16( %pg, %a, %dup) ret %out } define @sqshl_n_i32_range( %pg, %a) { ; CHECK-LABEL: sqshl_n_i32_range: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z1.s, #32 // =0x20 ; CHECK-NEXT: sqshl z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %dup = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 32) %out = call @llvm.aarch64.sve.sqshl.nxv4i32( %pg, %a, %dup) ret %out } define @sqshl_n_i64_range( %pg, %a) { ; CHECK-LABEL: sqshl_n_i64_range: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z1.d, #64 // =0x40 ; CHECK-NEXT: sqshl z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %dup = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 64) %out = call @llvm.aarch64.sve.sqshl.nxv2i64( %pg, %a, %dup) ret %out } ; ; SQSHLU ; define @sqshlu_i8( %pg, %a) { ; CHECK-LABEL: sqshlu_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: sqshlu z0.b, p0/m, z0.b, #2 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshlu.nxv16i8( %pg, %a, i32 2) ret %out } define @sqshlu_i16( %pg, %a) { ; CHECK-LABEL: sqshlu_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: sqshlu z0.h, p0/m, z0.h, #3 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshlu.nxv8i16( %pg, %a, i32 3) ret %out } define @sqshlu_i32( %pg, %a) { ; CHECK-LABEL: sqshlu_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sqshlu z0.s, p0/m, z0.s, #29 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshlu.nxv4i32( %pg, %a, i32 29) ret %out } define @sqshlu_i64( %pg, %a) { ; CHECK-LABEL: sqshlu_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sqshlu z0.d, p0/m, z0.d, #62 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshlu.nxv2i64( %pg, %a, i32 62) ret %out } ; ; SQSUB ; define @sqsub_i8( %pg, %a, %b) { ; CHECK-LABEL: sqsub_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: sqsub z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqsub.nxv16i8( %pg, %a, %b) ret %out } define @sqsub_i16( %pg, %a, %b) { ; CHECK-LABEL: sqsub_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: sqsub z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqsub.nxv8i16( %pg, %a, %b) ret %out } define @sqsub_i32( %pg, %a, %b) { ; CHECK-LABEL: sqsub_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sqsub z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqsub.nxv4i32( %pg, %a, %b) ret %out } define @sqsub_i64( %pg, %a, %b) { ; CHECK-LABEL: sqsub_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sqsub z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqsub.nxv2i64( %pg, %a, %b) ret %out } ; ; SQSUBR ; define @sqsubr_i8( %pg, %a, %b) { ; CHECK-LABEL: sqsubr_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: sqsubr z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqsubr.nxv16i8( %pg, %a, %b) ret %out } define @sqsubr_i16( %pg, %a, %b) { ; CHECK-LABEL: sqsubr_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: sqsubr z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqsubr.nxv8i16( %pg, %a, %b) ret %out } define @sqsubr_i32( %pg, %a, %b) { ; CHECK-LABEL: sqsubr_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sqsubr z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqsubr.nxv4i32( %pg, %a, %b) ret %out } define @sqsubr_i64( %pg, %a, %b) { ; CHECK-LABEL: sqsubr_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sqsubr z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqsubr.nxv2i64( %pg, %a, %b) ret %out } ; ; SRHADD ; define @srhadd_i8( %pg, %a, %b) { ; CHECK-LABEL: srhadd_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: srhadd z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.srhadd.nxv16i8( %pg, %a, %b) ret %out } define @srhadd_i16( %pg, %a, %b) { ; CHECK-LABEL: srhadd_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: srhadd z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.srhadd.nxv8i16( %pg, %a, %b) ret %out } define @srhadd_i32( %pg, %a, %b) { ; CHECK-LABEL: srhadd_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: srhadd z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.srhadd.nxv4i32( %pg, %a, %b) ret %out } define @srhadd_i64( %pg, %a, %b) { ; CHECK-LABEL: srhadd_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: srhadd z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.srhadd.nxv2i64( %pg, %a, %b) ret %out } ; ; SRI ; define @sri_i8( %a, %b) { ; CHECK-LABEL: sri_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: sri z0.b, z1.b, #1 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sri.nxv16i8( %a, %b, i32 1) ret %out } define @sri_i16( %a, %b) { ; CHECK-LABEL: sri_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: sri z0.h, z1.h, #16 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sri.nxv8i16( %a, %b, i32 16) ret %out } define @sri_i32( %a, %b) { ; CHECK-LABEL: sri_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sri z0.s, z1.s, #32 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sri.nxv4i32( %a, %b, i32 32); ret %out } define @sri_i64( %a, %b) { ; CHECK-LABEL: sri_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sri z0.d, z1.d, #64 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sri.nxv2i64( %a, %b, i32 64) ret %out } ; ; SRSHL ; define @srshl_i8( %pg, %a, %b) { ; CHECK-LABEL: srshl_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: srshl z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.srshl.nxv16i8( %pg, %a, %b) ret %out } define @srshl_i16( %pg, %a, %b) { ; CHECK-LABEL: srshl_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: srshl z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.srshl.nxv8i16( %pg, %a, %b) ret %out } define @srshl_i32( %pg, %a, %b) { ; CHECK-LABEL: srshl_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: srshl z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.srshl.nxv4i32( %pg, %a, %b) ret %out } define @srshl_i64( %pg, %a, %b) { ; CHECK-LABEL: srshl_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: srshl z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.srshl.nxv2i64( %pg, %a, %b) ret %out } ; ; SRSHLR ; define @srshlr_i8( %a, %b) { ; CHECK-LABEL: srshlr_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: srshlr z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %pg = call @llvm.aarch64.sve.ptrue.nxv16i1(i32 31) %out = call @llvm.aarch64.sve.srshl.nxv16i8( %pg, %b, %a) ret %out } define @srshlr_i16( %a, %b) { ; CHECK-LABEL: srshlr_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: srshlr z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %pg = call @llvm.aarch64.sve.ptrue.nxv8i1(i32 31) %out = call @llvm.aarch64.sve.srshl.nxv8i16( %pg, %b, %a) ret %out } define @srshlr_i32( %a, %b) { ; CHECK-LABEL: srshlr_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: srshlr z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %pg = call @llvm.aarch64.sve.ptrue.nxv4i1(i32 31) %out = call @llvm.aarch64.sve.srshl.nxv4i32( %pg, %b, %a) ret %out } define @srshlr_i64( %a, %b) { ; CHECK-LABEL: srshlr_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: srshlr z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %pg = call @llvm.aarch64.sve.ptrue.nxv2i1(i32 31) %out = call @llvm.aarch64.sve.srshl.nxv2i64( %pg, %b, %a) ret %out } define @srshlr_i64_noptrue( %pg, %a, %b) { ; CHECK-LABEL: srshlr_i64_noptrue: ; CHECK: // %bb.0: ; CHECK-NEXT: srshl z1.d, p0/m, z1.d, z0.d ; CHECK-NEXT: mov z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.srshl.nxv2i64( %pg, %b, %a) ret %out } ; ; SRSHR ; define @srshr_i8( %pg, %a) { ; CHECK-LABEL: srshr_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: srshr z0.b, p0/m, z0.b, #8 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.srshr.nxv16i8( %pg, %a, i32 8) ret %out } define @srshr_i16( %pg, %a) { ; CHECK-LABEL: srshr_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: srshr z0.h, p0/m, z0.h, #1 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.srshr.nxv8i16( %pg, %a, i32 1) ret %out } define @srshr_i32( %pg, %a) { ; CHECK-LABEL: srshr_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: srshr z0.s, p0/m, z0.s, #22 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.srshr.nxv4i32( %pg, %a, i32 22) ret %out } define @srshr_i64( %pg, %a) { ; CHECK-LABEL: srshr_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: srshr z0.d, p0/m, z0.d, #54 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.srshr.nxv2i64( %pg, %a, i32 54) ret %out } ; ; SRSRA ; define @srsra_i8( %a, %b) { ; CHECK-LABEL: srsra_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: srsra z0.b, z1.b, #2 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.srsra.nxv16i8( %a, %b, i32 2) ret %out } define @srsra_i16( %a, %b) { ; CHECK-LABEL: srsra_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: srsra z0.h, z1.h, #15 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.srsra.nxv8i16( %a, %b, i32 15) ret %out } define @srsra_i32( %a, %b) { ; CHECK-LABEL: srsra_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: srsra z0.s, z1.s, #12 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.srsra.nxv4i32( %a, %b, i32 12) ret %out } define @srsra_i64( %a, %b) { ; CHECK-LABEL: srsra_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: srsra z0.d, z1.d, #44 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.srsra.nxv2i64( %a, %b, i32 44) ret %out } ; ; SSRA ; define @ssra_i8( %a, %b) { ; CHECK-LABEL: ssra_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: ssra z0.b, z1.b, #3 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.ssra.nxv16i8( %a, %b, i32 3) ret %out } define @ssra_i16( %a, %b) { ; CHECK-LABEL: ssra_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: ssra z0.h, z1.h, #14 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.ssra.nxv8i16( %a, %b, i32 14) ret %out } define @ssra_i32( %a, %b) { ; CHECK-LABEL: ssra_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: ssra z0.s, z1.s, #2 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.ssra.nxv4i32( %a, %b, i32 2) ret %out } define @ssra_i64( %a, %b) { ; CHECK-LABEL: ssra_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: ssra z0.d, z1.d, #34 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.ssra.nxv2i64( %a, %b, i32 34) ret %out } ; ; SUQADD ; define @suqadd_i8( %pg, %a, %b) { ; CHECK-LABEL: suqadd_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: suqadd z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.suqadd.nxv16i8( %pg, %a, %b) ret %out } define @suqadd_i16( %pg, %a, %b) { ; CHECK-LABEL: suqadd_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: suqadd z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.suqadd.nxv8i16( %pg, %a, %b) ret %out } define @suqadd_i32( %pg, %a, %b) { ; CHECK-LABEL: suqadd_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: suqadd z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.suqadd.nxv4i32( %pg, %a, %b) ret %out } define @suqadd_i64( %pg, %a, %b) { ; CHECK-LABEL: suqadd_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: suqadd z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.suqadd.nxv2i64( %pg, %a, %b) ret %out } ; ; UABA ; define @uaba_i8( %a, %b, %c) { ; CHECK-LABEL: uaba_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: uaba z0.b, z1.b, z2.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uaba.nxv16i8( %a, %b, %c) ret %out } define @uaba_i16( %a, %b, %c) { ; CHECK-LABEL: uaba_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: uaba z0.h, z1.h, z2.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uaba.nxv8i16( %a, %b, %c) ret %out } define @uaba_i32( %a, %b, %c) { ; CHECK-LABEL: uaba_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: uaba z0.s, z1.s, z2.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uaba.nxv4i32( %a, %b, %c) ret %out } define @uaba_i64( %a, %b, %c) { ; CHECK-LABEL: uaba_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: uaba z0.d, z1.d, z2.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uaba.nxv2i64( %a, %b, %c) ret %out } ; ; UHADD ; define @uhadd_i8( %pg, %a, %b) { ; CHECK-LABEL: uhadd_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: uhadd z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uhadd.nxv16i8( %pg, %a, %b) ret %out } define @uhadd_i16( %pg, %a, %b) { ; CHECK-LABEL: uhadd_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: uhadd z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uhadd.nxv8i16( %pg, %a, %b) ret %out } define @uhadd_i32( %pg, %a, %b) { ; CHECK-LABEL: uhadd_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: uhadd z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uhadd.nxv4i32( %pg, %a, %b) ret %out } define @uhadd_i64( %pg, %a, %b) { ; CHECK-LABEL: uhadd_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: uhadd z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uhadd.nxv2i64( %pg, %a, %b) ret %out } ; ; UHSUB ; define @uhsub_i8( %pg, %a, %b) { ; CHECK-LABEL: uhsub_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: uhsub z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uhsub.nxv16i8( %pg, %a, %b) ret %out } define @uhsub_i16( %pg, %a, %b) { ; CHECK-LABEL: uhsub_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: uhsub z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uhsub.nxv8i16( %pg, %a, %b) ret %out } define @uhsub_i32( %pg, %a, %b) { ; CHECK-LABEL: uhsub_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: uhsub z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uhsub.nxv4i32( %pg, %a, %b) ret %out } define @uhsub_i64( %pg, %a, %b) { ; CHECK-LABEL: uhsub_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: uhsub z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uhsub.nxv2i64( %pg, %a, %b) ret %out } ; ; UHSUBR ; define @uhsubr_i8( %pg, %a, %b) { ; CHECK-LABEL: uhsubr_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: uhsubr z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uhsubr.nxv16i8( %pg, %a, %b) ret %out } define @uhsubr_i16( %pg, %a, %b) { ; CHECK-LABEL: uhsubr_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: uhsubr z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uhsubr.nxv8i16( %pg, %a, %b) ret %out } define @uhsubr_i32( %pg, %a, %b) { ; CHECK-LABEL: uhsubr_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: uhsubr z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uhsubr.nxv4i32( %pg, %a, %b) ret %out } define @uhsubr_i64( %pg, %a, %b) { ; CHECK-LABEL: uhsubr_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: uhsubr z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uhsubr.nxv2i64( %pg, %a, %b) ret %out } ; ; UQADD ; define @uqadd_i8( %pg, %a, %b) { ; CHECK-LABEL: uqadd_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: uqadd z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqadd.nxv16i8( %pg, %a, %b) ret %out } define @uqadd_i16( %pg, %a, %b) { ; CHECK-LABEL: uqadd_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: uqadd z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqadd.nxv8i16( %pg, %a, %b) ret %out } define @uqadd_i32( %pg, %a, %b) { ; CHECK-LABEL: uqadd_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: uqadd z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqadd.nxv4i32( %pg, %a, %b) ret %out } define @uqadd_i64( %pg, %a, %b) { ; CHECK-LABEL: uqadd_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: uqadd z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqadd.nxv2i64( %pg, %a, %b) ret %out } ; ; UQRSHL ; define @uqrshl_i8( %pg, %a, %b) { ; CHECK-LABEL: uqrshl_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: uqrshl z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqrshl.nxv16i8( %pg, %a, %b) ret %out } define @uqrshl_i16( %pg, %a, %b) { ; CHECK-LABEL: uqrshl_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: uqrshl z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqrshl.nxv8i16( %pg, %a, %b) ret %out } define @uqrshl_i32( %pg, %a, %b) { ; CHECK-LABEL: uqrshl_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: uqrshl z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqrshl.nxv4i32( %pg, %a, %b) ret %out } define @uqrshl_i64( %pg, %a, %b) { ; CHECK-LABEL: uqrshl_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: uqrshl z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqrshl.nxv2i64( %pg, %a, %b) ret %out } ; ; UQRSHLR ; define @uqrshlr_i8( %a, %b) { ; CHECK-LABEL: uqrshlr_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: uqrshlr z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %pg = call @llvm.aarch64.sve.ptrue.nxv16i1(i32 31) %out = call @llvm.aarch64.sve.uqrshl.nxv16i8( %pg, %b, %a) ret %out } define @uqrshlr_i16( %a, %b) { ; CHECK-LABEL: uqrshlr_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: uqrshlr z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %pg = call @llvm.aarch64.sve.ptrue.nxv8i1(i32 31) %out = call @llvm.aarch64.sve.uqrshl.nxv8i16( %pg, %b, %a) ret %out } define @uqrshlr_i32( %a, %b) { ; CHECK-LABEL: uqrshlr_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: uqrshlr z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %pg = call @llvm.aarch64.sve.ptrue.nxv4i1(i32 31) %out = call @llvm.aarch64.sve.uqrshl.nxv4i32( %pg, %b, %a) ret %out } define @uqrshlr_i64( %a, %b) { ; CHECK-LABEL: uqrshlr_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: uqrshlr z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %pg = call @llvm.aarch64.sve.ptrue.nxv2i1(i32 31) %out = call @llvm.aarch64.sve.uqrshl.nxv2i64( %pg, %b, %a) ret %out } define @uqrshlr_i64_noptrue( %pg, %a, %b) { ; CHECK-LABEL: uqrshlr_i64_noptrue: ; CHECK: // %bb.0: ; CHECK-NEXT: uqrshl z1.d, p0/m, z1.d, z0.d ; CHECK-NEXT: mov z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqrshl.nxv2i64( %pg, %b, %a) ret %out } ; ; UQSHL (Vectors) ; define @uqshl_i8( %pg, %a, %b) { ; CHECK-LABEL: uqshl_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: uqshl z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqshl.nxv16i8( %pg, %a, %b) ret %out } define @uqshl_i16( %pg, %a, %b) { ; CHECK-LABEL: uqshl_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: uqshl z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqshl.nxv8i16( %pg, %a, %b) ret %out } define @uqshl_i32( %pg, %a, %b) { ; CHECK-LABEL: uqshl_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: uqshl z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqshl.nxv4i32( %pg, %a, %b) ret %out } define @uqshl_i64( %pg, %a, %b) { ; CHECK-LABEL: uqshl_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: uqshl z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqshl.nxv2i64( %pg, %a, %b) ret %out } ; ; UQSHLR ; define @uqshlr_i8( %a, %b) { ; CHECK-LABEL: uqshlr_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: uqshlr z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %pg = call @llvm.aarch64.sve.ptrue.nxv16i1(i32 31) %out = call @llvm.aarch64.sve.uqshl.nxv16i8( %pg, %b, %a) ret %out } define @uqshlr_i16( %a, %b) { ; CHECK-LABEL: uqshlr_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: uqshlr z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %pg = call @llvm.aarch64.sve.ptrue.nxv8i1(i32 31) %out = call @llvm.aarch64.sve.uqshl.nxv8i16( %pg, %b, %a) ret %out } define @uqshlr_i32( %a, %b) { ; CHECK-LABEL: uqshlr_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: uqshlr z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %pg = call @llvm.aarch64.sve.ptrue.nxv4i1(i32 31) %out = call @llvm.aarch64.sve.uqshl.nxv4i32( %pg, %b, %a) ret %out } define @uqshlr_i64( %a, %b) { ; CHECK-LABEL: uqshlr_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: uqshlr z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %pg = call @llvm.aarch64.sve.ptrue.nxv2i1(i32 31) %out = call @llvm.aarch64.sve.uqshl.nxv2i64( %pg, %b, %a) ret %out } define @uqshlr_i64_noptrue( %pg, %a, %b) { ; CHECK-LABEL: uqshlr_i64_noptrue: ; CHECK: // %bb.0: ; CHECK-NEXT: uqshl z1.d, p0/m, z1.d, z0.d ; CHECK-NEXT: mov z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqshl.nxv2i64( %pg, %b, %a) ret %out } ; ; UQSHL (Scalar) ; define @uqshl_n_i8( %pg, %a) { ; CHECK-LABEL: uqshl_n_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: uqshl z0.b, p0/m, z0.b, #7 ; CHECK-NEXT: ret %dup = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 7) %out = call @llvm.aarch64.sve.uqshl.nxv16i8( %pg, %a, %dup) ret %out } define @uqshl_n_i16( %pg, %a) { ; CHECK-LABEL: uqshl_n_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: uqshl z0.h, p0/m, z0.h, #15 ; CHECK-NEXT: ret %dup = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 15) %out = call @llvm.aarch64.sve.uqshl.nxv8i16( %pg, %a, %dup) ret %out } define @uqshl_n_i32( %pg, %a) { ; CHECK-LABEL: uqshl_n_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: uqshl z0.s, p0/m, z0.s, #31 ; CHECK-NEXT: ret %dup = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 31) %out = call @llvm.aarch64.sve.uqshl.nxv4i32( %pg, %a, %dup) ret %out } define @uqshl_n_i64( %pg, %a) { ; CHECK-LABEL: uqshl_n_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: uqshl z0.d, p0/m, z0.d, #63 ; CHECK-NEXT: ret %dup = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 63) %out = call @llvm.aarch64.sve.uqshl.nxv2i64( %pg, %a, %dup) ret %out } define @uqshl_n_i8_range( %pg, %a) { ; CHECK-LABEL: uqshl_n_i8_range: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z1.b, #8 // =0x8 ; CHECK-NEXT: uqshl z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %dup = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 8) %out = call @llvm.aarch64.sve.uqshl.nxv16i8( %pg, %a, %dup) ret %out } define @uqshl_n_i16_range( %pg, %a) { ; CHECK-LABEL: uqshl_n_i16_range: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z1.h, #16 // =0x10 ; CHECK-NEXT: uqshl z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %dup = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 16) %out = call @llvm.aarch64.sve.uqshl.nxv8i16( %pg, %a, %dup) ret %out } define @uqshl_n_i32_range( %pg, %a) { ; CHECK-LABEL: uqshl_n_i32_range: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z1.s, #32 // =0x20 ; CHECK-NEXT: uqshl z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %dup = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 32) %out = call @llvm.aarch64.sve.uqshl.nxv4i32( %pg, %a, %dup) ret %out } define @uqshl_n_i64_range( %pg, %a) { ; CHECK-LABEL: uqshl_n_i64_range: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z1.d, #64 // =0x40 ; CHECK-NEXT: uqshl z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %dup = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 64) %out = call @llvm.aarch64.sve.uqshl.nxv2i64( %pg, %a, %dup) ret %out } ; ; UQSUB ; define @uqsub_i8( %pg, %a, %b) { ; CHECK-LABEL: uqsub_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: uqsub z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqsub.nxv16i8( %pg, %a, %b) ret %out } define @uqsub_i16( %pg, %a, %b) { ; CHECK-LABEL: uqsub_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: uqsub z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqsub.nxv8i16( %pg, %a, %b) ret %out } define @uqsub_i32( %pg, %a, %b) { ; CHECK-LABEL: uqsub_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: uqsub z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqsub.nxv4i32( %pg, %a, %b) ret %out } define @uqsub_i64( %pg, %a, %b) { ; CHECK-LABEL: uqsub_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: uqsub z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqsub.nxv2i64( %pg, %a, %b) ret %out } ; ; UQSUBR ; define @uqsubr_i8( %pg, %a, %b) { ; CHECK-LABEL: uqsubr_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: uqsubr z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqsubr.nxv16i8( %pg, %a, %b) ret %out } define @uqsubr_i16( %pg, %a, %b) { ; CHECK-LABEL: uqsubr_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: uqsubr z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqsubr.nxv8i16( %pg, %a, %b) ret %out } define @uqsubr_i32( %pg, %a, %b) { ; CHECK-LABEL: uqsubr_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: uqsubr z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqsubr.nxv4i32( %pg, %a, %b) ret %out } define @uqsubr_i64( %pg, %a, %b) { ; CHECK-LABEL: uqsubr_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: uqsubr z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqsubr.nxv2i64( %pg, %a, %b) ret %out } ; ; URECPE ; define @urecpe_i32( %a, %pg, %b) { ; CHECK-LABEL: urecpe_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: urecpe z0.s, p0/m, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.urecpe.nxv4i32( %a, %pg, %b) ret %out } ; ; URHADD ; define @urhadd_i8( %pg, %a, %b) { ; CHECK-LABEL: urhadd_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: urhadd z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.urhadd.nxv16i8( %pg, %a, %b) ret %out } define @urhadd_i16( %pg, %a, %b) { ; CHECK-LABEL: urhadd_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: urhadd z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.urhadd.nxv8i16( %pg, %a, %b) ret %out } define @urhadd_i32( %pg, %a, %b) { ; CHECK-LABEL: urhadd_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: urhadd z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.urhadd.nxv4i32( %pg, %a, %b) ret %out } define @urhadd_i64( %pg, %a, %b) { ; CHECK-LABEL: urhadd_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: urhadd z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.urhadd.nxv2i64( %pg, %a, %b) ret %out } ; ; URSHL ; define @urshl_i8( %pg, %a, %b) { ; CHECK-LABEL: urshl_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: urshl z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.urshl.nxv16i8( %pg, %a, %b) ret %out } define @urshl_i16( %pg, %a, %b) { ; CHECK-LABEL: urshl_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: urshl z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.urshl.nxv8i16( %pg, %a, %b) ret %out } define @urshl_i32( %pg, %a, %b) { ; CHECK-LABEL: urshl_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: urshl z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.urshl.nxv4i32( %pg, %a, %b) ret %out } define @urshl_i64( %pg, %a, %b) { ; CHECK-LABEL: urshl_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: urshl z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.urshl.nxv2i64( %pg, %a, %b) ret %out } ; ; URSHLR ; define @urshlr_i8( %a, %b) { ; CHECK-LABEL: urshlr_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.b ; CHECK-NEXT: urshlr z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %pg = call @llvm.aarch64.sve.ptrue.nxv16i1(i32 31) %out = call @llvm.aarch64.sve.urshl.nxv16i8( %pg, %b, %a) ret %out } define @urshlr_i16( %a, %b) { ; CHECK-LABEL: urshlr_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: urshlr z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %pg = call @llvm.aarch64.sve.ptrue.nxv8i1(i32 31) %out = call @llvm.aarch64.sve.urshl.nxv8i16( %pg, %b, %a) ret %out } define @urshlr_i32( %a, %b) { ; CHECK-LABEL: urshlr_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s ; CHECK-NEXT: urshlr z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %pg = call @llvm.aarch64.sve.ptrue.nxv4i1(i32 31) %out = call @llvm.aarch64.sve.urshl.nxv4i32( %pg, %b, %a) ret %out } define @urshlr_i64( %a, %b) { ; CHECK-LABEL: urshlr_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d ; CHECK-NEXT: urshlr z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %pg = call @llvm.aarch64.sve.ptrue.nxv2i1(i32 31) %out = call @llvm.aarch64.sve.urshl.nxv2i64( %pg, %b, %a) ret %out } define @urshlr_i64_noptrue( %pg, %a, %b) { ; CHECK-LABEL: urshlr_i64_noptrue: ; CHECK: // %bb.0: ; CHECK-NEXT: urshl z1.d, p0/m, z1.d, z0.d ; CHECK-NEXT: mov z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.urshl.nxv2i64( %pg, %b, %a) ret %out } ; ; URSHR ; define @urshr_i8( %pg, %a) { ; CHECK-LABEL: urshr_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: urshr z0.b, p0/m, z0.b, #4 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.urshr.nxv16i8( %pg, %a, i32 4) ret %out } define @urshr_i16( %pg, %a) { ; CHECK-LABEL: urshr_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: urshr z0.h, p0/m, z0.h, #13 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.urshr.nxv8i16( %pg, %a, i32 13) ret %out } define @urshr_i32( %pg, %a) { ; CHECK-LABEL: urshr_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: urshr z0.s, p0/m, z0.s, #1 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.urshr.nxv4i32( %pg, %a, i32 1) ret %out } define @urshr_i64( %pg, %a) { ; CHECK-LABEL: urshr_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: urshr z0.d, p0/m, z0.d, #24 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.urshr.nxv2i64( %pg, %a, i32 24) ret %out } ; ; URSQRTE ; define @ursqrte_i32( %a, %pg, %b) { ; CHECK-LABEL: ursqrte_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: ursqrte z0.s, p0/m, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.ursqrte.nxv4i32( %a, %pg, %b) ret %out } ; ; URSRA ; define @ursra_i8( %a, %b) { ; CHECK-LABEL: ursra_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: ursra z0.b, z1.b, #5 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.ursra.nxv16i8( %a, %b, i32 5) ret %out } define @ursra_i16( %a, %b) { ; CHECK-LABEL: ursra_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: ursra z0.h, z1.h, #12 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.ursra.nxv8i16( %a, %b, i32 12) ret %out } define @ursra_i32( %a, %b) { ; CHECK-LABEL: ursra_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: ursra z0.s, z1.s, #31 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.ursra.nxv4i32( %a, %b, i32 31) ret %out } define @ursra_i64( %a, %b) { ; CHECK-LABEL: ursra_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: ursra z0.d, z1.d, #14 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.ursra.nxv2i64( %a, %b, i32 14) ret %out } ; ; USQADD ; define @usqadd_i8( %pg, %a, %b) { ; CHECK-LABEL: usqadd_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: usqadd z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.usqadd.nxv16i8( %pg, %a, %b) ret %out } define @usqadd_i16( %pg, %a, %b) { ; CHECK-LABEL: usqadd_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: usqadd z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.usqadd.nxv8i16( %pg, %a, %b) ret %out } define @usqadd_i32( %pg, %a, %b) { ; CHECK-LABEL: usqadd_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: usqadd z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.usqadd.nxv4i32( %pg, %a, %b) ret %out } define @usqadd_i64( %pg, %a, %b) { ; CHECK-LABEL: usqadd_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: usqadd z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.usqadd.nxv2i64( %pg, %a, %b) ret %out } ; ; USRA ; define @usra_i8( %a, %b) { ; CHECK-LABEL: usra_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: usra z0.b, z1.b, #6 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.usra.nxv16i8( %a, %b, i32 6) ret %out } define @usra_i16( %a, %b) { ; CHECK-LABEL: usra_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: usra z0.h, z1.h, #11 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.usra.nxv8i16( %a, %b, i32 11) ret %out } define @usra_i32( %a, %b) { ; CHECK-LABEL: usra_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: usra z0.s, z1.s, #21 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.usra.nxv4i32( %a, %b, i32 21) ret %out } define @usra_i64( %a, %b) { ; CHECK-LABEL: usra_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: usra z0.d, z1.d, #4 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.usra.nxv2i64( %a, %b, i32 4) ret %out } declare @llvm.aarch64.sve.dup.x.nxv16i8(i8) declare @llvm.aarch64.sve.dup.x.nxv8i16(i16) declare @llvm.aarch64.sve.dup.x.nxv4i32(i32) declare @llvm.aarch64.sve.dup.x.nxv2i64(i64) declare @llvm.aarch64.sve.saba.nxv16i8(, , ) declare @llvm.aarch64.sve.saba.nxv8i16(, , ) declare @llvm.aarch64.sve.saba.nxv4i32(, , ) declare @llvm.aarch64.sve.saba.nxv2i64(, , ) declare @llvm.aarch64.sve.shadd.nxv16i8(, , ) declare @llvm.aarch64.sve.shadd.nxv8i16(, , ) declare @llvm.aarch64.sve.shadd.nxv4i32(, , ) declare @llvm.aarch64.sve.shadd.nxv2i64(, , ) declare @llvm.aarch64.sve.shsub.nxv16i8(, , ) declare @llvm.aarch64.sve.shsub.nxv8i16(, , ) declare @llvm.aarch64.sve.shsub.nxv4i32(, , ) declare @llvm.aarch64.sve.shsub.nxv2i64(, , ) declare @llvm.aarch64.sve.shsubr.nxv16i8(, , ) declare @llvm.aarch64.sve.shsubr.nxv8i16(, , ) declare @llvm.aarch64.sve.shsubr.nxv4i32(, , ) declare @llvm.aarch64.sve.shsubr.nxv2i64(, , ) declare @llvm.aarch64.sve.sli.nxv16i8(, , i32) declare @llvm.aarch64.sve.sli.nxv8i16(, , i32) declare @llvm.aarch64.sve.sli.nxv4i32(, , i32) declare @llvm.aarch64.sve.sli.nxv2i64(, , i32) declare @llvm.aarch64.sve.sqabs.nxv16i8(, , ) declare @llvm.aarch64.sve.sqabs.nxv8i16(, , ) declare @llvm.aarch64.sve.sqabs.nxv4i32(, , ) declare @llvm.aarch64.sve.sqabs.nxv2i64(, , ) declare @llvm.aarch64.sve.sqadd.nxv16i8(, , ) declare @llvm.aarch64.sve.sqadd.nxv8i16(, , ) declare @llvm.aarch64.sve.sqadd.nxv4i32(, , ) declare @llvm.aarch64.sve.sqadd.nxv2i64(, , ) declare @llvm.aarch64.sve.sqdmulh.nxv16i8(, ) declare @llvm.aarch64.sve.sqdmulh.nxv8i16(, ) declare @llvm.aarch64.sve.sqdmulh.nxv4i32(, ) declare @llvm.aarch64.sve.sqdmulh.nxv2i64(, ) declare @llvm.aarch64.sve.sqdmulh.lane.nxv8i16(, , i32) declare @llvm.aarch64.sve.sqdmulh.lane.nxv4i32(, , i32) declare @llvm.aarch64.sve.sqdmulh.lane.nxv2i64(, , i32) declare @llvm.aarch64.sve.sqneg.nxv16i8(, , ) declare @llvm.aarch64.sve.sqneg.nxv8i16(, , ) declare @llvm.aarch64.sve.sqneg.nxv4i32(, , ) declare @llvm.aarch64.sve.sqneg.nxv2i64(, , ) declare @llvm.aarch64.sve.sqrdmlah.nxv16i8(, , ) declare @llvm.aarch64.sve.sqrdmlah.nxv8i16(, , ) declare @llvm.aarch64.sve.sqrdmlah.nxv4i32(, , ) declare @llvm.aarch64.sve.sqrdmlah.nxv2i64(, , ) declare @llvm.aarch64.sve.sqrdmlah.lane.nxv8i16(, , , i32) declare @llvm.aarch64.sve.sqrdmlah.lane.nxv4i32(, , , i32) declare @llvm.aarch64.sve.sqrdmlah.lane.nxv2i64(, , , i32) declare @llvm.aarch64.sve.sqrdmlsh.nxv16i8(, , ) declare @llvm.aarch64.sve.sqrdmlsh.nxv8i16(, , ) declare @llvm.aarch64.sve.sqrdmlsh.nxv4i32(, , ) declare @llvm.aarch64.sve.sqrdmlsh.nxv2i64(, , ) declare @llvm.aarch64.sve.sqrdmlsh.lane.nxv8i16(, , , i32) declare @llvm.aarch64.sve.sqrdmlsh.lane.nxv4i32(, , , i32) declare @llvm.aarch64.sve.sqrdmlsh.lane.nxv2i64(, , , i32) declare @llvm.aarch64.sve.sqrdmulh.nxv16i8(, ) declare @llvm.aarch64.sve.sqrdmulh.nxv8i16(, ) declare @llvm.aarch64.sve.sqrdmulh.nxv4i32(, ) declare @llvm.aarch64.sve.sqrdmulh.nxv2i64(, ) declare @llvm.aarch64.sve.sqrdmulh.lane.nxv8i16(, , i32) declare @llvm.aarch64.sve.sqrdmulh.lane.nxv4i32(, , i32) declare @llvm.aarch64.sve.sqrdmulh.lane.nxv2i64(, , i32) declare @llvm.aarch64.sve.sqrshl.nxv16i8(, , ) declare @llvm.aarch64.sve.sqrshl.nxv8i16(, , ) declare @llvm.aarch64.sve.sqrshl.nxv4i32(, , ) declare @llvm.aarch64.sve.sqrshl.nxv2i64(, , ) declare @llvm.aarch64.sve.sqshl.nxv16i8(, , ) declare @llvm.aarch64.sve.sqshl.nxv8i16(, , ) declare @llvm.aarch64.sve.sqshl.nxv4i32(, , ) declare @llvm.aarch64.sve.sqshl.nxv2i64(, , ) declare @llvm.aarch64.sve.sqshlu.nxv16i8(, , i32) declare @llvm.aarch64.sve.sqshlu.nxv8i16(, , i32) declare @llvm.aarch64.sve.sqshlu.nxv4i32(, , i32) declare @llvm.aarch64.sve.sqshlu.nxv2i64(, , i32) declare @llvm.aarch64.sve.sqsub.nxv16i8(, , ) declare @llvm.aarch64.sve.sqsub.nxv8i16(, , ) declare @llvm.aarch64.sve.sqsub.nxv4i32(, , ) declare @llvm.aarch64.sve.sqsub.nxv2i64(, , ) declare @llvm.aarch64.sve.sqsubr.nxv16i8(, , ) declare @llvm.aarch64.sve.sqsubr.nxv8i16(, , ) declare @llvm.aarch64.sve.sqsubr.nxv4i32(, , ) declare @llvm.aarch64.sve.sqsubr.nxv2i64(, , ) declare @llvm.aarch64.sve.srhadd.nxv16i8(, , ) declare @llvm.aarch64.sve.srhadd.nxv8i16(, , ) declare @llvm.aarch64.sve.srhadd.nxv4i32(, , ) declare @llvm.aarch64.sve.srhadd.nxv2i64(, , ) declare @llvm.aarch64.sve.sri.nxv16i8(, , i32) declare @llvm.aarch64.sve.sri.nxv8i16(, , i32) declare @llvm.aarch64.sve.sri.nxv4i32(, , i32) declare @llvm.aarch64.sve.sri.nxv2i64(, , i32) declare @llvm.aarch64.sve.srshl.nxv16i8(, , ) declare @llvm.aarch64.sve.srshl.nxv8i16(, , ) declare @llvm.aarch64.sve.srshl.nxv4i32(, , ) declare @llvm.aarch64.sve.srshl.nxv2i64(, , ) declare @llvm.aarch64.sve.srshr.nxv16i8(, , i32) declare @llvm.aarch64.sve.srshr.nxv8i16(, , i32) declare @llvm.aarch64.sve.srshr.nxv4i32(, , i32) declare @llvm.aarch64.sve.srshr.nxv2i64(, , i32) declare @llvm.aarch64.sve.srsra.nxv16i8(, , i32) declare @llvm.aarch64.sve.srsra.nxv8i16(, , i32) declare @llvm.aarch64.sve.srsra.nxv4i32(, , i32) declare @llvm.aarch64.sve.srsra.nxv2i64(, , i32) declare @llvm.aarch64.sve.ssra.nxv16i8(, , i32) declare @llvm.aarch64.sve.ssra.nxv8i16(, , i32) declare @llvm.aarch64.sve.ssra.nxv4i32(, , i32) declare @llvm.aarch64.sve.ssra.nxv2i64(, , i32) declare @llvm.aarch64.sve.suqadd.nxv16i8(, , ) declare @llvm.aarch64.sve.suqadd.nxv8i16(, , ) declare @llvm.aarch64.sve.suqadd.nxv4i32(, , ) declare @llvm.aarch64.sve.suqadd.nxv2i64(, , ) declare @llvm.aarch64.sve.uaba.nxv16i8(, , ) declare @llvm.aarch64.sve.uaba.nxv8i16(, , ) declare @llvm.aarch64.sve.uaba.nxv4i32(, , ) declare @llvm.aarch64.sve.uaba.nxv2i64(, , ) declare @llvm.aarch64.sve.uhadd.nxv16i8(, , ) declare @llvm.aarch64.sve.uhadd.nxv8i16(, , ) declare @llvm.aarch64.sve.uhadd.nxv4i32(, , ) declare @llvm.aarch64.sve.uhadd.nxv2i64(, , ) declare @llvm.aarch64.sve.uhsub.nxv16i8(, , ) declare @llvm.aarch64.sve.uhsub.nxv8i16(, , ) declare @llvm.aarch64.sve.uhsub.nxv4i32(, , ) declare @llvm.aarch64.sve.uhsub.nxv2i64(, , ) declare @llvm.aarch64.sve.uhsubr.nxv16i8(, , ) declare @llvm.aarch64.sve.uhsubr.nxv8i16(, , ) declare @llvm.aarch64.sve.uhsubr.nxv4i32(, , ) declare @llvm.aarch64.sve.uhsubr.nxv2i64(, , ) declare @llvm.aarch64.sve.uqadd.nxv16i8(, , ) declare @llvm.aarch64.sve.uqadd.nxv8i16(, , ) declare @llvm.aarch64.sve.uqadd.nxv4i32(, , ) declare @llvm.aarch64.sve.uqadd.nxv2i64(, , ) declare @llvm.aarch64.sve.uqrshl.nxv16i8(, , ) declare @llvm.aarch64.sve.uqrshl.nxv8i16(, , ) declare @llvm.aarch64.sve.uqrshl.nxv4i32(, , ) declare @llvm.aarch64.sve.uqrshl.nxv2i64(, , ) declare @llvm.aarch64.sve.uqshl.nxv16i8(, , ) declare @llvm.aarch64.sve.uqshl.nxv8i16(, , ) declare @llvm.aarch64.sve.uqshl.nxv4i32(, , ) declare @llvm.aarch64.sve.uqshl.nxv2i64(, , ) declare @llvm.aarch64.sve.uqsub.nxv16i8(, , ) declare @llvm.aarch64.sve.uqsub.nxv8i16(, , ) declare @llvm.aarch64.sve.uqsub.nxv4i32(, , ) declare @llvm.aarch64.sve.uqsub.nxv2i64(, , ) declare @llvm.aarch64.sve.uqsubr.nxv16i8(, , ) declare @llvm.aarch64.sve.uqsubr.nxv8i16(, , ) declare @llvm.aarch64.sve.uqsubr.nxv4i32(, , ) declare @llvm.aarch64.sve.uqsubr.nxv2i64(, , ) declare @llvm.aarch64.sve.urecpe.nxv4i32(, , ) declare @llvm.aarch64.sve.urhadd.nxv16i8(, , ) declare @llvm.aarch64.sve.urhadd.nxv8i16(, , ) declare @llvm.aarch64.sve.urhadd.nxv4i32(, , ) declare @llvm.aarch64.sve.urhadd.nxv2i64(, , ) declare @llvm.aarch64.sve.urshl.nxv16i8(, , ) declare @llvm.aarch64.sve.urshl.nxv8i16(, , ) declare @llvm.aarch64.sve.urshl.nxv4i32(, , ) declare @llvm.aarch64.sve.urshl.nxv2i64(, , ) declare @llvm.aarch64.sve.urshr.nxv16i8(, , i32) declare @llvm.aarch64.sve.urshr.nxv8i16(, , i32) declare @llvm.aarch64.sve.urshr.nxv4i32(, , i32) declare @llvm.aarch64.sve.urshr.nxv2i64(, , i32) declare @llvm.aarch64.sve.ursqrte.nxv4i32(, , ) declare @llvm.aarch64.sve.ursra.nxv16i8(, , i32) declare @llvm.aarch64.sve.ursra.nxv8i16(, , i32) declare @llvm.aarch64.sve.ursra.nxv4i32(, , i32) declare @llvm.aarch64.sve.ursra.nxv2i64(, , i32) declare @llvm.aarch64.sve.usqadd.nxv16i8(, , ) declare @llvm.aarch64.sve.usqadd.nxv8i16(, , ) declare @llvm.aarch64.sve.usqadd.nxv4i32(, , ) declare @llvm.aarch64.sve.usqadd.nxv2i64(, , ) declare @llvm.aarch64.sve.usra.nxv16i8(, , i32) declare @llvm.aarch64.sve.usra.nxv8i16(, , i32) declare @llvm.aarch64.sve.usra.nxv4i32(, , i32) declare @llvm.aarch64.sve.usra.nxv2i64(, , i32) declare @llvm.aarch64.sve.ptrue.nxv16i1(i32) declare @llvm.aarch64.sve.ptrue.nxv8i1(i32) declare @llvm.aarch64.sve.ptrue.nxv4i1(i32) declare @llvm.aarch64.sve.ptrue.nxv2i1(i32)