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

Side by Side Diff: test/cctest/wasm/test-wasm-interpreter-entry.cc

Issue 2731713002: [wasm] Fix interpreter entry for i64 return type (Closed)
Patch Set: Created 3 years, 9 months 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 unified diff | Download patch
« src/compiler/wasm-compiler.cc ('K') | « src/compiler/wasm-compiler.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2017 the V8 project authors. All rights reserved. 1 // Copyright 2017 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 <cstdint> 5 #include <cstdint>
6 6
7 #include "src/assembler-inl.h" 7 #include "src/assembler-inl.h"
8 #include "src/objects-inl.h" 8 #include "src/objects-inl.h"
9 #include "src/wasm/wasm-macro-gen.h" 9 #include "src/wasm/wasm-macro-gen.h"
10 #include "src/wasm/wasm-objects.h" 10 #include "src/wasm/wasm-objects.h"
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 WasmRunnerBase& runner, WasmFunctionCompiler& inner_compiler, 80 WasmRunnerBase& runner, WasmFunctionCompiler& inner_compiler,
81 std::initializer_list<uint8_t> bytes_inner_function, 81 std::initializer_list<uint8_t> bytes_inner_function,
82 std::initializer_list<uint8_t> bytes_outer_function, 82 std::initializer_list<uint8_t> bytes_outer_function,
83 const T& expected_lambda) { 83 const T& expected_lambda) {
84 return ArgPassingHelper<T>(runner, inner_compiler, bytes_inner_function, 84 return ArgPassingHelper<T>(runner, inner_compiler, bytes_inner_function,
85 bytes_outer_function, expected_lambda); 85 bytes_outer_function, expected_lambda);
86 } 86 }
87 87
88 } // namespace 88 } // namespace
89 89
90 // Pass int32_t, return int32_t.
90 TEST(TestArgumentPassing_int32) { 91 TEST(TestArgumentPassing_int32) {
91 WasmRunner<int32_t, int32_t> runner(kExecuteCompiled); 92 WasmRunner<int32_t, int32_t> runner(kExecuteCompiled);
92 WasmFunctionCompiler& f2 = runner.NewFunction<int32_t, int32_t>(); 93 WasmFunctionCompiler& f2 = runner.NewFunction<int32_t, int32_t>();
93 94
94 auto helper = GetHelper( 95 auto helper = GetHelper(
95 runner, f2, 96 runner, f2,
96 {// Return 2*<0> + 1. 97 {// Return 2*<0> + 1.
97 WASM_I32_ADD(WASM_I32_MUL(WASM_I32V_1(2), WASM_GET_LOCAL(0)), WASM_ONE)}, 98 WASM_I32_ADD(WASM_I32_MUL(WASM_I32V_1(2), WASM_GET_LOCAL(0)), WASM_ONE)},
98 {// Call f2 with param <0>. 99 {// Call f2 with param <0>.
99 WASM_GET_LOCAL(0), WASM_CALL_FUNCTION0(f2.function_index())}, 100 WASM_GET_LOCAL(0), WASM_CALL_FUNCTION0(f2.function_index())},
100 [](int32_t a) { return 2 * a + 1; }); 101 [](int32_t a) { return 2 * a + 1; });
101 102
102 std::vector<int32_t> test_values = compiler::ValueHelper::int32_vector(); 103 std::vector<int32_t> test_values = compiler::ValueHelper::int32_vector();
103 for (int32_t v : test_values) helper.CheckCall(v); 104 for (int32_t v : test_values) helper.CheckCall(v);
104 } 105 }
105 106
106 TEST(TestArgumentPassing_int64) { 107 // Pass int64_t, return double.
108 TEST(TestArgumentPassing_double_int64) {
107 WasmRunner<double, int32_t, int32_t> runner(kExecuteCompiled); 109 WasmRunner<double, int32_t, int32_t> runner(kExecuteCompiled);
108 WasmFunctionCompiler& f2 = runner.NewFunction<double, int64_t>(); 110 WasmFunctionCompiler& f2 = runner.NewFunction<double, int64_t>();
109 111
110 auto helper = GetHelper( 112 auto helper = GetHelper(
111 runner, f2, 113 runner, f2,
112 {// Return (double)<0>. 114 {// Return (double)<0>.
113 WASM_F64_SCONVERT_I64(WASM_GET_LOCAL(0))}, 115 WASM_F64_SCONVERT_I64(WASM_GET_LOCAL(0))},
114 {// Call f2 with param (<0> | (<1> << 32)). 116 {// Call f2 with param (<0> | (<1> << 32)).
115 WASM_I64_IOR(WASM_I64_UCONVERT_I32(WASM_GET_LOCAL(0)), 117 WASM_I64_IOR(WASM_I64_UCONVERT_I32(WASM_GET_LOCAL(0)),
116 WASM_I64_SHL(WASM_I64_UCONVERT_I32(WASM_GET_LOCAL(1)), 118 WASM_I64_SHL(WASM_I64_UCONVERT_I32(WASM_GET_LOCAL(1)),
(...skipping 14 matching lines...) Expand all
131 133
132 std::vector<int64_t> test_values_i64 = compiler::ValueHelper::int64_vector(); 134 std::vector<int64_t> test_values_i64 = compiler::ValueHelper::int64_vector();
133 for (int64_t v : test_values_i64) { 135 for (int64_t v : test_values_i64) {
134 int32_t v1 = static_cast<int32_t>(v); 136 int32_t v1 = static_cast<int32_t>(v);
135 int32_t v2 = static_cast<int32_t>(v >> 32); 137 int32_t v2 = static_cast<int32_t>(v >> 32);
136 helper.CheckCall(v1, v2); 138 helper.CheckCall(v1, v2);
137 helper.CheckCall(v2, v1); 139 helper.CheckCall(v2, v1);
138 } 140 }
139 } 141 }
140 142
143 // Pass double, return int64_t.
144 TEST(TestArgumentPassing_int64_double) {
145 // Outer function still returns double.
146 WasmRunner<double, double> runner(kExecuteCompiled);
147 WasmFunctionCompiler& f2 = runner.NewFunction<int64_t, double>();
148
149 auto helper = GetHelper(
150 runner, f2,
151 {// Return (int64_t)<0>.
152 WASM_I64_SCONVERT_F64(WASM_GET_LOCAL(0))},
153 {// Call f2 with param <0>, convert returned value back to double.
154 WASM_F64_SCONVERT_I64(WASM_SEQ(
155 WASM_GET_LOCAL(0), WASM_CALL_FUNCTION0(f2.function_index())))},
156 [](double d) { return d; });
157
158 for (int64_t i : compiler::ValueHelper::int64_vector()) {
159 helper.CheckCall(i);
160 }
161 }
162
163 // Pass float, return double.
141 TEST(TestArgumentPassing_float_double) { 164 TEST(TestArgumentPassing_float_double) {
142 WasmRunner<double, float> runner(kExecuteCompiled); 165 WasmRunner<double, float> runner(kExecuteCompiled);
143 WasmFunctionCompiler& f2 = runner.NewFunction<double, float>(); 166 WasmFunctionCompiler& f2 = runner.NewFunction<double, float>();
144 167
145 auto helper = GetHelper( 168 auto helper = GetHelper(
146 runner, f2, 169 runner, f2,
147 {// Return 2*(double)<0> + 1. 170 {// Return 2*(double)<0> + 1.
148 WASM_F64_ADD( 171 WASM_F64_ADD(
149 WASM_F64_MUL(WASM_F64(2), WASM_F64_CONVERT_F32(WASM_GET_LOCAL(0))), 172 WASM_F64_MUL(WASM_F64(2), WASM_F64_CONVERT_F32(WASM_GET_LOCAL(0))),
150 WASM_F64(1))}, 173 WASM_F64(1))},
151 {// Call f2 with param <0>. 174 {// Call f2 with param <0>.
152 WASM_GET_LOCAL(0), WASM_CALL_FUNCTION0(f2.function_index())}, 175 WASM_GET_LOCAL(0), WASM_CALL_FUNCTION0(f2.function_index())},
153 [](float f) { return 2. * static_cast<double>(f) + 1.; }); 176 [](float f) { return 2. * static_cast<double>(f) + 1.; });
154 177
155 std::vector<float> test_values = compiler::ValueHelper::float32_vector(); 178 std::vector<float> test_values = compiler::ValueHelper::float32_vector();
156 for (float f : test_values) helper.CheckCall(f); 179 for (float f : test_values) helper.CheckCall(f);
157 } 180 }
158 181
182 // Pass two doubles, return double.
159 TEST(TestArgumentPassing_double_double) { 183 TEST(TestArgumentPassing_double_double) {
160 WasmRunner<double, double, double> runner(kExecuteCompiled); 184 WasmRunner<double, double, double> runner(kExecuteCompiled);
161 WasmFunctionCompiler& f2 = runner.NewFunction<double, double, double>(); 185 WasmFunctionCompiler& f2 = runner.NewFunction<double, double, double>();
162 186
163 auto helper = GetHelper(runner, f2, 187 auto helper = GetHelper(runner, f2,
164 {// Return <0> + <1>. 188 {// Return <0> + <1>.
165 WASM_F64_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))}, 189 WASM_F64_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))},
166 {// Call f2 with params <0>, <1>. 190 {// Call f2 with params <0>, <1>.
167 WASM_GET_LOCAL(0), WASM_GET_LOCAL(1), 191 WASM_GET_LOCAL(0), WASM_GET_LOCAL(1),
168 WASM_CALL_FUNCTION0(f2.function_index())}, 192 WASM_CALL_FUNCTION0(f2.function_index())},
169 [](double a, double b) { return a + b; }); 193 [](double a, double b) { return a + b; });
170 194
171 std::vector<double> test_values = compiler::ValueHelper::float64_vector(); 195 std::vector<double> test_values = compiler::ValueHelper::float64_vector();
172 for (double d1 : test_values) { 196 for (double d1 : test_values) {
173 for (double d2 : test_values) { 197 for (double d2 : test_values) {
174 helper.CheckCall(d1, d2); 198 helper.CheckCall(d1, d2);
175 } 199 }
176 } 200 }
177 } 201 }
178 202
203 // Pass int32_t, int64_t, float and double, return double.
179 TEST(TestArgumentPassing_AllTypes) { 204 TEST(TestArgumentPassing_AllTypes) {
180 // The second and third argument will be combined to an i64. 205 // The second and third argument will be combined to an i64.
181 WasmRunner<double, int, int, int, float, double> runner(kExecuteCompiled); 206 WasmRunner<double, int32_t, int32_t, int32_t, float, double> runner(
207 kExecuteCompiled);
182 WasmFunctionCompiler& f2 = 208 WasmFunctionCompiler& f2 =
183 runner.NewFunction<double, int, int64_t, float, double>(); 209 runner.NewFunction<double, int32_t, int64_t, float, double>();
184 210
185 auto helper = GetHelper( 211 auto helper = GetHelper(
186 runner, f2, 212 runner, f2,
187 { 213 {
188 // Convert all arguments to double, add them and return the sum. 214 // Convert all arguments to double, add them and return the sum.
189 WASM_F64_ADD( // <0+1+2> + <3> 215 WASM_F64_ADD( // <0+1+2> + <3>
190 WASM_F64_ADD( // <0+1> + <2> 216 WASM_F64_ADD( // <0+1> + <2>
191 WASM_F64_ADD( // <0> + <1> 217 WASM_F64_ADD( // <0> + <1>
192 WASM_F64_SCONVERT_I32( 218 WASM_F64_SCONVERT_I32(
193 WASM_GET_LOCAL(0)), // <0> to double 219 WASM_GET_LOCAL(0)), // <0> to double
(...skipping 29 matching lines...) Expand all
223 std::max(std::max(test_values_i32.size(), test_values_i64.size()), 249 std::max(std::max(test_values_i32.size(), test_values_i64.size()),
224 std::max(test_values_f32.size(), test_values_f64.size())); 250 std::max(test_values_f32.size(), test_values_f64.size()));
225 for (size_t i = 0; i < max_len; ++i) { 251 for (size_t i = 0; i < max_len; ++i) {
226 int32_t i32 = test_values_i32[i % test_values_i32.size()]; 252 int32_t i32 = test_values_i32[i % test_values_i32.size()];
227 int64_t i64 = test_values_i64[i % test_values_i64.size()]; 253 int64_t i64 = test_values_i64[i % test_values_i64.size()];
228 float f32 = test_values_f32[i % test_values_f32.size()]; 254 float f32 = test_values_f32[i % test_values_f32.size()];
229 double f64 = test_values_f64[i % test_values_f64.size()]; 255 double f64 = test_values_f64[i % test_values_f64.size()];
230 CheckCall(i32, i64, f32, f64); 256 CheckCall(i32, i64, f32, f64);
231 } 257 }
232 } 258 }
OLDNEW
« src/compiler/wasm-compiler.cc ('K') | « src/compiler/wasm-compiler.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698