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/wasm/wasm-macro-gen.h" | 9 #include "src/wasm/wasm-macro-gen.h" |
10 | 10 |
(...skipping 2819 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2830 } | 2830 } |
2831 } | 2831 } |
2832 } | 2832 } |
2833 } | 2833 } |
2834 | 2834 |
2835 | 2835 |
2836 #endif | 2836 #endif |
2837 | 2837 |
2838 | 2838 |
2839 TEST(Run_Wasm_SimpleCallIndirect) { | 2839 TEST(Run_Wasm_SimpleCallIndirect) { |
2840 Isolate* isolate = CcTest::InitIsolateOnce(); | |
2841 | |
2842 WasmRunner<int32_t> r(MachineType::Int32()); | 2840 WasmRunner<int32_t> r(MachineType::Int32()); |
2843 TestSignatures sigs; | 2841 TestSignatures sigs; |
2844 TestingModule module; | 2842 TestingModule module; |
2845 r.env()->module = &module; | 2843 r.env()->module = &module; |
2846 WasmFunctionCompiler t1(sigs.i_ii()); | 2844 WasmFunctionCompiler t1(sigs.i_ii()); |
2847 BUILD(t1, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | 2845 BUILD(t1, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
2848 t1.CompileAndAdd(&module); | 2846 t1.CompileAndAdd(&module, /*sig_index*/ 1); |
2849 | 2847 |
2850 WasmFunctionCompiler t2(sigs.i_ii()); | 2848 WasmFunctionCompiler t2(sigs.i_ii()); |
2851 BUILD(t2, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | 2849 BUILD(t2, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
2852 t2.CompileAndAdd(&module); | 2850 t2.CompileAndAdd(&module, /*sig_index*/ 1); |
2853 | 2851 |
2854 // Signature table. | 2852 // Signature table. |
2855 module.AddSignature(sigs.f_ff()); | 2853 module.AddSignature(sigs.f_ff()); |
2856 module.AddSignature(sigs.i_ii()); | 2854 module.AddSignature(sigs.i_ii()); |
2857 module.AddSignature(sigs.d_dd()); | 2855 module.AddSignature(sigs.d_dd()); |
2858 | 2856 |
2859 // Function table. | 2857 // Function table. |
2860 int table_size = 2; | 2858 int table[] = {0, 1}; |
2861 module.module->function_table = new std::vector<uint16_t>; | 2859 module.AddIndirectFunctionTable(table, 2); |
2862 module.module->function_table->push_back(0); | 2860 module.PopulateIndirectFunctionTable(); |
2863 module.module->function_table->push_back(1); | |
2864 | |
2865 // Function table. | |
2866 Handle<FixedArray> fixed = isolate->factory()->NewFixedArray(2 * table_size); | |
2867 fixed->set(0, Smi::FromInt(1)); | |
2868 fixed->set(1, Smi::FromInt(1)); | |
2869 fixed->set(2, *module.function_code->at(0)); | |
2870 fixed->set(3, *module.function_code->at(1)); | |
2871 module.function_table = fixed; | |
2872 | 2861 |
2873 // Builder the caller function. | 2862 // Builder the caller function. |
2874 BUILD(r, WASM_CALL_INDIRECT(1, WASM_GET_LOCAL(0), WASM_I8(66), WASM_I8(22))); | 2863 BUILD(r, WASM_CALL_INDIRECT(1, WASM_GET_LOCAL(0), WASM_I8(66), WASM_I8(22))); |
2875 | 2864 |
2876 CHECK_EQ(88, r.Call(0)); | 2865 CHECK_EQ(88, r.Call(0)); |
2877 CHECK_EQ(44, r.Call(1)); | 2866 CHECK_EQ(44, r.Call(1)); |
2878 CHECK_TRAP(r.Call(2)); | 2867 CHECK_TRAP(r.Call(2)); |
2879 } | 2868 } |
2880 | 2869 |
2881 | 2870 |
2882 TEST(Run_Wasm_MultipleCallIndirect) { | 2871 TEST(Run_Wasm_MultipleCallIndirect) { |
2883 Isolate* isolate = CcTest::InitIsolateOnce(); | |
2884 | |
2885 WasmRunner<int32_t> r(MachineType::Int32(), MachineType::Int32(), | 2872 WasmRunner<int32_t> r(MachineType::Int32(), MachineType::Int32(), |
2886 MachineType::Int32()); | 2873 MachineType::Int32()); |
2887 TestSignatures sigs; | 2874 TestSignatures sigs; |
2888 TestingModule module; | 2875 TestingModule module; |
2889 r.env()->module = &module; | 2876 r.env()->module = &module; |
2890 WasmFunctionCompiler t1(sigs.i_ii()); | 2877 WasmFunctionCompiler t1(sigs.i_ii()); |
2891 BUILD(t1, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | 2878 BUILD(t1, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
2892 t1.CompileAndAdd(&module); | 2879 t1.CompileAndAdd(&module, /*sig_index*/ 1); |
2893 | 2880 |
2894 WasmFunctionCompiler t2(sigs.i_ii()); | 2881 WasmFunctionCompiler t2(sigs.i_ii()); |
2895 BUILD(t2, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | 2882 BUILD(t2, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
2896 t2.CompileAndAdd(&module); | 2883 t2.CompileAndAdd(&module, /*sig_index*/ 1); |
2897 | 2884 |
2898 // Signature table. | 2885 // Signature table. |
2899 module.AddSignature(sigs.f_ff()); | 2886 module.AddSignature(sigs.f_ff()); |
2900 module.AddSignature(sigs.i_ii()); | 2887 module.AddSignature(sigs.i_ii()); |
2901 module.AddSignature(sigs.d_dd()); | 2888 module.AddSignature(sigs.d_dd()); |
2902 | 2889 |
2903 // Function table. | 2890 // Function table. |
2904 int table_size = 2; | 2891 int table[] = {0, 1}; |
2905 module.module->function_table = new std::vector<uint16_t>; | 2892 module.AddIndirectFunctionTable(table, 2); |
2906 module.module->function_table->push_back(0); | 2893 module.PopulateIndirectFunctionTable(); |
2907 module.module->function_table->push_back(1); | |
2908 | |
2909 // Function table. | |
2910 Handle<FixedArray> fixed = isolate->factory()->NewFixedArray(2 * table_size); | |
2911 fixed->set(0, Smi::FromInt(1)); | |
2912 fixed->set(1, Smi::FromInt(1)); | |
2913 fixed->set(2, *module.function_code->at(0)); | |
2914 fixed->set(3, *module.function_code->at(1)); | |
2915 module.function_table = fixed; | |
2916 | 2894 |
2917 // Builder the caller function. | 2895 // Builder the caller function. |
2918 BUILD(r, | 2896 BUILD(r, |
2919 WASM_I32_ADD(WASM_CALL_INDIRECT(1, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1), | 2897 WASM_I32_ADD(WASM_CALL_INDIRECT(1, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1), |
2920 WASM_GET_LOCAL(2)), | 2898 WASM_GET_LOCAL(2)), |
2921 WASM_CALL_INDIRECT(1, WASM_GET_LOCAL(1), WASM_GET_LOCAL(2), | 2899 WASM_CALL_INDIRECT(1, WASM_GET_LOCAL(1), WASM_GET_LOCAL(2), |
2922 WASM_GET_LOCAL(0)))); | 2900 WASM_GET_LOCAL(0)))); |
2923 | 2901 |
2924 CHECK_EQ(5, r.Call(0, 1, 2)); | 2902 CHECK_EQ(5, r.Call(0, 1, 2)); |
2925 CHECK_EQ(19, r.Call(0, 1, 9)); | 2903 CHECK_EQ(19, r.Call(0, 1, 9)); |
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3268 | 3246 |
3269 TEST(Run_Wasm_F32CopySign) { | 3247 TEST(Run_Wasm_F32CopySign) { |
3270 WasmRunner<float> r(MachineType::Float32(), MachineType::Float32()); | 3248 WasmRunner<float> r(MachineType::Float32(), MachineType::Float32()); |
3271 BUILD(r, WASM_F32_COPYSIGN(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | 3249 BUILD(r, WASM_F32_COPYSIGN(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
3272 | 3250 |
3273 FOR_FLOAT32_INPUTS(i) { | 3251 FOR_FLOAT32_INPUTS(i) { |
3274 FOR_FLOAT32_INPUTS(j) { CheckFloatEq(copysign(*i, *j), r.Call(*i, *j)); } | 3252 FOR_FLOAT32_INPUTS(j) { CheckFloatEq(copysign(*i, *j), r.Call(*i, *j)); } |
3275 } | 3253 } |
3276 } | 3254 } |
3277 | 3255 |
| 3256 |
3278 #endif | 3257 #endif |
| 3258 |
| 3259 |
| 3260 void CompileCallIndirectMany(LocalType param) { |
| 3261 // Make sure we don't run out of registers when compiling indirect calls |
| 3262 // with many many parameters. |
| 3263 TestSignatures sigs; |
| 3264 for (byte num_params = 0; num_params < 40; num_params++) { |
| 3265 Zone zone; |
| 3266 HandleScope scope(CcTest::InitIsolateOnce()); |
| 3267 TestingModule module; |
| 3268 FunctionSig* sig = sigs.many(&zone, kAstStmt, param, num_params); |
| 3269 |
| 3270 module.AddSignature(sig); |
| 3271 module.AddSignature(sig); |
| 3272 module.AddIndirectFunctionTable(nullptr, 0); |
| 3273 |
| 3274 WasmFunctionCompiler t(sig); |
| 3275 t.env.module = &module; |
| 3276 |
| 3277 std::vector<byte> code; |
| 3278 ADD_CODE(code, kExprCallIndirect, 1); |
| 3279 ADD_CODE(code, kExprI8Const, 0); |
| 3280 for (byte p = 0; p < num_params; p++) { |
| 3281 ADD_CODE(code, kExprGetLocal, p); |
| 3282 } |
| 3283 |
| 3284 t.Build(&code[0], &code[0] + code.size()); |
| 3285 t.Compile(&module); |
| 3286 } |
| 3287 } |
| 3288 |
| 3289 |
| 3290 TEST(Compile_Wasm_CallIndirect_Many_i32) { CompileCallIndirectMany(kAstI32); } |
| 3291 |
| 3292 |
| 3293 #if WASM_64 |
| 3294 TEST(Compile_Wasm_CallIndirect_Many_i64) { CompileCallIndirectMany(kAstI64); } |
| 3295 #endif |
| 3296 |
| 3297 |
| 3298 TEST(Compile_Wasm_CallIndirect_Many_f32) { CompileCallIndirectMany(kAstF32); } |
| 3299 |
| 3300 |
| 3301 TEST(Compile_Wasm_CallIndirect_Many_f64) { CompileCallIndirectMany(kAstF64); } |
OLD | NEW |