v8/test/mjsunit/compiler/bigint-asintn.js
Nico Hartmann bd4ea1e178 [turbofan] Support for BigInt.asIntN
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}
2021-10-19 14:41:45 +00:00

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);