Lines Matching defs:HVC
199 AlignVectors(const HexagonVectorCombine &HVC_) : HVC(HVC_) {}
209 AddrInfo(const HexagonVectorCombine &HVC, Instruction *I, Value *A, Type *T,
212 NeedAlign(HVC.getTypeAlignment(ValTy)) {}
363 const HexagonVectorCombine &HVC;
421 HvxIdioms(const HexagonVectorCombine &HVC_) : HVC(HVC_) {
422 auto *Int32Ty = HVC.getIntTy(32);
423 HvxI32Ty = HVC.getHvxTy(Int32Ty, /*Pair=*/false);
424 HvxP32Ty = HVC.getHvxTy(Int32Ty, /*Pair=*/true);
479 const HexagonVectorCombine &HVC;
623 return AddrInfo(HVC, L, L->getPointerOperand(), L->getType(),
626 return AddrInfo(HVC, S, S->getPointerOperand(),
632 return AddrInfo(HVC, II, II->getArgOperand(0), II->getType(),
635 return AddrInfo(HVC, II, II->getArgOperand(1),
644 return HVC.HST.isTypeForHVX(AI.ValTy);
670 return HVC.getFullValue(HVC.getBoolTy(HVC.length(VecTy)));
671 return HVC.getFullValue(HVC.getBoolTy());
689 return Builder.CreatePtrAdd(Ptr, HVC.getConstInt(Adjust), "gep");
704 Value *AsInt = Builder.CreatePtrToInt(Ptr, HVC.getIntTy(), "pti");
705 Value *Mask = HVC.getConstInt(-Alignment);
715 bool HvxHasPredLoad = HVC.HST.useHVXV62Ops();
720 if (HVC.isFalse(Predicate))
722 if (!HVC.isTrue(Predicate) && HvxHasPredLoad) {
729 assert(!HVC.isUndef(Mask)); // Should this be allowed?
730 if (HVC.isZero(Mask))
732 if (HVC.isTrue(Mask))
756 assert(HVC.HST.isTypeForHVX(ValTy) &&
760 assert(HVC.getSizeOf(ValTy, HVC.Alloc) % Alignment == 0);
761 if (HVC.isFalse(Predicate))
763 if (HVC.isTrue(Predicate))
766 auto V6_vL32b_pred_ai = HVC.HST.getIntrinsicId(Hexagon::V6_vL32b_pred_ai);
768 return HVC.createHvxIntrinsic(Builder, V6_vL32b_pred_ai, ValTy,
769 {Predicate, Ptr, HVC.getConstInt(0)}, {},
776 if (HVC.isZero(Mask) || HVC.isUndef(Val) || HVC.isUndef(Mask))
781 if (HVC.isFalse(Predicate))
783 if (HVC.isTrue(Predicate))
788 if (HVC.isTrue(Mask)) {
828 assert(HVC.HST.isTypeForHVX(Val->getType()) &&
831 if (HVC.isFalse(Predicate))
833 if (HVC.isTrue(Predicate))
836 assert(HVC.getSizeOf(Val, HVC.Alloc) % Alignment == 0);
837 auto V6_vS32b_pred_ai = HVC.HST.getIntrinsicId(Hexagon::V6_vS32b_pred_ai);
839 return HVC.createHvxIntrinsic(Builder, V6_vS32b_pred_ai, nullptr,
840 {Predicate, Ptr, HVC.getConstInt(0), Val}, {},
875 if (auto D = HVC.calculatePointerDifference(AI.Addr, W.Addr))
906 traverseBlock(HVC.DT.getRootNode(), traverseBlock);
916 G.second, [&](auto &I) { return HVC.HST.isTypeForHVX(I.ValTy); });
942 if (!HVC.isSafeToMoveBeforeInBB(*Info.Inst, Base->getIterator()))
946 return HVC.isSafeToMoveBeforeInBB(*I, Base->getIterator()) &&
947 HVC.isSafeToClone(*I);
971 if (!HVC.HST.useHVXV62Ops())
1002 if (!HVC.isSafeToMoveBeforeInBB(*Info.Inst, Base->getIterator(), Move.Main))
1022 if (!HVC.HST.useHVXV62Ops())
1033 return HVC.HST.isHVXVectorType(
1085 assert(HVC.isSafeToClone(*I));
1103 Type *SecTy = HVC.getByteTy(ScLen);
1105 bool DoAlign = !HVC.isZero(AlignVal);
1110 auto *True = HVC.getFullValue(HVC.getBoolTy(ScLen));
1240 if (!HVC.isSafeToMoveBeforeInBB(*Load, BasePos))
1258 Val = HVC.vralignb(Builder, Val, NextLoad, AlignVal);
1267 Value *Accum = UndefValue::get(HVC.getByteTy(B.Seg.Size));
1288 Value *Pay = HVC.vbytes(Builder, getPayload(S->Seg.Val));
1290 HVC.insertb(Builder, Accum, Pay, S->Seg.Start, S->Seg.Size, S->Pos);
1312 Type *SecTy = HVC.getByteTy(ScLen);
1314 bool DoAlign = !HVC.isZero(AlignVal);
1337 Value *Zero = HVC.getNullValue(SecTy);
1342 Value *Mask = HVC.rescale(Builder, MakeVec(Builder, getMask(S.Seg.Val)),
1343 Pay->getType(), HVC.getByteTy());
1344 Value *PartM = HVC.insertb(Builder, Zero, HVC.vbytes(Builder, Mask),
1348 Value *PartV = HVC.insertb(Builder, Undef, HVC.vbytes(Builder, Pay),
1369 ASpanV[Index - 1].Seg.Val = HVC.vlalignb(Builder, PrevV, ThisV, AlignVal);
1370 ASpanM[Index - 1].Seg.Val = HVC.vlalignb(Builder, PrevM, ThisM, AlignVal);
1383 if (HVC.isUndef(Val) || HVC.isZero(Mask))
1395 HVC.vlsb(Builder, Mask),
1464 InstSimplifyFolder(HVC.DL));
1481 AlignVal = HVC.getConstInt(Diff);
1496 Builder.CreatePtrToInt(WithMinOffset.Addr, HVC.getIntTy(), "pti");
1505 VSpan.Blocks.emplace_back(AI.Inst, HVC.getSizeOf(AI.ValTy),
1512 int ScLen = Move.IsHvx ? HVC.HST.getVectorLength()
1545 if (!HVC.isByteVecTy(Ty))
1547 int Size = HVC.getSizeOf(Ty);
1548 if (HVC.HST.isTypeForHVX(Ty))
1549 return Size == static_cast<int>(HVC.HST.getVectorLength());
1554 LLVM_DEBUG(dbgs() << "Running HVC::AlignVectors on " << HVC.F.getName()
1603 LLVM_DEBUG(dbgs() << "After moveTogether:\n" << HVC.F);
1619 unsigned Bits = HVC.getNumSignificantBits(V, In);
1625 KnownBits Known = HVC.getKnownBits(V, In);
1725 if ((HVC.length(VecTy) * ElemWidth) % (8 * HVC.HST.getVectorLength()) != 0)
1745 InstSimplifyFolder(HVC.DL));
1768 auto *ResizeTy = VectorType::get(HVC.getIntTy(Width), VecTy);
1781 unsigned VecLen = HVC.length(ResizeTy);
1782 unsigned ChopLen = (8 * HVC.HST.getVectorLength()) / std::min(Width, 32u);
1789 ChopOp.X.Val = HVC.subvector(Builder, X, V * ChopLen, ChopLen);
1790 ChopOp.Y.Val = HVC.subvector(Builder, Y, V * ChopLen, ChopLen);
1799 Value *Cat = HVC.concat(Builder, Results);
1847 Value *RoundVal = HVC.getConstSplat(Prod32->getType(), 1 << *Op.RoundAt);
1851 Value *ShiftAmt = HVC.getConstSplat(Prod32->getType(), Op.Frac);
1862 auto WordX = HVC.splitVectorElements(Builder, Op.X.Val, /*ToWidth=*/32);
1863 auto WordY = HVC.splitVectorElements(Builder, Op.Y.Val, /*ToWidth=*/32);
1870 Value *Zero = HVC.getNullValue(WordX[0]->getType());
1873 HVC.getConstSplat(HvxWordTy, 1 << (*Op.RoundAt % 32));
1881 Constant *ShiftAmt = HVC.getConstSplat(HvxWordTy, Op.Frac % 32);
1899 return HVC.joinVectorElements(Builder, WordP, Op.ResTy);
1905 assert(X.Val->getType()->getScalarType() == HVC.getIntTy(16));
1906 assert(HVC.HST.isHVXVectorType(EVT::getEVT(X.Val->getType(), false)));
1912 auto V6_vmpyhvsrs = HVC.HST.getIntrinsicId(Hexagon::V6_vmpyhvsrs);
1913 return HVC.createHvxIntrinsic(Builder, V6_vmpyhvsrs, X.Val->getType(),
1921 assert(InpTy->getScalarType() == HVC.getIntTy(32));
1922 assert(HVC.HST.isHVXVectorType(EVT::getEVT(InpTy, false)));
1927 auto V6_vmpyewuh = HVC.HST.getIntrinsicId(Hexagon::V6_vmpyewuh);
1929 ? HVC.HST.getIntrinsicId(Hexagon::V6_vmpyowh_rnd_sacc)
1930 : HVC.HST.getIntrinsicId(Hexagon::V6_vmpyowh_sacc);
1932 HVC.createHvxIntrinsic(Builder, V6_vmpyewuh, InpTy, {X.Val, Y.Val});
1933 return HVC.createHvxIntrinsic(Builder, V6_vmpyo_acc, InpTy,
1942 if (VecTy == HvxI32Ty && HVC.HST.useHVXV62Ops()) {
1945 if (CarryIn == nullptr && HVC.HST.useHVXV66Ops()) {
1946 AddCarry = HVC.HST.getIntrinsicId(Hexagon::V6_vaddcarryo);
1948 AddCarry = HVC.HST.getIntrinsicId(Hexagon::V6_vaddcarry);
1950 CarryIn = HVC.getNullValue(HVC.getBoolTy(HVC.length(VecTy)));
1953 Value *Ret = HVC.createHvxIntrinsic(Builder, AddCarry,
1971 auto V6_vandqrt = HVC.HST.getIntrinsicId(Hexagon::V6_vandqrt);
1973 HVC.createHvxIntrinsic(Builder, V6_vandqrt, /*RetTy=*/nullptr,
1974 {CarryIn, HVC.getConstInt(Mask)});
1990 V6_vmpyh = HVC.HST.getIntrinsicId(Hexagon::V6_vmpyhv);
1993 V6_vmpyh = HVC.HST.getIntrinsicId(Hexagon::V6_vmpyhus);
1995 V6_vmpyh = HVC.HST.getIntrinsicId(Hexagon::V6_vmpyuhv);
2000 HVC.createHvxIntrinsic(Builder, V6_vmpyh, HvxP32Ty, {Y.Val, X.Val});
2002 return HVC.vshuff(Builder, HVC.sublo(Builder, P), HVC.subhi(Builder, P));
2007 Type *HvxI16Ty = HVC.getHvxTy(HVC.getIntTy(16), /*Pair=*/false);
2009 if (HVC.HST.useHVXV69Ops()) {
2011 auto V6_vmpyuhvs = HVC.HST.getIntrinsicId(Hexagon::V6_vmpyuhvs);
2012 return HVC.createHvxIntrinsic(Builder, V6_vmpyuhvs, HvxI16Ty,
2017 Type *HvxP16Ty = HVC.getHvxTy(HVC.getIntTy(16), /*Pair=*/true);
2020 unsigned Len = HVC.length(HvxP16Ty) / 2;
2027 HVC.sublo(Builder, Pair16), HVC.subhi(Builder, Pair16), PickOdd, "shf");
2046 Value *Parts = HVC.createHvxIntrinsic(Builder, V6_vmpy_parts, nullptr,
2061 if (HVC.isZero(WordX[Idx]))
2063 else if (HVC.isZero(WordY[Idx]))
2098 Value *Zero = HVC.getNullValue(WordX[0]->getType());
2133 for (BasicBlock &B : HVC.F) {
2143 RecursivelyDeleteTriviallyDeadInstructions(&*It, &HVC.TLI);
2970 HexagonVectorCombine HVC(F, AA, AC, DT, SE, TLI, TM);
2971 return HVC.run();