Add spread call micro-benchmark for frozen array

Bug: v8:6831
Change-Id: If3084304b4759f0c1a6e930d66a45f6c9d51eabd
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1612166
Reviewed-by: Benedikt Meurer <bmeurer@chromium.org>
Reviewed-by: Toon Verwaest <verwaest@chromium.org>
Commit-Queue: Z Nguyen-Huu <duongn@microsoft.com>
Cr-Commit-Position: refs/heads/master@{#61545}
diff --git a/test/js-perf-test/JSTests5.json b/test/js-perf-test/JSTests5.json
index e69f204..98f8e33 100644
--- a/test/js-perf-test/JSTests5.json
+++ b/test/js-perf-test/JSTests5.json
@@ -573,7 +573,10 @@
         {"name": "TaggedTemplate"},
         {"name": "TaggedTemplateLoose"},
         {"name": "ArrayIndexOf"},
-        {"name": "ArrayIncludes"}
+        {"name": "ArrayIncludes"},
+        {"name": "ApplySpreadLiteral"},
+        {"name": "SpreadCall"},
+        {"name": "SpreadCallSpreadLiteral"}
       ]
     },
     {
diff --git a/test/js-perf-test/ObjectFreeze/run.js b/test/js-perf-test/ObjectFreeze/run.js
index 065bb7c..adc1a47 100644
--- a/test/js-perf-test/ObjectFreeze/run.js
+++ b/test/js-perf-test/ObjectFreeze/run.js
@@ -4,6 +4,7 @@
 load('../base.js');
 load('tagged-template.js');
 load('array-indexof-includes.js');
+load('spread-call.js');
 
 function PrintResult(name, result) {
   console.log(name);
diff --git a/test/js-perf-test/ObjectFreeze/spread-call.js b/test/js-perf-test/ObjectFreeze/spread-call.js
new file mode 100644
index 0000000..ec1cd5d
--- /dev/null
+++ b/test/js-perf-test/ObjectFreeze/spread-call.js
@@ -0,0 +1,59 @@
+// 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.
+
+function setupArray(length) {
+  var a = new Array(length);
+  for (var i=0;i<length;i++) {
+    a[i] = ''+i;
+  }
+  return Object.freeze(a);
+}
+
+const frozenSpreadArray = setupArray(100);
+
+function foo() {
+  var result = arguments[0];
+  for (var i = 1; i < arguments.length; ++i) {
+    result += arguments[i];
+  }
+  return result;
+}
+
+// ----------------------------------------------------------------------------
+// Benchmark: SpreadCall
+// ----------------------------------------------------------------------------
+
+function SpreadCall() {
+  foo(...frozenSpreadArray);
+}
+
+
+// ----------------------------------------------------------------------------
+// Benchmark: SpreadCallSpreadLiteral
+// ----------------------------------------------------------------------------
+
+function SpreadCallSpreadLiteral() {
+  foo(...[...frozenSpreadArray]);
+}
+
+
+// ----------------------------------------------------------------------------
+// Benchmark: ApplySpreadLiteral
+// ----------------------------------------------------------------------------
+
+function ApplySpreadLiteral() {
+  foo.apply(this, [...frozenSpreadArray]);
+}
+
+// ----------------------------------------------------------------------------
+// Setup and Run
+// ----------------------------------------------------------------------------
+
+function CreateBenchmark(name, f) {
+  new BenchmarkSuite(name, [10], [ new Benchmark(name, false, false, 0, f) ]);
+}
+
+CreateBenchmark('ApplySpreadLiteral', ApplySpreadLiteral);
+CreateBenchmark('SpreadCall', SpreadCall);
+CreateBenchmark('SpreadCallSpreadLiteral', SpreadCallSpreadLiteral);