// 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 --opt

function TestAsUintN() {
  assertEquals(0n, BigInt.asUintN(64, 0n));
  assertEquals(0n, BigInt.asUintN(8, 0n));
  assertEquals(0n, BigInt.asUintN(1, 0n));
  assertEquals(0n, BigInt.asUintN(0, 0n));
  assertEquals(0n, BigInt.asUintN(100, 0n));

  assertEquals(123n, BigInt.asUintN(64, 123n));
  assertEquals(123n, BigInt.asUintN(32, 123n));
  assertEquals(123n, BigInt.asUintN(8, 123n));
  assertEquals(59n, BigInt.asUintN(6, 123n));
  assertEquals(27n, BigInt.asUintN(5, 123n));
  assertEquals(11n, BigInt.asUintN(4, 123n));
  assertEquals(1n, BigInt.asUintN(1, 123n));
  assertEquals(0n, BigInt.asUintN(0, 123n));
  assertEquals(123n, BigInt.asUintN(72, 123n));

  assertEquals(BigInt("0xFFFFFFFFFFFFFF85"), BigInt.asUintN(64, -123n));
  assertEquals(BigInt("0xFFFFFF85"), BigInt.asUintN(32, -123n));
  assertEquals(BigInt("0x85"), BigInt.asUintN(8, -123n));
  assertEquals(5n, BigInt.asUintN(6, -123n));
  assertEquals(5n, BigInt.asUintN(5, -123n));
  assertEquals(5n, BigInt.asUintN(4, -123n));
  assertEquals(1n, BigInt.asUintN(1, -123n));
  assertEquals(0n, BigInt.asUintN(0, -123n));
  assertEquals(BigInt("0xFFFFFFFFFFFFFFFF85"), BigInt.asUintN(72, -123n));
}

function TestInt64LoweredOperations() {
  assertEquals(0n, BigInt.asUintN(64, -0n));
  assertEquals(0n, BigInt.asUintN(64, 15n + -15n));
  assertEquals(0n, BigInt.asUintN(64, 0n + 0n));
  assertEquals(14n, BigInt.asUintN(32, 8n + 6n));
  assertEquals(813n, BigInt.asUintN(10, 1013n + -200n));
  assertEquals(15n, BigInt.asUintN(4, -319n + 302n));
  assertEquals(32n, BigInt.asUintN(64, (2n ** 100n + 64n) - 32n));
  assertEquals(2n ** 64n - 32n, BigInt.asUintN(64, 32n - (2n ** 100n + 64n)));
  assertEquals(11n, BigInt.asUintN(4, 800n - 789n));
  assertEquals(5n, BigInt.asUintN(4, 789n - 800n));

  for (let i = 0; i < 2; ++i) {
    let x = 32n; // x = 32n
    if (i === 1) {
      x = BigInt.asUintN(64, x + 3n); // x = 35n
      const y = x + -8n + x; // x = 35n, y = 62n
      x = BigInt.asUintN(6, y + x); // x = 33n, y = 62n
      x = -9n + y - x; // x = 20n
      x = BigInt.asUintN(10000 * i, x); // x = 20n
    } else {
      x = x + 400n; // x = 432n
      x = -144n + BigInt.asUintN(8, 500n) + x; // x = 532n
    }
    assertEquals(20n, BigInt.asUintN(8, x));
  }

  let x = 7n;
  for (let i = 0; i < 10; ++i) {
    x = x + 5n;
  }
  assertEquals(57n, BigInt.asUintN(8, x));

  let y = 7n;
  for(let i = 0; i < 10; ++i) {
    y = BigInt.asUintN(4, y + 16n);
  }
  assertEquals(7n, y);
}

function OptimizeAndTest(fn) {
  %PrepareFunctionForOptimization(fn);
  %PrepareFunctionForOptimization(assertEquals);
  %PrepareFunctionForOptimization(deepEquals);
  fn();
  fn();
  %OptimizeFunctionOnNextCall(fn);
  fn();
  assertOptimized(fn);
  fn();
}

OptimizeAndTest(TestAsUintN);
OptimizeAndTest(TestInt64LoweredOperations);
