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

// Flags: --allow-natives-syntax --opt

// Test multiple arguments push for PACKED_SMI_ELEMENTS.
(function() {
  function push0(a) {
    return a.push();
  }

  %PrepareFunctionForOptimization(push0);
  assertEquals(0, push0([]));
  assertEquals(1, push0([1]));
  %OptimizeFunctionOnNextCall(push0);
  assertEquals(2, push0([1, 2]));

  function push1(a) {
    return a.push(1);
  }

  %PrepareFunctionForOptimization(push1);
  assertEquals(1, push1([]));
  assertEquals(2, push1([1]));
  %OptimizeFunctionOnNextCall(push1);
  assertEquals(3, push1([1, 2]));

  function push2(a) {
    return a.push(1, 2);
  }

  %PrepareFunctionForOptimization(push2);
  assertEquals(2, push2([]));
  assertEquals(3, push2([1]));
  %OptimizeFunctionOnNextCall(push2);
  assertEquals(4, push2([1, 2]));

  function push3(a) {
    return a.push(1, 2, 3);
  }

  %PrepareFunctionForOptimization(push3);
  assertEquals(3, push3([]));
  assertEquals(4, push3([1]));
  %OptimizeFunctionOnNextCall(push3);
  assertEquals(5, push3([1, 2]));
})();

// Test multiple arguments push for HOLEY_SMI_ELEMENTS.
(function() {
  function push0(a) {
    return a.push();
  }

  %PrepareFunctionForOptimization(push0);
  assertEquals(1, push0(new Array(1)));
  assertEquals(2, push0(new Array(2)));
  %OptimizeFunctionOnNextCall(push0);
  assertEquals(3, push0(new Array(3)));

  function push1(a) {
    return a.push(1);
  }

  %PrepareFunctionForOptimization(push1);
  assertEquals(2, push1(new Array(1)));
  assertEquals(3, push1(new Array(2)));
  %OptimizeFunctionOnNextCall(push1);
  assertEquals(4, push1(new Array(3)));

  function push2(a) {
    return a.push(1, 2);
  }

  %PrepareFunctionForOptimization(push2);
  assertEquals(3, push2(new Array(1)));
  assertEquals(4, push2(new Array(2)));
  %OptimizeFunctionOnNextCall(push2);
  assertEquals(5, push2(new Array(3)));

  function push3(a) {
    return a.push(1, 2, 3);
  }

  %PrepareFunctionForOptimization(push3);
  assertEquals(4, push3(new Array(1)));
  assertEquals(5, push3(new Array(2)));
  %OptimizeFunctionOnNextCall(push3);
  assertEquals(6, push3(new Array(3)));
})();

// Test multiple arguments push for PACKED_DOUBLE_ELEMENTS.
(function() {
  function push0(a) {
    return a.push();
  }

  %PrepareFunctionForOptimization(push0);
  assertEquals(1, push0([1.1]));
  assertEquals(2, push0([1.1, 2.2]));
  %OptimizeFunctionOnNextCall(push0);
  assertEquals(3, push0([1.1, 2.2, 3.3]));

  function push1(a) {
    return a.push(1.1);
  }

  %PrepareFunctionForOptimization(push1);
  assertEquals(2, push1([1.1]));
  assertEquals(3, push1([1.1, 2.2]));
  %OptimizeFunctionOnNextCall(push1);
  assertEquals(4, push1([1.1, 2.2, 3.3]));

  function push2(a) {
    return a.push(1.1, 2.2);
  }

  %PrepareFunctionForOptimization(push2);
  assertEquals(3, push2([1.1]));
  assertEquals(4, push2([1.1, 2.2]));
  %OptimizeFunctionOnNextCall(push2);
  assertEquals(5, push2([1.1, 2.2, 3.3]));

  function push3(a) {
    return a.push(1.1, 2.2, 3.3);
  }

  %PrepareFunctionForOptimization(push3);
  assertEquals(4, push3([1.1]));
  assertEquals(5, push3([1.1, 2.2]));
  %OptimizeFunctionOnNextCall(push3);
  assertEquals(6, push3([1.1, 2.2, 3.3]));
})();

