bd4ea1e178
This CL adds support for BigInt.asIntN, the necessary operations and extensions of the compiler's type system to allow lowering of BigInts to word64 representations that are interpreted as signed 64 bit BigInts. Bug: v8:9407 Change-Id: Id4f1f45437c1caf94e01c7b4e063c2ae2386c88a Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3198070 Commit-Queue: Nico Hartmann <nicohartmann@chromium.org> Reviewed-by: Maya Lekova <mslekova@chromium.org> Cr-Commit-Position: refs/heads/main@{#77458}
38 lines
1.1 KiB
JavaScript
38 lines
1.1 KiB
JavaScript
// Copyright 2021 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 --opt --no-always-opt
|
|
|
|
|
|
function f(x) {
|
|
return BigInt.asIntN(3, x);
|
|
}
|
|
|
|
%PrepareFunctionForOptimization(f);
|
|
assertEquals(-1n, f(7n));
|
|
assertEquals(1n, f(9n));
|
|
%OptimizeFunctionOnNextCall(f);
|
|
assertEquals(-1n, f(7n));
|
|
assertEquals(1n, f(9n));
|
|
assertOptimized(f);
|
|
|
|
// BigInt.asIntN throws TypeError for non-BigInt arguments.
|
|
assertThrows(() => f(2), TypeError);
|
|
if(%Is64Bit()) {
|
|
// On 64 bit architectures TurboFan optimizes BigInt.asIntN to native code
|
|
// that deoptimizes on non-BigInt arguments.
|
|
assertUnoptimized(f);
|
|
|
|
// The next time the function is optimized, speculation should be disabled
|
|
// so the builtin call is kept, which won't deoptimize again.
|
|
%PrepareFunctionForOptimization(f);
|
|
%OptimizeFunctionOnNextCall(f);
|
|
}
|
|
assertEquals(-1n, f(7n));
|
|
assertOptimized(f);
|
|
|
|
// Re-optimized still throws but does not deopt-loop.
|
|
assertThrows(() => f(2), TypeError);
|
|
assertOptimized(f);
|