2016-01-14 09:48:45 +00:00
|
|
|
// Copyright 2015 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.
|
|
|
|
|
|
|
|
#include <stdint.h>
|
2016-01-18 14:28:32 +00:00
|
|
|
#include <stdio.h>
|
2016-01-14 09:48:45 +00:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
2017-02-23 11:46:29 +00:00
|
|
|
#include "src/assembler-inl.h"
|
2016-01-14 09:48:45 +00:00
|
|
|
#include "test/cctest/cctest.h"
|
2016-02-18 09:55:25 +00:00
|
|
|
#include "test/cctest/compiler/value-helper.h"
|
2016-01-14 09:48:45 +00:00
|
|
|
#include "test/cctest/wasm/wasm-run-utils.h"
|
2016-10-05 11:59:47 +00:00
|
|
|
#include "test/common/wasm/test-signatures.h"
|
2017-04-25 11:29:17 +00:00
|
|
|
#include "test/common/wasm/wasm-macro-gen.h"
|
2016-01-14 09:48:45 +00:00
|
|
|
|
|
|
|
using namespace v8::base;
|
|
|
|
using namespace v8::internal;
|
|
|
|
using namespace v8::internal::compiler;
|
|
|
|
using namespace v8::internal::wasm;
|
|
|
|
|
|
|
|
#define BUILD(r, ...) \
|
|
|
|
do { \
|
|
|
|
byte code[] = {__VA_ARGS__}; \
|
|
|
|
r.Build(code, code + arraysize(code)); \
|
|
|
|
} while (false)
|
|
|
|
|
2016-01-18 14:28:32 +00:00
|
|
|
#define ADD_CODE(vec, ...) \
|
|
|
|
do { \
|
|
|
|
byte __buf[] = {__VA_ARGS__}; \
|
|
|
|
for (size_t i = 0; i < sizeof(__buf); i++) vec.push_back(__buf[i]); \
|
|
|
|
} while (false)
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
// A helper for generating predictable but unique argument values that
|
|
|
|
// are easy to debug (e.g. with misaligned stacks).
|
|
|
|
class PredictableInputValues {
|
|
|
|
public:
|
|
|
|
int base_;
|
|
|
|
explicit PredictableInputValues(int base) : base_(base) {}
|
|
|
|
double arg_d(int which) { return base_ * which + ((which & 1) * 0.5); }
|
|
|
|
float arg_f(int which) { return base_ * which + ((which & 1) * 0.25); }
|
|
|
|
int32_t arg_i(int which) { return base_ * which + ((which & 1) * kMinInt); }
|
|
|
|
int64_t arg_l(int which) {
|
|
|
|
return base_ * which + ((which & 1) * (0x04030201LL << 32));
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2017-08-18 08:21:34 +00:00
|
|
|
uint32_t AddJSSelector(TestingModuleBuilder* builder, FunctionSig* sig,
|
|
|
|
int which) {
|
2016-03-29 11:41:19 +00:00
|
|
|
const int kMaxParams = 11;
|
|
|
|
static const char* formals[kMaxParams] = {"",
|
|
|
|
"a",
|
|
|
|
"a,b",
|
|
|
|
"a,b,c",
|
|
|
|
"a,b,c,d",
|
|
|
|
"a,b,c,d,e",
|
|
|
|
"a,b,c,d,e,f",
|
|
|
|
"a,b,c,d,e,f,g",
|
|
|
|
"a,b,c,d,e,f,g,h",
|
|
|
|
"a,b,c,d,e,f,g,h,i",
|
|
|
|
"a,b,c,d,e,f,g,h,i,j"};
|
2016-01-18 14:28:32 +00:00
|
|
|
CHECK_LT(which, static_cast<int>(sig->parameter_count()));
|
|
|
|
CHECK_LT(static_cast<int>(sig->parameter_count()), kMaxParams);
|
|
|
|
|
|
|
|
i::EmbeddedVector<char, 256> source;
|
|
|
|
char param = 'a' + which;
|
|
|
|
SNPrintF(source, "(function(%s) { return %c; })",
|
|
|
|
formals[sig->parameter_count()], param);
|
|
|
|
|
2017-08-18 08:21:34 +00:00
|
|
|
return builder->AddJsFunction(sig, source.start());
|
2016-01-14 09:48:45 +00:00
|
|
|
}
|
|
|
|
|
2016-01-18 14:28:32 +00:00
|
|
|
void EXPECT_CALL(double expected, Handle<JSFunction> jsfunc,
|
|
|
|
Handle<Object>* buffer, int count) {
|
2016-01-14 09:48:45 +00:00
|
|
|
Isolate* isolate = jsfunc->GetIsolate();
|
|
|
|
Handle<Object> global(isolate->context()->global_object(), isolate);
|
|
|
|
MaybeHandle<Object> retval =
|
2016-01-18 14:28:32 +00:00
|
|
|
Execution::Call(isolate, jsfunc, global, count, buffer);
|
2016-01-14 09:48:45 +00:00
|
|
|
|
|
|
|
CHECK(!retval.is_null());
|
|
|
|
Handle<Object> result = retval.ToHandleChecked();
|
|
|
|
if (result->IsSmi()) {
|
2017-07-10 12:58:27 +00:00
|
|
|
CHECK_EQ(expected, Smi::ToInt(*result));
|
2016-01-14 09:48:45 +00:00
|
|
|
} else {
|
|
|
|
CHECK(result->IsHeapNumber());
|
2016-01-18 14:28:32 +00:00
|
|
|
CheckFloatEq(expected, HeapNumber::cast(*result)->value());
|
2016-01-14 09:48:45 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-01-18 14:28:32 +00:00
|
|
|
void EXPECT_CALL(double expected, Handle<JSFunction> jsfunc, double a,
|
|
|
|
double b) {
|
|
|
|
Isolate* isolate = jsfunc->GetIsolate();
|
|
|
|
Handle<Object> buffer[] = {isolate->factory()->NewNumber(a),
|
|
|
|
isolate->factory()->NewNumber(b)};
|
|
|
|
EXPECT_CALL(expected, jsfunc, buffer, 2);
|
|
|
|
}
|
|
|
|
} // namespace
|
|
|
|
|
2016-01-14 09:48:45 +00:00
|
|
|
TEST(Run_Int32Sub_jswrapped) {
|
2016-12-16 10:13:11 +00:00
|
|
|
WasmRunner<int, int, int> r(kExecuteCompiled);
|
|
|
|
BUILD(r, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
|
2017-08-18 08:21:34 +00:00
|
|
|
Handle<JSFunction> jsfunc = r.builder().WrapCode(r.function()->func_index);
|
2016-01-14 09:48:45 +00:00
|
|
|
|
|
|
|
EXPECT_CALL(33, jsfunc, 44, 11);
|
|
|
|
EXPECT_CALL(-8723487, jsfunc, -8000000, 723487);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(Run_Float32Div_jswrapped) {
|
2016-12-16 10:13:11 +00:00
|
|
|
WasmRunner<float, float, float> r(kExecuteCompiled);
|
|
|
|
BUILD(r, WASM_F32_DIV(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
|
2017-08-18 08:21:34 +00:00
|
|
|
Handle<JSFunction> jsfunc = r.builder().WrapCode(r.function()->func_index);
|
2016-01-14 09:48:45 +00:00
|
|
|
|
|
|
|
EXPECT_CALL(92, jsfunc, 46, 0.5);
|
|
|
|
EXPECT_CALL(64, jsfunc, -16, -0.25);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(Run_Float64Add_jswrapped) {
|
2016-12-16 10:13:11 +00:00
|
|
|
WasmRunner<double, double, double> r(kExecuteCompiled);
|
|
|
|
BUILD(r, WASM_F64_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
|
2017-08-18 08:21:34 +00:00
|
|
|
Handle<JSFunction> jsfunc = r.builder().WrapCode(r.function()->func_index);
|
2016-01-14 09:48:45 +00:00
|
|
|
|
|
|
|
EXPECT_CALL(3, jsfunc, 2, 1);
|
|
|
|
EXPECT_CALL(-5.5, jsfunc, -5.25, -0.25);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(Run_I32Popcount_jswrapped) {
|
2016-12-16 10:13:11 +00:00
|
|
|
WasmRunner<int, int> r(kExecuteCompiled);
|
|
|
|
BUILD(r, WASM_I32_POPCNT(WASM_GET_LOCAL(0)));
|
2017-08-18 08:21:34 +00:00
|
|
|
Handle<JSFunction> jsfunc = r.builder().WrapCode(r.function()->func_index);
|
2016-01-14 09:48:45 +00:00
|
|
|
|
|
|
|
EXPECT_CALL(2, jsfunc, 9, 0);
|
|
|
|
EXPECT_CALL(3, jsfunc, 11, 0);
|
|
|
|
EXPECT_CALL(6, jsfunc, 0x3F, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(Run_CallJS_Add_jswrapped) {
|
2016-12-16 10:13:11 +00:00
|
|
|
WasmRunner<int, int> r(kExecuteCompiled);
|
2016-01-14 09:48:45 +00:00
|
|
|
TestSignatures sigs;
|
Revert "[wasm] Reland "[wasm] redirect wasm calls to js functions through a GCed table""
This reverts commit 649b1e70e73dbdc98fe9655f454f0ace0113c990.
Reason for revert: A1 Jetstream bots are still failing.
Original change's description:
> [wasm] Reland "[wasm] redirect wasm calls to js functions through a GCed table"
>
> This reverts commit 25f03308a7c34df996e93178ba4d29de8949349a.
>
> Reason for revert: Fix the cause of bot failure and reland
>
> Original change's description:
> > Revert "[wasm] redirect wasm calls to js functions through a GCed table"
> >
> > This reverts commit eb65f35e96a417b7792400a3867560248d9809f2.
> >
> > Reason for revert: Broke jetstream benchmark on android.
> >
> > BUG=chromium:750828
> >
> > Original change's description:
> > > [wasm] redirect wasm calls to js functions through a GCed table
> > >
> > > With this patch, rather than embedding the JSReceiver address directly
> > > in the WasmToJS wrappers, we put that in a fixed array with global handle
> > > scope and instead embed the location of the handle and the index in the
> > > wrapper. This ensures that the wrapper doesn't need to be patched if the
> > > GC kicks in. This is needed to get the WASM code off the GCed heap.
> > >
> > > R=mtrofin@chromium.org
> > >
> > > Bug:
> > > Change-Id: Ie5a77a78cdecec51b04f702c63b8e4285e6a2d8d
> > > Reviewed-on: https://chromium-review.googlesource.com/581682
> > > Commit-Queue: Aseem Garg <aseemgarg@chromium.org>
> > > Reviewed-by: Mircea Trofin <mtrofin@chromium.org>
> > > Cr-Commit-Position: refs/heads/master@{#46884}
> >
> > TBR=mtrofin@chromium.org,aseemgarg@google.com,aseemgarg@chromium.org,clemensh@chromium.org
> >
> > # Not skipping CQ checks because original CL landed > 1 day ago.
> >
> > Change-Id: I26f49ee0a1fe73cc5d8852ded87b56638be39ebf
> > Reviewed-on: https://chromium-review.googlesource.com/596268
> > Commit-Queue: Aseem Garg <aseemgarg@chromium.org>
> > Reviewed-by: Clemens Hammacher <clemensh@chromium.org>
> > Cr-Commit-Position: refs/heads/master@{#47059}
>
> R=mtrofin@chromium.org,aseemgarg@google.com,aseemgarg@chromium.org,clemensh@chromium.org,sullivan@chromium.org
>
> Change-Id: I29ef35f6e612a706d9f571da3e7beb1da8b5052b
> Bug: chromium:750828
> Reviewed-on: https://chromium-review.googlesource.com/597010
> Commit-Queue: Aseem Garg <aseemgarg@chromium.org>
> Reviewed-by: Clemens Hammacher <clemensh@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#47177}
TBR=bradnelson@chromium.org,sullivan@chromium.org,mtrofin@chromium.org,aseemgarg@google.com,aseemgarg@chromium.org,clemensh@chromium.org
Bug: chromium:750828
Change-Id: I04b12c0eb0705ad809822a7d7461423be77d942a
Reviewed-on: https://chromium-review.googlesource.com/606867
Commit-Queue: Aseem Garg <aseemgarg@chromium.org>
Reviewed-by: Aseem Garg <aseemgarg@chromium.org>
Cr-Commit-Position: refs/heads/master@{#47231}
2017-08-08 19:01:16 +00:00
|
|
|
uint32_t js_index =
|
2017-08-18 08:21:34 +00:00
|
|
|
r.builder().AddJsFunction(sigs.i_i(), "(function(a) { return a + 99; })");
|
2016-12-16 10:13:11 +00:00
|
|
|
BUILD(r, WASM_CALL_FUNCTION(js_index, WASM_GET_LOCAL(0)));
|
2016-01-14 09:48:45 +00:00
|
|
|
|
2017-08-18 08:21:34 +00:00
|
|
|
Handle<JSFunction> jsfunc = r.builder().WrapCode(r.function()->func_index);
|
2016-01-14 09:48:45 +00:00
|
|
|
|
|
|
|
EXPECT_CALL(101, jsfunc, 2, -8);
|
|
|
|
EXPECT_CALL(199, jsfunc, 100, -1);
|
|
|
|
EXPECT_CALL(-666666801, jsfunc, -666666900, -1);
|
|
|
|
}
|
2016-01-18 14:28:32 +00:00
|
|
|
|
|
|
|
void RunJSSelectTest(int which) {
|
|
|
|
const int kMaxParams = 8;
|
|
|
|
PredictableInputValues inputs(0x100);
|
2016-12-21 13:43:00 +00:00
|
|
|
ValueType type = kWasmF64;
|
|
|
|
ValueType types[kMaxParams + 1] = {type, type, type, type, type,
|
2016-01-18 14:28:32 +00:00
|
|
|
type, type, type, type};
|
|
|
|
for (int num_params = which + 1; num_params < kMaxParams; num_params++) {
|
|
|
|
HandleScope scope(CcTest::InitIsolateOnce());
|
|
|
|
FunctionSig sig(1, num_params, types);
|
|
|
|
|
2016-12-16 10:13:11 +00:00
|
|
|
WasmRunner<void> r(kExecuteCompiled);
|
2017-08-18 08:21:34 +00:00
|
|
|
uint32_t js_index = AddJSSelector(&r.builder(), &sig, which);
|
2016-12-16 10:13:11 +00:00
|
|
|
WasmFunctionCompiler& t = r.NewFunction(&sig);
|
2016-01-18 14:28:32 +00:00
|
|
|
|
|
|
|
{
|
|
|
|
std::vector<byte> code;
|
|
|
|
|
|
|
|
for (int i = 0; i < num_params; i++) {
|
|
|
|
ADD_CODE(code, WASM_F64(inputs.arg_d(i)));
|
|
|
|
}
|
|
|
|
|
2016-09-27 20:46:10 +00:00
|
|
|
ADD_CODE(code, kExprCallFunction, static_cast<byte>(js_index));
|
2016-04-29 09:15:26 +00:00
|
|
|
|
2016-01-18 14:28:32 +00:00
|
|
|
size_t end = code.size();
|
|
|
|
code.push_back(0);
|
|
|
|
t.Build(&code[0], &code[end]);
|
|
|
|
}
|
|
|
|
|
2017-08-18 08:21:34 +00:00
|
|
|
Handle<JSFunction> jsfunc = r.builder().WrapCode(t.function_index());
|
2016-01-18 14:28:32 +00:00
|
|
|
double expected = inputs.arg_d(which);
|
|
|
|
EXPECT_CALL(expected, jsfunc, 0.0, 0.0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-08-11 08:32:47 +00:00
|
|
|
TEST(Run_JSSelect_0) {
|
|
|
|
CcTest::InitializeVM();
|
|
|
|
RunJSSelectTest(0);
|
|
|
|
}
|
2016-01-18 14:28:32 +00:00
|
|
|
|
2016-08-11 08:32:47 +00:00
|
|
|
TEST(Run_JSSelect_1) {
|
|
|
|
CcTest::InitializeVM();
|
|
|
|
RunJSSelectTest(1);
|
|
|
|
}
|
2016-01-18 14:28:32 +00:00
|
|
|
|
2016-08-11 08:32:47 +00:00
|
|
|
TEST(Run_JSSelect_2) {
|
|
|
|
CcTest::InitializeVM();
|
|
|
|
RunJSSelectTest(2);
|
|
|
|
}
|
2016-01-18 14:28:32 +00:00
|
|
|
|
2016-08-11 08:32:47 +00:00
|
|
|
TEST(Run_JSSelect_3) {
|
|
|
|
CcTest::InitializeVM();
|
|
|
|
RunJSSelectTest(3);
|
|
|
|
}
|
2016-01-18 14:28:32 +00:00
|
|
|
|
2016-08-11 08:32:47 +00:00
|
|
|
TEST(Run_JSSelect_4) {
|
|
|
|
CcTest::InitializeVM();
|
|
|
|
RunJSSelectTest(4);
|
|
|
|
}
|
2016-01-18 14:28:32 +00:00
|
|
|
|
2016-08-11 08:32:47 +00:00
|
|
|
TEST(Run_JSSelect_5) {
|
|
|
|
CcTest::InitializeVM();
|
|
|
|
RunJSSelectTest(5);
|
|
|
|
}
|
2016-01-18 14:28:32 +00:00
|
|
|
|
2016-08-11 08:32:47 +00:00
|
|
|
TEST(Run_JSSelect_6) {
|
|
|
|
CcTest::InitializeVM();
|
|
|
|
RunJSSelectTest(6);
|
|
|
|
}
|
2016-01-18 14:28:32 +00:00
|
|
|
|
2016-08-11 08:32:47 +00:00
|
|
|
TEST(Run_JSSelect_7) {
|
|
|
|
CcTest::InitializeVM();
|
|
|
|
RunJSSelectTest(7);
|
|
|
|
}
|
2016-01-18 14:28:32 +00:00
|
|
|
|
|
|
|
void RunWASMSelectTest(int which) {
|
|
|
|
PredictableInputValues inputs(0x200);
|
|
|
|
Isolate* isolate = CcTest::InitIsolateOnce();
|
|
|
|
const int kMaxParams = 8;
|
|
|
|
for (int num_params = which + 1; num_params < kMaxParams; num_params++) {
|
2016-12-21 13:43:00 +00:00
|
|
|
ValueType type = kWasmF64;
|
|
|
|
ValueType types[kMaxParams + 1] = {type, type, type, type, type,
|
2016-01-18 14:28:32 +00:00
|
|
|
type, type, type, type};
|
|
|
|
FunctionSig sig(1, num_params, types);
|
|
|
|
|
2016-12-16 10:13:11 +00:00
|
|
|
WasmRunner<void> r(kExecuteCompiled);
|
|
|
|
WasmFunctionCompiler& t = r.NewFunction(&sig);
|
2016-01-18 14:28:32 +00:00
|
|
|
BUILD(t, WASM_GET_LOCAL(which));
|
2017-08-18 08:21:34 +00:00
|
|
|
Handle<JSFunction> jsfunc = r.builder().WrapCode(t.function_index());
|
2016-01-18 14:28:32 +00:00
|
|
|
|
|
|
|
Handle<Object> args[] = {
|
|
|
|
isolate->factory()->NewNumber(inputs.arg_d(0)),
|
|
|
|
isolate->factory()->NewNumber(inputs.arg_d(1)),
|
|
|
|
isolate->factory()->NewNumber(inputs.arg_d(2)),
|
|
|
|
isolate->factory()->NewNumber(inputs.arg_d(3)),
|
|
|
|
isolate->factory()->NewNumber(inputs.arg_d(4)),
|
|
|
|
isolate->factory()->NewNumber(inputs.arg_d(5)),
|
|
|
|
isolate->factory()->NewNumber(inputs.arg_d(6)),
|
|
|
|
isolate->factory()->NewNumber(inputs.arg_d(7)),
|
|
|
|
};
|
|
|
|
|
|
|
|
double expected = inputs.arg_d(which);
|
|
|
|
EXPECT_CALL(expected, jsfunc, args, kMaxParams);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-08-11 08:32:47 +00:00
|
|
|
TEST(Run_WASMSelect_0) {
|
|
|
|
CcTest::InitializeVM();
|
|
|
|
RunWASMSelectTest(0);
|
|
|
|
}
|
2016-01-18 14:28:32 +00:00
|
|
|
|
2016-08-11 08:32:47 +00:00
|
|
|
TEST(Run_WASMSelect_1) {
|
|
|
|
CcTest::InitializeVM();
|
|
|
|
RunWASMSelectTest(1);
|
|
|
|
}
|
2016-01-18 14:28:32 +00:00
|
|
|
|
2016-08-11 08:32:47 +00:00
|
|
|
TEST(Run_WASMSelect_2) {
|
|
|
|
CcTest::InitializeVM();
|
|
|
|
RunWASMSelectTest(2);
|
|
|
|
}
|
2016-01-18 14:28:32 +00:00
|
|
|
|
2016-08-11 08:32:47 +00:00
|
|
|
TEST(Run_WASMSelect_3) {
|
|
|
|
CcTest::InitializeVM();
|
|
|
|
RunWASMSelectTest(3);
|
|
|
|
}
|
2016-01-18 14:28:32 +00:00
|
|
|
|
2016-08-11 08:32:47 +00:00
|
|
|
TEST(Run_WASMSelect_4) {
|
|
|
|
CcTest::InitializeVM();
|
|
|
|
RunWASMSelectTest(4);
|
|
|
|
}
|
2016-01-18 14:28:32 +00:00
|
|
|
|
2016-08-11 08:32:47 +00:00
|
|
|
TEST(Run_WASMSelect_5) {
|
|
|
|
CcTest::InitializeVM();
|
|
|
|
RunWASMSelectTest(5);
|
|
|
|
}
|
2016-01-18 14:28:32 +00:00
|
|
|
|
2016-08-11 08:32:47 +00:00
|
|
|
TEST(Run_WASMSelect_6) {
|
|
|
|
CcTest::InitializeVM();
|
|
|
|
RunWASMSelectTest(6);
|
|
|
|
}
|
2016-01-18 14:28:32 +00:00
|
|
|
|
2016-08-11 08:32:47 +00:00
|
|
|
TEST(Run_WASMSelect_7) {
|
|
|
|
CcTest::InitializeVM();
|
|
|
|
RunWASMSelectTest(7);
|
|
|
|
}
|
2016-01-18 14:28:32 +00:00
|
|
|
|
|
|
|
void RunWASMSelectAlignTest(int num_args, int num_params) {
|
|
|
|
PredictableInputValues inputs(0x300);
|
|
|
|
Isolate* isolate = CcTest::InitIsolateOnce();
|
2016-03-29 11:41:19 +00:00
|
|
|
const int kMaxParams = 10;
|
2016-01-18 14:28:32 +00:00
|
|
|
DCHECK_LE(num_args, kMaxParams);
|
2016-12-21 13:43:00 +00:00
|
|
|
ValueType type = kWasmF64;
|
|
|
|
ValueType types[kMaxParams + 1] = {type, type, type, type, type, type,
|
2016-03-29 11:41:19 +00:00
|
|
|
type, type, type, type, type};
|
2016-01-18 14:28:32 +00:00
|
|
|
FunctionSig sig(1, num_params, types);
|
|
|
|
|
|
|
|
for (int which = 0; which < num_params; which++) {
|
2016-12-16 10:13:11 +00:00
|
|
|
WasmRunner<void> r(kExecuteCompiled);
|
|
|
|
WasmFunctionCompiler& t = r.NewFunction(&sig);
|
2016-01-18 14:28:32 +00:00
|
|
|
BUILD(t, WASM_GET_LOCAL(which));
|
2017-08-18 08:21:34 +00:00
|
|
|
Handle<JSFunction> jsfunc = r.builder().WrapCode(t.function_index());
|
2016-01-18 14:28:32 +00:00
|
|
|
|
2016-03-29 11:41:19 +00:00
|
|
|
Handle<Object> args[] = {isolate->factory()->NewNumber(inputs.arg_d(0)),
|
|
|
|
isolate->factory()->NewNumber(inputs.arg_d(1)),
|
|
|
|
isolate->factory()->NewNumber(inputs.arg_d(2)),
|
|
|
|
isolate->factory()->NewNumber(inputs.arg_d(3)),
|
|
|
|
isolate->factory()->NewNumber(inputs.arg_d(4)),
|
|
|
|
isolate->factory()->NewNumber(inputs.arg_d(5)),
|
|
|
|
isolate->factory()->NewNumber(inputs.arg_d(6)),
|
|
|
|
isolate->factory()->NewNumber(inputs.arg_d(7)),
|
|
|
|
isolate->factory()->NewNumber(inputs.arg_d(8)),
|
|
|
|
isolate->factory()->NewNumber(inputs.arg_d(9))};
|
2016-01-18 14:28:32 +00:00
|
|
|
|
|
|
|
double nan = std::numeric_limits<double>::quiet_NaN();
|
|
|
|
double expected = which < num_args ? inputs.arg_d(which) : nan;
|
|
|
|
EXPECT_CALL(expected, jsfunc, args, num_args);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(Run_WASMSelectAlign_0) {
|
2016-08-11 08:32:47 +00:00
|
|
|
CcTest::InitializeVM();
|
2016-01-18 14:28:32 +00:00
|
|
|
RunWASMSelectAlignTest(0, 1);
|
|
|
|
RunWASMSelectAlignTest(0, 2);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(Run_WASMSelectAlign_1) {
|
2016-08-11 08:32:47 +00:00
|
|
|
CcTest::InitializeVM();
|
2016-01-18 14:28:32 +00:00
|
|
|
RunWASMSelectAlignTest(1, 2);
|
|
|
|
RunWASMSelectAlignTest(1, 3);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(Run_WASMSelectAlign_2) {
|
2016-08-11 08:32:47 +00:00
|
|
|
CcTest::InitializeVM();
|
2016-01-18 14:28:32 +00:00
|
|
|
RunWASMSelectAlignTest(2, 3);
|
|
|
|
RunWASMSelectAlignTest(2, 4);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(Run_WASMSelectAlign_3) {
|
2016-08-11 08:32:47 +00:00
|
|
|
CcTest::InitializeVM();
|
2016-01-18 14:28:32 +00:00
|
|
|
RunWASMSelectAlignTest(3, 3);
|
|
|
|
RunWASMSelectAlignTest(3, 4);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(Run_WASMSelectAlign_4) {
|
2016-08-11 08:32:47 +00:00
|
|
|
CcTest::InitializeVM();
|
2016-01-18 14:28:32 +00:00
|
|
|
RunWASMSelectAlignTest(4, 3);
|
|
|
|
RunWASMSelectAlignTest(4, 4);
|
|
|
|
}
|
|
|
|
|
2016-03-29 11:41:19 +00:00
|
|
|
TEST(Run_WASMSelectAlign_7) {
|
2016-08-11 08:32:47 +00:00
|
|
|
CcTest::InitializeVM();
|
2016-03-29 11:41:19 +00:00
|
|
|
RunWASMSelectAlignTest(7, 5);
|
|
|
|
RunWASMSelectAlignTest(7, 6);
|
|
|
|
RunWASMSelectAlignTest(7, 7);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(Run_WASMSelectAlign_8) {
|
2016-08-11 08:32:47 +00:00
|
|
|
CcTest::InitializeVM();
|
2016-03-29 11:41:19 +00:00
|
|
|
RunWASMSelectAlignTest(8, 5);
|
|
|
|
RunWASMSelectAlignTest(8, 6);
|
|
|
|
RunWASMSelectAlignTest(8, 7);
|
|
|
|
RunWASMSelectAlignTest(8, 8);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(Run_WASMSelectAlign_9) {
|
2016-08-11 08:32:47 +00:00
|
|
|
CcTest::InitializeVM();
|
2016-03-29 11:41:19 +00:00
|
|
|
RunWASMSelectAlignTest(9, 6);
|
|
|
|
RunWASMSelectAlignTest(9, 7);
|
|
|
|
RunWASMSelectAlignTest(9, 8);
|
|
|
|
RunWASMSelectAlignTest(9, 9);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(Run_WASMSelectAlign_10) {
|
2016-08-11 08:32:47 +00:00
|
|
|
CcTest::InitializeVM();
|
2016-03-29 11:41:19 +00:00
|
|
|
RunWASMSelectAlignTest(10, 7);
|
|
|
|
RunWASMSelectAlignTest(10, 8);
|
|
|
|
RunWASMSelectAlignTest(10, 9);
|
|
|
|
RunWASMSelectAlignTest(10, 10);
|
|
|
|
}
|
2016-01-18 14:28:32 +00:00
|
|
|
|
|
|
|
void RunJSSelectAlignTest(int num_args, int num_params) {
|
|
|
|
PredictableInputValues inputs(0x400);
|
|
|
|
Isolate* isolate = CcTest::InitIsolateOnce();
|
|
|
|
Factory* factory = isolate->factory();
|
2016-03-29 11:41:19 +00:00
|
|
|
const int kMaxParams = 10;
|
2016-01-18 14:28:32 +00:00
|
|
|
CHECK_LE(num_args, kMaxParams);
|
|
|
|
CHECK_LE(num_params, kMaxParams);
|
2016-12-21 13:43:00 +00:00
|
|
|
ValueType type = kWasmF64;
|
|
|
|
ValueType types[kMaxParams + 1] = {type, type, type, type, type, type,
|
2016-03-29 11:41:19 +00:00
|
|
|
type, type, type, type, type};
|
2016-01-18 14:28:32 +00:00
|
|
|
FunctionSig sig(1, num_params, types);
|
2016-12-16 10:13:11 +00:00
|
|
|
i::AccountingAllocator allocator;
|
|
|
|
Zone zone(&allocator, ZONE_NAME);
|
2016-01-18 14:28:32 +00:00
|
|
|
|
|
|
|
// Build the calling code.
|
|
|
|
std::vector<byte> code;
|
|
|
|
|
|
|
|
for (int i = 0; i < num_params; i++) {
|
|
|
|
ADD_CODE(code, WASM_GET_LOCAL(i));
|
|
|
|
}
|
|
|
|
|
2016-12-16 10:13:11 +00:00
|
|
|
uint8_t predicted_js_index = 1;
|
|
|
|
ADD_CODE(code, kExprCallFunction, predicted_js_index);
|
2016-04-29 09:15:26 +00:00
|
|
|
|
2016-01-18 14:28:32 +00:00
|
|
|
size_t end = code.size();
|
|
|
|
code.push_back(0);
|
|
|
|
|
|
|
|
// Call different select JS functions.
|
|
|
|
for (int which = 0; which < num_params; which++) {
|
2016-12-16 10:13:11 +00:00
|
|
|
WasmRunner<void> r(kExecuteCompiled);
|
2017-08-18 08:21:34 +00:00
|
|
|
uint32_t js_index = AddJSSelector(&r.builder(), &sig, which);
|
2016-12-16 10:13:11 +00:00
|
|
|
CHECK_EQ(predicted_js_index, js_index);
|
|
|
|
WasmFunctionCompiler& t = r.NewFunction(&sig);
|
2016-01-18 14:28:32 +00:00
|
|
|
t.Build(&code[0], &code[end]);
|
|
|
|
|
2017-08-18 08:21:34 +00:00
|
|
|
Handle<JSFunction> jsfunc = r.builder().WrapCode(t.function_index());
|
2016-01-18 14:28:32 +00:00
|
|
|
|
|
|
|
Handle<Object> args[] = {
|
|
|
|
factory->NewNumber(inputs.arg_d(0)),
|
|
|
|
factory->NewNumber(inputs.arg_d(1)),
|
|
|
|
factory->NewNumber(inputs.arg_d(2)),
|
|
|
|
factory->NewNumber(inputs.arg_d(3)),
|
2016-03-29 11:41:19 +00:00
|
|
|
factory->NewNumber(inputs.arg_d(4)),
|
|
|
|
factory->NewNumber(inputs.arg_d(5)),
|
|
|
|
factory->NewNumber(inputs.arg_d(6)),
|
|
|
|
factory->NewNumber(inputs.arg_d(7)),
|
|
|
|
factory->NewNumber(inputs.arg_d(8)),
|
|
|
|
factory->NewNumber(inputs.arg_d(9)),
|
2016-01-18 14:28:32 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
double nan = std::numeric_limits<double>::quiet_NaN();
|
|
|
|
double expected = which < num_args ? inputs.arg_d(which) : nan;
|
|
|
|
EXPECT_CALL(expected, jsfunc, args, num_args);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(Run_JSSelectAlign_0) {
|
2016-08-11 08:32:47 +00:00
|
|
|
CcTest::InitializeVM();
|
2016-01-18 14:28:32 +00:00
|
|
|
RunJSSelectAlignTest(0, 1);
|
|
|
|
RunJSSelectAlignTest(0, 2);
|
|
|
|
}
|
|
|
|
|
2016-03-29 11:41:19 +00:00
|
|
|
TEST(Run_JSSelectAlign_1) {
|
2016-08-11 08:32:47 +00:00
|
|
|
CcTest::InitializeVM();
|
2016-03-29 11:41:19 +00:00
|
|
|
RunJSSelectAlignTest(1, 2);
|
|
|
|
RunJSSelectAlignTest(1, 3);
|
|
|
|
}
|
2016-01-18 14:28:32 +00:00
|
|
|
|
|
|
|
TEST(Run_JSSelectAlign_2) {
|
2016-08-11 08:32:47 +00:00
|
|
|
CcTest::InitializeVM();
|
2016-01-18 14:28:32 +00:00
|
|
|
RunJSSelectAlignTest(2, 3);
|
|
|
|
RunJSSelectAlignTest(2, 4);
|
|
|
|
}
|
|
|
|
|
2016-03-29 11:41:19 +00:00
|
|
|
TEST(Run_JSSelectAlign_3) {
|
2016-08-11 08:32:47 +00:00
|
|
|
CcTest::InitializeVM();
|
2016-03-29 11:41:19 +00:00
|
|
|
RunJSSelectAlignTest(3, 3);
|
|
|
|
RunJSSelectAlignTest(3, 4);
|
|
|
|
}
|
2016-01-18 14:28:32 +00:00
|
|
|
|
|
|
|
TEST(Run_JSSelectAlign_4) {
|
2016-08-11 08:32:47 +00:00
|
|
|
CcTest::InitializeVM();
|
2016-01-18 14:28:32 +00:00
|
|
|
RunJSSelectAlignTest(4, 3);
|
|
|
|
RunJSSelectAlignTest(4, 4);
|
|
|
|
}
|
|
|
|
|
2016-03-29 11:41:19 +00:00
|
|
|
TEST(Run_JSSelectAlign_7) {
|
2016-08-11 08:32:47 +00:00
|
|
|
CcTest::InitializeVM();
|
2016-03-29 11:41:19 +00:00
|
|
|
RunJSSelectAlignTest(7, 3);
|
|
|
|
RunJSSelectAlignTest(7, 4);
|
|
|
|
RunJSSelectAlignTest(7, 4);
|
|
|
|
RunJSSelectAlignTest(7, 4);
|
|
|
|
}
|
2016-01-18 14:28:32 +00:00
|
|
|
|
2016-03-29 11:41:19 +00:00
|
|
|
TEST(Run_JSSelectAlign_8) {
|
2016-08-11 08:32:47 +00:00
|
|
|
CcTest::InitializeVM();
|
2016-03-29 11:41:19 +00:00
|
|
|
RunJSSelectAlignTest(8, 5);
|
|
|
|
RunJSSelectAlignTest(8, 6);
|
|
|
|
RunJSSelectAlignTest(8, 7);
|
|
|
|
RunJSSelectAlignTest(8, 8);
|
2016-01-18 14:28:32 +00:00
|
|
|
}
|
|
|
|
|
2016-03-29 11:41:19 +00:00
|
|
|
TEST(Run_JSSelectAlign_9) {
|
2016-08-11 08:32:47 +00:00
|
|
|
CcTest::InitializeVM();
|
2016-03-29 11:41:19 +00:00
|
|
|
RunJSSelectAlignTest(9, 6);
|
|
|
|
RunJSSelectAlignTest(9, 7);
|
|
|
|
RunJSSelectAlignTest(9, 8);
|
|
|
|
RunJSSelectAlignTest(9, 9);
|
|
|
|
}
|
2016-01-18 14:28:32 +00:00
|
|
|
|
2016-03-29 11:41:19 +00:00
|
|
|
TEST(Run_JSSelectAlign_10) {
|
2016-08-11 08:32:47 +00:00
|
|
|
CcTest::InitializeVM();
|
2016-03-29 11:41:19 +00:00
|
|
|
RunJSSelectAlignTest(10, 7);
|
|
|
|
RunJSSelectAlignTest(10, 8);
|
|
|
|
RunJSSelectAlignTest(10, 9);
|
|
|
|
RunJSSelectAlignTest(10, 10);
|
2016-01-18 14:28:32 +00:00
|
|
|
}
|