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 <stdio.h> | 6 #include <stdio.h> |
7 #include <stdlib.h> | 7 #include <stdlib.h> |
8 #include <string.h> | 8 #include <string.h> |
9 | 9 |
10 #include "src/wasm/wasm-macro-gen.h" | 10 #include "src/wasm/wasm-macro-gen.h" |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
115 Isolate* isolate = jsfunc->GetIsolate(); | 115 Isolate* isolate = jsfunc->GetIsolate(); |
116 Handle<Object> buffer[] = {isolate->factory()->NewNumber(a), | 116 Handle<Object> buffer[] = {isolate->factory()->NewNumber(a), |
117 isolate->factory()->NewNumber(b)}; | 117 isolate->factory()->NewNumber(b)}; |
118 EXPECT_CALL(expected, jsfunc, buffer, 2); | 118 EXPECT_CALL(expected, jsfunc, buffer, 2); |
119 } | 119 } |
120 } // namespace | 120 } // namespace |
121 | 121 |
122 TEST(Run_Int32Sub_jswrapped) { | 122 TEST(Run_Int32Sub_jswrapped) { |
123 TestSignatures sigs; | 123 TestSignatures sigs; |
124 TestingModule module; | 124 TestingModule module; |
125 WasmFunctionCompiler t(sigs.i_ii()); | 125 WasmFunctionCompiler t(sigs.i_ii(), &module); |
126 BUILD(t, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | 126 BUILD(t, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
127 Handle<JSFunction> jsfunc = WrapCode(&module, t.CompileAndAdd(&module)); | 127 Handle<JSFunction> jsfunc = WrapCode(&module, t.CompileAndAdd()); |
128 | 128 |
129 EXPECT_CALL(33, jsfunc, 44, 11); | 129 EXPECT_CALL(33, jsfunc, 44, 11); |
130 EXPECT_CALL(-8723487, jsfunc, -8000000, 723487); | 130 EXPECT_CALL(-8723487, jsfunc, -8000000, 723487); |
131 } | 131 } |
132 | 132 |
133 | 133 |
134 TEST(Run_Float32Div_jswrapped) { | 134 TEST(Run_Float32Div_jswrapped) { |
135 TestSignatures sigs; | 135 TestSignatures sigs; |
136 TestingModule module; | 136 TestingModule module; |
137 WasmFunctionCompiler t(sigs.f_ff()); | 137 WasmFunctionCompiler t(sigs.f_ff(), &module); |
138 BUILD(t, WASM_F32_DIV(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | 138 BUILD(t, WASM_F32_DIV(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
139 Handle<JSFunction> jsfunc = WrapCode(&module, t.CompileAndAdd(&module)); | 139 Handle<JSFunction> jsfunc = WrapCode(&module, t.CompileAndAdd()); |
140 | 140 |
141 EXPECT_CALL(92, jsfunc, 46, 0.5); | 141 EXPECT_CALL(92, jsfunc, 46, 0.5); |
142 EXPECT_CALL(64, jsfunc, -16, -0.25); | 142 EXPECT_CALL(64, jsfunc, -16, -0.25); |
143 } | 143 } |
144 | 144 |
145 | 145 |
146 TEST(Run_Float64Add_jswrapped) { | 146 TEST(Run_Float64Add_jswrapped) { |
147 TestSignatures sigs; | 147 TestSignatures sigs; |
148 TestingModule module; | 148 TestingModule module; |
149 WasmFunctionCompiler t(sigs.d_dd()); | 149 WasmFunctionCompiler t(sigs.d_dd(), &module); |
150 BUILD(t, WASM_F64_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | 150 BUILD(t, WASM_F64_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
151 Handle<JSFunction> jsfunc = WrapCode(&module, t.CompileAndAdd(&module)); | 151 Handle<JSFunction> jsfunc = WrapCode(&module, t.CompileAndAdd()); |
152 | 152 |
153 EXPECT_CALL(3, jsfunc, 2, 1); | 153 EXPECT_CALL(3, jsfunc, 2, 1); |
154 EXPECT_CALL(-5.5, jsfunc, -5.25, -0.25); | 154 EXPECT_CALL(-5.5, jsfunc, -5.25, -0.25); |
155 } | 155 } |
156 | 156 |
157 | 157 |
158 TEST(Run_I32Popcount_jswrapped) { | 158 TEST(Run_I32Popcount_jswrapped) { |
159 TestSignatures sigs; | 159 TestSignatures sigs; |
160 TestingModule module; | 160 TestingModule module; |
161 WasmFunctionCompiler t(sigs.i_i()); | 161 WasmFunctionCompiler t(sigs.i_i(), &module); |
162 BUILD(t, WASM_I32_POPCNT(WASM_GET_LOCAL(0))); | 162 BUILD(t, WASM_I32_POPCNT(WASM_GET_LOCAL(0))); |
163 Handle<JSFunction> jsfunc = WrapCode(&module, t.CompileAndAdd(&module)); | 163 Handle<JSFunction> jsfunc = WrapCode(&module, t.CompileAndAdd()); |
164 | 164 |
165 EXPECT_CALL(2, jsfunc, 9, 0); | 165 EXPECT_CALL(2, jsfunc, 9, 0); |
166 EXPECT_CALL(3, jsfunc, 11, 0); | 166 EXPECT_CALL(3, jsfunc, 11, 0); |
167 EXPECT_CALL(6, jsfunc, 0x3F, 0); | 167 EXPECT_CALL(6, jsfunc, 0x3F, 0); |
168 | 168 |
169 USE(AddJsFunction); | 169 USE(AddJsFunction); |
170 } | 170 } |
171 | 171 |
172 | 172 |
173 #if !V8_TARGET_ARCH_ARM64 | 173 #if !V8_TARGET_ARCH_ARM64 |
174 // TODO(titzer): dynamic frame alignment on arm64 | 174 // TODO(titzer): dynamic frame alignment on arm64 |
175 TEST(Run_CallJS_Add_jswrapped) { | 175 TEST(Run_CallJS_Add_jswrapped) { |
176 TestSignatures sigs; | 176 TestSignatures sigs; |
177 TestingModule module; | 177 TestingModule module; |
178 WasmFunctionCompiler t(sigs.i_i(), &module); | 178 WasmFunctionCompiler t(sigs.i_i(), &module); |
179 uint32_t js_index = | 179 uint32_t js_index = |
180 AddJsFunction(&module, sigs.i_i(), "(function(a) { return a + 99; })"); | 180 AddJsFunction(&module, sigs.i_i(), "(function(a) { return a + 99; })"); |
181 BUILD(t, WASM_CALL_FUNCTION(js_index, WASM_GET_LOCAL(0))); | 181 BUILD(t, WASM_CALL_FUNCTION(js_index, WASM_GET_LOCAL(0))); |
182 | 182 |
183 Handle<JSFunction> jsfunc = WrapCode(&module, t.CompileAndAdd(&module)); | 183 Handle<JSFunction> jsfunc = WrapCode(&module, t.CompileAndAdd()); |
184 | 184 |
185 EXPECT_CALL(101, jsfunc, 2, -8); | 185 EXPECT_CALL(101, jsfunc, 2, -8); |
186 EXPECT_CALL(199, jsfunc, 100, -1); | 186 EXPECT_CALL(199, jsfunc, 100, -1); |
187 EXPECT_CALL(-666666801, jsfunc, -666666900, -1); | 187 EXPECT_CALL(-666666801, jsfunc, -666666900, -1); |
188 } | 188 } |
189 #endif | 189 #endif |
190 | 190 |
191 | 191 |
192 void RunJSSelectTest(int which) { | 192 void RunJSSelectTest(int which) { |
193 #if !V8_TARGET_ARCH_ARM | 193 #if !V8_TARGET_ARCH_ARM |
(...skipping 17 matching lines...) Expand all Loading... |
211 | 211 |
212 for (int i = 0; i < num_params; i++) { | 212 for (int i = 0; i < num_params; i++) { |
213 ADD_CODE(code, WASM_F64(inputs.arg_d(i))); | 213 ADD_CODE(code, WASM_F64(inputs.arg_d(i))); |
214 } | 214 } |
215 | 215 |
216 size_t end = code.size(); | 216 size_t end = code.size(); |
217 code.push_back(0); | 217 code.push_back(0); |
218 t.Build(&code[0], &code[end]); | 218 t.Build(&code[0], &code[end]); |
219 } | 219 } |
220 | 220 |
221 Handle<JSFunction> jsfunc = WrapCode(&module, t.CompileAndAdd(&module)); | 221 Handle<JSFunction> jsfunc = WrapCode(&module, t.CompileAndAdd()); |
222 double expected = inputs.arg_d(which); | 222 double expected = inputs.arg_d(which); |
223 EXPECT_CALL(expected, jsfunc, 0.0, 0.0); | 223 EXPECT_CALL(expected, jsfunc, 0.0, 0.0); |
224 } | 224 } |
225 #endif | 225 #endif |
226 } | 226 } |
227 | 227 |
228 | 228 |
229 TEST(Run_JSSelect_0) { RunJSSelectTest(0); } | 229 TEST(Run_JSSelect_0) { RunJSSelectTest(0); } |
230 | 230 |
231 TEST(Run_JSSelect_1) { RunJSSelectTest(1); } | 231 TEST(Run_JSSelect_1) { RunJSSelectTest(1); } |
(...skipping 17 matching lines...) Expand all Loading... |
249 const int kMaxParams = 8; | 249 const int kMaxParams = 8; |
250 for (int num_params = which + 1; num_params < kMaxParams; num_params++) { | 250 for (int num_params = which + 1; num_params < kMaxParams; num_params++) { |
251 LocalType type = kAstF64; | 251 LocalType type = kAstF64; |
252 LocalType types[kMaxParams + 1] = {type, type, type, type, type, | 252 LocalType types[kMaxParams + 1] = {type, type, type, type, type, |
253 type, type, type, type}; | 253 type, type, type, type}; |
254 FunctionSig sig(1, num_params, types); | 254 FunctionSig sig(1, num_params, types); |
255 | 255 |
256 TestingModule module; | 256 TestingModule module; |
257 WasmFunctionCompiler t(&sig, &module); | 257 WasmFunctionCompiler t(&sig, &module); |
258 BUILD(t, WASM_GET_LOCAL(which)); | 258 BUILD(t, WASM_GET_LOCAL(which)); |
259 Handle<JSFunction> jsfunc = WrapCode(&module, t.CompileAndAdd(&module)); | 259 Handle<JSFunction> jsfunc = WrapCode(&module, t.CompileAndAdd()); |
260 | 260 |
261 Handle<Object> args[] = { | 261 Handle<Object> args[] = { |
262 isolate->factory()->NewNumber(inputs.arg_d(0)), | 262 isolate->factory()->NewNumber(inputs.arg_d(0)), |
263 isolate->factory()->NewNumber(inputs.arg_d(1)), | 263 isolate->factory()->NewNumber(inputs.arg_d(1)), |
264 isolate->factory()->NewNumber(inputs.arg_d(2)), | 264 isolate->factory()->NewNumber(inputs.arg_d(2)), |
265 isolate->factory()->NewNumber(inputs.arg_d(3)), | 265 isolate->factory()->NewNumber(inputs.arg_d(3)), |
266 isolate->factory()->NewNumber(inputs.arg_d(4)), | 266 isolate->factory()->NewNumber(inputs.arg_d(4)), |
267 isolate->factory()->NewNumber(inputs.arg_d(5)), | 267 isolate->factory()->NewNumber(inputs.arg_d(5)), |
268 isolate->factory()->NewNumber(inputs.arg_d(6)), | 268 isolate->factory()->NewNumber(inputs.arg_d(6)), |
269 isolate->factory()->NewNumber(inputs.arg_d(7)), | 269 isolate->factory()->NewNumber(inputs.arg_d(7)), |
(...skipping 28 matching lines...) Expand all Loading... |
298 const int kMaxParams = 4; | 298 const int kMaxParams = 4; |
299 DCHECK_LE(num_args, kMaxParams); | 299 DCHECK_LE(num_args, kMaxParams); |
300 LocalType type = kAstF64; | 300 LocalType type = kAstF64; |
301 LocalType types[kMaxParams + 1] = {type, type, type, type, type}; | 301 LocalType types[kMaxParams + 1] = {type, type, type, type, type}; |
302 FunctionSig sig(1, num_params, types); | 302 FunctionSig sig(1, num_params, types); |
303 | 303 |
304 for (int which = 0; which < num_params; which++) { | 304 for (int which = 0; which < num_params; which++) { |
305 TestingModule module; | 305 TestingModule module; |
306 WasmFunctionCompiler t(&sig, &module); | 306 WasmFunctionCompiler t(&sig, &module); |
307 BUILD(t, WASM_GET_LOCAL(which)); | 307 BUILD(t, WASM_GET_LOCAL(which)); |
308 Handle<JSFunction> jsfunc = WrapCode(&module, t.CompileAndAdd(&module)); | 308 Handle<JSFunction> jsfunc = WrapCode(&module, t.CompileAndAdd()); |
309 | 309 |
310 Handle<Object> args[] = { | 310 Handle<Object> args[] = { |
311 isolate->factory()->NewNumber(inputs.arg_d(0)), | 311 isolate->factory()->NewNumber(inputs.arg_d(0)), |
312 isolate->factory()->NewNumber(inputs.arg_d(1)), | 312 isolate->factory()->NewNumber(inputs.arg_d(1)), |
313 isolate->factory()->NewNumber(inputs.arg_d(2)), | 313 isolate->factory()->NewNumber(inputs.arg_d(2)), |
314 isolate->factory()->NewNumber(inputs.arg_d(3)), | 314 isolate->factory()->NewNumber(inputs.arg_d(3)), |
315 }; | 315 }; |
316 | 316 |
317 double nan = std::numeric_limits<double>::quiet_NaN(); | 317 double nan = std::numeric_limits<double>::quiet_NaN(); |
318 double expected = which < num_args ? inputs.arg_d(which) : nan; | 318 double expected = which < num_args ? inputs.arg_d(which) : nan; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
375 | 375 |
376 // Call different select JS functions. | 376 // Call different select JS functions. |
377 for (int which = 0; which < num_params; which++) { | 377 for (int which = 0; which < num_params; which++) { |
378 HandleScope scope(isolate); | 378 HandleScope scope(isolate); |
379 TestingModule module; | 379 TestingModule module; |
380 uint32_t js_index = AddJSSelector(&module, &sig, which); | 380 uint32_t js_index = AddJSSelector(&module, &sig, which); |
381 CHECK_EQ(0, js_index); | 381 CHECK_EQ(0, js_index); |
382 WasmFunctionCompiler t(&sig, &module); | 382 WasmFunctionCompiler t(&sig, &module); |
383 t.Build(&code[0], &code[end]); | 383 t.Build(&code[0], &code[end]); |
384 | 384 |
385 Handle<JSFunction> jsfunc = WrapCode(&module, t.CompileAndAdd(&module)); | 385 Handle<JSFunction> jsfunc = WrapCode(&module, t.CompileAndAdd()); |
386 | 386 |
387 Handle<Object> args[] = { | 387 Handle<Object> args[] = { |
388 factory->NewNumber(inputs.arg_d(0)), | 388 factory->NewNumber(inputs.arg_d(0)), |
389 factory->NewNumber(inputs.arg_d(1)), | 389 factory->NewNumber(inputs.arg_d(1)), |
390 factory->NewNumber(inputs.arg_d(2)), | 390 factory->NewNumber(inputs.arg_d(2)), |
391 factory->NewNumber(inputs.arg_d(3)), | 391 factory->NewNumber(inputs.arg_d(3)), |
392 }; | 392 }; |
393 | 393 |
394 double nan = std::numeric_limits<double>::quiet_NaN(); | 394 double nan = std::numeric_limits<double>::quiet_NaN(); |
395 double expected = which < num_args ? inputs.arg_d(which) : nan; | 395 double expected = which < num_args ? inputs.arg_d(which) : nan; |
(...skipping 26 matching lines...) Expand all Loading... |
422 RunJSSelectAlignTest(1, 2); | 422 RunJSSelectAlignTest(1, 2); |
423 RunJSSelectAlignTest(1, 3); | 423 RunJSSelectAlignTest(1, 3); |
424 } | 424 } |
425 | 425 |
426 | 426 |
427 TEST(Run_JSSelectAlign_3) { | 427 TEST(Run_JSSelectAlign_3) { |
428 RunJSSelectAlignTest(3, 3); | 428 RunJSSelectAlignTest(3, 3); |
429 RunJSSelectAlignTest(3, 4); | 429 RunJSSelectAlignTest(3, 4); |
430 } | 430 } |
431 #endif | 431 #endif |
OLD | NEW |