@@ -11339,6 +11339,31 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {
1133911339
1134011340 return Success(APValue(ResultElements.data(), ResultElements.size()), E);
1134111341 }
11342+ case Builtin::BI__builtin_elementwise_add_sat: {
11343+ APValue SourceLHS, SourceRHS;
11344+ if (!EvaluateAsRValue(Info, E->getArg(0), SourceLHS) ||
11345+ !EvaluateAsRValue(Info, E->getArg(1), SourceRHS))
11346+ return false;
11347+
11348+ QualType DestEltTy = E->getType()->castAs<VectorType>()->getElementType();
11349+ unsigned SourceLen = SourceLHS.getVectorLength();
11350+ SmallVector<APValue, 4> ResultElements;
11351+ ResultElements.reserve(SourceLen);
11352+
11353+ for (unsigned EltNum = 0; EltNum < SourceLen; ++EltNum) {
11354+ APSInt LHS = SourceLHS.getVectorElt(EltNum).getInt();
11355+ APSInt RHS = SourceRHS.getVectorElt(EltNum).getInt();
11356+ switch (E->getBuiltinCallee()) {
11357+ case Builtin::BI__builtin_elementwise_add_sat:
11358+ ResultElements.push_back(APValue(
11359+ APSInt(LHS.isSigned() ? LHS.sadd_sat(RHS) : RHS.uadd_sat(RHS),
11360+ DestEltTy->isUnsignedIntegerOrEnumerationType())));
11361+ break;
11362+ }
11363+ }
11364+
11365+ return Success(APValue(ResultElements.data(), ResultElements.size()), E);
11366+ }
1134211367 }
1134311368}
1134411369
@@ -13204,6 +13229,16 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E,
1320413229 return Success(Val.rotr(Amt.urem(Val.getBitWidth())), E);
1320513230 }
1320613231
13232+ case Builtin::BI__builtin_elementwise_add_sat: {
13233+ APSInt LHS, RHS;
13234+ if (!EvaluateInteger(E->getArg(0), LHS, Info) ||
13235+ !EvaluateInteger(E->getArg(1), RHS, Info))
13236+ return false;
13237+
13238+ APInt Result = LHS.isSigned() ? LHS.sadd_sat(RHS) : LHS.uadd_sat(RHS);
13239+ return Success(APSInt(Result, !LHS.isSigned()), E);
13240+ }
13241+
1320713242 case Builtin::BIstrlen:
1320813243 case Builtin::BIwcslen:
1320913244 // A call to strlen is not a constant expression.
0 commit comments