@@ -11339,7 +11339,8 @@ 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: {
11342+ case Builtin::BI__builtin_elementwise_add_sat:
11343+ case Builtin::BI__builtin_elementwise_sub_sat: {
1134311344 APValue SourceLHS, SourceRHS;
1134411345 if (!EvaluateAsRValue(Info, E->getArg(0), SourceLHS) ||
1134511346 !EvaluateAsRValue(Info, E->getArg(1), SourceRHS))
@@ -11359,6 +11360,11 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {
1135911360 APSInt(LHS.isSigned() ? LHS.sadd_sat(RHS) : RHS.uadd_sat(RHS),
1136011361 DestEltTy->isUnsignedIntegerOrEnumerationType())));
1136111362 break;
11363+ case Builtin::BI__builtin_elementwise_sub_sat:
11364+ ResultElements.push_back(APValue(
11365+ APSInt(LHS.isSigned() ? LHS.ssub_sat(RHS) : RHS.usub_sat(RHS),
11366+ DestEltTy->isUnsignedIntegerOrEnumerationType())));
11367+ break;
1136211368 }
1136311369 }
1136411370
@@ -13238,6 +13244,15 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E,
1323813244 APInt Result = LHS.isSigned() ? LHS.sadd_sat(RHS) : LHS.uadd_sat(RHS);
1323913245 return Success(APSInt(Result, !LHS.isSigned()), E);
1324013246 }
13247+ case Builtin::BI__builtin_elementwise_sub_sat: {
13248+ APSInt LHS, RHS;
13249+ if (!EvaluateInteger(E->getArg(0), LHS, Info) ||
13250+ !EvaluateInteger(E->getArg(1), RHS, Info))
13251+ return false;
13252+
13253+ APInt Result = LHS.isSigned() ? LHS.ssub_sat(RHS) : LHS.usub_sat(RHS);
13254+ return Success(APSInt(Result, !LHS.isSigned()), E);
13255+ }
1324113256
1324213257 case Builtin::BIstrlen:
1324313258 case Builtin::BIwcslen:
0 commit comments