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 |
index 0e2ed1b0fe2e377a2e5ff09b39af4c9bb93424ab..3b30e56076a57854f81040c8eb04b560fac35552 100644 |
--- a/test/cctest/wasm/test-run-wasm-module.cc |
+++ b/test/cctest/wasm/test-run-wasm-module.cc |
@@ -429,3 +429,94 @@ TEST(Run_WasmModule_GrowMemOobVariableIndex) { |
CHECK(try_catch.HasCaught()); |
isolate->clear_pending_exception(); |
} |
+ |
+TEST(Run_WasmModule_Global_init) { |
+ v8::internal::AccountingAllocator allocator; |
+ Zone zone(&allocator); |
+ TestSignatures sigs; |
+ |
+ WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone); |
+ uint32_t global1 = |
+ builder->AddGlobal(kAstI32, false, false, WasmInitExpr(777777)); |
+ uint32_t global2 = |
+ builder->AddGlobal(kAstI32, false, false, WasmInitExpr(222222)); |
+ WasmFunctionBuilder* f1 = builder->AddFunction(sigs.i_v()); |
+ byte code[] = { |
+ WASM_I32_ADD(WASM_GET_GLOBAL(global1), WASM_GET_GLOBAL(global2))}; |
+ f1->EmitCode(code, sizeof(code)); |
+ ExportAsMain(f1); |
+ TestModule(&zone, builder, 999999); |
+} |
+ |
+template <typename CType> |
+static void RunWasmModuleGlobalInitTest(LocalType type, CType expected) { |
+ v8::internal::AccountingAllocator allocator; |
+ Zone zone(&allocator); |
+ TestSignatures sigs; |
+ |
+ LocalType types[] = {type}; |
+ FunctionSig sig(1, 0, types); |
+ |
+ for (int padding = 0; padding < 5; padding++) { |
+ // Test with a simple initializer |
+ WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone); |
+ |
+ for (int i = 0; i < padding; i++) { // pad global before |
+ builder->AddGlobal(kAstI32, false, false, WasmInitExpr(i + 20000)); |
+ } |
+ uint32_t global = |
+ builder->AddGlobal(type, false, false, WasmInitExpr(expected)); |
+ for (int i = 0; i < padding; i++) { // pad global after |
+ builder->AddGlobal(kAstI32, false, false, WasmInitExpr(i + 30000)); |
+ } |
+ |
+ WasmFunctionBuilder* f1 = builder->AddFunction(&sig); |
+ byte code[] = {WASM_GET_GLOBAL(global)}; |
+ f1->EmitCode(code, sizeof(code)); |
+ ExportAsMain(f1); |
+ TestModule(&zone, builder, expected); |
+ } |
+ |
+ for (int padding = 0; padding < 5; padding++) { |
+ // Test with a global index |
+ WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone); |
+ for (int i = 0; i < padding; i++) { // pad global before |
+ builder->AddGlobal(kAstI32, false, false, WasmInitExpr(i + 40000)); |
+ } |
+ |
+ uint32_t global1 = |
+ builder->AddGlobal(type, false, false, WasmInitExpr(expected)); |
+ |
+ for (int i = 0; i < padding; i++) { // pad global middle |
+ builder->AddGlobal(kAstI32, false, false, WasmInitExpr(i + 50000)); |
+ } |
+ |
+ uint32_t global2 = builder->AddGlobal( |
+ type, false, false, WasmInitExpr(WasmInitExpr::kGlobalIndex, global1)); |
+ |
+ for (int i = 0; i < padding; i++) { // pad global after |
+ builder->AddGlobal(kAstI32, false, false, WasmInitExpr(i + 60000)); |
+ } |
+ |
+ WasmFunctionBuilder* f1 = builder->AddFunction(&sig); |
+ byte code[] = {WASM_GET_GLOBAL(global2)}; |
+ f1->EmitCode(code, sizeof(code)); |
+ ExportAsMain(f1); |
+ TestModule(&zone, builder, expected); |
+ } |
+} |
+ |
+TEST(Run_WasmModule_Global_i32) { |
+ RunWasmModuleGlobalInitTest<int32_t>(kAstI32, -983489); |
+ RunWasmModuleGlobalInitTest<int32_t>(kAstI32, 11223344); |
+} |
+ |
+TEST(Run_WasmModule_Global_f32) { |
+ RunWasmModuleGlobalInitTest<float>(kAstF32, -983.9f); |
+ RunWasmModuleGlobalInitTest<float>(kAstF32, 1122.99f); |
+} |
+ |
+TEST(Run_WasmModule_Global_f64) { |
+ RunWasmModuleGlobalInitTest<double>(kAstF64, -833.9); |
+ RunWasmModuleGlobalInitTest<double>(kAstF64, 86374.25); |
+} |