Skip to content

Commit f04bdad

Browse files
modulovaluedart-scoped@luci-project-accounts.iam.gserviceaccount.com
authored andcommitted
[vm, compiler] Fold Float32x4/Float64x2 min and max with Dart semantics
Constant folding of the RISC-V per-lane min/max used C fmin/fmax, which drop NaNs and do not order -0.0 below 0.0. TEST=lib/typed_data/float32x4_clamp_test lib/typed_data/float64x2_clamp_test Fixes: dart-lang#64546 Issue: dart-lang#64170 Cq-Include-Trybots: luci.dart.try:vm-linux-debug-simriscv64-try,vm-aot-linux-debug-simriscv64-try Change-Id: Ieed8880e6d4f736ea07e9c2918616ea1d08ba83e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/562661 Reviewed-by: Ryan Macnak <rmacnak@google.com> Commit-Queue: Alexander Aprelev <aam@google.com> Auto-Submit: Modestas Valauskas <valauskasmodestas@gmail.com> Reviewed-by: Alexander Aprelev <aam@google.com>
1 parent aa93a96 commit f04bdad

1 file changed

Lines changed: 16 additions & 4 deletions

File tree

‎runtime/vm/compiler/backend/evaluator.cc‎

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,16 @@ double Evaluator::EvaluateUnaryDoubleOp(const double value,
241241
}
242242
}
243243

244+
template <typename T>
245+
static T MinMax(T left, T right, bool is_min) {
246+
if (isnan(left)) return left;
247+
if (isnan(right)) return right;
248+
if (left == right) {
249+
return (signbit(left) != 0) == is_min ? left : right;
250+
}
251+
return (left < right) == is_min ? left : right;
252+
}
253+
244254
double Evaluator::EvaluateBinaryDoubleOp(const double left,
245255
const double right,
246256
Token::Kind token_kind,
@@ -256,9 +266,9 @@ double Evaluator::EvaluateBinaryDoubleOp(const double left,
256266
case Token::kDIV:
257267
return Utils::DivideAllowZero(left, right);
258268
case Token::kMIN:
259-
return fmin(left, right);
269+
return MinMax(left, right, /*is_min=*/true);
260270
case Token::kMAX:
261-
return fmax(left, right);
271+
return MinMax(left, right, /*is_min=*/false);
262272
default:
263273
UNREACHABLE();
264274
}
@@ -275,9 +285,11 @@ double Evaluator::EvaluateBinaryDoubleOp(const double left,
275285
return Utils::DivideAllowZero(static_cast<float>(left),
276286
static_cast<float>(right));
277287
case Token::kMIN:
278-
return fminf(static_cast<float>(left), static_cast<float>(right));
288+
return MinMax(static_cast<float>(left), static_cast<float>(right),
289+
/*is_min=*/true);
279290
case Token::kMAX:
280-
return fmaxf(static_cast<float>(left), static_cast<float>(right));
291+
return MinMax(static_cast<float>(left), static_cast<float>(right),
292+
/*is_min=*/false);
281293
default:
282294
UNREACHABLE();
283295
}

0 commit comments

Comments
 (0)