test2DMatrixSubtraction.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  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. this.WScript.LoadScriptFile("..\\UnitTestFramework\\SimdJsHelpers.js");
  6. function asmModule(stdlib, imports, buffer) {
  7. "use asm";
  8. var log = stdlib.Math.log;
  9. var toF = stdlib.Math.fround;
  10. var imul = stdlib.Math.imul;
  11. var i4 = stdlib.SIMD.Int32x4;
  12. var i4store = i4.store;
  13. var i4load = i4.load;
  14. var i4swizzle = i4.swizzle;
  15. var i4check = i4.check;
  16. var i4add = i4.add;
  17. var i4sub = i4.sub;
  18. var f4 = stdlib.SIMD.Float32x4;
  19. var f4equal = f4.equal;
  20. var f4lessThan = f4.lessThan;
  21. var f4splat = f4.splat;
  22. var f4store = f4.store;
  23. var f4load = f4.load;
  24. var f4check = f4.check;
  25. var f4abs = f4.abs;
  26. var f4add = f4.add;
  27. var f4sub = f4.sub;
  28. var Float32Heap = new stdlib.Float32Array(buffer);
  29. var Int32Heap = new stdlib.Int32Array(buffer);
  30. var BLOCK_SIZE = 4;
  31. function matrixSubtraction(aIndex, bIndex, cIndex) {
  32. aIndex = aIndex | 0;
  33. bIndex = bIndex | 0;
  34. cIndex = cIndex | 0;
  35. var i = 0, dim1 = 0, dim2 = 0, matrixSize = 0;
  36. var aPiece = i4(0, 0, 0, 0), bPiece = i4(0, 0, 0, 0);
  37. dim1 = Int32Heap[aIndex << 2 >> 2] | 0;
  38. dim2 = Int32Heap[aIndex + 1 << 2 >> 2] | 0;
  39. matrixSize = imul(dim1, dim2);
  40. //array dimensions don't match
  41. if (((dim2 | 0) != (Int32Heap[bIndex + 1 << 2 >> 2] | 0)) | ((dim1 | 0) != (Int32Heap[bIndex << 2 >> 2] | 0))) {
  42. return -1;
  43. }
  44. Int32Heap[cIndex << 2 >> 2] = dim1;
  45. Int32Heap[cIndex + 1 << 2 >> 2] = dim2;
  46. while ((i|0) < (matrixSize|0)) {
  47. aPiece = i4load(Int32Heap, aIndex + 2 + i << 2 >> 2);
  48. bPiece = i4load(Int32Heap, bIndex + 2 + i << 2 >> 2);
  49. i4store(Int32Heap, cIndex + 2 + i << 2 >> 2, i4sub(aPiece, bPiece));
  50. i = (i + BLOCK_SIZE)|0;
  51. }
  52. return 0;
  53. }
  54. function new2DMatrix(startIndex, dim1, dim2) {
  55. startIndex = startIndex | 0;
  56. dim1 = dim1 | 0;
  57. dim2 = dim2 | 0;
  58. var i = 0, matrixSize = 0;
  59. matrixSize = imul(dim1, dim2);
  60. Int32Heap[startIndex << 2 >> 2] = dim1;
  61. Int32Heap[startIndex + 1 << 2 >> 2] = dim2;
  62. for (i = 0; (i|0) < ((matrixSize - BLOCK_SIZE)|0); i = (i + BLOCK_SIZE)|0) {
  63. i4store(Int32Heap, startIndex + 2 + i << 2 >> 2, i4((i + 1), (i + 2), (i + 3), (i + 4)));
  64. }
  65. for (; (i|0) < (matrixSize|0); i = (i + 1)|0) {
  66. Int32Heap[(startIndex + 2 + i) << 2 >> 2] = (i + 1) | 0;
  67. }
  68. return (startIndex + 2 + i) | 0;
  69. }
  70. return {
  71. new2DMatrix: new2DMatrix,
  72. matrixSubtraction: matrixSubtraction
  73. };
  74. }
  75. ////////////////////////////////////////////////////////////////
  76. //Call GEN_BASELINE() to generate baseline data and initialize RESULTS with it.
  77. ///////////////////////////////////////////////////////////////
  78. function GEN_BASELINE(buffer, start) {
  79. var IntHeap32 = new Int32Array(buffer);
  80. var FloatHeap32 = new Float32Array(buffer);
  81. var i4;
  82. var dim1 = IntHeap32[start];
  83. var dim2 = IntHeap32[start + 1];
  84. print("[");
  85. for (var i = 0; i < Math.imul(dim1, dim2) ; i += 4) {
  86. i4 = SIMD.Int32x4.load(IntHeap32, i + start + 2);
  87. print(i4.toString()+",");
  88. }
  89. print("]");
  90. }
  91. function verify2DMatrix(buffer, start, results) {
  92. var IntHeap32 = new Int32Array(buffer);
  93. var FloatHeap32 = new Float32Array(buffer);
  94. var i4;
  95. var dim1 = IntHeap32[start];
  96. var dim2 = IntHeap32[start + 1];
  97. for (var i = 0, rslt_idx = 0; i < Math.imul(dim1, dim2) ; i += 4) {
  98. i4 = SIMD.Int32x4.load(IntHeap32, i + start + 2);
  99. equalSimd(results[rslt_idx++], i4, SIMD.Int32x4, "2d Matrix Addition");
  100. }
  101. }
  102. var buffer = new ArrayBuffer(16 * 1024 * 1024);
  103. var m = asmModule(this, null, buffer);
  104. print("2D Matrix Subtraction");
  105. m.new2DMatrix(0, 13, 17);
  106. m.new2DMatrix(500, 13, 17);
  107. m.matrixSubtraction(0, 500, 1000);
  108. m.matrixSubtraction(1000, 0, 1500);
  109. // print2DMatrix(buffer, 1000);
  110. // print2DMatrix(buffer, 1500);
  111. // GEN_BASELINE(buffer, 1000);
  112. var RESULTS =[
  113. SIMD.Int32x4(0, 0, 0, 0),
  114. SIMD.Int32x4(0, 0, 0, 0),
  115. SIMD.Int32x4(0, 0, 0, 0),
  116. SIMD.Int32x4(0, 0, 0, 0),
  117. SIMD.Int32x4(0, 0, 0, 0),
  118. SIMD.Int32x4(0, 0, 0, 0),
  119. SIMD.Int32x4(0, 0, 0, 0),
  120. SIMD.Int32x4(0, 0, 0, 0),
  121. SIMD.Int32x4(0, 0, 0, 0),
  122. SIMD.Int32x4(0, 0, 0, 0),
  123. SIMD.Int32x4(0, 0, 0, 0),
  124. SIMD.Int32x4(0, 0, 0, 0),
  125. SIMD.Int32x4(0, 0, 0, 0),
  126. SIMD.Int32x4(0, 0, 0, 0),
  127. SIMD.Int32x4(0, 0, 0, 0),
  128. SIMD.Int32x4(0, 0, 0, 0),
  129. SIMD.Int32x4(0, 0, 0, 0),
  130. SIMD.Int32x4(0, 0, 0, 0),
  131. SIMD.Int32x4(0, 0, 0, 0),
  132. SIMD.Int32x4(0, 0, 0, 0),
  133. SIMD.Int32x4(0, 0, 0, 0),
  134. SIMD.Int32x4(0, 0, 0, 0),
  135. SIMD.Int32x4(0, 0, 0, 0),
  136. SIMD.Int32x4(0, 0, 0, 0),
  137. SIMD.Int32x4(0, 0, 0, 0),
  138. SIMD.Int32x4(0, 0, 0, 0),
  139. SIMD.Int32x4(0, 0, 0, 0),
  140. SIMD.Int32x4(0, 0, 0, 0),
  141. SIMD.Int32x4(0, 0, 0, 0),
  142. SIMD.Int32x4(0, 0, 0, 0),
  143. SIMD.Int32x4(0, 0, 0, 0),
  144. SIMD.Int32x4(0, 0, 0, 0),
  145. SIMD.Int32x4(0, 0, 0, 0),
  146. SIMD.Int32x4(0, 0, 0, 0),
  147. SIMD.Int32x4(0, 0, 0, 0),
  148. SIMD.Int32x4(0, 0, 0, 0),
  149. SIMD.Int32x4(0, 0, 0, 0),
  150. SIMD.Int32x4(0, 0, 0, 0),
  151. SIMD.Int32x4(0, 0, 0, 0),
  152. SIMD.Int32x4(0, 0, 0, 0),
  153. SIMD.Int32x4(0, 0, 0, 0),
  154. SIMD.Int32x4(0, 0, 0, 0),
  155. SIMD.Int32x4(0, 0, 0, 0),
  156. SIMD.Int32x4(0, 0, 0, 0),
  157. SIMD.Int32x4(0, 0, 0, 0),
  158. SIMD.Int32x4(0, 0, 0, 0),
  159. SIMD.Int32x4(0, 0, 0, 0),
  160. SIMD.Int32x4(0, 0, 0, 0),
  161. SIMD.Int32x4(0, 0, 0, 0),
  162. SIMD.Int32x4(0, 0, 0, 0),
  163. SIMD.Int32x4(0, 0, 0, 0),
  164. SIMD.Int32x4(0, 0, 0, 0),
  165. SIMD.Int32x4(0, 0, 0, 0),
  166. SIMD.Int32x4(0, 0, 0, 0),
  167. SIMD.Int32x4(0, 0, 0, 0),
  168. SIMD.Int32x4(0, 0, 0, 0),
  169. ];
  170. verify2DMatrix(buffer, 1000, RESULTS);
  171. // GEN_BASELINE(buffer, 1500);
  172. var RESULTS =[
  173. SIMD.Int32x4(-1, -2, -3, -4),
  174. SIMD.Int32x4(-5, -6, -7, -8),
  175. SIMD.Int32x4(-9, -10, -11, -12),
  176. SIMD.Int32x4(-13, -14, -15, -16),
  177. SIMD.Int32x4(-17, -18, -19, -20),
  178. SIMD.Int32x4(-21, -22, -23, -24),
  179. SIMD.Int32x4(-25, -26, -27, -28),
  180. SIMD.Int32x4(-29, -30, -31, -32),
  181. SIMD.Int32x4(-33, -34, -35, -36),
  182. SIMD.Int32x4(-37, -38, -39, -40),
  183. SIMD.Int32x4(-41, -42, -43, -44),
  184. SIMD.Int32x4(-45, -46, -47, -48),
  185. SIMD.Int32x4(-49, -50, -51, -52),
  186. SIMD.Int32x4(-53, -54, -55, -56),
  187. SIMD.Int32x4(-57, -58, -59, -60),
  188. SIMD.Int32x4(-61, -62, -63, -64),
  189. SIMD.Int32x4(-65, -66, -67, -68),
  190. SIMD.Int32x4(-69, -70, -71, -72),
  191. SIMD.Int32x4(-73, -74, -75, -76),
  192. SIMD.Int32x4(-77, -78, -79, -80),
  193. SIMD.Int32x4(-81, -82, -83, -84),
  194. SIMD.Int32x4(-85, -86, -87, -88),
  195. SIMD.Int32x4(-89, -90, -91, -92),
  196. SIMD.Int32x4(-93, -94, -95, -96),
  197. SIMD.Int32x4(-97, -98, -99, -100),
  198. SIMD.Int32x4(-101, -102, -103, -104),
  199. SIMD.Int32x4(-105, -106, -107, -108),
  200. SIMD.Int32x4(-109, -110, -111, -112),
  201. SIMD.Int32x4(-113, -114, -115, -116),
  202. SIMD.Int32x4(-117, -118, -119, -120),
  203. SIMD.Int32x4(-121, -122, -123, -124),
  204. SIMD.Int32x4(-125, -126, -127, -128),
  205. SIMD.Int32x4(-129, -130, -131, -132),
  206. SIMD.Int32x4(-133, -134, -135, -136),
  207. SIMD.Int32x4(-137, -138, -139, -140),
  208. SIMD.Int32x4(-141, -142, -143, -144),
  209. SIMD.Int32x4(-145, -146, -147, -148),
  210. SIMD.Int32x4(-149, -150, -151, -152),
  211. SIMD.Int32x4(-153, -154, -155, -156),
  212. SIMD.Int32x4(-157, -158, -159, -160),
  213. SIMD.Int32x4(-161, -162, -163, -164),
  214. SIMD.Int32x4(-165, -166, -167, -168),
  215. SIMD.Int32x4(-169, -170, -171, -172),
  216. SIMD.Int32x4(-173, -174, -175, -176),
  217. SIMD.Int32x4(-177, -178, -179, -180),
  218. SIMD.Int32x4(-181, -182, -183, -184),
  219. SIMD.Int32x4(-185, -186, -187, -188),
  220. SIMD.Int32x4(-189, -190, -191, -192),
  221. SIMD.Int32x4(-193, -194, -195, -196),
  222. SIMD.Int32x4(-197, -198, -199, -200),
  223. SIMD.Int32x4(-201, -202, -203, -204),
  224. SIMD.Int32x4(-205, -206, -207, -208),
  225. SIMD.Int32x4(-209, -210, -211, -212),
  226. SIMD.Int32x4(-213, -214, -215, -216),
  227. SIMD.Int32x4(-217, -218, -219, -220),
  228. SIMD.Int32x4(-221, 0, 0, 0),
  229. ];
  230. verify2DMatrix(buffer, 1500, RESULTS);
  231. print("PASS");