diff --git a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp --- a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp @@ -466,6 +466,21 @@ { ISD::FP_TO_UINT, MVT::v2i32, MVT::v2f64, 2 }, { ISD::FP_TO_UINT, MVT::v2i16, MVT::v2f64, 2 }, { ISD::FP_TO_UINT, MVT::v2i8, MVT::v2f64, 2 }, + + // Truncate from nxvmf32 to nxvmf16 + { ISD::FP_ROUND, MVT::nxv2f16, MVT::nxv2f32, 1 }, + { ISD::FP_ROUND, MVT::nxv4f16, MVT::nxv4f32, 1 }, + { ISD::FP_ROUND, MVT::nxv8f16, MVT::nxv8f32, 1 }, + + // Truncate from nxvmf64 to nxvmf16 + { ISD::FP_ROUND, MVT::nxv2f16, MVT::nxv2f64, 1 }, + { ISD::FP_ROUND, MVT::nxv4f16, MVT::nxv4f64, 1 }, + { ISD::FP_ROUND, MVT::nxv8f16, MVT::nxv8f64, 1 }, + + // Truncate from nxvmf64 to nxvmf32 + { ISD::FP_ROUND, MVT::nxv2f32, MVT::nxv2f64, 1 }, + { ISD::FP_ROUND, MVT::nxv4f32, MVT::nxv4f64, 1 }, + { ISD::FP_ROUND, MVT::nxv8f32, MVT::nxv8f64, 1 }, }; if (const auto *Entry = ConvertCostTableLookup(ConversionTbl, ISD, diff --git a/llvm/test/Analysis/CostModel/AArch64/sve-fptrunc.ll b/llvm/test/Analysis/CostModel/AArch64/sve-fptrunc.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Analysis/CostModel/AArch64/sve-fptrunc.ll @@ -0,0 +1,30 @@ +; RUN: opt -cost-model -analyze -mtriple aarch64-linux-gnu -mattr=+sve -S -o - < %s 2>&1| FileCheck %s + +target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" +target triple = "aarch64-unknown-linux-gnu" + +define void @sve_fptruncs() { + ; CHECK-LABEL: 'sve_fptruncs' + ; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %nxv2_f16_from_f32 = fptrunc undef to + ; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %nxv4_f16_from_f32 = fptrunc undef to + ; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %nxv8_f16_from_f32 = fptrunc undef to + ; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %nxv2_f16_from_f64 = fptrunc undef to + ; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %nxv4_f16_from_f64 = fptrunc undef to + ; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %nxv8_f16_from_f64 = fptrunc undef to + ; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %nxv2_f32_from_f64 = fptrunc undef to + ; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %nxv4_f32_from_f64 = fptrunc undef to + ; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %nxv8_f32_from_f64 = fptrunc undef to + %nxv2_f16_from_f32 = fptrunc undef to + %nxv4_f16_from_f32 = fptrunc undef to + %nxv8_f16_from_f32 = fptrunc undef to + + %nxv2_f16_from_f64 = fptrunc undef to + %nxv4_f16_from_f64 = fptrunc undef to + %nxv8_f16_from_f64 = fptrunc undef to + + %nxv2_f32_from_f64 = fptrunc undef to + %nxv4_f32_from_f64 = fptrunc undef to + %nxv8_f32_from_f64 = fptrunc undef to + + ret void +}