diff --git a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td index a15e89be1a24b..574432869471a 100644 --- a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td @@ -4282,8 +4282,8 @@ let Predicates = [HasSVE2p2orSME2p2] in { defm BFCVT_ZPzZ_StoH : sve_fp_z2op_p_zd_bfcvt<"bfcvt", int_aarch64_sve_fcvt_bf16f32_v2>; // Floating-point convert to integer, zeroing predicate - defm FCVTZS_ZPzZ : sve_fp_z2op_p_zd_d<0b0, "fcvtzs">; - defm FCVTZU_ZPzZ : sve_fp_z2op_p_zd_d<0b1, "fcvtzu">; + defm FCVTZS_ZPzZ : sve_fp_z2op_p_zd_d<0b0, "fcvtzs", "int_aarch64_sve_fcvtzs", AArch64fcvtzs_mt>; + defm FCVTZU_ZPzZ : sve_fp_z2op_p_zd_d<0b1, "fcvtzu", "int_aarch64_sve_fcvtzu", AArch64fcvtzu_mt>; // Integer convert to floating-point, zeroing predicate defm SCVTF_ZPzZ : sve_fp_z2op_p_zd_c<0b0, "scvtf">; defm UCVTF_ZPzZ : sve_fp_z2op_p_zd_c<0b1, "ucvtf">; diff --git a/llvm/lib/Target/AArch64/SVEInstrFormats.td b/llvm/lib/Target/AArch64/SVEInstrFormats.td index 828a048eaf6fb..e9595ff89ddb8 100644 --- a/llvm/lib/Target/AArch64/SVEInstrFormats.td +++ b/llvm/lib/Target/AArch64/SVEInstrFormats.td @@ -3293,7 +3293,7 @@ multiclass sve_fp_z2op_p_zd_bfcvt { def : SVE_3_Op_UndefZero_Pat(NAME)>; } -multiclass sve_fp_z2op_p_zd_d { +multiclass sve_fp_z2op_p_zd_d { def _HtoH : sve_fp_z2op_p_zd<{ 0b011101, U }, asm, ZPR16, ZPR16>; def _HtoS : sve_fp_z2op_p_zd<{ 0b011110, U }, asm, ZPR16, ZPR32>; def _HtoD : sve_fp_z2op_p_zd<{ 0b011111, U }, asm, ZPR16, ZPR64>; @@ -3301,6 +3301,15 @@ multiclass sve_fp_z2op_p_zd_d { def _StoD : sve_fp_z2op_p_zd<{ 0b111110, U }, asm, ZPR32, ZPR64>; def _DtoS : sve_fp_z2op_p_zd<{ 0b111100, U }, asm, ZPR64, ZPR32>; def _DtoD : sve_fp_z2op_p_zd<{ 0b111111, U }, asm, ZPR64, ZPR64>; + + def : SVE_3_Op_UndefZero_Pat(int_op # _i32f64), nxv4i32, nxv2i1, nxv2f64, !cast(NAME # _DtoS)>; + def : SVE_3_Op_UndefZero_Pat(int_op # _i64f32), nxv2i64, nxv2i1, nxv4f32, !cast(NAME # _StoD)>; + def : SVE_3_Op_UndefZero_Pat(int_op # _i32f16), nxv4i32, nxv4i1, nxv8f16, !cast(NAME # _HtoS)>; + def : SVE_3_Op_UndefZero_Pat(int_op # _i64f16), nxv2i64, nxv2i1, nxv8f16, !cast(NAME # _HtoD)>; + + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _HtoH)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _StoS)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _DtoD)>; } multiclass sve_fp_z2op_p_zd_c { diff --git a/llvm/test/CodeGen/AArch64/zeroing-forms-fcvtzsu.ll b/llvm/test/CodeGen/AArch64/zeroing-forms-fcvtzsu.ll new file mode 100644 index 0000000000000..b8b36d390330a --- /dev/null +++ b/llvm/test/CodeGen/AArch64/zeroing-forms-fcvtzsu.ll @@ -0,0 +1,659 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc -mattr=+sve < %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_fcvtzs_s32_f64_x_1( %pg, %x) { +; CHECK-LABEL: test_fcvtzs_s32_f64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzs_s32_f64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.s, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.i32f64( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzs_s32_f64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzs_s32_f64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzs z0.s, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzs_s32_f64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.s, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.i32f64( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzs_s32_f64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzs_s32_f64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: fcvtzs z0.s, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzs_s32_f64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.s, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.i32f64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_fcvtzs_s64_f32_x_1( %pg, %x) { +; CHECK-LABEL: test_fcvtzs_s64_f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzs_s64_f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.d, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.i64f32( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzs_s64_f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzs_s64_f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzs z0.d, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzs_s64_f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.d, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.i64f32( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzs_s64_f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzs_s64_f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: fcvtzs z0.d, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzs_s64_f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.d, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.i64f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_fcvtzs_s32_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_fcvtzs_s32_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzs_s32_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.s, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.i32f16( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzs_s32_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzs_s32_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzs z0.s, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzs_s32_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.s, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.i32f16( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzs_s32_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzs_s32_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: fcvtzs z0.s, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzs_s32_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.s, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.i32f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_fcvtzs_s64_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_fcvtzs_s64_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzs_s64_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.d, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.i64f16( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzs_s64_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzs_s64_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzs z0.d, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzs_s64_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.d, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.i64f16( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzs_s64_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzs_s64_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: fcvtzs z0.d, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzs_s64_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.d, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.i64f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_fcvtzu_u32_f64_x_1( %pg, %x) { +; CHECK-LABEL: test_fcvtzu_u32_f64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzu z0.s, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzu_u32_f64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.s, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.i32f64( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzu_u32_f64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzu_u32_f64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzu z0.s, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzu_u32_f64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.s, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.i32f64( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzu_u32_f64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzu_u32_f64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: fcvtzu z0.s, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzu_u32_f64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.s, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.i32f64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_fcvtzu_u64_f32_x_1( %pg, %x) { +; CHECK-LABEL: test_fcvtzu_u64_f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzu_u64_f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.d, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.i64f32( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzu_u64_f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzu_u64_f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzu z0.d, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzu_u64_f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.d, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.i64f32( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzu_u64_f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzu_u64_f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: fcvtzu z0.d, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzu_u64_f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.d, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.i64f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_fcvtzu_u32_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_fcvtzu_u32_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzu z0.s, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzu_u32_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.s, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.i32f16( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzu_u32_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzu_u32_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzu z0.s, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzu_u32_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.s, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.i32f16( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzu_u32_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzu_u32_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: fcvtzu z0.s, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzu_u32_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.s, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.i32f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_fcvtzu_u64_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_fcvtzu_u64_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzu_u64_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.d, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.i64f16( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzu_u64_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzu_u64_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzu z0.d, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzu_u64_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.d, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.i64f16( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzu_u64_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzu_u64_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: fcvtzu z0.d, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzu_u64_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.d, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.i64f16( zeroinitializer, %pg, %x) + ret %0 +} + + +define @test_svcvt_s16_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svcvt_s16_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzs z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_s16_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.nxv8i16.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svcvt_s16_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcvt_s16_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: fcvtzs z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_s16_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.nxv8i16.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svcvt_s16_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcvt_s16_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: fcvtzs z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_s16_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.nxv8i16.nxv8f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svcvt_u16_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svcvt_u16_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzu z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_u16_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.nxv8i16.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svcvt_u16_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcvt_u16_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: fcvtzu z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_u16_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.nxv8i16.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svcvt_u16_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcvt_u16_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: fcvtzu z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_u16_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.nxv8i16.nxv8f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svcvt_s32_f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svcvt_s32_f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_s32_f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.nxv4i32.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svcvt_s32_f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcvt_s32_f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: fcvtzs z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_s32_f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.nxv4i32.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svcvt_s32_f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcvt_s32_f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: fcvtzs z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_s32_f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.nxv4i32.nxv4f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svcvt_u32_f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svcvt_u32_f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzu z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_u32_f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.nxv4i32.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svcvt_u32_f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcvt_u32_f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: fcvtzu z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_u32_f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.nxv4i32.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svcvt_u32_f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcvt_u32_f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: fcvtzu z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_u32_f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.nxv4i32.nxv4f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svcvt_s64_f64_x_1( %pg, %x) { +; CHECK-LABEL: test_svcvt_s64_f64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_s64_f64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.nxv2i64.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svcvt_s64_f64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcvt_s64_f64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: fcvtzs z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_s64_f64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.nxv2i64.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svcvt_s64_f64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcvt_s64_f64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: fcvtzs z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_s64_f64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.nxv2i64.nxv2f64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svcvt_u64_f64_x_1( %pg, %x) { +; CHECK-LABEL: test_svcvt_u64_f64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_u64_f64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.nxv2i64.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svcvt_u64_f64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcvt_u64_f64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: fcvtzu z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_u64_f64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.nxv2i64.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svcvt_u64_f64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcvt_u64_f64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: fcvtzu z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_u64_f64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.nxv2i64.nxv2f64( zeroinitializer, %pg, %x) + ret %0 +}