@@ -12146,11 +12146,15 @@ static bool evalShuffleGeneric(
1214612146 if (SrcIdx < 0) {
1214712147 // Zero out this element
1214812148 QualType ElemTy = VT->getElementType();
12149- if (ElemTy->isFloatingType ()) {
12149+ if (ElemTy->isRealFloatingType ()) {
1215012150 ResultElements.push_back(
1215112151 APValue(APFloat::getZero(Info.Ctx.getFloatTypeSemantics(ElemTy))));
12152+ } else if (ElemTy->isIntegerType()) {
12153+ APValue Zero(Info.Ctx.MakeIntValue(0, ElemTy));
12154+ ResultElements.push_back(APValue(Zero));
1215212155 } else {
12153- ResultElements.push_back(APValue(Info.Ctx.MakeIntValue(0, ElemTy)));
12156+ // Other types of fallback logic
12157+ ResultElements.push_back(APValue());
1215412158 }
1215512159 } else {
1215612160 const APValue &Src = (SrcVecIdx == 0) ? A : B;
@@ -12929,16 +12933,16 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {
1292912933 APValue R;
1293012934 if (!evalShuffleGeneric(
1293112935 Info, E, R,
12932- [](unsigned DstIdx, unsigned ShuffleMask) -> std::pair<unsigned, int> {
12936+ [](unsigned DstIdx,
12937+ unsigned ShuffleMask) -> std::pair<unsigned, int> {
1293312938 uint8_t Ctlb = static_cast<uint8_t>(ShuffleMask);
12934- if (Ctlb & 0x80) {
12939+ if (Ctlb & 0x80)
1293512940 return std::make_pair(0, -1);
12936- } else {
12937- unsigned LaneBase = (DstIdx / 16) * 16;
12938- unsigned SrcOffset = Ctlb & 0x0F;
12939- unsigned SrcIdx = LaneBase + SrcOffset;
12940- return std::make_pair(0, static_cast<int>(SrcIdx));
12941- }
12941+
12942+ unsigned LaneBase = (DstIdx / 16) * 16;
12943+ unsigned SrcOffset = Ctlb & 0x0F;
12944+ unsigned SrcIdx = LaneBase + SrcOffset;
12945+ return std::make_pair(0, static_cast<int>(SrcIdx));
1294212946 }))
1294312947 return false;
1294412948 return Success(R, E);
@@ -12961,7 +12965,7 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {
1296112965 unsigned Sel = (Mask >> (2 * LaneIdx)) & 0x3;
1296212966 return std::make_pair(0, static_cast<int>(LaneBase + Sel));
1296312967 }
12964- return std::make_pair(0, static_cast<int>(DstIdx));
12968+ return std::make_pair(0, static_cast<int>(DstIdx));
1296512969 }))
1296612970 return false;
1296712971 return Success(R, E);
@@ -12983,9 +12987,10 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {
1298312987 if (LaneIdx >= HalfSize) {
1298412988 unsigned Rel = LaneIdx - HalfSize;
1298512989 unsigned Sel = (Mask >> (2 * Rel)) & 0x3;
12986- return std::make_pair(0, static_cast<int>(LaneBase + HalfSize + Sel));
12990+ return std::make_pair(
12991+ 0, static_cast<int>(LaneBase + HalfSize + Sel));
1298712992 }
12988- return std::make_pair(0, static_cast<int>(DstIdx));
12993+ return std::make_pair(0, static_cast<int>(DstIdx));
1298912994 }))
1299012995 return false;
1299112996 return Success(R, E);
@@ -13491,14 +13496,15 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {
1349113496 [](unsigned DstIdx, unsigned Shift) -> std::pair<unsigned, int> {
1349213497 unsigned LaneBase = (DstIdx / 16) * 16;
1349313498 unsigned LaneIdx = DstIdx % 16;
13494- if (LaneIdx < Shift) {
13499+ if (LaneIdx < Shift)
1349513500 return std::make_pair(0, -1);
13496- }
13497- return std::make_pair(0, static_cast<int>(LaneBase + LaneIdx - Shift));
13501+
13502+ return std::make_pair(
13503+ 0, static_cast<int>(LaneBase + LaneIdx - Shift));
1349813504 }))
1349913505 return false;
1350013506 return Success(R, E);
13501- }
13507+ }
1350213508
1350313509 case X86::BI__builtin_ia32_psrldqi128_byteshift:
1350413510 case X86::BI__builtin_ia32_psrldqi256_byteshift:
@@ -13509,14 +13515,15 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {
1350913515 [](unsigned DstIdx, unsigned Shift) -> std::pair<unsigned, int> {
1351013516 unsigned LaneBase = (DstIdx / 16) * 16;
1351113517 unsigned LaneIdx = DstIdx % 16;
13512- if (LaneIdx + Shift < 16) {
13513- return std::make_pair(0, static_cast<int>(LaneBase + LaneIdx + Shift));
13514- }
13515- return std::make_pair(0, -1);
13518+ if (LaneIdx + Shift < 16)
13519+ return std::make_pair(
13520+ 0, static_cast<int>(LaneBase + LaneIdx + Shift));
13521+
13522+ return std::make_pair(0, -1);
1351613523 }))
1351713524 return false;
1351813525 return Success(R, E);
13519- }
13526+ }
1352013527 case X86::BI__builtin_ia32_vpermi2varq128:
1352113528 case X86::BI__builtin_ia32_vpermi2varpd128: {
1352213529 APValue R;
0 commit comments