diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/IR/AutoUpgrade.cpp | 54 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86IntrinsicsInfo.h | 8 |
2 files changed, 42 insertions, 20 deletions
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp index 8fbf6f424ee..ae88a285a0e 100644 --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -71,12 +71,12 @@ static bool ShouldUpgradeX86Intrinsic(Function *F, StringRef Name) { // like to use this information to remove upgrade code for some older // intrinsics. It is currently undecided how we will determine that future // point. - if (Name.startswith("sse2.paddus") || // Added in 8.0 - Name.startswith("sse2.psubus") || // Added in 8.0 - Name.startswith("avx2.paddus") || // Added in 8.0 - Name.startswith("avx2.psubus") || // Added in 8.0 - Name.startswith("avx512.mask.paddus") || // Added in 8.0 - Name.startswith("avx512.mask.psubus") || // Added in 8.0 + if (Name.startswith("sse2.paddus.") || // Added in 8.0 + Name.startswith("sse2.psubus.") || // Added in 8.0 + Name.startswith("avx2.paddus.") || // Added in 8.0 + Name.startswith("avx2.psubus.") || // Added in 8.0 + Name.startswith("avx512.mask.paddus.") || // Added in 8.0 + Name.startswith("avx512.mask.psubus.") || // Added in 8.0 Name=="ssse3.pabs.b.128" || // Added in 6.0 Name=="ssse3.pabs.w.128" || // Added in 6.0 Name=="ssse3.pabs.d.128" || // Added in 6.0 @@ -282,6 +282,14 @@ static bool ShouldUpgradeX86Intrinsic(Function *F, StringRef Name) { Name.startswith("avx512.mask.pror.") || // Added in 7.0 Name.startswith("avx512.mask.prolv.") || // Added in 7.0 Name.startswith("avx512.mask.prol.") || // Added in 7.0 + Name == "avx512.mask.padds.b.128" || // Added in 8.0 + Name == "avx512.mask.padds.b.256" || // Added in 8.0 + Name == "avx512.mask.padds.w.128" || // Added in 8.0 + Name == "avx512.mask.padds.w.256" || // Added in 8.0 + Name == "avx512.mask.psubs.b.128" || // Added in 8.0 + Name == "avx512.mask.psubs.b.256" || // Added in 8.0 + Name == "avx512.mask.psubs.w.128" || // Added in 8.0 + Name == "avx512.mask.psubs.w.256" || // Added in 8.0 Name == "sse.cvtsi2ss" || // Added in 7.0 Name == "sse.cvtsi642ss" || // Added in 7.0 Name == "sse2.cvtsi2sd" || // Added in 7.0 @@ -1404,6 +1412,28 @@ static bool upgradeAVX512MaskToSelect(StringRef Name, IRBuilder<> &Builder, IID = Intrinsic::x86_avx512_prol_q_512; else llvm_unreachable("Unexpected intrinsic"); + } else if (Name.startswith("padds.")) { + if (VecWidth == 128 && EltWidth == 8) + IID = Intrinsic::x86_sse2_padds_b; + else if (VecWidth == 256 && EltWidth == 8) + IID = Intrinsic::x86_avx2_padds_b; + else if (VecWidth == 128 && EltWidth == 16) + IID = Intrinsic::x86_sse2_padds_w; + else if (VecWidth == 256 && EltWidth == 16) + IID = Intrinsic::x86_avx2_padds_w; + else + llvm_unreachable("Unexpected intrinsic"); + } else if (Name.startswith("psubs.")) { + if (VecWidth == 128 && EltWidth == 8) + IID = Intrinsic::x86_sse2_psubs_b; + else if (VecWidth == 256 && EltWidth == 8) + IID = Intrinsic::x86_avx2_psubs_b; + else if (VecWidth == 128 && EltWidth == 16) + IID = Intrinsic::x86_sse2_psubs_w; + else if (VecWidth == 256 && EltWidth == 16) + IID = Intrinsic::x86_avx2_psubs_w; + else + llvm_unreachable("Unexpected intrinsic"); } else return false; @@ -2080,12 +2110,12 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { if (CI->getNumArgOperands() == 3) Rep = EmitX86Select(Builder, CI->getArgOperand(2), Rep, CI->getArgOperand(1)); - } else if (IsX86 && (Name.startswith("sse2.paddus") || - Name.startswith("sse2.psubus") || - Name.startswith("avx2.paddus") || - Name.startswith("avx2.psubus") || - Name.startswith("avx512.mask.paddus") || - Name.startswith("avx512.mask.psubus"))) { + } else if (IsX86 && (Name.startswith("sse2.paddus.") || + Name.startswith("sse2.psubus.") || + Name.startswith("avx2.paddus.") || + Name.startswith("avx2.psubus.") || + Name.startswith("avx512.mask.paddus.") || + Name.startswith("avx512.mask.psubus."))) { bool IsAdd = Name.contains(".paddus"); Rep = UpgradeX86AddSubSatIntrinsics(Builder, *CI, IsAdd); } else if (IsX86 && Name.startswith("avx512.mask.palignr.")) { diff --git a/llvm/lib/Target/X86/X86IntrinsicsInfo.h b/llvm/lib/Target/X86/X86IntrinsicsInfo.h index 9ac179f18d6..95f17f76298 100644 --- a/llvm/lib/Target/X86/X86IntrinsicsInfo.h +++ b/llvm/lib/Target/X86/X86IntrinsicsInfo.h @@ -673,11 +673,7 @@ static const IntrinsicData IntrinsicsWithoutChain[] = { X86ISD::FMULS_RND, 0), X86_INTRINSIC_DATA(avx512_mask_mul_ss_round, INTR_TYPE_SCALAR_MASK_RM, X86ISD::FMULS_RND, 0), - X86_INTRINSIC_DATA(avx512_mask_padds_b_128, INTR_TYPE_2OP_MASK, X86ISD::ADDS, 0), - X86_INTRINSIC_DATA(avx512_mask_padds_b_256, INTR_TYPE_2OP_MASK, X86ISD::ADDS, 0), X86_INTRINSIC_DATA(avx512_mask_padds_b_512, INTR_TYPE_2OP_MASK, X86ISD::ADDS, 0), - X86_INTRINSIC_DATA(avx512_mask_padds_w_128, INTR_TYPE_2OP_MASK, X86ISD::ADDS, 0), - X86_INTRINSIC_DATA(avx512_mask_padds_w_256, INTR_TYPE_2OP_MASK, X86ISD::ADDS, 0), X86_INTRINSIC_DATA(avx512_mask_padds_w_512, INTR_TYPE_2OP_MASK, X86ISD::ADDS, 0), X86_INTRINSIC_DATA(avx512_mask_pmov_db_128, INTR_TYPE_1OP_MASK, X86ISD::VTRUNC, 0), @@ -793,11 +789,7 @@ static const IntrinsicData IntrinsicsWithoutChain[] = { X86ISD::MULTISHIFT, 0), X86_INTRINSIC_DATA(avx512_mask_pmultishift_qb_512, INTR_TYPE_2OP_MASK, X86ISD::MULTISHIFT, 0), - X86_INTRINSIC_DATA(avx512_mask_psubs_b_128, INTR_TYPE_2OP_MASK, X86ISD::SUBS, 0), - X86_INTRINSIC_DATA(avx512_mask_psubs_b_256, INTR_TYPE_2OP_MASK, X86ISD::SUBS, 0), X86_INTRINSIC_DATA(avx512_mask_psubs_b_512, INTR_TYPE_2OP_MASK, X86ISD::SUBS, 0), - X86_INTRINSIC_DATA(avx512_mask_psubs_w_128, INTR_TYPE_2OP_MASK, X86ISD::SUBS, 0), - X86_INTRINSIC_DATA(avx512_mask_psubs_w_256, INTR_TYPE_2OP_MASK, X86ISD::SUBS, 0), X86_INTRINSIC_DATA(avx512_mask_psubs_w_512, INTR_TYPE_2OP_MASK, X86ISD::SUBS, 0), X86_INTRINSIC_DATA(avx512_mask_range_pd_128, INTR_TYPE_3OP_MASK, X86ISD::VRANGE, 0), X86_INTRINSIC_DATA(avx512_mask_range_pd_256, INTR_TYPE_3OP_MASK, X86ISD::VRANGE, 0), |