// Test multiple arguments push for HOLEY_DOUBLE_ELEMENTS.
(function() {
  function push0(a) {
    return a.push();
  }

  %PrepareFunctionForOptimization(push0);
  assertEquals(2, push0([, 1.1]));
  assertEquals(3, push0([, 1.1, 2.2]));
  %OptimizeFunctionOnNextCall(push0);
  assertEquals(4, push0([, 1.1, 2.2, 3.3]));

  function push1(a) {
    return a.push(1.1);
  }

  %PrepareFunctionForOptimization(push1);
  assertEquals(3, push1([, 1.1]));
  assertEquals(4, push1([, 1.1, 2.2]));
  %OptimizeFunctionOnNextCall(push1);
  assertEquals(5, push1([, 1.1, 2.2, 3.3]));

  function push2(a) {
    return a.push(1.1, 2.2);
  }

  %PrepareFunctionForOptimization(push2);
  assertEquals(4, push2([, 1.1]));
  assertEquals(5, push2([, 1.1, 2.2]));
  %OptimizeFunctionOnNextCall(push2);
  assertEquals(6, push2([, 1.1, 2.2, 3.3]));

  function push3(a) {
    return a.push(1.1, 2.2, 3.3);
  }

  %PrepareFunctionForOptimization(push3);
  assertEquals(5, push3([, 1.1]));
  assertEquals(6, push3([, 1.1, 2.2]));
  %OptimizeFunctionOnNextCall(push3);
  assertEquals(7, push3([, 1.1, 2.2, 3.3]));
})();

// Test multiple arguments push for PACKED_ELEMENTS.
(function() {
  function push0(a) {
    return a.push();
  }

  %PrepareFunctionForOptimization(push0);
  assertEquals(1, push0(['1']));
  assertEquals(2, push0(['1', '2']));
  %OptimizeFunctionOnNextCall(push0);
  assertEquals(3, push0(['1', '2', '3']));

  function push1(a) {
    return a.push('1');
  }

  %PrepareFunctionForOptimization(push1);
  assertEquals(2, push1(['1']));
  assertEquals(3, push1(['1', '2']));
  %OptimizeFunctionOnNextCall(push1);
  assertEquals(4, push1(['1', '2', '3']));

  function push2(a) {
    return a.push('1', '2');
  }

  %PrepareFunctionForOptimization(push2);
  assertEquals(3, push2(['1']));
  assertEquals(4, push2(['1', '2']));
  %OptimizeFunctionOnNextCall(push2);
  assertEquals(5, push2(['1', '2', '3']));

  function push3(a) {
    return a.push('1', '2', '3');
  }

  %PrepareFunctionForOptimization(push3);
  assertEquals(4, push3(['1']));
  assertEquals(5, push3(['1', '2']));
  %OptimizeFunctionOnNextCall(push3);
  assertEquals(6, push3(['1', '2', '3']));
})();

// Test multiple arguments push for HOLEY_ELEMENTS.
(function() {
  function push0(a) {
    return a.push();
  }

  %PrepareFunctionForOptimization(push0);
  assertEquals(2, push0([, '1']));
  assertEquals(3, push0([, '1', '2']));
  %OptimizeFunctionOnNextCall(push0);
  assertEquals(4, push0([, '1', '2', '3']));

  function push1(a) {
    return a.push('1');
  }

  %PrepareFunctionForOptimization(push1);
  assertEquals(3, push1([, '1']));
  assertEquals(4, push1([, '1', '2']));
  %OptimizeFunctionOnNextCall(push1);
  assertEquals(5, push1([, '1', '2', '3']));

  function push2(a) {
    return a.push('1', '2');
  }

  %PrepareFunctionForOptimization(push2);
  assertEquals(4, push2([, '1']));
  assertEquals(5, push2([, '1', '2']));
  %OptimizeFunctionOnNextCall(push2);
  assertEquals(6, push2([, '1', '2', '3']));

  function push3(a) {
    return a.push('1', '2', '3');
  }

  %PrepareFunctionForOptimization(push3);
  assertEquals(5, push3([, '1']));
  assertEquals(6, push3([, '1', '2']));
  %OptimizeFunctionOnNextCall(push3);
  assertEquals(7, push3([, '1', '2', '3']));
})();
