diff --git a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td index 7dd6d49bf2022..c805acd56fff5 100644 --- a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td @@ -4283,10 +4283,10 @@ let Predicates = [HasSVE2p2orSME2p2] in { defm FLOGB_ZPzZ : sve_fp_z2op_p_zd_d_flogb<"flogb">; // SVE2 integer unary operations, zeroing predicate - def URECPE_ZPzZ : sve2_int_un_pred_arit_z<0b10, 0b00, "urecpe", ZPR32>; - def URSQRTE_ZPzZ : sve2_int_un_pred_arit_z<0b10, 0b01, "ursqrte", ZPR32>; - defm SQABS_ZPzZ : sve2_int_un_pred_arit_z<0b10, "sqabs">; - defm SQNEG_ZPzZ : sve2_int_un_pred_arit_z<0b11, "sqneg">; + defm URECPE_ZPzZ : sve2_int_un_pred_arit_z_S<0b00, "urecpe", int_aarch64_sve_urecpe>; + defm URSQRTE_ZPzZ : sve2_int_un_pred_arit_z_S<0b01, "ursqrte", int_aarch64_sve_ursqrte>; + defm SQABS_ZPzZ : sve2_int_un_pred_arit_z< 0b10, "sqabs", int_aarch64_sve_sqabs>; + defm SQNEG_ZPzZ : sve2_int_un_pred_arit_z< 0b11, "sqneg", int_aarch64_sve_sqneg>; // Floating point round to integral fp value in integer size range // Merging diff --git a/llvm/lib/Target/AArch64/SVEInstrFormats.td b/llvm/lib/Target/AArch64/SVEInstrFormats.td index 0ef862fc1a27c..7198e151e0eab 100644 --- a/llvm/lib/Target/AArch64/SVEInstrFormats.td +++ b/llvm/lib/Target/AArch64/SVEInstrFormats.td @@ -4180,11 +4180,22 @@ multiclass sve2_int_un_pred_arit opc, string asm, SDPatternOperator op> defm : SVE_3_Op_Undef_Pat(NAME # _D_UNDEF)>; } -multiclass sve2_int_un_pred_arit_z opc, string asm> { +multiclass sve2_int_un_pred_arit_z_S opc, string asm, SDPatternOperator op> { + def _S : sve2_int_un_pred_arit_z<0b10, opc, asm, ZPR32>; + + defm : SVE_3_Op_UndefZero_Pat(NAME # _S)>; +} + +multiclass sve2_int_un_pred_arit_z opc, string asm, SDPatternOperator op> { def _B : sve2_int_un_pred_arit_z<0b00, opc, asm, ZPR8>; def _H : sve2_int_un_pred_arit_z<0b01, opc, asm, ZPR16>; def _S : sve2_int_un_pred_arit_z<0b10, opc, asm, ZPR32>; def _D : sve2_int_un_pred_arit_z<0b11, opc, asm, ZPR64>; + + defm : SVE_3_Op_UndefZero_Pat(NAME # _B)>; + defm : SVE_3_Op_UndefZero_Pat(NAME # _H)>; + defm : SVE_3_Op_UndefZero_Pat(NAME # _S)>; + defm : SVE_3_Op_UndefZero_Pat(NAME # _D)>; } //===----------------------------------------------------------------------===// diff --git a/llvm/test/CodeGen/AArch64/zeroing-forms-urecpe-ursqrte-sqabs-sqneg.ll b/llvm/test/CodeGen/AArch64/zeroing-forms-urecpe-ursqrte-sqabs-sqneg.ll new file mode 100644 index 0000000000000..787ac4458079c --- /dev/null +++ b/llvm/test/CodeGen/AArch64/zeroing-forms-urecpe-ursqrte-sqabs-sqneg.ll @@ -0,0 +1,858 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc -mattr=+sve2 < %s | FileCheck %s +; RUN: llc -mattr=+sve2p2 < %s | FileCheck %s -check-prefix CHECK-2p2 + +; RUN: llc -mattr=+sme --force-streaming < %s | FileCheck %s +; RUN: llc -mattr=+sme2p2 --force-streaming < %s | FileCheck %s -check-prefix CHECK-2p2 + +target triple = "aarch64-linux" + +define @test_svrecpe_x_1( %pg, %x) { +; CHECK-LABEL: test_svrecpe_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: urecpe z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrecpe_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: urecpe z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.urecpe.nxv4i32( poison, %pg, %x) + ret %0 +} + +define @test_svrecpe_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrecpe_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: urecpe z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrecpe_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: urecpe z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.urecpe.nxv4i32( poison, %pg, %x) + ret %0 +} + +define @test_svrecpe_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrecpe_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: urecpe z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrecpe_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: urecpe z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.urecpe.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrsqrte_x_1( %pg, %x) { +; CHECK-LABEL: test_svrsqrte_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ursqrte z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrsqrte_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ursqrte z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.ursqrte.nxv4i32( poison, %pg, %x) + ret %0 +} + +define @test_svrsqrte_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrsqrte_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: ursqrte z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrsqrte_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ursqrte z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.ursqrte.nxv4i32( poison, %pg, %x) + ret %0 +} + +define @test_svrsqrte_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrsqrte_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: ursqrte z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrsqrte_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ursqrte z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.ursqrte.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svqabs_s8_x_1( %pg, %x) { +; CHECK-LABEL: test_svqabs_s8_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: sqabs z0.b, p0/m, z0.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqabs_s8_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqabs z0.b, p0/z, z0.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqabs.nxv16i8( poison, %pg, %x) + ret %0 +} + +define @test_svqabs_s8_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqabs_s8_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: sqabs z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqabs_s8_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqabs z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqabs.nxv16i8( poison, %pg, %x) + ret %0 +} + +define @test_svqabs_s8_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqabs_s8_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.b, #0 // =0x0 +; CHECK-NEXT: sqabs z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqabs_s8_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqabs z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqabs.nxv16i8( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svqabs_s16_x_1( %pg, %x) { +; CHECK-LABEL: test_svqabs_s16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: sqabs z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqabs_s16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqabs z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqabs.nxv8i16( poison, %pg, %x) + ret %0 +} + +define @test_svqabs_s16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqabs_s16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: sqabs z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqabs_s16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqabs z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqabs.nxv8i16( poison, %pg, %x) + ret %0 +} + +define @test_svqabs_s16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqabs_s16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: sqabs z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqabs_s16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqabs z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqabs.nxv8i16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svqabs_s32_x_1( %pg, %x) { +; CHECK-LABEL: test_svqabs_s32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: sqabs z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqabs_s32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqabs z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqabs.nxv4i32( poison, %pg, %x) + ret %0 +} + +define @test_svqabs_s32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqabs_s32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: sqabs z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqabs_s32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqabs z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqabs.nxv4i32( poison, %pg, %x) + ret %0 +} + +define @test_svqabs_s32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqabs_s32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: sqabs z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqabs_s32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqabs z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqabs.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svqabs_s64_x_1( %pg, %x) { +; CHECK-LABEL: test_svqabs_s64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: sqabs z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqabs_s64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqabs z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqabs.nxv2i64( poison, %pg, %x) + ret %0 +} + +define @test_svqabs_s64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqabs_s64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: sqabs z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqabs_s64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqabs z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqabs.nxv2i64( poison, %pg, %x) + ret %0 +} + +define @test_svqabs_s64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqabs_s64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: sqabs z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqabs_s64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqabs z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqabs.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svqneg_s8_x_1( %pg, %x) { +; CHECK-LABEL: test_svqneg_s8_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: sqneg z0.b, p0/m, z0.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqneg_s8_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqneg z0.b, p0/z, z0.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqneg.nxv16i8( poison, %pg, %x) + ret %0 +} + +define @test_svqneg_s8_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqneg_s8_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: sqneg z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqneg_s8_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqneg z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqneg.nxv16i8( poison, %pg, %x) + ret %0 +} + +define @test_svqneg_s8_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqneg_s8_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.b, #0 // =0x0 +; CHECK-NEXT: sqneg z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqneg_s8_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqneg z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqneg.nxv16i8( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svqneg_s16_x_1( %pg, %x) { +; CHECK-LABEL: test_svqneg_s16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: sqneg z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqneg_s16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqneg z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqneg.nxv8i16( poison, %pg, %x) + ret %0 +} + +define @test_svqneg_s16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqneg_s16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: sqneg z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqneg_s16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqneg z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqneg.nxv8i16( poison, %pg, %x) + ret %0 +} + +define @test_svqneg_s16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqneg_s16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: sqneg z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqneg_s16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqneg z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqneg.nxv8i16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svqneg_s32_x_1( %pg, %x) { +; CHECK-LABEL: test_svqneg_s32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: sqneg z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqneg_s32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqneg z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqneg.nxv4i32( poison, %pg, %x) + ret %0 +} + +define @test_svqneg_s32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqneg_s32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: sqneg z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqneg_s32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqneg z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqneg.nxv4i32( poison, %pg, %x) + ret %0 +} + +define @test_svqneg_s32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqneg_s32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: sqneg z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqneg_s32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqneg z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqneg.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svqneg_s64_x_1( %pg, %x) { +; CHECK-LABEL: test_svqneg_s64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: sqneg z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqneg_s64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqneg z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqneg.nxv2i64( poison, %pg, %x) + ret %0 +} + +define @test_svqneg_s64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqneg_s64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: sqneg z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqneg_s64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqneg z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqneg.nxv2i64( poison, %pg, %x) + ret %0 +} + +define @test_svqneg_s64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqneg_s64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: sqneg z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqneg_s64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqneg z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqneg.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svurecpe_nxv4i32_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svurecpe_nxv4i32_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: urecpe z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svurecpe_nxv4i32_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.s +; CHECK-2p2-NEXT: urecpe z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv4i1(i32 31) + %0 = tail call @llvm.aarch64.sve.urecpe.nxv4i32( poison, %pg, %x) + ret %0 +} + +define @test_svurecpe_nxv4i32_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svurecpe_nxv4i32_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: movprfx z0, z2 +; CHECK-NEXT: urecpe z0.s, p0/m, z2.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svurecpe_nxv4i32_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.s +; CHECK-2p2-NEXT: urecpe z0.s, p0/z, z2.s +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv4i1(i32 31) + %0 = tail call @llvm.aarch64.sve.urecpe.nxv4i32( %x, %pg, %y) + ret %0 +} + +define @test_svursqrte_nxv4i32_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svursqrte_nxv4i32_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: ursqrte z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svursqrte_nxv4i32_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.s +; CHECK-2p2-NEXT: ursqrte z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv4i1(i32 31) + %0 = tail call @llvm.aarch64.sve.ursqrte.nxv4i32( poison, %pg, %x) + ret %0 +} + +define @test_svursqrte_nxv4i32_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svursqrte_nxv4i32_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: movprfx z0, z2 +; CHECK-NEXT: ursqrte z0.s, p0/m, z2.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svursqrte_nxv4i32_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.s +; CHECK-2p2-NEXT: ursqrte z0.s, p0/z, z2.s +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv4i1(i32 31) + %0 = tail call @llvm.aarch64.sve.ursqrte.nxv4i32( %x, %pg, %y) + ret %0 +} + +define @test_svsqabs_nxv16i8_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svsqabs_nxv16i8_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.b +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: sqabs z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqabs_nxv16i8_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.b +; CHECK-2p2-NEXT: sqabs z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv16i1(i32 31) + %0 = tail call @llvm.aarch64.sve.sqabs.nxv16i8( poison, %pg, %x) + ret %0 +} + +define @test_svsqabs_nxv16i8_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svsqabs_nxv16i8_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.b +; CHECK-NEXT: movprfx z0, z2 +; CHECK-NEXT: sqabs z0.b, p0/m, z2.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqabs_nxv16i8_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.b +; CHECK-2p2-NEXT: sqabs z0.b, p0/z, z2.b +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv16i1(i32 31) + %0 = tail call @llvm.aarch64.sve.sqabs.nxv16i8( %x, %pg, %y) + ret %0 +} + +define @test_svsqabs_nxv8i16_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svsqabs_nxv8i16_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.h +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: sqabs z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqabs_nxv8i16_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.h +; CHECK-2p2-NEXT: sqabs z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv8i1(i32 31) + %0 = tail call @llvm.aarch64.sve.sqabs.nxv8i16( poison, %pg, %x) + ret %0 +} + +define @test_svsqabs_nxv8i16_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svsqabs_nxv8i16_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.h +; CHECK-NEXT: movprfx z0, z2 +; CHECK-NEXT: sqabs z0.h, p0/m, z2.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqabs_nxv8i16_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.h +; CHECK-2p2-NEXT: sqabs z0.h, p0/z, z2.h +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv8i1(i32 31) + %0 = tail call @llvm.aarch64.sve.sqabs.nxv8i16( %x, %pg, %y) + ret %0 +} + +define @test_svsqabs_nxv4i32_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svsqabs_nxv4i32_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: sqabs z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqabs_nxv4i32_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.s +; CHECK-2p2-NEXT: sqabs z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv4i1(i32 31) + %0 = tail call @llvm.aarch64.sve.sqabs.nxv4i32( poison, %pg, %x) + ret %0 +} + +define @test_svsqabs_nxv4i32_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svsqabs_nxv4i32_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: movprfx z0, z2 +; CHECK-NEXT: sqabs z0.s, p0/m, z2.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqabs_nxv4i32_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.s +; CHECK-2p2-NEXT: sqabs z0.s, p0/z, z2.s +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv4i1(i32 31) + %0 = tail call @llvm.aarch64.sve.sqabs.nxv4i32( %x, %pg, %y) + ret %0 +} + +define @test_svsqabs_nxv2i64_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svsqabs_nxv2i64_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: sqabs z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqabs_nxv2i64_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.d +; CHECK-2p2-NEXT: sqabs z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv2i1(i32 31) + %0 = tail call @llvm.aarch64.sve.sqabs.nxv2i64( poison, %pg, %x) + ret %0 +} + +define @test_svsqabs_nxv2i64_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svsqabs_nxv2i64_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: movprfx z0, z2 +; CHECK-NEXT: sqabs z0.d, p0/m, z2.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqabs_nxv2i64_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.d +; CHECK-2p2-NEXT: sqabs z0.d, p0/z, z2.d +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv2i1(i32 31) + %0 = tail call @llvm.aarch64.sve.sqabs.nxv2i64( %x, %pg, %y) + ret %0 +} + +define @test_svsqneg_nxv16i8_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svsqneg_nxv16i8_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.b +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: sqneg z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqneg_nxv16i8_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.b +; CHECK-2p2-NEXT: sqneg z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv16i1(i32 31) + %0 = tail call @llvm.aarch64.sve.sqneg.nxv16i8( poison, %pg, %x) + ret %0 +} + +define @test_svsqneg_nxv16i8_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svsqneg_nxv16i8_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.b +; CHECK-NEXT: movprfx z0, z2 +; CHECK-NEXT: sqneg z0.b, p0/m, z2.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqneg_nxv16i8_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.b +; CHECK-2p2-NEXT: sqneg z0.b, p0/z, z2.b +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv16i1(i32 31) + %0 = tail call @llvm.aarch64.sve.sqneg.nxv16i8( %x, %pg, %y) + ret %0 +} + +define @test_svsqneg_nxv8i16_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svsqneg_nxv8i16_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.h +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: sqneg z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqneg_nxv8i16_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.h +; CHECK-2p2-NEXT: sqneg z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv8i1(i32 31) + %0 = tail call @llvm.aarch64.sve.sqneg.nxv8i16( poison, %pg, %x) + ret %0 +} + +define @test_svsqneg_nxv8i16_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svsqneg_nxv8i16_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.h +; CHECK-NEXT: movprfx z0, z2 +; CHECK-NEXT: sqneg z0.h, p0/m, z2.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqneg_nxv8i16_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.h +; CHECK-2p2-NEXT: sqneg z0.h, p0/z, z2.h +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv8i1(i32 31) + %0 = tail call @llvm.aarch64.sve.sqneg.nxv8i16( %x, %pg, %y) + ret %0 +} + +define @test_svsqneg_nxv4i32_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svsqneg_nxv4i32_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: sqneg z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqneg_nxv4i32_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.s +; CHECK-2p2-NEXT: sqneg z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv4i1(i32 31) + %0 = tail call @llvm.aarch64.sve.sqneg.nxv4i32( poison, %pg, %x) + ret %0 +} + +define @test_svsqneg_nxv4i32_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svsqneg_nxv4i32_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: movprfx z0, z2 +; CHECK-NEXT: sqneg z0.s, p0/m, z2.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqneg_nxv4i32_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.s +; CHECK-2p2-NEXT: sqneg z0.s, p0/z, z2.s +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv4i1(i32 31) + %0 = tail call @llvm.aarch64.sve.sqneg.nxv4i32( %x, %pg, %y) + ret %0 +} + +define @test_svsqneg_nxv2i64_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svsqneg_nxv2i64_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: sqneg z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqneg_nxv2i64_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.d +; CHECK-2p2-NEXT: sqneg z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv2i1(i32 31) + %0 = tail call @llvm.aarch64.sve.sqneg.nxv2i64( poison, %pg, %x) + ret %0 +} + +define @test_svsqneg_nxv2i64_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svsqneg_nxv2i64_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: movprfx z0, z2 +; CHECK-NEXT: sqneg z0.d, p0/m, z2.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqneg_nxv2i64_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.d +; CHECK-2p2-NEXT: sqneg z0.d, p0/z, z2.d +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv2i1(i32 31) + %0 = tail call @llvm.aarch64.sve.sqneg.nxv2i64( %x, %pg, %y) + ret %0 +}