@@ -11621,9 +11621,8 @@ static bool evalPackBuiltin(const CallExpr *E, EvalInfo &Info, APValue &Result,
1162111621
1162211622static bool evalShuffleGeneric(
1162311623 EvalInfo &Info, const CallExpr *Call, APValue &Out,
11624- llvm::function_ref<std::pair<unsigned, unsigned>(unsigned, unsigned)>
11625- GetSourceIndex,
11626- llvm::function_ref<bool(unsigned, unsigned)> ShouldZero = nullptr) {
11624+ llvm::function_ref<std::pair<unsigned, int>(unsigned, unsigned)>
11625+ GetSourceIndex) {
1162711626
1162811627 const auto *VT = Call->getType()->getAs<VectorType>();
1162911628 if (!VT)
@@ -11644,13 +11643,14 @@ static bool evalShuffleGeneric(
1164411643 ResultElements.reserve(NumElts);
1164511644
1164611645 for (unsigned DstIdx = 0; DstIdx != NumElts; ++DstIdx) {
11647- if (ShouldZero && ShouldZero(DstIdx, ShuffleMask)) {
11646+ auto [SrcVecIdx, SrcIdx] = GetSourceIndex(DstIdx, ShuffleMask);
11647+
11648+ if (SrcIdx < 0) {
1164811649 // Zero out this element
1164911650 QualType ElemTy = VT->getElementType();
1165011651 ResultElements.push_back(
1165111652 APValue(APFloat::getZero(Info.Ctx.getFloatTypeSemantics(ElemTy))));
1165211653 } else {
11653- auto [SrcVecIdx, SrcIdx] = GetSourceIndex(DstIdx, ShuffleMask);
1165411654 const APValue &Src = (SrcVecIdx == 0) ? A : B;
1165511655 ResultElements.push_back(Src.getVectorElt(SrcIdx));
1165611656 }
@@ -12446,7 +12446,7 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {
1244612446 if (!evalShuffleGeneric(
1244712447 Info, E, R,
1244812448 [](unsigned DstIdx,
12449- unsigned ShuffleMask) -> std::pair<unsigned, unsigned > {
12449+ unsigned ShuffleMask) -> std::pair<unsigned, int > {
1245012450 constexpr unsigned LaneBits = 128u;
1245112451 unsigned NumElemPerLane = LaneBits / 32;
1245212452 unsigned NumSelectableElems = NumElemPerLane / 2;
@@ -12459,7 +12459,7 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {
1245912459 unsigned BitIndex = (DstIdx * BitsPerElem) % MaskBits;
1246012460 unsigned SrcIdx = (ElemInLane < NumSelectableElems) ? 0 : 1;
1246112461 unsigned Index = (ShuffleMask >> BitIndex) & IndexMask;
12462- return {SrcIdx, LaneOffset + Index};
12462+ return {SrcIdx, static_cast<int>( LaneOffset + Index) };
1246312463 }))
1246412464 return false;
1246512465 return Success(R, E);
@@ -12471,7 +12471,7 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {
1247112471 if (!evalShuffleGeneric(
1247212472 Info, E, R,
1247312473 [](unsigned DstIdx,
12474- unsigned ShuffleMask) -> std::pair<unsigned, unsigned > {
12474+ unsigned ShuffleMask) -> std::pair<unsigned, int > {
1247512475 constexpr unsigned LaneBits = 128u;
1247612476 unsigned NumElemPerLane = LaneBits / 64;
1247712477 unsigned NumSelectableElems = NumElemPerLane / 2;
@@ -12484,7 +12484,7 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {
1248412484 unsigned BitIndex = (DstIdx * BitsPerElem) % MaskBits;
1248512485 unsigned SrcIdx = (ElemInLane < NumSelectableElems) ? 0 : 1;
1248612486 unsigned Index = (ShuffleMask >> BitIndex) & IndexMask;
12487- return {SrcIdx, LaneOffset + Index};
12487+ return {SrcIdx, static_cast<int>( LaneOffset + Index) };
1248812488 }))
1248912489 return false;
1249012490 return Success(R, E);
@@ -12493,23 +12493,22 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {
1249312493 APValue R;
1249412494 if (!evalShuffleGeneric(
1249512495 Info, E, R,
12496- [](unsigned DstIdx,
12497- unsigned Mask) -> std::pair<unsigned, unsigned> {
12496+ [](unsigned DstIdx, unsigned Mask) -> std::pair<unsigned, int> {
12497+ // Bits [3:0]: zero mask - if bit is set, zero this element
12498+ if ((Mask & (1 << DstIdx)) != 0) {
12499+ return {0, -1};
12500+ }
1249812501 // Bits [7:6]: select element from source vector Y (0-3)
1249912502 // Bits [5:4]: select destination position (0-3)
1250012503 unsigned SrcElem = (Mask >> 6) & 0x3;
1250112504 unsigned DstElem = (Mask >> 4) & 0x3;
1250212505 if (DstIdx == DstElem) {
1250312506 // Insert element from source vector (B) at this position
12504- return {1, SrcElem};
12507+ return {1, static_cast<int>( SrcElem) };
1250512508 } else {
1250612509 // Copy from destination vector (A)
12507- return {0, DstIdx};
12510+ return {0, static_cast<int>( DstIdx) };
1250812511 }
12509- },
12510- [](unsigned DstIdx, unsigned Mask) -> bool {
12511- // Bits [3:0]: zero mask
12512- return (Mask & (1 << DstIdx)) != 0;
1251312512 }))
1251412513 return false;
1251512514 return Success(R, E);
0 commit comments