7ac19fe598
Migrate the isNaN, isFinite, Number.isFinite, Number.isInteger, Number.isSafeInteger and Number.isNaN predicates to TurboFan builtins and make them optimizable (for certain input types) in JavaScript callees being optimized by TurboFan. That means both the baseline and the optimized version is now always at maximum, consistent performance. Especially TurboFan suffered from poor baseline (and optimized) performance because it cannot play the same weird tricks that Crankshaft plays for %_IsSmi. This also adds a bunch of new tests to properly cover the use of the Harmony predicates in optimized code. R=franzih@chromium.org BUG=v8:5049,v8:5267 Review-Url: https://codereview.chromium.org/2313073002 Cr-Commit-Position: refs/heads/master@{#39242}
51 lines
1.4 KiB
JavaScript
51 lines
1.4 KiB
JavaScript
// Copyright 2016 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
|
|
|
|
function test(f) {
|
|
assertTrue(f(0));
|
|
assertTrue(f(Number.MIN_SAFE_INTEGER));
|
|
assertFalse(f(Number.MIN_SAFE_INTEGER - 13));
|
|
assertTrue(f(Number.MIN_SAFE_INTEGER + 13));
|
|
assertTrue(f(Number.MAX_SAFE_INTEGER));
|
|
assertFalse(f(Number.MAX_SAFE_INTEGER + 23));
|
|
assertTrue(f(Number.MAX_SAFE_INTEGER - 23));
|
|
assertFalse(f(Number.MIN_VALUE));
|
|
assertFalse(f(Number.MAX_VALUE));
|
|
assertFalse(f(Number.NaN));
|
|
assertFalse(f(Number.POSITIVE_INFINITY));
|
|
assertFalse(f(Number.NEGATIVE_INFINITY));
|
|
assertFalse(f(1 / 0));
|
|
assertFalse(f(-1 / 0));
|
|
assertFalse(f(Number.EPSILON));
|
|
|
|
var near_upper = Math.pow(2, 52);
|
|
assertTrue(f(near_upper));
|
|
assertFalse(f(2 * near_upper));
|
|
assertTrue(f(2 * near_upper - 1));
|
|
assertTrue(f(2 * near_upper - 2));
|
|
assertFalse(f(2 * near_upper + 1));
|
|
assertFalse(f(2 * near_upper + 2));
|
|
assertFalse(f(2 * near_upper + 7));
|
|
|
|
var near_lower = -near_upper;
|
|
assertTrue(f(near_lower));
|
|
assertFalse(f(2 * near_lower));
|
|
assertTrue(f(2 * near_lower + 1));
|
|
assertTrue(f(2 * near_lower + 2));
|
|
assertFalse(f(2 * near_lower - 1));
|
|
assertFalse(f(2 * near_lower - 2));
|
|
assertFalse(f(2 * near_lower - 7));
|
|
}
|
|
|
|
function f(x) {
|
|
return Number.isSafeInteger(+x);
|
|
}
|
|
|
|
test(f);
|
|
test(f);
|
|
%OptimizeFunctionOnNextCall(f);
|
|
test(f);
|