b6731abef0
When a fast path was added for Math.hypot, the algorithm was also simplified. This simplification turns out to be incorrect in some rare edge cases. This cl reverts back to the original algorithm and converts it to torque. Original cl: https://chromium-review.googlesource.com/c/v8/v8/+/1684178 Bug: v8:9546 Change-Id: If4e21504732f46081a8de823f50f499917f1a20c Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1725200 Commit-Queue: Georg Neis <neis@chromium.org> Reviewed-by: Georg Neis <neis@chromium.org> Reviewed-by: Jakob Gruber <jgruber@chromium.org> Cr-Commit-Position: refs/heads/master@{#63070}
54 lines
1.7 KiB
JavaScript
54 lines
1.7 KiB
JavaScript
// Copyright 2019 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
//
|
|
// Flags: --allow-natives-syntax
|
|
|
|
// Sanity checks.
|
|
assertEquals(Math.hypot(3, 4), 5);
|
|
assertEquals(Math.hypot(1, 2, 3, 4, 5, 27), 28);
|
|
|
|
// Regress.
|
|
assertEquals(Math.hypot(Infinity, NaN), Infinity);
|
|
assertEquals(Math.hypot(NaN, 0), NaN);
|
|
assertEquals(Math.hypot(NaN, Infinity), Infinity);
|
|
assertEquals(Math.hypot(0, NaN), NaN);
|
|
assertEquals(Math.hypot(NaN, 1, 2, 3, 4, 5, 0), NaN);
|
|
assertEquals(Math.hypot(NaN, Infinity, 2, 3, 4, 5, 0), Infinity);
|
|
|
|
// Verify optimized code works as intended.
|
|
function two_hypot(a, b) {
|
|
return Math.hypot(a, b);
|
|
}
|
|
|
|
function six_hypot(a, b, c, d, e, f) {
|
|
return Math.hypot(a, b, c, d, e, f);
|
|
}
|
|
|
|
%PrepareFunctionForOptimization(two_hypot);
|
|
two_hypot(1, 2);
|
|
two_hypot(3, 4);
|
|
two_hypot(5, 6);
|
|
%OptimizeFunctionOnNextCall(two_hypot);
|
|
assertEquals(two_hypot(3, 4), 5);
|
|
|
|
// Regress 2 parameter case.
|
|
assertEquals(two_hypot(Infinity, NaN), Infinity);
|
|
assertEquals(two_hypot(NaN, 0), NaN);
|
|
assertEquals(two_hypot(NaN, Infinity), Infinity);
|
|
assertEquals(two_hypot(0, NaN), NaN);
|
|
|
|
// Regress many parameters case.
|
|
%PrepareFunctionForOptimization(six_hypot);
|
|
six_hypot(1, 2, 3, 4, 5, 6);
|
|
six_hypot(3, 4, 5, 6, 7, 8);
|
|
six_hypot(5, 6, 7, 8, 9, 10);
|
|
%OptimizeFunctionOnNextCall(six_hypot);
|
|
assertEquals(six_hypot(1, 2, 3, 4, 5, 27), 28);
|
|
|
|
assertEquals(six_hypot(0, 0, 0, 0, 0, 0), 0);
|
|
assertEquals(six_hypot(NaN, 1, 2, 3, 4, 5, 0), NaN);
|
|
assertEquals(six_hypot(NaN, Infinity, 2, 3, 4, 5, 0), Infinity);
|
|
assertEquals(six_hypot(1, 2, 3, 4, 5, NaN), NaN);
|
|
assertEquals(six_hypot(Infinity, 2, 3, 4, 5, NaN), Infinity);
|