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

Side by Side Diff: test/cctest/wasm/test-run-wasm-simd.cc

Issue 2670673002: [wasm] Implement polymorphic checking, matching the reference interpreter. (Closed)
Patch Set: Created 3 years, 10 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
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 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 "src/wasm/wasm-macro-gen.h" 5 #include "src/wasm/wasm-macro-gen.h"
6 6
7 #include "test/cctest/cctest.h" 7 #include "test/cctest/cctest.h"
8 #include "test/cctest/compiler/value-helper.h" 8 #include "test/cctest/compiler/value-helper.h"
9 #include "test/cctest/wasm/wasm-run-utils.h" 9 #include "test/cctest/wasm/wasm-run-utils.h"
10 10
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 #define WASM_SIMD_CHECK_SPLAT4_F32(TYPE, value, lv) \ 184 #define WASM_SIMD_CHECK_SPLAT4_F32(TYPE, value, lv) \
185 WASM_SIMD_CHECK4_F32(TYPE, value, lv, lv, lv, lv) 185 WASM_SIMD_CHECK4_F32(TYPE, value, lv, lv, lv, lv)
186 186
187 #if V8_TARGET_ARCH_ARM 187 #if V8_TARGET_ARCH_ARM
188 WASM_EXEC_TEST(F32x4Splat) { 188 WASM_EXEC_TEST(F32x4Splat) {
189 FLAG_wasm_simd_prototype = true; 189 FLAG_wasm_simd_prototype = true;
190 190
191 WasmRunner<int32_t, float> r(kExecuteCompiled); 191 WasmRunner<int32_t, float> r(kExecuteCompiled);
192 byte lane_val = 0; 192 byte lane_val = 0;
193 byte simd = r.AllocateLocal(kWasmS128); 193 byte simd = r.AllocateLocal(kWasmS128);
194 BUILD(r, WASM_BLOCK(WASM_SET_LOCAL(simd, WASM_SIMD_F32x4_SPLAT( 194 BUILD(r,
195 WASM_GET_LOCAL(lane_val))), 195 WASM_SET_LOCAL(simd, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(lane_val))),
196 WASM_SIMD_CHECK_SPLAT4_F32(F32x4, simd, lane_val), 196 WASM_SIMD_CHECK_SPLAT4_F32(F32x4, simd, lane_val), WASM_ONE);
197 WASM_RETURN1(WASM_ONE)));
198 197
199 FOR_FLOAT32_INPUTS(i) { CHECK_EQ(1, r.Call(*i)); } 198 FOR_FLOAT32_INPUTS(i) { CHECK_EQ(1, r.Call(*i)); }
200 } 199 }
201 200
202 WASM_EXEC_TEST(F32x4ReplaceLane) { 201 WASM_EXEC_TEST(F32x4ReplaceLane) {
203 FLAG_wasm_simd_prototype = true; 202 FLAG_wasm_simd_prototype = true;
204 WasmRunner<int32_t, float, float> r(kExecuteCompiled); 203 WasmRunner<int32_t, float, float> r(kExecuteCompiled);
205 byte old_val = 0; 204 byte old_val = 0;
206 byte new_val = 1; 205 byte new_val = 1;
207 byte simd = r.AllocateLocal(kWasmS128); 206 byte simd = r.AllocateLocal(kWasmS128);
208 BUILD(r, WASM_BLOCK( 207 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(old_val))),
209 WASM_SET_LOCAL(simd, 208 WASM_SET_LOCAL(simd,
210 WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(old_val))), 209 WASM_SIMD_F32x4_REPLACE_LANE(0, WASM_GET_LOCAL(simd),
211 WASM_SET_LOCAL( 210 WASM_GET_LOCAL(new_val))),
212 simd, WASM_SIMD_F32x4_REPLACE_LANE(0, WASM_GET_LOCAL(simd), 211 WASM_SIMD_CHECK4(F32x4, simd, F32, new_val, old_val, old_val, old_val),
213 WASM_GET_LOCAL(new_val))), 212 WASM_SET_LOCAL(simd,
214 WASM_SIMD_CHECK4(F32x4, simd, F32, new_val, old_val, old_val, 213 WASM_SIMD_F32x4_REPLACE_LANE(1, WASM_GET_LOCAL(simd),
215 old_val), 214 WASM_GET_LOCAL(new_val))),
216 WASM_SET_LOCAL( 215 WASM_SIMD_CHECK4(F32x4, simd, F32, new_val, new_val, old_val, old_val),
217 simd, WASM_SIMD_F32x4_REPLACE_LANE(1, WASM_GET_LOCAL(simd), 216 WASM_SET_LOCAL(simd,
218 WASM_GET_LOCAL(new_val))), 217 WASM_SIMD_F32x4_REPLACE_LANE(2, WASM_GET_LOCAL(simd),
219 WASM_SIMD_CHECK4(F32x4, simd, F32, new_val, new_val, old_val, 218 WASM_GET_LOCAL(new_val))),
220 old_val), 219 WASM_SIMD_CHECK4(F32x4, simd, F32, new_val, new_val, new_val, old_val),
221 WASM_SET_LOCAL( 220 WASM_SET_LOCAL(simd,
222 simd, WASM_SIMD_F32x4_REPLACE_LANE(2, WASM_GET_LOCAL(simd), 221 WASM_SIMD_F32x4_REPLACE_LANE(3, WASM_GET_LOCAL(simd),
223 WASM_GET_LOCAL(new_val))), 222 WASM_GET_LOCAL(new_val))),
224 WASM_SIMD_CHECK4(F32x4, simd, F32, new_val, new_val, new_val, 223 WASM_SIMD_CHECK_SPLAT4(F32x4, simd, F32, new_val), WASM_ONE);
225 old_val),
226 WASM_SET_LOCAL(
227 simd, WASM_SIMD_F32x4_REPLACE_LANE(3, WASM_GET_LOCAL(simd),
228 WASM_GET_LOCAL(new_val))),
229 WASM_SIMD_CHECK_SPLAT4(F32x4, simd, F32, new_val),
230 WASM_RETURN1(WASM_ONE)));
231 224
232 CHECK_EQ(1, r.Call(3.14159, -1.5)); 225 CHECK_EQ(1, r.Call(3.14159, -1.5));
233 } 226 }
234 227
235 // Tests both signed and unsigned conversion. 228 // Tests both signed and unsigned conversion.
236 WASM_EXEC_TEST(F32x4FromInt32x4) { 229 WASM_EXEC_TEST(F32x4FromInt32x4) {
237 FLAG_wasm_simd_prototype = true; 230 FLAG_wasm_simd_prototype = true;
238 WasmRunner<int32_t, int32_t, float, float> r(kExecuteCompiled); 231 WasmRunner<int32_t, int32_t, float, float> r(kExecuteCompiled);
239 byte a = 0; 232 byte a = 0;
240 byte expected_signed = 1; 233 byte expected_signed = 1;
241 byte expected_unsigned = 2; 234 byte expected_unsigned = 2;
242 byte simd0 = r.AllocateLocal(kWasmS128); 235 byte simd0 = r.AllocateLocal(kWasmS128);
243 byte simd1 = r.AllocateLocal(kWasmS128); 236 byte simd1 = r.AllocateLocal(kWasmS128);
244 byte simd2 = r.AllocateLocal(kWasmS128); 237 byte simd2 = r.AllocateLocal(kWasmS128);
245 BUILD(r, WASM_BLOCK( 238 BUILD(
246 WASM_SET_LOCAL(simd0, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), 239 r, WASM_SET_LOCAL(simd0, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))),
247 WASM_SET_LOCAL( 240 WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_FROM_I32x4(WASM_GET_LOCAL(simd0))),
248 simd1, WASM_SIMD_F32x4_FROM_I32x4(WASM_GET_LOCAL(simd0))), 241 WASM_SIMD_CHECK_SPLAT4_F32(F32x4, simd1, expected_signed),
249 WASM_SIMD_CHECK_SPLAT4_F32(F32x4, simd1, expected_signed), 242 WASM_SET_LOCAL(simd2, WASM_SIMD_F32x4_FROM_U32x4(WASM_GET_LOCAL(simd0))),
250 WASM_SET_LOCAL( 243 WASM_SIMD_CHECK_SPLAT4_F32(F32x4, simd2, expected_unsigned), WASM_ONE);
251 simd2, WASM_SIMD_F32x4_FROM_U32x4(WASM_GET_LOCAL(simd0))),
252 WASM_SIMD_CHECK_SPLAT4_F32(F32x4, simd2, expected_unsigned),
253 WASM_RETURN1(WASM_ONE)));
254 244
255 FOR_INT32_INPUTS(i) { 245 FOR_INT32_INPUTS(i) {
256 CHECK_EQ(1, r.Call(*i, static_cast<float>(*i), 246 CHECK_EQ(1, r.Call(*i, static_cast<float>(*i),
257 static_cast<float>(static_cast<uint32_t>(*i)))); 247 static_cast<float>(static_cast<uint32_t>(*i))));
258 } 248 }
259 } 249 }
260 250
261 WASM_EXEC_TEST(S32x4Select) { 251 WASM_EXEC_TEST(S32x4Select) {
262 FLAG_wasm_simd_prototype = true; 252 FLAG_wasm_simd_prototype = true;
263 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); 253 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled);
264 byte val1 = 0; 254 byte val1 = 0;
265 byte val2 = 1; 255 byte val2 = 1;
266 byte mask = r.AllocateLocal(kWasmS128); 256 byte mask = r.AllocateLocal(kWasmS128);
267 byte src1 = r.AllocateLocal(kWasmS128); 257 byte src1 = r.AllocateLocal(kWasmS128);
268 byte src2 = r.AllocateLocal(kWasmS128); 258 byte src2 = r.AllocateLocal(kWasmS128);
269 BUILD(r, 259 BUILD(r,
270 WASM_BLOCK( 260
271 WASM_SET_LOCAL(mask, WASM_SIMD_I32x4_SPLAT(WASM_ZERO)), 261 WASM_SET_LOCAL(mask, WASM_SIMD_I32x4_SPLAT(WASM_ZERO)),
272 WASM_SET_LOCAL(src1, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(val1))), 262 WASM_SET_LOCAL(src1, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(val1))),
273 WASM_SET_LOCAL(src2, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(val2))), 263 WASM_SET_LOCAL(src2, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(val2))),
274 WASM_SET_LOCAL(mask, WASM_SIMD_I32x4_REPLACE_LANE( 264 WASM_SET_LOCAL(mask, WASM_SIMD_I32x4_REPLACE_LANE(
275 1, WASM_GET_LOCAL(mask), WASM_I32V(-1))), 265 1, WASM_GET_LOCAL(mask), WASM_I32V(-1))),
276 WASM_SET_LOCAL(mask, WASM_SIMD_I32x4_REPLACE_LANE( 266 WASM_SET_LOCAL(mask, WASM_SIMD_I32x4_REPLACE_LANE(
277 2, WASM_GET_LOCAL(mask), WASM_I32V(-1))), 267 2, WASM_GET_LOCAL(mask), WASM_I32V(-1))),
278 WASM_SET_LOCAL(mask, WASM_SIMD_S32x4_SELECT(WASM_GET_LOCAL(mask), 268 WASM_SET_LOCAL(mask, WASM_SIMD_S32x4_SELECT(WASM_GET_LOCAL(mask),
279 WASM_GET_LOCAL(src1), 269 WASM_GET_LOCAL(src1),
280 WASM_GET_LOCAL(src2))), 270 WASM_GET_LOCAL(src2))),
281 WASM_SIMD_CHECK_LANE(I32x4, mask, I32, val2, 0), 271 WASM_SIMD_CHECK_LANE(I32x4, mask, I32, val2, 0),
282 WASM_SIMD_CHECK_LANE(I32x4, mask, I32, val1, 1), 272 WASM_SIMD_CHECK_LANE(I32x4, mask, I32, val1, 1),
283 WASM_SIMD_CHECK_LANE(I32x4, mask, I32, val1, 2), 273 WASM_SIMD_CHECK_LANE(I32x4, mask, I32, val1, 2),
284 WASM_SIMD_CHECK_LANE(I32x4, mask, I32, val2, 3), 274 WASM_SIMD_CHECK_LANE(I32x4, mask, I32, val2, 3), WASM_ONE);
285 WASM_RETURN1(WASM_ONE)));
286 275
287 CHECK_EQ(1, r.Call(0x1234, 0x5678)); 276 CHECK_EQ(1, r.Call(0x1234, 0x5678));
288 } 277 }
289 278
290 void RunF32x4UnOpTest(WasmOpcode simd_op, FloatUnOp expected_op) { 279 void RunF32x4UnOpTest(WasmOpcode simd_op, FloatUnOp expected_op) {
291 FLAG_wasm_simd_prototype = true; 280 FLAG_wasm_simd_prototype = true;
292 WasmRunner<int32_t, float, float> r(kExecuteCompiled); 281 WasmRunner<int32_t, float, float> r(kExecuteCompiled);
293 byte a = 0; 282 byte a = 0;
294 byte expected = 1; 283 byte expected = 1;
295 byte simd = r.AllocateLocal(kWasmS128); 284 byte simd = r.AllocateLocal(kWasmS128);
296 BUILD(r, WASM_BLOCK( 285 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))),
297 WASM_SET_LOCAL(simd, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), 286 WASM_SET_LOCAL(simd,
298 WASM_SET_LOCAL( 287 WASM_SIMD_UNOP(simd_op & 0xffu, WASM_GET_LOCAL(simd))),
299 simd, WASM_SIMD_UNOP(simd_op & 0xffu, WASM_GET_LOCAL(simd))), 288 WASM_SIMD_CHECK_SPLAT4_F32(F32x4, simd, expected), WASM_ONE);
300 WASM_SIMD_CHECK_SPLAT4_F32(F32x4, simd, expected),
301 WASM_RETURN1(WASM_ONE)));
302 289
303 FOR_FLOAT32_INPUTS(i) { 290 FOR_FLOAT32_INPUTS(i) {
304 if (std::isnan(*i)) continue; 291 if (std::isnan(*i)) continue;
305 CHECK_EQ(1, r.Call(*i, expected_op(*i))); 292 CHECK_EQ(1, r.Call(*i, expected_op(*i)));
306 } 293 }
307 } 294 }
308 295
309 WASM_EXEC_TEST(F32x4Abs) { RunF32x4UnOpTest(kExprF32x4Abs, std::abs); } 296 WASM_EXEC_TEST(F32x4Abs) { RunF32x4UnOpTest(kExprF32x4Abs, std::abs); }
310 WASM_EXEC_TEST(F32x4Neg) { RunF32x4UnOpTest(kExprF32x4Neg, Negate); } 297 WASM_EXEC_TEST(F32x4Neg) { RunF32x4UnOpTest(kExprF32x4Neg, Negate); }
311 298
312 void RunF32x4BinOpTest(WasmOpcode simd_op, FloatBinOp expected_op) { 299 void RunF32x4BinOpTest(WasmOpcode simd_op, FloatBinOp expected_op) {
313 FLAG_wasm_simd_prototype = true; 300 FLAG_wasm_simd_prototype = true;
314 WasmRunner<int32_t, float, float, float> r(kExecuteCompiled); 301 WasmRunner<int32_t, float, float, float> r(kExecuteCompiled);
315 byte a = 0; 302 byte a = 0;
316 byte b = 1; 303 byte b = 1;
317 byte expected = 2; 304 byte expected = 2;
318 byte simd0 = r.AllocateLocal(kWasmS128); 305 byte simd0 = r.AllocateLocal(kWasmS128);
319 byte simd1 = r.AllocateLocal(kWasmS128); 306 byte simd1 = r.AllocateLocal(kWasmS128);
320 BUILD(r, WASM_BLOCK( 307 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))),
321 WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), 308 WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(b))),
322 WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(b))), 309 WASM_SET_LOCAL(simd1,
323 WASM_SET_LOCAL(simd1, WASM_SIMD_BINOP(simd_op & 0xffu, 310 WASM_SIMD_BINOP(simd_op & 0xffu, WASM_GET_LOCAL(simd0),
324 WASM_GET_LOCAL(simd0), 311 WASM_GET_LOCAL(simd1))),
325 WASM_GET_LOCAL(simd1))), 312 WASM_SIMD_CHECK_SPLAT4_F32(F32x4, simd1, expected), WASM_ONE);
326 WASM_SIMD_CHECK_SPLAT4_F32(F32x4, simd1, expected),
327 WASM_RETURN1(WASM_ONE)));
328 313
329 FOR_FLOAT32_INPUTS(i) { 314 FOR_FLOAT32_INPUTS(i) {
330 if (std::isnan(*i)) continue; 315 if (std::isnan(*i)) continue;
331 FOR_FLOAT32_INPUTS(j) { 316 FOR_FLOAT32_INPUTS(j) {
332 if (std::isnan(*j)) continue; 317 if (std::isnan(*j)) continue;
333 float expected = expected_op(*i, *j); 318 float expected = expected_op(*i, *j);
334 // SIMD on some platforms may handle denormalized numbers differently. 319 // SIMD on some platforms may handle denormalized numbers differently.
335 // TODO(bbudge) On platforms that flush denorms to zero, test with 320 // TODO(bbudge) On platforms that flush denorms to zero, test with
336 // expected == 0. 321 // expected == 0.
337 if (std::fpclassify(expected) == FP_SUBNORMAL) continue; 322 if (std::fpclassify(expected) == FP_SUBNORMAL) continue;
338 CHECK_EQ(1, r.Call(*i, *j, expected)); 323 CHECK_EQ(1, r.Call(*i, *j, expected));
339 } 324 }
340 } 325 }
341 } 326 }
342 327
343 WASM_EXEC_TEST(F32x4Add) { RunF32x4BinOpTest(kExprF32x4Add, Add); } 328 WASM_EXEC_TEST(F32x4Add) { RunF32x4BinOpTest(kExprF32x4Add, Add); }
344 WASM_EXEC_TEST(F32x4Sub) { RunF32x4BinOpTest(kExprF32x4Sub, Sub); } 329 WASM_EXEC_TEST(F32x4Sub) { RunF32x4BinOpTest(kExprF32x4Sub, Sub); }
345 330
346 void RunF32x4CompareOpTest(WasmOpcode simd_op, FloatCompareOp expected_op) { 331 void RunF32x4CompareOpTest(WasmOpcode simd_op, FloatCompareOp expected_op) {
347 FLAG_wasm_simd_prototype = true; 332 FLAG_wasm_simd_prototype = true;
348 WasmRunner<int32_t, float, float, int32_t> r(kExecuteCompiled); 333 WasmRunner<int32_t, float, float, int32_t> r(kExecuteCompiled);
349 byte a = 0; 334 byte a = 0;
350 byte b = 1; 335 byte b = 1;
351 byte expected = 2; 336 byte expected = 2;
352 byte simd0 = r.AllocateLocal(kWasmS128); 337 byte simd0 = r.AllocateLocal(kWasmS128);
353 byte simd1 = r.AllocateLocal(kWasmS128); 338 byte simd1 = r.AllocateLocal(kWasmS128);
354 BUILD(r, WASM_BLOCK( 339 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))),
355 WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), 340 WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(b))),
356 WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(b))), 341 WASM_SET_LOCAL(simd1,
357 WASM_SET_LOCAL(simd1, WASM_SIMD_BINOP(simd_op & 0xffu, 342 WASM_SIMD_BINOP(simd_op & 0xffu, WASM_GET_LOCAL(simd0),
358 WASM_GET_LOCAL(simd0), 343 WASM_GET_LOCAL(simd1))),
359 WASM_GET_LOCAL(simd1))), 344 WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, expected), WASM_ONE);
360 WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, expected),
361 WASM_RETURN1(WASM_ONE)));
362 345
363 FOR_FLOAT32_INPUTS(i) { 346 FOR_FLOAT32_INPUTS(i) {
364 if (std::isnan(*i)) continue; 347 if (std::isnan(*i)) continue;
365 FOR_FLOAT32_INPUTS(j) { 348 FOR_FLOAT32_INPUTS(j) {
366 if (std::isnan(*j)) continue; 349 if (std::isnan(*j)) continue;
367 // SIMD on some platforms may handle denormalized numbers differently. 350 // SIMD on some platforms may handle denormalized numbers differently.
368 // Check for number pairs that are very close together. 351 // Check for number pairs that are very close together.
369 if (std::fpclassify(*i - *j) == FP_SUBNORMAL) continue; 352 if (std::fpclassify(*i - *j) == FP_SUBNORMAL) continue;
370 CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); 353 CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j)));
371 } 354 }
(...skipping 13 matching lines...) Expand all
385 // 368 //
386 // SetLocal(1, I32x4Splat(Local(0))); 369 // SetLocal(1, I32x4Splat(Local(0)));
387 // For each lane index 370 // For each lane index
388 // if(Local(0) != I32x4ExtractLane(Local(1), index) 371 // if(Local(0) != I32x4ExtractLane(Local(1), index)
389 // return 0 372 // return 0
390 // 373 //
391 // return 1 374 // return 1
392 WasmRunner<int32_t, int32_t> r(kExecuteCompiled); 375 WasmRunner<int32_t, int32_t> r(kExecuteCompiled);
393 byte lane_val = 0; 376 byte lane_val = 0;
394 byte simd = r.AllocateLocal(kWasmS128); 377 byte simd = r.AllocateLocal(kWasmS128);
395 BUILD(r, WASM_BLOCK(WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT( 378 BUILD(r,
396 WASM_GET_LOCAL(lane_val))), 379 WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(lane_val))),
397 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, lane_val), 380 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, lane_val), WASM_ONE);
398 WASM_RETURN1(WASM_ONE)));
399 381
400 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(*i)); } 382 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(*i)); }
401 } 383 }
402 384
403 WASM_EXEC_TEST(I32x4ReplaceLane) { 385 WASM_EXEC_TEST(I32x4ReplaceLane) {
404 FLAG_wasm_simd_prototype = true; 386 FLAG_wasm_simd_prototype = true;
405 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); 387 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled);
406 byte old_val = 0; 388 byte old_val = 0;
407 byte new_val = 1; 389 byte new_val = 1;
408 byte simd = r.AllocateLocal(kWasmS128); 390 byte simd = r.AllocateLocal(kWasmS128);
409 BUILD(r, WASM_BLOCK( 391 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(old_val))),
410 WASM_SET_LOCAL(simd, 392 WASM_SET_LOCAL(simd,
411 WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(old_val))), 393 WASM_SIMD_I32x4_REPLACE_LANE(0, WASM_GET_LOCAL(simd),
412 WASM_SET_LOCAL( 394 WASM_GET_LOCAL(new_val))),
413 simd, WASM_SIMD_I32x4_REPLACE_LANE(0, WASM_GET_LOCAL(simd), 395 WASM_SIMD_CHECK4(I32x4, simd, I32, new_val, old_val, old_val, old_val),
414 WASM_GET_LOCAL(new_val))), 396 WASM_SET_LOCAL(simd,
415 WASM_SIMD_CHECK4(I32x4, simd, I32, new_val, old_val, old_val, 397 WASM_SIMD_I32x4_REPLACE_LANE(1, WASM_GET_LOCAL(simd),
416 old_val), 398 WASM_GET_LOCAL(new_val))),
417 WASM_SET_LOCAL( 399 WASM_SIMD_CHECK4(I32x4, simd, I32, new_val, new_val, old_val, old_val),
418 simd, WASM_SIMD_I32x4_REPLACE_LANE(1, WASM_GET_LOCAL(simd), 400 WASM_SET_LOCAL(simd,
419 WASM_GET_LOCAL(new_val))), 401 WASM_SIMD_I32x4_REPLACE_LANE(2, WASM_GET_LOCAL(simd),
420 WASM_SIMD_CHECK4(I32x4, simd, I32, new_val, new_val, old_val, 402 WASM_GET_LOCAL(new_val))),
421 old_val), 403 WASM_SIMD_CHECK4(I32x4, simd, I32, new_val, new_val, new_val, old_val),
422 WASM_SET_LOCAL( 404 WASM_SET_LOCAL(simd,
423 simd, WASM_SIMD_I32x4_REPLACE_LANE(2, WASM_GET_LOCAL(simd), 405 WASM_SIMD_I32x4_REPLACE_LANE(3, WASM_GET_LOCAL(simd),
424 WASM_GET_LOCAL(new_val))), 406 WASM_GET_LOCAL(new_val))),
425 WASM_SIMD_CHECK4(I32x4, simd, I32, new_val, new_val, new_val, 407 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, new_val), WASM_ONE);
426 old_val),
427 WASM_SET_LOCAL(
428 simd, WASM_SIMD_I32x4_REPLACE_LANE(3, WASM_GET_LOCAL(simd),
429 WASM_GET_LOCAL(new_val))),
430 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, new_val),
431 WASM_RETURN1(WASM_ONE)));
432 408
433 CHECK_EQ(1, r.Call(1, 2)); 409 CHECK_EQ(1, r.Call(1, 2));
434 } 410 }
435 411
436 #if V8_TARGET_ARCH_ARM 412 #if V8_TARGET_ARCH_ARM
437 413
438 WASM_EXEC_TEST(I16x8Splat) { 414 WASM_EXEC_TEST(I16x8Splat) {
439 FLAG_wasm_simd_prototype = true; 415 FLAG_wasm_simd_prototype = true;
440 416
441 WasmRunner<int32_t, int32_t> r(kExecuteCompiled); 417 WasmRunner<int32_t, int32_t> r(kExecuteCompiled);
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
682 // Tests both signed and unsigned conversion. 658 // Tests both signed and unsigned conversion.
683 WASM_EXEC_TEST(I32x4FromFloat32x4) { 659 WASM_EXEC_TEST(I32x4FromFloat32x4) {
684 FLAG_wasm_simd_prototype = true; 660 FLAG_wasm_simd_prototype = true;
685 WasmRunner<int32_t, float, int32_t, int32_t> r(kExecuteCompiled); 661 WasmRunner<int32_t, float, int32_t, int32_t> r(kExecuteCompiled);
686 byte a = 0; 662 byte a = 0;
687 byte expected_signed = 1; 663 byte expected_signed = 1;
688 byte expected_unsigned = 2; 664 byte expected_unsigned = 2;
689 byte simd0 = r.AllocateLocal(kWasmS128); 665 byte simd0 = r.AllocateLocal(kWasmS128);
690 byte simd1 = r.AllocateLocal(kWasmS128); 666 byte simd1 = r.AllocateLocal(kWasmS128);
691 byte simd2 = r.AllocateLocal(kWasmS128); 667 byte simd2 = r.AllocateLocal(kWasmS128);
692 BUILD(r, WASM_BLOCK( 668 BUILD(
693 WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), 669 r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))),
694 WASM_SET_LOCAL( 670 WASM_SET_LOCAL(simd1, WASM_SIMD_I32x4_FROM_F32x4(WASM_GET_LOCAL(simd0))),
695 simd1, WASM_SIMD_I32x4_FROM_F32x4(WASM_GET_LOCAL(simd0))), 671 WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, expected_signed),
696 WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, expected_signed), 672 WASM_SET_LOCAL(simd2, WASM_SIMD_U32x4_FROM_F32x4(WASM_GET_LOCAL(simd0))),
697 WASM_SET_LOCAL( 673 WASM_SIMD_CHECK_SPLAT4(I32x4, simd2, I32, expected_unsigned), WASM_ONE);
698 simd2, WASM_SIMD_U32x4_FROM_F32x4(WASM_GET_LOCAL(simd0))),
699 WASM_SIMD_CHECK_SPLAT4(I32x4, simd2, I32, expected_unsigned),
700 WASM_RETURN1(WASM_ONE)));
701 674
702 FOR_FLOAT32_INPUTS(i) { 675 FOR_FLOAT32_INPUTS(i) {
703 int32_t signed_value = ConvertToInt(*i, false); 676 int32_t signed_value = ConvertToInt(*i, false);
704 int32_t unsigned_value = ConvertToInt(*i, true); 677 int32_t unsigned_value = ConvertToInt(*i, true);
705 CHECK_EQ(1, r.Call(*i, signed_value, unsigned_value)); 678 CHECK_EQ(1, r.Call(*i, signed_value, unsigned_value));
706 } 679 }
707 } 680 }
708 681
709 void RunI32x4UnOpTest(WasmOpcode simd_op, Int32UnOp expected_op) { 682 void RunI32x4UnOpTest(WasmOpcode simd_op, Int32UnOp expected_op) {
710 FLAG_wasm_simd_prototype = true; 683 FLAG_wasm_simd_prototype = true;
(...skipping 15 matching lines...) Expand all
726 #endif // V8_TARGET_ARCH_ARM 699 #endif // V8_TARGET_ARCH_ARM
727 700
728 void RunI32x4BinOpTest(WasmOpcode simd_op, Int32BinOp expected_op) { 701 void RunI32x4BinOpTest(WasmOpcode simd_op, Int32BinOp expected_op) {
729 FLAG_wasm_simd_prototype = true; 702 FLAG_wasm_simd_prototype = true;
730 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); 703 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled);
731 byte a = 0; 704 byte a = 0;
732 byte b = 1; 705 byte b = 1;
733 byte expected = 2; 706 byte expected = 2;
734 byte simd0 = r.AllocateLocal(kWasmS128); 707 byte simd0 = r.AllocateLocal(kWasmS128);
735 byte simd1 = r.AllocateLocal(kWasmS128); 708 byte simd1 = r.AllocateLocal(kWasmS128);
736 BUILD(r, WASM_BLOCK( 709 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))),
737 WASM_SET_LOCAL(simd0, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), 710 WASM_SET_LOCAL(simd1, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(b))),
738 WASM_SET_LOCAL(simd1, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(b))), 711 WASM_SET_LOCAL(simd1,
739 WASM_SET_LOCAL(simd1, WASM_SIMD_BINOP(simd_op & 0xffu, 712 WASM_SIMD_BINOP(simd_op & 0xffu, WASM_GET_LOCAL(simd0),
740 WASM_GET_LOCAL(simd0), 713 WASM_GET_LOCAL(simd1))),
741 WASM_GET_LOCAL(simd1))), 714 WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, expected), WASM_ONE);
742 WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, expected),
743 WASM_RETURN1(WASM_ONE)));
744 715
745 FOR_INT32_INPUTS(i) { 716 FOR_INT32_INPUTS(i) {
746 FOR_INT32_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } 717 FOR_INT32_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); }
747 } 718 }
748 } 719 }
749 720
750 WASM_EXEC_TEST(I32x4Add) { RunI32x4BinOpTest(kExprI32x4Add, Add); } 721 WASM_EXEC_TEST(I32x4Add) { RunI32x4BinOpTest(kExprI32x4Add, Add); }
751 722
752 WASM_EXEC_TEST(I32x4Sub) { RunI32x4BinOpTest(kExprI32x4Sub, Sub); } 723 WASM_EXEC_TEST(I32x4Sub) { RunI32x4BinOpTest(kExprI32x4Sub, Sub); }
753 724
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
923 WASM_EXEC_TEST(Ui8x16GreaterEqual) { 894 WASM_EXEC_TEST(Ui8x16GreaterEqual) {
924 RunI8x16BinOpTest(kExprI8x16GeU, UnsignedGreaterEqual); 895 RunI8x16BinOpTest(kExprI8x16GeU, UnsignedGreaterEqual);
925 } 896 }
926 897
927 WASM_EXEC_TEST(Ui8x16Less) { RunI8x16BinOpTest(kExprI8x16LtU, UnsignedLess); } 898 WASM_EXEC_TEST(Ui8x16Less) { RunI8x16BinOpTest(kExprI8x16LtU, UnsignedLess); }
928 899
929 WASM_EXEC_TEST(Ui8x16LessEqual) { 900 WASM_EXEC_TEST(Ui8x16LessEqual) {
930 RunI8x16BinOpTest(kExprI8x16LeU, UnsignedLessEqual); 901 RunI8x16BinOpTest(kExprI8x16LeU, UnsignedLessEqual);
931 } 902 }
932 #endif // V8_TARGET_ARCH_ARM 903 #endif // V8_TARGET_ARCH_ARM
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698