; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve2 < %s | FileCheck %s ; ; 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.u.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.u.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.u.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.u.nxv2i64( %pg, %a, %b) ret %out } ; ; SHSUB (swapped operands) ; define @shsub_i8_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: shsub_i8_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: shsubr z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shsub.u.nxv16i8( %pg, %b, %a) ret %out } define @shsub_i16_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: shsub_i16_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: shsubr z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shsub.u.nxv8i16( %pg, %b, %a) ret %out } define @shsub_i32_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: shsub_i32_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: shsubr z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shsub.u.nxv4i32( %pg, %b, %a) ret %out } define @shsub_i64_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: shsub_i64_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: shsubr z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shsub.u.nxv2i64( %pg, %b, %a) ret %out } ; ; SHSUB (movprfx) ; define @shsub_i8_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: shsub_i8_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: shsub z0.b, p0/m, z0.b, z2.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shsub.u.nxv16i8( %pg, %a, %b) ret %out } define @shsub_i16_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: shsub_i16_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: shsub z0.h, p0/m, z0.h, z2.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shsub.u.nxv8i16( %pg, %a, %b) ret %out } define @shsub_i32_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: shsub_i32_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: shsub z0.s, p0/m, z0.s, z2.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shsub.u.nxv4i32( %pg, %a, %b) ret %out } define @shsub_i64_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: shsub_i64_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: shsub z0.d, p0/m, z0.d, z2.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.shsub.u.nxv2i64( %pg, %a, %b) 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.u.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.u.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.u.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.u.nxv2i64( %pg, %a, %b) ret %out } ; ; SQRSHL (swapped operands) ; define @sqrshl_i8_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: sqrshl_i8_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrshlr z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrshl.u.nxv16i8( %pg, %b, %a) ret %out } define @sqrshl_i16_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: sqrshl_i16_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrshlr z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrshl.u.nxv8i16( %pg, %b, %a) ret %out } define @sqrshl_i32_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: sqrshl_i32_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrshlr z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrshl.u.nxv4i32( %pg, %b, %a) ret %out } define @sqrshl_i64_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: sqrshl_i64_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: sqrshlr z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrshl.u.nxv2i64( %pg, %b, %a) ret %out } ; ; SQRSHL (movprfx) ; define @sqrshl_i8_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: sqrshl_i8_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: sqrshl z0.b, p0/m, z0.b, z2.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrshl.u.nxv16i8( %pg, %a, %b) ret %out } define @sqrshl_i16_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: sqrshl_i16_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: sqrshl z0.h, p0/m, z0.h, z2.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrshl.u.nxv8i16( %pg, %a, %b) ret %out } define @sqrshl_i32_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: sqrshl_i32_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: sqrshl z0.s, p0/m, z0.s, z2.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrshl.u.nxv4i32( %pg, %a, %b) ret %out } define @sqrshl_i64_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: sqrshl_i64_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: sqrshl z0.d, p0/m, z0.d, z2.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqrshl.u.nxv2i64( %pg, %a, %b) 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.u.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.u.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.u.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.u.nxv2i64( %pg, %a, %b) ret %out } ; ; SQSHL (Vectors, swapped operands) ; define @sqshl_i8_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: sqshl_i8_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: sqshlr z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshl.u.nxv16i8( %pg, %b, %a) ret %out } define @sqshl_i16_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: sqshl_i16_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: sqshlr z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshl.u.nxv8i16( %pg, %b, %a) ret %out } define @sqshl_i32_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: sqshl_i32_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: sqshlr z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshl.u.nxv4i32( %pg, %b, %a) ret %out } define @sqshl_i64_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: sqshl_i64_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: sqshlr z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshl.u.nxv2i64( %pg, %b, %a) ret %out } ; ; SQSHL (Vectors, movpfrx) ; define @sqshl_i8_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: sqshl_i8_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: sqshl z0.b, p0/m, z0.b, z2.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshl.u.nxv16i8( %pg, %a, %b) ret %out } define @sqshl_i16_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: sqshl_i16_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: sqshl z0.h, p0/m, z0.h, z2.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshl.u.nxv8i16( %pg, %a, %b) ret %out } define @sqshl_i32_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: sqshl_i32_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: sqshl z0.s, p0/m, z0.s, z2.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshl.u.nxv4i32( %pg, %a, %b) ret %out } define @sqshl_i64_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: sqshl_i64_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: sqshl z0.d, p0/m, z0.d, z2.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshl.u.nxv2i64( %pg, %a, %b) ret %out } ; ; SQSHL (Immediate) ; 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 %out = call @llvm.aarch64.sve.sqshl.u.nxv16i8( %pg, %a, splat (i8 7)) 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 %out = call @llvm.aarch64.sve.sqshl.u.nxv8i16( %pg, %a, splat (i16 15)) 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 %out = call @llvm.aarch64.sve.sqshl.u.nxv4i32( %pg, %a, splat (i32 31)) 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 %out = call @llvm.aarch64.sve.sqshl.u.nxv2i64( %pg, %a, splat (i64 63)) ret %out } define @sqshl_n_i8_out_of_range( %pg, %a) { ; CHECK-LABEL: sqshl_n_i8_out_of_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 %out = call @llvm.aarch64.sve.sqshl.u.nxv16i8( %pg, %a, splat (i8 8)) ret %out } define @sqshl_n_i16_out_of_range( %pg, %a) { ; CHECK-LABEL: sqshl_n_i16_out_of_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 %out = call @llvm.aarch64.sve.sqshl.u.nxv8i16( %pg, %a, splat (i16 16)) ret %out } define @sqshl_n_i32_out_of_range( %pg, %a) { ; CHECK-LABEL: sqshl_n_i32_out_of_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 %out = call @llvm.aarch64.sve.sqshl.u.nxv4i32( %pg, %a, splat (i32 32)) ret %out } define @sqshl_n_i64_out_of_range( %pg, %a) { ; CHECK-LABEL: sqshl_n_i64_out_of_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 %out = call @llvm.aarch64.sve.sqshl.u.nxv2i64( %pg, %a, splat (i64 64)) ret %out } ; ; SQSHL (Immediate, movprfx) ; define @sqshl_n_i8_movprfx( %pg, %unused, %a) { ; CHECK-LABEL: sqshl_n_i8_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: sqshl z0.b, p0/m, z0.b, #7 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshl.u.nxv16i8( %pg, %a, splat (i8 7)) ret %out } define @sqshl_n_i16_movprfx( %pg, %unused, %a) { ; CHECK-LABEL: sqshl_n_i16_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: sqshl z0.h, p0/m, z0.h, #15 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshl.u.nxv8i16( %pg, %a, splat (i16 15)) ret %out } define @sqshl_n_i32_movprfx( %pg, %unused, %a) { ; CHECK-LABEL: sqshl_n_i32_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: sqshl z0.s, p0/m, z0.s, #31 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshl.u.nxv4i32( %pg, %a, splat (i32 31)) ret %out } define @sqshl_n_i64_movprfx( %pg, %unused, %a) { ; CHECK-LABEL: sqshl_n_i64_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: sqshl z0.d, p0/m, z0.d, #63 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqshl.u.nxv2i64( %pg, %a, splat (i64 63)) ret %out } ; ; SQSUB ; define @sqsub_i8_u( %pg, %a, %b) { ; CHECK-LABEL: sqsub_i8_u: ; CHECK: // %bb.0: ; CHECK-NEXT: sqsub z0.b, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqsub.u.nxv16i8( %pg, %a, %b) ret %out } define @sqsub_i16_u( %pg, %a, %b) { ; CHECK-LABEL: sqsub_i16_u: ; CHECK: // %bb.0: ; CHECK-NEXT: sqsub z0.h, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqsub.u.nxv8i16( %pg, %a, %b) ret %out } define @sqsub_i32_u( %pg, %a, %b) { ; CHECK-LABEL: sqsub_i32_u: ; CHECK: // %bb.0: ; CHECK-NEXT: sqsub z0.s, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqsub.u.nxv4i32( %pg, %a, %b) ret %out } define @sqsub_i64_u( %pg, %a, %b) { ; CHECK-LABEL: sqsub_i64_u: ; CHECK: // %bb.0: ; CHECK-NEXT: sqsub z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.sqsub.u.nxv2i64( %pg, %a, %b) 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.u.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.u.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.u.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.u.nxv2i64( %pg, %a, %b) ret %out } ; ; SRSHL (swapped operands) ; define @srshl_i8_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: srshl_i8_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: srshlr z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.srshl.u.nxv16i8( %pg, %b, %a) ret %out } define @srshl_i16_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: srshl_i16_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: srshlr z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.srshl.u.nxv8i16( %pg, %b, %a) ret %out } define @srshl_i32_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: srshl_i32_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: srshlr z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.srshl.u.nxv4i32( %pg, %b, %a) ret %out } define @srshl_i64_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: srshl_i64_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: srshlr z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.srshl.u.nxv2i64( %pg, %b, %a) ret %out } ; ; SRSHL (movprfx) ; define @srshl_i8_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: srshl_i8_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: srshl z0.b, p0/m, z0.b, z2.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.srshl.u.nxv16i8( %pg, %a, %b) ret %out } define @srshl_i16_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: srshl_i16_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: srshl z0.h, p0/m, z0.h, z2.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.srshl.u.nxv8i16( %pg, %a, %b) ret %out } define @srshl_i32_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: srshl_i32_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: srshl z0.s, p0/m, z0.s, z2.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.srshl.u.nxv4i32( %pg, %a, %b) ret %out } define @srshl_i64_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: srshl_i64_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: srshl z0.d, p0/m, z0.d, z2.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.srshl.u.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.u.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.u.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.u.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.u.nxv2i64( %pg, %a, %b) ret %out } ; ; UHSUB (swapped operands) ; define @uhsub_i8_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: uhsub_i8_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: uhsubr z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uhsub.u.nxv16i8( %pg, %b, %a) ret %out } define @uhsub_i16_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: uhsub_i16_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: uhsubr z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uhsub.u.nxv8i16( %pg, %b, %a) ret %out } define @uhsub_i32_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: uhsub_i32_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: uhsubr z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uhsub.u.nxv4i32( %pg, %b, %a) ret %out } define @uhsub_i64_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: uhsub_i64_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: uhsubr z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uhsub.u.nxv2i64( %pg, %b, %a) ret %out } ; ; UHSUB (movprfx) ; define @uhsub_i8_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: uhsub_i8_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: uhsub z0.b, p0/m, z0.b, z2.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uhsub.u.nxv16i8( %pg, %a, %b) ret %out } define @uhsub_i16_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: uhsub_i16_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: uhsub z0.h, p0/m, z0.h, z2.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uhsub.u.nxv8i16( %pg, %a, %b) ret %out } define @uhsub_i32_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: uhsub_i32_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: uhsub z0.s, p0/m, z0.s, z2.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uhsub.u.nxv4i32( %pg, %a, %b) ret %out } define @uhsub_i64_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: uhsub_i64_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: uhsub z0.d, p0/m, z0.d, z2.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uhsub.u.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.u.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.u.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.u.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.u.nxv2i64( %pg, %a, %b) ret %out } ; ; UQRSHL (swapped operands) ; define @uqrshl_i8_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: uqrshl_i8_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: uqrshlr z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqrshl.u.nxv16i8( %pg, %b, %a) ret %out } define @uqrshl_i16_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: uqrshl_i16_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: uqrshlr z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqrshl.u.nxv8i16( %pg, %b, %a) ret %out } define @uqrshl_i32_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: uqrshl_i32_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: uqrshlr z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqrshl.u.nxv4i32( %pg, %b, %a) ret %out } define @uqrshl_i64_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: uqrshl_i64_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: uqrshlr z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqrshl.u.nxv2i64( %pg, %b, %a) ret %out } ; ; UQRSHL (movprfx) ; define @uqrshl_i8_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: uqrshl_i8_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: uqrshl z0.b, p0/m, z0.b, z2.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqrshl.u.nxv16i8( %pg, %a, %b) ret %out } define @uqrshl_i16_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: uqrshl_i16_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: uqrshl z0.h, p0/m, z0.h, z2.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqrshl.u.nxv8i16( %pg, %a, %b) ret %out } define @uqrshl_i32_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: uqrshl_i32_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: uqrshl z0.s, p0/m, z0.s, z2.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqrshl.u.nxv4i32( %pg, %a, %b) ret %out } define @uqrshl_i64_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: uqrshl_i64_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: uqrshl z0.d, p0/m, z0.d, z2.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqrshl.u.nxv2i64( %pg, %a, %b) 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.u.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.u.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.u.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.u.nxv2i64( %pg, %a, %b) ret %out } ; ; UQSHL (Vectors, swapped operands) ; define @uqshl_i8_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: uqshl_i8_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: uqshlr z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqshl.u.nxv16i8( %pg, %b, %a) ret %out } define @uqshl_i16_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: uqshl_i16_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: uqshlr z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqshl.u.nxv8i16( %pg, %b, %a) ret %out } define @uqshl_i32_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: uqshl_i32_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: uqshlr z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqshl.u.nxv4i32( %pg, %b, %a) ret %out } define @uqshl_i64_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: uqshl_i64_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: uqshlr z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqshl.u.nxv2i64( %pg, %b, %a) ret %out } ; ; UQSHL (Vectors, movprfx) ; define @uqshl_i8_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: uqshl_i8_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: uqshl z0.b, p0/m, z0.b, z2.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqshl.u.nxv16i8( %pg, %a, %b) ret %out } define @uqshl_i16_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: uqshl_i16_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: uqshl z0.h, p0/m, z0.h, z2.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqshl.u.nxv8i16( %pg, %a, %b) ret %out } define @uqshl_i32_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: uqshl_i32_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: uqshl z0.s, p0/m, z0.s, z2.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqshl.u.nxv4i32( %pg, %a, %b) ret %out } define @uqshl_i64_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: uqshl_i64_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: uqshl z0.d, p0/m, z0.d, z2.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqshl.u.nxv2i64( %pg, %a, %b) ret %out } ; ; UQSHL (Immediate) ; 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 %out = call @llvm.aarch64.sve.uqshl.u.nxv16i8( %pg, %a, splat(i8 7)) 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 %out = call @llvm.aarch64.sve.uqshl.u.nxv8i16( %pg, %a, splat(i16 15)) 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 %out = call @llvm.aarch64.sve.uqshl.u.nxv4i32( %pg, %a, splat(i32 31)) 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 %out = call @llvm.aarch64.sve.uqshl.u.nxv2i64( %pg, %a, splat(i64 63)) ret %out } define @uqshl_n_i8_out_of_range( %pg, %a) { ; CHECK-LABEL: uqshl_n_i8_out_of_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 %out = call @llvm.aarch64.sve.uqshl.u.nxv16i8( %pg, %a, splat(i8 8)) ret %out } define @uqshl_n_i16_out_of_range( %pg, %a) { ; CHECK-LABEL: uqshl_n_i16_out_of_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 %out = call @llvm.aarch64.sve.uqshl.u.nxv8i16( %pg, %a, splat(i16 16)) ret %out } define @uqshl_n_i32_out_of_range( %pg, %a) { ; CHECK-LABEL: uqshl_n_i32_out_of_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 %out = call @llvm.aarch64.sve.uqshl.u.nxv4i32( %pg, %a, splat(i32 32)) ret %out } define @uqshl_n_i64_out_of_range( %pg, %a) { ; CHECK-LABEL: uqshl_n_i64_out_of_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 %out = call @llvm.aarch64.sve.uqshl.u.nxv2i64( %pg, %a, splat(i64 64)) ret %out } ; ; UQSHL (Immediate, movprfx) ; define @uqshl_n_i8_movprfx( %pg, %unused, %a) { ; CHECK-LABEL: uqshl_n_i8_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: uqshl z0.b, p0/m, z0.b, #7 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqshl.u.nxv16i8( %pg, %a, splat(i8 7)) ret %out } define @uqshl_n_i16_movprfx( %pg, %unused, %a) { ; CHECK-LABEL: uqshl_n_i16_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: uqshl z0.h, p0/m, z0.h, #15 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqshl.u.nxv8i16( %pg, %a, splat(i16 15)) ret %out } define @uqshl_n_i32_movprfx( %pg, %unused, %a) { ; CHECK-LABEL: uqshl_n_i32_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: uqshl z0.s, p0/m, z0.s, #31 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqshl.u.nxv4i32( %pg, %a, splat(i32 31)) ret %out } define @uqshl_n_i64_movprfx( %pg, %unused, %a) { ; CHECK-LABEL: uqshl_n_i64_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: uqshl z0.d, p0/m, z0.d, #63 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqshl.u.nxv2i64( %pg, %a, splat(i64 63)) ret %out } ; ; UQSUB ; define @uqsub_i8_u( %pg, %a, %b) { ; CHECK-LABEL: uqsub_i8_u: ; CHECK: // %bb.0: ; CHECK-NEXT: uqsub z0.b, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqsub.u.nxv16i8( %pg, %a, %b) ret %out } define @uqsub_i16_u( %pg, %a, %b) { ; CHECK-LABEL: uqsub_i16_u: ; CHECK: // %bb.0: ; CHECK-NEXT: uqsub z0.h, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqsub.u.nxv8i16( %pg, %a, %b) ret %out } define @uqsub_i32_u( %pg, %a, %b) { ; CHECK-LABEL: uqsub_i32_u: ; CHECK: // %bb.0: ; CHECK-NEXT: uqsub z0.s, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqsub.u.nxv4i32( %pg, %a, %b) ret %out } define @uqsub_i64_u( %pg, %a, %b) { ; CHECK-LABEL: uqsub_i64_u: ; CHECK: // %bb.0: ; CHECK-NEXT: uqsub z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uqsub.u.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.u.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.u.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.u.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.u.nxv2i64( %pg, %a, %b) ret %out } ; ; URSHL (swapped operands) ; define @urshl_i8_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: urshl_i8_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: urshlr z0.b, p0/m, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.urshl.u.nxv16i8( %pg, %b, %a) ret %out } define @urshl_i16_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: urshl_i16_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: urshlr z0.h, p0/m, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.urshl.u.nxv8i16( %pg, %b, %a) ret %out } define @urshl_i32_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: urshl_i32_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: urshlr z0.s, p0/m, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.urshl.u.nxv4i32( %pg, %b, %a) ret %out } define @urshl_i64_swapped_operands( %pg, %a, %b) { ; CHECK-LABEL: urshl_i64_swapped_operands: ; CHECK: // %bb.0: ; CHECK-NEXT: urshlr z0.d, p0/m, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.urshl.u.nxv2i64( %pg, %b, %a) ret %out } ; ; URSHL (movprfx) ; define @urshl_i8_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: urshl_i8_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: urshl z0.b, p0/m, z0.b, z2.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.urshl.u.nxv16i8( %pg, %a, %b) ret %out } define @urshl_i16_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: urshl_i16_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: urshl z0.h, p0/m, z0.h, z2.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.urshl.u.nxv8i16( %pg, %a, %b) ret %out } define @urshl_i32_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: urshl_i32_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: urshl z0.s, p0/m, z0.s, z2.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.urshl.u.nxv4i32( %pg, %a, %b) ret %out } define @urshl_i64_movprfx( %pg, %unused, %a, %b) { ; CHECK-LABEL: urshl_i64_movprfx: ; CHECK: // %bb.0: ; CHECK-NEXT: movprfx z0, z1 ; CHECK-NEXT: urshl z0.d, p0/m, z0.d, z2.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.urshl.u.nxv2i64( %pg, %a, %b) ret %out }