Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/cctest/wasm/test-wasm-interpreter-entry.cc')
-rw-r--r--deps/v8/test/cctest/wasm/test-wasm-interpreter-entry.cc260
1 files changed, 0 insertions, 260 deletions
diff --git a/deps/v8/test/cctest/wasm/test-wasm-interpreter-entry.cc b/deps/v8/test/cctest/wasm/test-wasm-interpreter-entry.cc
deleted file mode 100644
index 75e927fafe1..00000000000
--- a/deps/v8/test/cctest/wasm/test-wasm-interpreter-entry.cc
+++ /dev/null
@@ -1,260 +0,0 @@
-// 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.
-
-#include <cstdint>
-
-#include "src/base/overflowing-math.h"
-#include "src/codegen/assembler-inl.h"
-#include "src/objects/objects-inl.h"
-#include "src/wasm/wasm-objects.h"
-#include "test/cctest/cctest.h"
-#include "test/cctest/compiler/value-helper.h"
-#include "test/cctest/wasm/wasm-run-utils.h"
-#include "test/common/wasm/wasm-macro-gen.h"
-
-namespace v8 {
-namespace internal {
-namespace wasm {
-
-/**
- * We test the interface from Wasm compiled code to the Wasm interpreter by
- * building a module with two functions. The external function is called from
- * this test, and will be compiled code. It takes its arguments and passes them
- * on to the internal function, which will be redirected to the interpreter.
- * If the internal function has an i64 parameter, is has to be replaced by two
- * i32 parameters on the external function.
- * The internal function just converts all its arguments to f64, sums them up
- * and returns the sum.
- */
-namespace {
-
-template <typename T>
-class ArgPassingHelper {
- public:
- ArgPassingHelper(WasmRunnerBase* runner, WasmFunctionCompiler* inner_compiler,
- std::initializer_list<uint8_t> bytes_inner_function,
- std::initializer_list<uint8_t> bytes_outer_function,
- const T& expected_lambda)
- : isolate_(runner->main_isolate()),
- expected_lambda_(expected_lambda),
- debug_info_(WasmInstanceObject::GetOrCreateDebugInfo(
- runner->builder().instance_object())) {
- std::vector<uint8_t> inner_code{bytes_inner_function};
- inner_compiler->Build(inner_code.data(),
- inner_code.data() + inner_code.size());
-
- std::vector<uint8_t> outer_code{bytes_outer_function};
- runner->Build(outer_code.data(), outer_code.data() + outer_code.size());
-
- int funcs_to_redict[] = {
- static_cast<int>(inner_compiler->function_index())};
- runner->builder().SetExecutable();
- WasmDebugInfo::RedirectToInterpreter(debug_info_,
- ArrayVector(funcs_to_redict));
- main_fun_wrapper_ = runner->builder().WrapCode(runner->function_index());
- }
-
- template <typename... Args>
- void CheckCall(Args... args) {
- Handle<Object> arg_objs[] = {isolate_->factory()->NewNumber(args)...};
-
- uint64_t num_interpreted_before = debug_info_->NumInterpretedCalls();
- Handle<Object> global(isolate_->context().global_object(), isolate_);
- MaybeHandle<Object> retval = Execution::Call(
- isolate_, main_fun_wrapper_, global, arraysize(arg_objs), arg_objs);
- uint64_t num_interpreted_after = debug_info_->NumInterpretedCalls();
- // Check that we really went through the interpreter.
- CHECK_EQ(num_interpreted_before + 1, num_interpreted_after);
- // Check the result.
- double result = retval.ToHandleChecked()->Number();
- double expected = expected_lambda_(args...);
- CHECK_DOUBLE_EQ(expected, result);
- }
-
- private:
- Isolate* isolate_;
- T expected_lambda_;
- Handle<WasmDebugInfo> debug_info_;
- Handle<JSFunction> main_fun_wrapper_;
-};
-
-template <typename T>
-static ArgPassingHelper<T> GetHelper(
- WasmRunnerBase* runner, WasmFunctionCompiler* inner_compiler,
- std::initializer_list<uint8_t> bytes_inner_function,
- std::initializer_list<uint8_t> bytes_outer_function,
- const T& expected_lambda) {
- return ArgPassingHelper<T>(runner, inner_compiler, bytes_inner_function,
- bytes_outer_function, expected_lambda);
-}
-
-} // namespace
-
-// Pass int32_t, return int32_t.
-TEST(TestArgumentPassing_int32) {
- WasmRunner<int32_t, int32_t> runner(ExecutionTier::kTurbofan);
- WasmFunctionCompiler& f2 = runner.NewFunction<int32_t, int32_t>();
-
- auto helper = GetHelper(
- &runner, &f2,
- {// Return 2*<0> + 1.
- WASM_I32_ADD(WASM_I32_MUL(WASM_I32V_1(2), WASM_GET_LOCAL(0)), WASM_ONE)},
- {// Call f2 with param <0>.
- WASM_GET_LOCAL(0), WASM_CALL_FUNCTION0(f2.function_index())},
- [](int32_t a) {
- return base::AddWithWraparound(base::MulWithWraparound(2, a), 1);
- });
-
- FOR_INT32_INPUTS(v) { helper.CheckCall(v); }
-}
-
-// Pass int64_t, return double.
-TEST(TestArgumentPassing_double_int64) {
- WasmRunner<double, int32_t, int32_t> runner(ExecutionTier::kTurbofan);
- WasmFunctionCompiler& f2 = runner.NewFunction<double, int64_t>();
-
- auto helper = GetHelper(
- &runner, &f2,
- {// Return (double)<0>.
- WASM_F64_SCONVERT_I64(WASM_GET_LOCAL(0))},
- {// Call f2 with param (<0> | (<1> << 32)).
- WASM_I64_IOR(WASM_I64_UCONVERT_I32(WASM_GET_LOCAL(0)),
- WASM_I64_SHL(WASM_I64_UCONVERT_I32(WASM_GET_LOCAL(1)),
- WASM_I64V_1(32))),
- WASM_CALL_FUNCTION0(f2.function_index())},
- [](int32_t a, int32_t b) {
- int64_t a64 = static_cast<int64_t>(a) & 0xFFFFFFFF;
- int64_t b64 = static_cast<uint64_t>(static_cast<int64_t>(b)) << 32;
- return static_cast<double>(a64 | b64);
- });
-
- FOR_INT32_INPUTS(v1) {
- FOR_INT32_INPUTS(v2) { helper.CheckCall(v1, v2); }
- }
-
- FOR_INT64_INPUTS(v) {
- int32_t v1 = static_cast<int32_t>(v);
- int32_t v2 = static_cast<int32_t>(v >> 32);
- helper.CheckCall(v1, v2);
- helper.CheckCall(v2, v1);
- }
-}
-
-// Pass double, return int64_t.
-TEST(TestArgumentPassing_int64_double) {
- // Outer function still returns double.
- WasmRunner<double, double> runner(ExecutionTier::kTurbofan);
- WasmFunctionCompiler& f2 = runner.NewFunction<int64_t, double>();
-
- auto helper = GetHelper(
- &runner, &f2,
- {// Return (int64_t)<0>.
- WASM_I64_SCONVERT_F64(WASM_GET_LOCAL(0))},
- {// Call f2 with param <0>, convert returned value back to double.
- WASM_F64_SCONVERT_I64(WASM_SEQ(
- WASM_GET_LOCAL(0), WASM_CALL_FUNCTION0(f2.function_index())))},
- [](double d) { return d; });
-
- for (int64_t i : compiler::ValueHelper::int64_vector()) {
- helper.CheckCall(i);
- }
-}
-
-// Pass float, return double.
-TEST(TestArgumentPassing_float_double) {
- WasmRunner<double, float> runner(ExecutionTier::kTurbofan);
- WasmFunctionCompiler& f2 = runner.NewFunction<double, float>();
-
- auto helper = GetHelper(
- &runner, &f2,
- {// Return 2*(double)<0> + 1.
- WASM_F64_ADD(
- WASM_F64_MUL(WASM_F64(2), WASM_F64_CONVERT_F32(WASM_GET_LOCAL(0))),
- WASM_F64(1))},
- {// Call f2 with param <0>.
- WASM_GET_LOCAL(0), WASM_CALL_FUNCTION0(f2.function_index())},
- [](float f) { return 2. * static_cast<double>(f) + 1.; });
-
- FOR_FLOAT32_INPUTS(f) { helper.CheckCall(f); }
-}
-
-// Pass two doubles, return double.
-TEST(TestArgumentPassing_double_double) {
- WasmRunner<double, double, double> runner(ExecutionTier::kTurbofan);
- WasmFunctionCompiler& f2 = runner.NewFunction<double, double, double>();
-
- auto helper = GetHelper(&runner, &f2,
- {// Return <0> + <1>.
- WASM_F64_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))},
- {// Call f2 with params <0>, <1>.
- WASM_GET_LOCAL(0), WASM_GET_LOCAL(1),
- WASM_CALL_FUNCTION0(f2.function_index())},
- [](double a, double b) { return a + b; });
-
- FOR_FLOAT64_INPUTS(d1) {
- FOR_FLOAT64_INPUTS(d2) { helper.CheckCall(d1, d2); }
- }
-}
-
-// Pass int32_t, int64_t, float and double, return double.
-TEST(TestArgumentPassing_AllTypes) {
- // The second and third argument will be combined to an i64.
- WasmRunner<double, int32_t, int32_t, int32_t, float, double> runner(
- ExecutionTier::kTurbofan);
- WasmFunctionCompiler& f2 =
- runner.NewFunction<double, int32_t, int64_t, float, double>();
-
- auto helper = GetHelper(
- &runner, &f2,
- {
- // Convert all arguments to double, add them and return the sum.
- WASM_F64_ADD( // <0+1+2> + <3>
- WASM_F64_ADD( // <0+1> + <2>
- WASM_F64_ADD( // <0> + <1>
- WASM_F64_SCONVERT_I32(
- WASM_GET_LOCAL(0)), // <0> to double
- WASM_F64_SCONVERT_I64(
- WASM_GET_LOCAL(1))), // <1> to double
- WASM_F64_CONVERT_F32(WASM_GET_LOCAL(2))), // <2> to double
- WASM_GET_LOCAL(3)) // <3>
- },
- {WASM_GET_LOCAL(0), // first arg
- WASM_I64_IOR(WASM_I64_UCONVERT_I32(WASM_GET_LOCAL(1)), // second arg
- WASM_I64_SHL(WASM_I64_UCONVERT_I32(WASM_GET_LOCAL(2)),
- WASM_I64V_1(32))),
- WASM_GET_LOCAL(3), // third arg
- WASM_GET_LOCAL(4), // fourth arg
- WASM_CALL_FUNCTION0(f2.function_index())},
- [](int32_t a, int32_t b, int32_t c, float d, double e) {
- return 0. + a + (static_cast<int64_t>(b) & 0xFFFFFFFF) +
- ((static_cast<int64_t>(c) & 0xFFFFFFFF) << 32) + d + e;
- });
-
- auto CheckCall = [&](int32_t a, int64_t b, float c, double d) {
- int32_t b0 = static_cast<int32_t>(b);
- int32_t b1 = static_cast<int32_t>(b >> 32);
- helper.CheckCall(a, b0, b1, c, d);
- helper.CheckCall(a, b1, b0, c, d);
- };
-
- Vector<const int32_t> test_values_i32 = compiler::ValueHelper::int32_vector();
- Vector<const int64_t> test_values_i64 = compiler::ValueHelper::int64_vector();
- Vector<const float> test_values_f32 = compiler::ValueHelper::float32_vector();
- Vector<const double> test_values_f64 =
- compiler::ValueHelper::float64_vector();
- size_t max_len =
- std::max(std::max(test_values_i32.size(), test_values_i64.size()),
- std::max(test_values_f32.size(), test_values_f64.size()));
- for (size_t i = 0; i < max_len; ++i) {
- int32_t i32 = test_values_i32[i % test_values_i32.size()];
- int64_t i64 = test_values_i64[i % test_values_i64.size()];
- float f32 = test_values_f32[i % test_values_f32.size()];
- double f64 = test_values_f64[i % test_values_f64.size()];
- CheckCall(i32, i64, f32, f64);
- }
-}
-
-} // namespace wasm
-} // namespace internal
-} // namespace v8