| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stdint.h> | 5 #include <stdint.h> |
| 6 #include <stdlib.h> | 6 #include <stdlib.h> |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include "src/base/utils/random-number-generator.h" | 9 #include "src/base/utils/random-number-generator.h" |
| 10 | 10 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 class TestingModule : public ModuleEnv { | 64 class TestingModule : public ModuleEnv { |
| 65 public: | 65 public: |
| 66 TestingModule() : mem_size(0), global_offset(0) { | 66 TestingModule() : mem_size(0), global_offset(0) { |
| 67 globals_area = 0; | 67 globals_area = 0; |
| 68 mem_start = 0; | 68 mem_start = 0; |
| 69 mem_end = 0; | 69 mem_end = 0; |
| 70 module = nullptr; | 70 module = nullptr; |
| 71 linker = nullptr; | 71 linker = nullptr; |
| 72 function_code = nullptr; | 72 function_code = nullptr; |
| 73 asm_js = false; | 73 asm_js = false; |
| 74 memset(global_data, 0, sizeof(global_data)); |
| 74 } | 75 } |
| 75 | 76 |
| 76 ~TestingModule() { | 77 ~TestingModule() { |
| 77 if (mem_start) { | 78 if (mem_start) { |
| 78 free(raw_mem_start<byte>()); | 79 free(raw_mem_start<byte>()); |
| 79 } | 80 } |
| 80 if (function_code) delete function_code; | 81 if (function_code) delete function_code; |
| 81 if (module) delete module; | 82 if (module) delete module; |
| 82 } | 83 } |
| 83 | 84 |
| (...skipping 2034 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2118 BUILD(r, kExprBlock, 2, kExprLoop, 1, kExprIf, kExprGetLocal, 0, kExprBr, 0, | 2119 BUILD(r, kExprBlock, 2, kExprLoop, 1, kExprIf, kExprGetLocal, 0, kExprBr, 0, |
| 2119 kExprIfElse, kExprI32LoadMem, 0, kExprGetLocal, 0, kExprBr, 2, | 2120 kExprIfElse, kExprI32LoadMem, 0, kExprGetLocal, 0, kExprBr, 2, |
| 2120 kExprI8Const, 255, kExprSetLocal, 0, kExprI32Sub, kExprGetLocal, 0, | 2121 kExprI8Const, 255, kExprSetLocal, 0, kExprI32Sub, kExprGetLocal, 0, |
| 2121 kExprI8Const, 4, kExprI8Const, 0); | 2122 kExprI8Const, 4, kExprI8Const, 0); |
| 2122 | 2123 |
| 2123 module.BlankMemory(); | 2124 module.BlankMemory(); |
| 2124 CHECK_EQ(0, r.Call((kNumElems - 1) * 4)); | 2125 CHECK_EQ(0, r.Call((kNumElems - 1) * 4)); |
| 2125 } | 2126 } |
| 2126 | 2127 |
| 2127 | 2128 |
| 2128 // TODO(titzer): Fix for msan and re-enable. | |
| 2129 #if 0 | |
| 2130 | |
| 2131 TEST(Run_Wasm_MemF32_Sum) { | 2129 TEST(Run_Wasm_MemF32_Sum) { |
| 2132 WasmRunner<int32_t> r(MachineType::Int32()); | 2130 WasmRunner<int32_t> r(MachineType::Int32()); |
| 2133 const byte kSum = r.AllocateLocal(kAstF32); | 2131 const byte kSum = r.AllocateLocal(kAstF32); |
| 2134 ModuleEnv module; | |
| 2135 const int kSize = 5; | 2132 const int kSize = 5; |
| 2136 float buffer[kSize] = {-99.25, -888.25, -77.25, 66666.25, 5555.25}; | 2133 TestingModule module; |
| 2137 module.mem_start = reinterpret_cast<uintptr_t>(&buffer); | 2134 module.AddMemoryElems<float>(kSize); |
| 2138 module.mem_end = reinterpret_cast<uintptr_t>(&buffer[kSize]); | 2135 float* buffer = module.raw_mem_start<float>(); |
| 2136 buffer[0] = -99.25; |
| 2137 buffer[1] = -888.25; |
| 2138 buffer[2] = -77.25; |
| 2139 buffer[3] = 66666.25; |
| 2140 buffer[4] = 5555.25; |
| 2139 r.env()->module = &module; | 2141 r.env()->module = &module; |
| 2140 | 2142 |
| 2141 BUILD(r, WASM_BLOCK( | 2143 BUILD(r, WASM_BLOCK( |
| 2142 3, WASM_WHILE( | 2144 3, WASM_WHILE( |
| 2143 WASM_GET_LOCAL(0), | 2145 WASM_GET_LOCAL(0), |
| 2144 WASM_BLOCK( | 2146 WASM_BLOCK( |
| 2145 2, WASM_SET_LOCAL( | 2147 2, WASM_SET_LOCAL( |
| 2146 kSum, WASM_F32_ADD( | 2148 kSum, WASM_F32_ADD( |
| 2147 WASM_GET_LOCAL(kSum), | 2149 WASM_GET_LOCAL(kSum), |
| 2148 WASM_LOAD_MEM(MachineType::Float32(), | 2150 WASM_LOAD_MEM(MachineType::Float32(), |
| 2149 WASM_GET_LOCAL(0)))), | 2151 WASM_GET_LOCAL(0)))), |
| 2150 WASM_SET_LOCAL( | 2152 WASM_SET_LOCAL( |
| 2151 0, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I8(4))))), | 2153 0, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I8(4))))), |
| 2152 WASM_STORE_MEM(MachineType::Float32(), WASM_ZERO, | 2154 WASM_STORE_MEM(MachineType::Float32(), WASM_ZERO, |
| 2153 WASM_GET_LOCAL(kSum)), | 2155 WASM_GET_LOCAL(kSum)), |
| 2154 WASM_GET_LOCAL(0))); | 2156 WASM_GET_LOCAL(0))); |
| 2155 | 2157 |
| 2156 CHECK_EQ(0, r.Call(4 * (kSize - 1))); | 2158 CHECK_EQ(0, r.Call(4 * (kSize - 1))); |
| 2157 CHECK_NE(-99.25, buffer[0]); | 2159 CHECK_NE(-99.25, buffer[0]); |
| 2158 CHECK_EQ(71256.0f, buffer[0]); | 2160 CHECK_EQ(71256.0f, buffer[0]); |
| 2159 } | 2161 } |
| 2160 | 2162 |
| 2161 #endif | |
| 2162 | |
| 2163 | 2163 |
| 2164 #if WASM_64 | 2164 #if WASM_64 |
| 2165 TEST(Run_Wasm_MemI64_Sum) { | 2165 TEST(Run_Wasm_MemI64_Sum) { |
| 2166 WasmRunner<uint64_t> r(MachineType::Int32()); | 2166 WasmRunner<uint64_t> r(MachineType::Int32()); |
| 2167 const int kNumElems = 20; | 2167 const int kNumElems = 20; |
| 2168 const byte kSum = r.AllocateLocal(kAstI64); | 2168 const byte kSum = r.AllocateLocal(kAstI64); |
| 2169 TestingModule module; | 2169 TestingModule module; |
| 2170 uint64_t* memory = module.AddMemoryElems<uint64_t>(kNumElems); | 2170 uint64_t* memory = module.AddMemoryElems<uint64_t>(kNumElems); |
| 2171 r.env()->module = &module; | 2171 r.env()->module = &module; |
| 2172 | 2172 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 2190 for (size_t j = kNumElems - 1; j > 0; j--) { | 2190 for (size_t j = kNumElems - 1; j > 0; j--) { |
| 2191 expected += memory[j]; | 2191 expected += memory[j]; |
| 2192 } | 2192 } |
| 2193 uint64_t result = r.Call(8 * (kNumElems - 1)); | 2193 uint64_t result = r.Call(8 * (kNumElems - 1)); |
| 2194 CHECK_EQ(expected, result); | 2194 CHECK_EQ(expected, result); |
| 2195 } | 2195 } |
| 2196 } | 2196 } |
| 2197 #endif | 2197 #endif |
| 2198 | 2198 |
| 2199 | 2199 |
| 2200 // TODO(titzer): Fix for msan and re-enable. | |
| 2201 #if 0 | |
| 2202 | |
| 2203 template <typename T> | 2200 template <typename T> |
| 2204 void GenerateAndRunFold(WasmOpcode binop, T* buffer, size_t size, | 2201 T GenerateAndRunFold(WasmOpcode binop, T* buffer, size_t size, |
| 2205 LocalType astType, MachineType memType) { | 2202 LocalType astType, MachineType memType) { |
| 2206 WasmRunner<int32_t> r(MachineType::Int32()); | 2203 WasmRunner<int32_t> r(MachineType::Int32()); |
| 2207 const byte kAccum = r.AllocateLocal(astType); | 2204 const byte kAccum = r.AllocateLocal(astType); |
| 2208 ModuleEnv module; | 2205 TestingModule module; |
| 2209 module.mem_start = reinterpret_cast<uintptr_t>(buffer); | 2206 module.AddMemoryElems<T>(size); |
| 2210 module.mem_end = reinterpret_cast<uintptr_t>(buffer + size); | 2207 for (size_t i = 0; i < size; i++) { |
| 2208 module.raw_mem_start<T>()[i] = buffer[i]; |
| 2209 } |
| 2211 r.env()->module = &module; | 2210 r.env()->module = &module; |
| 2212 | 2211 |
| 2213 BUILD( | 2212 BUILD( |
| 2214 r, | 2213 r, |
| 2215 WASM_BLOCK( | 2214 WASM_BLOCK( |
| 2216 4, WASM_SET_LOCAL(kAccum, WASM_LOAD_MEM(memType, WASM_ZERO)), | 2215 4, WASM_SET_LOCAL(kAccum, WASM_LOAD_MEM(memType, WASM_ZERO)), |
| 2217 WASM_WHILE( | 2216 WASM_WHILE( |
| 2218 WASM_GET_LOCAL(0), | 2217 WASM_GET_LOCAL(0), |
| 2219 WASM_BLOCK( | 2218 WASM_BLOCK( |
| 2220 2, WASM_SET_LOCAL( | 2219 2, WASM_SET_LOCAL( |
| 2221 kAccum, | 2220 kAccum, |
| 2222 WASM_BINOP(binop, WASM_GET_LOCAL(kAccum), | 2221 WASM_BINOP(binop, WASM_GET_LOCAL(kAccum), |
| 2223 WASM_LOAD_MEM(memType, WASM_GET_LOCAL(0)))), | 2222 WASM_LOAD_MEM(memType, WASM_GET_LOCAL(0)))), |
| 2224 WASM_SET_LOCAL( | 2223 WASM_SET_LOCAL( |
| 2225 0, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I8(sizeof(T)))))), | 2224 0, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I8(sizeof(T)))))), |
| 2226 WASM_STORE_MEM(memType, WASM_ZERO, WASM_GET_LOCAL(kAccum)), | 2225 WASM_STORE_MEM(memType, WASM_ZERO, WASM_GET_LOCAL(kAccum)), |
| 2227 WASM_GET_LOCAL(0))); | 2226 WASM_GET_LOCAL(0))); |
| 2228 r.Call(static_cast<int>(sizeof(T) * (size - 1))); | 2227 r.Call(static_cast<int>(sizeof(T) * (size - 1))); |
| 2228 return module.raw_mem_at<double>(0); |
| 2229 } | 2229 } |
| 2230 | 2230 |
| 2231 | 2231 |
| 2232 TEST(Run_Wasm_MemF64_Mul) { | 2232 TEST(Run_Wasm_MemF64_Mul) { |
| 2233 const size_t kSize = 6; | 2233 const size_t kSize = 6; |
| 2234 double buffer[kSize] = {1, 2, 2, 2, 2, 2}; | 2234 double buffer[kSize] = {1, 2, 2, 2, 2, 2}; |
| 2235 GenerateAndRunFold<double>(kExprF64Mul, buffer, kSize, kAstF64, | 2235 double result = GenerateAndRunFold<double>(kExprF64Mul, buffer, kSize, |
| 2236 MachineType::Float64()); | 2236 kAstF64, MachineType::Float64()); |
| 2237 CHECK_EQ(32, buffer[0]); | 2237 CHECK_EQ(32, result); |
| 2238 } | 2238 } |
| 2239 | 2239 |
| 2240 #endif | |
| 2241 | |
| 2242 | 2240 |
| 2243 TEST(Build_Wasm_Infinite_Loop) { | 2241 TEST(Build_Wasm_Infinite_Loop) { |
| 2244 WasmRunner<int32_t> r(MachineType::Int32()); | 2242 WasmRunner<int32_t> r(MachineType::Int32()); |
| 2245 // Only build the graph and compile, don't run. | 2243 // Only build the graph and compile, don't run. |
| 2246 BUILD(r, WASM_INFINITE_LOOP); | 2244 BUILD(r, WASM_INFINITE_LOOP); |
| 2247 } | 2245 } |
| 2248 | 2246 |
| 2249 | 2247 |
| 2250 TEST(Build_Wasm_Infinite_Loop_effect) { | 2248 TEST(Build_Wasm_Infinite_Loop_effect) { |
| 2251 WasmRunner<int32_t> r(MachineType::Int32()); | 2249 WasmRunner<int32_t> r(MachineType::Int32()); |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2459 | 2457 |
| 2460 *global = 116; | 2458 *global = 116; |
| 2461 for (int i = 9; i < 444444; i += 111111) { | 2459 for (int i = 9; i < 444444; i += 111111) { |
| 2462 int32_t expected = *global + i; | 2460 int32_t expected = *global + i; |
| 2463 r.Call(i); | 2461 r.Call(i); |
| 2464 CHECK_EQ(expected, *global); | 2462 CHECK_EQ(expected, *global); |
| 2465 } | 2463 } |
| 2466 } | 2464 } |
| 2467 | 2465 |
| 2468 | 2466 |
| 2469 // TODO(titzer): Fix for msan and re-enable. | |
| 2470 #if 0 | |
| 2471 | |
| 2472 TEST(Run_WasmInt32Globals_DontAlias) { | 2467 TEST(Run_WasmInt32Globals_DontAlias) { |
| 2473 const int kNumGlobals = 3; | 2468 const int kNumGlobals = 3; |
| 2474 TestingModule module; | 2469 TestingModule module; |
| 2475 int32_t* globals[] = {module.AddGlobal<int32_t>(MachineType::Int32()), | 2470 int32_t* globals[] = {module.AddGlobal<int32_t>(MachineType::Int32()), |
| 2476 module.AddGlobal<int32_t>(MachineType::Int32()), | 2471 module.AddGlobal<int32_t>(MachineType::Int32()), |
| 2477 module.AddGlobal<int32_t>(MachineType::Int32())}; | 2472 module.AddGlobal<int32_t>(MachineType::Int32())}; |
| 2478 | 2473 |
| 2479 for (int g = 0; g < kNumGlobals; g++) { | 2474 for (int g = 0; g < kNumGlobals; g++) { |
| 2480 // global = global + p0 | 2475 // global = global + p0 |
| 2481 WasmRunner<int32_t> r(MachineType::Int32()); | 2476 WasmRunner<int32_t> r(MachineType::Int32()); |
| 2482 r.env()->module = &module; | 2477 r.env()->module = &module; |
| 2483 BUILD(r, WASM_STORE_GLOBAL( | 2478 BUILD(r, WASM_STORE_GLOBAL( |
| 2484 g, WASM_I32_ADD(WASM_LOAD_GLOBAL(g), WASM_GET_LOCAL(0)))); | 2479 g, WASM_I32_ADD(WASM_LOAD_GLOBAL(g), WASM_GET_LOCAL(0)))); |
| 2485 | 2480 |
| 2486 // Check that reading/writing global number {g} doesn't alter the others. | 2481 // Check that reading/writing global number {g} doesn't alter the others. |
| 2487 *globals[g] = 116 * g; | 2482 *globals[g] = 116 * g; |
| 2488 int32_t before[kNumGlobals]; | 2483 int32_t before[kNumGlobals]; |
| 2489 for (int i = 9; i < 444444; i += 111113) { | 2484 for (int i = 9; i < 444444; i += 111113) { |
| 2490 int32_t sum = *globals[g] + i; | 2485 int32_t sum = *globals[g] + i; |
| 2491 for (int j = 0; j < kNumGlobals; j++) before[j] = *globals[j]; | 2486 for (int j = 0; j < kNumGlobals; j++) before[j] = *globals[j]; |
| 2492 r.Call(i); | 2487 r.Call(i); |
| 2493 for (int j = 0; j < kNumGlobals; j++) { | 2488 for (int j = 0; j < kNumGlobals; j++) { |
| 2494 int32_t expected = j == g ? sum : before[j]; | 2489 int32_t expected = j == g ? sum : before[j]; |
| 2495 CHECK_EQ(expected, *globals[j]); | 2490 CHECK_EQ(expected, *globals[j]); |
| 2496 } | 2491 } |
| 2497 } | 2492 } |
| 2498 } | 2493 } |
| 2499 } | 2494 } |
| 2500 | 2495 |
| 2501 #endif | |
| 2502 | |
| 2503 | 2496 |
| 2504 #if WASM_64 | 2497 #if WASM_64 |
| 2505 TEST(Run_WasmInt64Global) { | 2498 TEST(Run_WasmInt64Global) { |
| 2506 TestingModule module; | 2499 TestingModule module; |
| 2507 int64_t* global = module.AddGlobal<int64_t>(MachineType::Int64()); | 2500 int64_t* global = module.AddGlobal<int64_t>(MachineType::Int64()); |
| 2508 WasmRunner<int32_t> r(MachineType::Int32()); | 2501 WasmRunner<int32_t> r(MachineType::Int32()); |
| 2509 r.env()->module = &module; | 2502 r.env()->module = &module; |
| 2510 // global = global + p0 | 2503 // global = global + p0 |
| 2511 BUILD(r, WASM_BLOCK(2, WASM_STORE_GLOBAL( | 2504 BUILD(r, WASM_BLOCK(2, WASM_STORE_GLOBAL( |
| 2512 0, WASM_I64_ADD( | 2505 0, WASM_I64_ADD( |
| (...skipping 1103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3616 TEST(Run_Wasm_F32CopySign) { | 3609 TEST(Run_Wasm_F32CopySign) { |
| 3617 WasmRunner<float> r(MachineType::Float32(), MachineType::Float32()); | 3610 WasmRunner<float> r(MachineType::Float32(), MachineType::Float32()); |
| 3618 BUILD(r, WASM_F32_COPYSIGN(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | 3611 BUILD(r, WASM_F32_COPYSIGN(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
| 3619 | 3612 |
| 3620 FOR_FLOAT32_INPUTS(i) { | 3613 FOR_FLOAT32_INPUTS(i) { |
| 3621 FOR_FLOAT32_INPUTS(j) { CheckFloatEq(copysign(*i, *j), r.Call(*i, *j)); } | 3614 FOR_FLOAT32_INPUTS(j) { CheckFloatEq(copysign(*i, *j), r.Call(*i, *j)); } |
| 3622 } | 3615 } |
| 3623 } | 3616 } |
| 3624 | 3617 |
| 3625 #endif | 3618 #endif |
| OLD | NEW |