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

"use strict";

load('bigint-util.js');

let random_bigints = [];

// This dummy ensures that the feedback for benchmark.run() in the Measure
// function from base.js is not monomorphic, thereby preventing the benchmarks
// below from being inlined. This ensures consistent behavior and comparable
// results.
new BenchmarkSuite('Prevent-Inline-Dummy', [10000], [
  new Benchmark('Prevent-Inline-Dummy', true, false, 0, () => {})
]);


[32, 64, 128, 256].forEach((d) => {
  new BenchmarkSuite(`AsUint64-${d}`, [1000], [
    new Benchmark(`AsUint64-${d}`, true, false, 0, TestAsUint64,
      () => SetUpTestAsUintN(d))
  ]);
});


[32, 64, 128, 256].forEach((d) => {
  new BenchmarkSuite(`AsUint32-${d}`, [1000], [
    new Benchmark(`AsUint32-${d}`, true, false, 0, TestAsUint32,
      () => SetUpTestAsUintN(d))
  ]);
});


[32, 64, 128, 256].forEach((d) => {
  new BenchmarkSuite(`AsUint8-${d}`, [1000], [
    new Benchmark(`AsUint8-${d}`, true, false, 0, TestAsUint8,
      () => SetUpTestAsUintN(d))
  ]);
});


function SetUpTestAsUintN(d) {
  random_bigints = [
    RandomBigIntWithBits(d),
    RandomBigIntWithBits(d),
    RandomBigIntWithBits(d),
    RandomBigIntWithBits(d),
    RandomBigIntWithBits(d),
    RandomBigIntWithBits(d),
    RandomBigIntWithBits(d),
    RandomBigIntWithBits(d)
  ];
}


function TestAsUint64() {
  let result = 0n;

  for (let i = 0; i < TEST_ITERATIONS; ++i) {
    result = BigInt.asUintN(64, random_bigints[i % 8]);
  }

  return result;
}


function TestAsUint32() {
  let result = 0n;

  for (let i = 0; i < TEST_ITERATIONS; ++i) {
    result = BigInt.asUintN(32, random_bigints[i % 8]);
  }

  return result;
}


function TestAsUint8() {
  let result = 0n;

  for (let i = 0; i < TEST_ITERATIONS; ++i) {
    result = BigInt.asUintN(8, random_bigints[i % 8]);
  }

  return result;
}
