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

function addBenchmark(name, test) {
  new BenchmarkSuite(name, [1000],
      [
        new Benchmark(name, false, false, 0, test)
      ]);
}

addBenchmark('Smi-Add', addSmi);
addBenchmark('Number-Add', addNumber);
addBenchmark('Number-Oddball-Add', addOddball);
addBenchmark('String-Add', addString);
addBenchmark('Number-String-Add', addNumberString);
addBenchmark('Object-Add', addObject);
addBenchmark('Smi-Sub', subSmi);
addBenchmark('Number-Sub', subNumber);
addBenchmark('Number-Oddball-Sub', subOddball);
addBenchmark('Object-Sub', subObject);
addBenchmark('Smi-Mul', mulSmi);
addBenchmark('Number-Mul', mulNumber);
addBenchmark('Number-Oddball-Mul', mulOddball);
addBenchmark('Object-Mul', mulObject);
addBenchmark('Smi-Div', divSmi);
addBenchmark('Number-Div', divNumber);
addBenchmark('Number-Oddball-Div', divOddball);
addBenchmark('Object-Div', divObject);
addBenchmark('Smi-Mod', modSmi);
addBenchmark('Number-Mod', modNumber);
addBenchmark('Number-Oddball-Mod', modOddball);
addBenchmark('Object-Mod', modObject);
addBenchmark('Smi-Constant-Add', addSmiConstant);
addBenchmark('Smi-Constant-Sub', subSmiConstant);
addBenchmark('Smi-Constant-Mul', mulSmiConstant);
addBenchmark('Smi-Constant-Div', divSmiConstant);
addBenchmark('Smi-Constant-Mod', modSmiConstant);
addBenchmark('Smi-Increment', SmiIncrement);
addBenchmark('Number-Increment', NumberIncrement);
addBenchmark('Smi-Decrement', SmiDecrement);
addBenchmark('Number-Decrement', NumberDecrement);


function add(a, b) {
  for (var i = 0; i < 1000; ++i) {
    a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b;
    a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b;
    a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b;
    a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b;
    a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b;
    a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b;
    a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b;
    a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b;
    a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b;
    a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b; a + b;
  }
}

function sub(a, b) {
  for (var i = 0; i < 1000; ++i) {
    a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b;
    a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b;
    a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b;
    a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b;
    a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b;
    a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b;
    a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b;
    a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b;
    a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b;
    a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b; a - b;
  }
}

function mul(a, b) {
  for (var i = 0; i < 1000; ++i) {
    a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b;
    a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b;
    a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b;
    a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b;
    a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b;
    a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b;
    a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b;
    a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b;
    a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b;
    a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b; a * b;
  }
}

function div(a, b) {
  for (var i = 0; i < 1000; ++i) {
    a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b;
    a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b;
    a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b;
    a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b;
    a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b;
    a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b;
    a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b;
    a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b;
    a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b;
    a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b; a / b;
  }
}

function mod(a, b) {
  for (var i = 0; i < 1000; ++i) {
    a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b;
    a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b;
    a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b;
    a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b;
    a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b;
    a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b;
    a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b;
    a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b;
    a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b;
    a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b; a % b;
  }
}

function addSmiConstant(a) {
  var a = 20;
  for (var i = 0; i < 1000; ++i) {
    a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10;
    a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10;
    a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10;
    a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10;
    a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10;
    a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10;
    a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10;
    a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10;
    a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10;
    a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10; a + 10;
  }
}

function subSmiConstant() {
  var a = 20;
  for (var i = 0; i < 1000; ++i) {
    a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10;
    a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10;
    a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10;
    a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10;
    a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10;
    a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10;
    a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10;
    a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10;
    a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10;
    a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10; a - 10;
  }
}

function mulSmiConstant() {
  var a = 20;
  for (var i = 0; i < 1000; ++i) {
    a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10;
    a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10;
    a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10;
    a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10;
    a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10;
    a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10;
    a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10;
    a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10;
    a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10;
    a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10; a * 10;
  }
}

function divSmiConstant() {
  var a = 20;
  for (var i = 0; i < 1000; ++i) {
    a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10;
    a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10;
    a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10;
    a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10;
    a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10;
    a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10;
    a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10;
    a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10;
    a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10;
    a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10; a / 10;
  }
}

function modSmiConstant() {
  var a = 20;
  for (var i = 0; i < 1000; ++i) {
    a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10;
    a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10;
    a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10;
    a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10;
    a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10;
    a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10;
    a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10;
    a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10;
    a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10;
    a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10; a % 10;
  }
}

function inc(a) {
  for (var i = 0; i < 1000; ++i) {
    ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a;
    ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a;
    ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a;
    ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a;
    ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a;
    ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a;
    ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a;
    ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a;
    ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a;
    ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a; ++a;
    // To ensure it is always in SmiRange for Smi operation.
    a -= 1000;
  }
}

function dec(a) {
  for (var i = 0; i < 1000; ++i) {
    --a; --a; --a; --a; --a; --a; --a; --a; --a; --a;
    --a; --a; --a; --a; --a; --a; --a; --a; --a; --a;
    --a; --a; --a; --a; --a; --a; --a; --a; --a; --a;
    --a; --a; --a; --a; --a; --a; --a; --a; --a; --a;
    --a; --a; --a; --a; --a; --a; --a; --a; --a; --a;
    --a; --a; --a; --a; --a; --a; --a; --a; --a; --a;
    --a; --a; --a; --a; --a; --a; --a; --a; --a; --a;
    --a; --a; --a; --a; --a; --a; --a; --a; --a; --a;
    --a; --a; --a; --a; --a; --a; --a; --a; --a; --a;
    --a; --a; --a; --a; --a; --a; --a; --a; --a; --a;
    // To ensure it is always in SmiRange for Smi operation.
    a += 1000;
  }
}

function addSmi() {
 add(10, 20);
}

function addNumber() {
 add(0.333, 0.5);
}

function addOddball() {
 add(0.333, true);
}

function addString() {
 add("abc", "def");
}

function addNumberString() {
 add("abc", 1.23);
}

function addObject() {
 add({x: 1, y:2}, {x:3, y:4});
}

function subSmi() {
 sub(10, 20);
}

function subNumber() {
 sub(0.333, 0.5);
}

function subOddball() {
 sub(0.333, true);
}

function subObject() {
 sub({x: 1, y:2}, {x:3, y:4});
}

function mulSmi() {
 mul(10, 20);
}

function mulNumber() {
 mul(0.333, 0.5);
}

function mulOddball() {
 mul(0.333, true);
}

function mulObject() {
 mul({x: 1, y:2}, {x:3, y:4});
}

function divSmi() {
 div(10, 20);
}

function divNumber() {
 div(0.333, 0.5);
}

function divOddball() {
 div(0.333, true);
}

function divObject() {
 div({x: 1, y:2}, {x:3, y:4});
}

function modSmi() {
 mod(10, 20);
}

function modNumber() {
 mod(0.333, 0.5);
}

function modOddball() {
 mod(0.333, true);
}

function modObject() {
 mod({x: 1, y:2}, {x:3, y:4});
}

function SmiIncrement() {
 inc(3);
}

function NumberIncrement() {
 inc(0.33);
}

function SmiDecrement() {
 dec(3);
}

function NumberDecrement() {
 dec(0.33);
}