testLoad.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. function equal(a, b) {
  6. if (a == b)
  7. WScript.Echo("Correct");
  8. else
  9. WScript.Echo(">> Fail!");
  10. }
  11. var bufLanes = 2 * 4; //4 = lane size; Test all alignments.
  12. var bufSize = bufLanes * 4 + 8; //bufLanes * lane Size + 8; Extra for over-alignment test.
  13. var ab = new ArrayBuffer(bufSize);
  14. var buf = new Int32Array(ab);
  15. function testLoad() {
  16. WScript.Echo("Int32x4 load");
  17. for (var i = 0; i < bufLanes; i++) buf[i] = i; // Number buffer sequentially.
  18. WScript.Echo("Int32x4 load: Test aligned loads");
  19. for (var i = 0; i < 4; i++) {
  20. var a = SIMD.Int32x4.load(buf, i);
  21. for (var index = 0; index < 4; index++) {
  22. var v = SIMD.Int32x4.extractLane(a, index);
  23. equal(v, i + index);
  24. }
  25. }
  26. WScript.Echo("Int32x4 load: Test 2 possible over-alignments");
  27. var f64 = new Float64Array(ab);
  28. var stride = 8 / 4; // 4= lane Size;
  29. for (var i = 0; i < 1; i++) {
  30. var a = SIMD.Int32x4.load(f64, i);
  31. for (var index = 0; index < 4; index++) {
  32. var v = SIMD.Int32x4.extractLane(a, index);
  33. equal(v, stride * i + index);
  34. }
  35. }
  36. WScript.Echo("Int32x4 load: Test 7 possible mis-alignments");
  37. var i8 = new Int8Array(ab);
  38. for (var misalignment = 1; misalignment < 8; misalignment++) {
  39. // Shift the buffer up by 1 byte.
  40. for (var i = i8.length - 1; i > 0; i--)
  41. i8[i] = i8[i - 1];
  42. var a = SIMD.Int32x4.load(i8, misalignment);
  43. for (var index = 0; index < 4; index++) {
  44. var v = SIMD.Int32x4.extractLane(a, index);
  45. equal(v, i + index);
  46. }
  47. }
  48. }
  49. function testLoad1() {
  50. WScript.Echo("Int32x4 load1");
  51. for (var i = 0; i < bufLanes; i++) buf[i] = i; // Number buffer sequentially.
  52. WScript.Echo("Int32x4 load1: Test aligned loads");
  53. for (var i = 0; i < 4; i++) {
  54. var a = SIMD.Int32x4.load1(buf, i);
  55. for (var index = 0; index < 4; index++) {
  56. var v = SIMD.Int32x4.extractLane(a, index);
  57. equal(v, index < 1 ? i + index : 0);
  58. }
  59. }
  60. WScript.Echo("Int32x4 load1: Test 2 possible over-alignments");
  61. var f64 = new Float64Array(ab);
  62. var stride = 8 / 4; // 4= type.laneSize;
  63. for (var i = 0; i < 1; i++) {
  64. var a = SIMD.Int32x4.load1(f64, i);
  65. for (var index = 0; index < 4; index++) {
  66. var v = SIMD.Int32x4.extractLane(a, index);
  67. equal(v, index < 1 ? stride * i + index : 0);
  68. }
  69. }
  70. WScript.Echo("Int32x4 load1: Test 7 possible mis-alignments");
  71. var i8 = new Int8Array(ab);
  72. for (var misalignment = 1; misalignment < 8; misalignment++) {
  73. // Shift the buffer up by 1 byte.
  74. for (var i = i8.length - 1; i > 0; i--)
  75. i8[i] = i8[i - 1];
  76. var a = SIMD.Int32x4.load1(i8, misalignment);
  77. for (var index = 0; index < 4; index++) {
  78. var v = SIMD.Int32x4.extractLane(a, index);
  79. equal(v, index < 1 ? i + index : 0);
  80. }
  81. }
  82. }
  83. function testLoad2() {
  84. WScript.Echo("Int32x4 load2");
  85. for (var i = 0; i < bufLanes; i++) buf[i] = i; // Number buffer sequentially.
  86. WScript.Echo("Int32x4 load2: Test aligned loads");
  87. for (var i = 0; i < 4; i++) {
  88. var a = SIMD.Int32x4.load2(buf, i);
  89. for (var index = 0; index < 4; index++) {
  90. var v = SIMD.Int32x4.extractLane(a, index);
  91. equal(v, index < 2 ? i + index : 0);
  92. }
  93. }
  94. WScript.Echo("Int32x4 load2: Test 2 possible over-alignments");
  95. var f64 = new Float64Array(ab);
  96. var stride = 8 / 4; // 4= laneSize;
  97. for (var i = 0; i < 1; i++) {
  98. var a = SIMD.Int32x4.load2(f64, i);
  99. for (var index = 0; index < 4; index++) {
  100. var v = SIMD.Int32x4.extractLane(a, index);
  101. equal(v, index < 2 ? stride * i + index : 0);
  102. }
  103. }
  104. WScript.Echo("Int32x4 load2: Test 7 possible mis-alignments");
  105. var i8 = new Int8Array(ab);
  106. for (var misalignment = 1; misalignment < 8; misalignment++) {
  107. // Shift the buffer up by 1 byte.
  108. for (var i = i8.length - 1; i > 0; i--)
  109. i8[i] = i8[i - 1];
  110. var a = SIMD.Int32x4.load2(i8, misalignment);
  111. for (var index = 0; index < 4; index++) {
  112. var v = SIMD.Int32x4.extractLane(a, index);
  113. equal(v, index < 2 ? i + index : 0);
  114. }
  115. }
  116. }
  117. function testLoad3() {
  118. WScript.Echo("Int32x4 load3");
  119. for (var i = 0; i < bufLanes; i++) buf[i] = i; // Number buffer sequentially.
  120. WScript.Echo("Int32x4 load3: Test aligned loads");
  121. for (var i = 0; i < 4; i++) {
  122. var a = SIMD.Int32x4.load3(buf, i);
  123. for (var index = 0; index < 4; index++) {
  124. var v = SIMD.Int32x4.extractLane(a, index);
  125. equal(v, index < 3 ? i + index : 0);
  126. }
  127. }
  128. WScript.Echo("Int32x4 load3: Test 2 possible over-alignments");
  129. var f64 = new Float64Array(ab);
  130. var stride = 8 / 4; // 4= laneSize;
  131. for (var i = 0; i < 1; i++) {
  132. var a = SIMD.Int32x4.load3(f64, i);
  133. for (var index = 0; index < 4; index++) {
  134. var v = SIMD.Int32x4.extractLane(a, index);
  135. equal(v, index < 3 ? stride * i + index : 0);
  136. }
  137. }
  138. WScript.Echo("Int32x4 load3: Test 7 possible mis-alignments");
  139. var i8 = new Int8Array(ab);
  140. for (var misalignment = 1; misalignment < 8; misalignment++) {
  141. // Shift the buffer up by 1 byte.
  142. for (var i = i8.length - 1; i > 0; i--)
  143. i8[i] = i8[i - 1];
  144. var a = SIMD.Int32x4.load3(i8, misalignment);
  145. for (var index = 0; index < 4; index++) {
  146. var v = SIMD.Int32x4.extractLane(a, index);
  147. equal(v, index < 3 ? i + index : 0);
  148. }
  149. }
  150. }
  151. testLoad();
  152. testLoad1();
  153. testLoad2();
  154. testLoad3();