storeTests.js 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft Corporation and contributors. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. let passed = true;
  6. function assertEquals(expected, actual) {
  7. if (expected != actual) {
  8. passed = false;
  9. throw `Expected ${expected}, received ${actual}`;
  10. }
  11. }
  12. let check = function(expected, funName, ...args) {
  13. let fun = eval(funName);
  14. var result;
  15. try {
  16. result = fun(...args);
  17. }
  18. catch (e) {
  19. result = e.name;
  20. }
  21. if(result != expected)
  22. {
  23. passed = false;
  24. print(`${funName}(${[...args]}) produced ${result}, expected ${expected}`);
  25. }
  26. }
  27. const INITIAL_SIZE = 1;
  28. const module = new WebAssembly.Module(readbuffer('stores.wasm'));
  29. let memObj = new WebAssembly.Memory({initial:INITIAL_SIZE});
  30. const instance = new WebAssembly.Instance(module, { "dummy" : { "memory" : memObj } }).exports;
  31. let intArray = new Int32Array (memObj.buffer);
  32. let byteArray = new Uint8Array (memObj.buffer);
  33. let testStore = function (funcname, ...expected) {
  34. const index = 0;
  35. for (let i = 0; i < expected.length; i++) {
  36. intArray[4 + i] = expected[i];
  37. }
  38. instance[funcname](index, ...expected);
  39. for (let i = 0; i < expected.length; i++)
  40. assertEquals(expected[i], intArray[index + i]);
  41. }
  42. testStore("v128_store4", 777, 888, 999, 1111);
  43. testStore("v128_store4", -1, 0, 0, -1);
  44. testStore("v128_store4", -1, -1, -1, -1);
  45. for (let i = 0; i < 18; i++) {
  46. byteArray[i] = 0;
  47. }
  48. // Check that v128 store does not overrun value boundaries
  49. instance.v128_store_i32x4(1, 0x01020304);
  50. assertEquals(0, byteArray[0]);
  51. assertEquals(4, byteArray[1]);
  52. assertEquals(3, byteArray[2]);
  53. assertEquals(2, byteArray[3]);
  54. assertEquals(1, byteArray[4]);
  55. assertEquals(4, byteArray[5]);
  56. assertEquals(3, byteArray[6]);
  57. assertEquals(2, byteArray[7]);
  58. assertEquals(1, byteArray[8]);
  59. assertEquals(4, byteArray[9]);
  60. assertEquals(3, byteArray[10]);
  61. assertEquals(2, byteArray[11]);
  62. assertEquals(1, byteArray[12]);
  63. assertEquals(4, byteArray[13]);
  64. assertEquals(3, byteArray[14]);
  65. assertEquals(2, byteArray[15]);
  66. assertEquals(1, byteArray[16]);
  67. assertEquals(0, byteArray[17]);
  68. const MEM_SIZE_IN_BYTES = 1024 * 64;
  69. check("RangeError", "instance.v128_store4", MEM_SIZE_IN_BYTES - 12, 777, 888, 999, 1111);
  70. check("RangeError", "instance.v128_store4", MEM_SIZE_IN_BYTES - 8, 777, 888, 999, 1111);
  71. check("RangeError", "instance.v128_store4", MEM_SIZE_IN_BYTES - 4, 777, 888, 999, 1111);
  72. check("RangeError", "instance.v128_store4_offset", -1, 777, 888, 999, 1111);
  73. check("RangeError", "instance.v128_store4_offset", 0xFFFFFFFC, 777, 888, 999, 1111);
  74. check(undefined, "instance.v128_store4", MEM_SIZE_IN_BYTES - 16, 777, 888, 999, 1111);
  75. if (passed) {
  76. print("Passed");
  77. }