Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1225)

Unified Diff: test/cctest/wasm/test-run-wasm-module.cc

Issue 1504713014: Initial import of v8-native WASM. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « test/cctest/wasm/test-run-wasm.cc ('k') | test/cctest/wasm/test-signatures.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/cctest/wasm/test-run-wasm-module.cc
diff --git a/test/cctest/wasm/test-run-wasm-module.cc b/test/cctest/wasm/test-run-wasm-module.cc
new file mode 100644
index 0000000000000000000000000000000000000000..98ae9a9c4c988dbc2b19b34e81ba530b045407e1
--- /dev/null
+++ b/test/cctest/wasm/test-run-wasm-module.cc
@@ -0,0 +1,183 @@
+// 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 <stdlib.h>
+#include <string.h>
+
+#include "src/wasm/encoder.h"
+#include "src/wasm/wasm-macro-gen.h"
+#include "src/wasm/wasm-module.h"
+#include "src/wasm/wasm-opcodes.h"
+
+#include "test/cctest/cctest.h"
+
+using namespace v8::base;
+using namespace v8::internal;
+using namespace v8::internal::compiler;
+using namespace v8::internal::wasm;
+
+
+namespace {
+void TestModule(WasmModuleIndex* module, int32_t expected_result) {
+ Isolate* isolate = CcTest::InitIsolateOnce();
+ int32_t result =
+ CompileAndRunWasmModule(isolate, module->Begin(), module->End());
+ CHECK_EQ(expected_result, result);
+}
+} // namespace
+
+
+// A raw test that skips the WasmModuleBuilder.
+TEST(Run_WasmModule_CallAdd_rev) {
+ static const byte data[] = {
+ // sig#0 ------------------------------------------
+ kDeclSignatures, 2, 0, kLocalI32, // void -> int
+ 2, kLocalI32, kLocalI32, kLocalI32, // int,int -> int
+ // func#0 (main) ----------------------------------
+ kDeclFunctions, 2, kDeclFunctionExport, 0, 0, // sig index
+ 6, 0, // body size
+ kExprCallFunction, 1, // --
+ kExprI8Const, 77, // --
+ kExprI8Const, 22, // --
+ // func#1 -----------------------------------------
+ 0, // no name, not exported
+ 1, 0, // sig index
+ 5, 0, // body size
+ kExprI32Add, // --
+ kExprGetLocal, 0, // --
+ kExprGetLocal, 1, // --
+ };
+
+ Isolate* isolate = CcTest::InitIsolateOnce();
+ int32_t result =
+ CompileAndRunWasmModule(isolate, data, data + arraysize(data));
+ CHECK_EQ(99, result);
+}
+
+
+TEST(Run_WasmModule_Return114) {
+ static const int32_t kReturnValue = 114;
+ Zone zone;
+ WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
+ uint16_t f_index = builder->AddFunction();
+ WasmFunctionBuilder* f = builder->FunctionAt(f_index);
+ f->ReturnType(kAstI32);
+ f->Exported(1);
+ byte code[] = {WASM_I8(kReturnValue)};
+ f->EmitCode(code, sizeof(code));
+ WasmModuleWriter* writer = builder->Build(&zone);
+ TestModule(writer->WriteTo(&zone), kReturnValue);
+}
+
+
+TEST(Run_WasmModule_CallAdd) {
+ Zone zone;
+ WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
+ uint16_t f1_index = builder->AddFunction();
+ WasmFunctionBuilder* f = builder->FunctionAt(f1_index);
+ f->ReturnType(kAstI32);
+ uint16_t param1 = f->AddParam(kAstI32);
+ uint16_t param2 = f->AddParam(kAstI32);
+ byte code1[] = {WASM_I32_ADD(WASM_GET_LOCAL(param1), WASM_GET_LOCAL(param2))};
+ uint32_t local_indices1[] = {2, 4};
+ f->EmitCode(code1, sizeof(code1), local_indices1, sizeof(local_indices1) / 4);
+ uint16_t f2_index = builder->AddFunction();
+ f = builder->FunctionAt(f2_index);
+ f->ReturnType(kAstI32);
+ f->Exported(1);
+ byte code2[] = {WASM_CALL_FUNCTION(f1_index, WASM_I8(77), WASM_I8(22))};
+ f->EmitCode(code2, sizeof(code2));
+ WasmModuleWriter* writer = builder->Build(&zone);
+ TestModule(writer->WriteTo(&zone), 99);
+}
+
+
+TEST(Run_WasmModule_ReadLoadedDataSegment) {
+ static const byte kDataSegmentDest0 = 12;
+ Zone zone;
+ WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
+ uint16_t f_index = builder->AddFunction();
+ WasmFunctionBuilder* f = builder->FunctionAt(f_index);
+ f->ReturnType(kAstI32);
+ f->Exported(1);
+ byte code[] = {
+ WASM_LOAD_MEM(MachineType::Int32(), WASM_I8(kDataSegmentDest0))};
+ f->EmitCode(code, sizeof(code));
+ byte data[] = {0xaa, 0xbb, 0xcc, 0xdd};
+ builder->AddDataSegment(new (&zone) WasmDataSegmentEncoder(
+ &zone, data, sizeof(data), kDataSegmentDest0));
+ WasmModuleWriter* writer = builder->Build(&zone);
+ TestModule(writer->WriteTo(&zone), 0xddccbbaa);
+}
+
+
+TEST(Run_WasmModule_CheckMemoryIsZero) {
+ static const int kCheckSize = 16 * 1024;
+ Zone zone;
+ WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
+ uint16_t f_index = builder->AddFunction();
+ WasmFunctionBuilder* f = builder->FunctionAt(f_index);
+ f->ReturnType(kAstI32);
+ uint16_t localIndex = f->AddLocal(kAstI32);
+ f->Exported(1);
+ byte code[] = {WASM_BLOCK(
+ 2,
+ WASM_WHILE(
+ WASM_I32_LTS(WASM_GET_LOCAL(localIndex), WASM_I32(kCheckSize)),
+ WASM_IF_ELSE(
+ WASM_LOAD_MEM(MachineType::Int32(), WASM_GET_LOCAL(localIndex)),
+ WASM_BRV(2, WASM_I8(-1)), WASM_INC_LOCAL_BY(localIndex, 4))),
+ WASM_I8(11))};
+ uint32_t local_indices[] = {7, 19, 25, 28};
+ f->EmitCode(code, sizeof(code), local_indices, sizeof(local_indices) / 4);
+ WasmModuleWriter* writer = builder->Build(&zone);
+ TestModule(writer->WriteTo(&zone), 11);
+}
+
+
+TEST(Run_WasmModule_CallMain_recursive) {
+ Zone zone;
+ WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
+ uint16_t f_index = builder->AddFunction();
+ WasmFunctionBuilder* f = builder->FunctionAt(f_index);
+ f->ReturnType(kAstI32);
+ uint16_t localIndex = f->AddLocal(kAstI32);
+ f->Exported(1);
+ byte code[] = {WASM_BLOCK(
+ 2, WASM_SET_LOCAL(localIndex,
+ WASM_LOAD_MEM(MachineType::Int32(), WASM_ZERO)),
+ WASM_IF_ELSE(WASM_I32_LTS(WASM_GET_LOCAL(localIndex), WASM_I8(5)),
+ WASM_BLOCK(2, WASM_STORE_MEM(MachineType::Int32(), WASM_ZERO,
+ WASM_INC_LOCAL(localIndex)),
+ WASM_BRV(1, WASM_CALL_FUNCTION0(0))),
+ WASM_BRV(0, WASM_I8(55))))};
+ uint32_t local_indices[] = {3, 11, 21, 24};
+ f->EmitCode(code, sizeof(code), local_indices, sizeof(local_indices) / 4);
+ WasmModuleWriter* writer = builder->Build(&zone);
+ TestModule(writer->WriteTo(&zone), 55);
+}
+
+
+TEST(Run_WasmModule_Global) {
+ Zone zone;
+ WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
+ uint32_t global1 = builder->AddGlobal(MachineType::Int32(), 0);
+ uint32_t global2 = builder->AddGlobal(MachineType::Int32(), 0);
+ uint16_t f1_index = builder->AddFunction();
+ WasmFunctionBuilder* f = builder->FunctionAt(f1_index);
+ f->ReturnType(kAstI32);
+ byte code1[] = {
+ WASM_I32_ADD(WASM_LOAD_GLOBAL(global1), WASM_LOAD_GLOBAL(global2))};
+ f->EmitCode(code1, sizeof(code1));
+ uint16_t f2_index = builder->AddFunction();
+ f = builder->FunctionAt(f2_index);
+ f->ReturnType(kAstI32);
+ f->Exported(1);
+ byte code2[] = {WASM_STORE_GLOBAL(global1, WASM_I32(56)),
+ WASM_STORE_GLOBAL(global2, WASM_I32(41)),
+ WASM_RETURN(WASM_CALL_FUNCTION0(f1_index))};
+ f->EmitCode(code2, sizeof(code2));
+ WasmModuleWriter* writer = builder->Build(&zone);
+ TestModule(writer->WriteTo(&zone), 97);
+}
« no previous file with comments | « test/cctest/wasm/test-run-wasm.cc ('k') | test/cctest/wasm/test-signatures.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698