test2DMatrixAddition.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  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 i4swizzle = i4.swizzle;
  14. var i4check = i4.check;
  15. var f4 = stdlib.SIMD.Float32x4;
  16. var f4equal = f4.equal;
  17. var f4lessThan = f4.lessThan;
  18. var f4splat = f4.splat;
  19. var f4store = f4.store;
  20. var f4load = f4.load;
  21. var f4check = f4.check;
  22. var f4abs = f4.abs;
  23. var f4add = f4.add;
  24. var f4sub = f4.sub;
  25. var Float32Heap = new stdlib.Float32Array(buffer);
  26. var Int32Heap = new stdlib.Int32Array(buffer);
  27. var BLOCK_SIZE = 4;
  28. function matrixAddition(aIndex, bIndex, cIndex) {
  29. aIndex = aIndex | 0;
  30. bIndex = bIndex | 0;
  31. cIndex = cIndex | 0;
  32. var i = 0, dim1 = 0, dim2 = 0, matrixSize = 0;
  33. var aPiece = f4(0.0, 0.0, 0.0, 0.0), bPiece = f4(0.0, 0.0, 0.0, 0.0);
  34. dim1 = Int32Heap[aIndex << 2 >> 2] | 0;
  35. dim2 = Int32Heap[aIndex + 1 << 2 >> 2] | 0;
  36. matrixSize = imul(dim1, dim2);
  37. //array dimensions don't match
  38. if (((dim2 | 0) != (Int32Heap[bIndex + 1 << 2 >> 2] | 0)) | ((dim1 | 0) != (Int32Heap[bIndex << 2 >> 2] | 0))) {
  39. return -1;
  40. }
  41. Int32Heap[cIndex << 2 >> 2] = dim1;
  42. Int32Heap[cIndex + 1 << 2 >> 2] = dim2;
  43. while ((i|0) < (matrixSize|0)) {
  44. aPiece = f4load(Float32Heap, aIndex + 2 + i << 2 >> 2);
  45. bPiece = f4load(Float32Heap, bIndex + 2 + i << 2 >> 2);
  46. f4store(Float32Heap, cIndex + 2 + i << 2 >> 2, f4add(aPiece, bPiece));
  47. i = (i + BLOCK_SIZE)|0;
  48. }
  49. return 0;
  50. }
  51. function new2DMatrix(startIndex, dim1, dim2) {
  52. startIndex = startIndex | 0;
  53. dim1 = dim1 | 0;
  54. dim2 = dim2 | 0;
  55. var i = 0, matrixSize = 0;
  56. matrixSize = imul(dim1, dim2);
  57. Int32Heap[startIndex << 2 >> 2] = dim1;
  58. Int32Heap[startIndex + 1 << 2 >> 2] = dim2;
  59. for (i = 0; (i|0) < ((matrixSize - BLOCK_SIZE)|0); i = (i + BLOCK_SIZE)|0) {
  60. f4store(Float32Heap, startIndex + 2 + i << 2 >> 2, f4(toF((i + 1)|0), toF((i + 2)|0), toF((i + 3)|0), toF((i + 4)|0)));
  61. }
  62. for (; (i|0) < (matrixSize|0); i = (i + 1)|0) {
  63. Float32Heap[(startIndex + 2 + i) << 2 >> 2] = toF((i + 1)|0);
  64. }
  65. return (startIndex + 2 + i) | 0;
  66. }
  67. return {
  68. new2DMatrix: new2DMatrix,
  69. matrixAddition: matrixAddition
  70. };
  71. }
  72. function verify_results(type, results_ex, buffer, count)
  73. {
  74. var i4;
  75. for (var i = 0, idx = 0; i < count/* * 16*/; i += 4)
  76. {
  77. i4 = type.load(buffer, i);
  78. equalSimd(results_ex[idx++], i4, type, "Matrix Add" );
  79. }
  80. }
  81. var exp_results = [
  82. SIMD.Float32x4(2,4,6,8),
  83. SIMD.Float32x4(10,12,14,16),
  84. SIMD.Float32x4(18,20,22,24),
  85. SIMD.Float32x4(26,28,30,32),
  86. SIMD.Float32x4(34,36,38,40),
  87. SIMD.Float32x4(42,44,46,48),
  88. SIMD.Float32x4(50,52,54,56),
  89. SIMD.Float32x4(58,60,62,64),
  90. SIMD.Float32x4(66,68,70,72),
  91. SIMD.Float32x4(74,76,78,80),
  92. SIMD.Float32x4(82,84,86,88),
  93. SIMD.Float32x4(90,92,94,96),
  94. SIMD.Float32x4(98,100,102,104),
  95. SIMD.Float32x4(106,108,110,112),
  96. SIMD.Float32x4(114,116,118,120),
  97. SIMD.Float32x4(122,124,126,128),
  98. SIMD.Float32x4(130,132,134,136),
  99. SIMD.Float32x4(138,140,142,144),
  100. SIMD.Float32x4(146,148,150,152),
  101. SIMD.Float32x4(154,156,158,160),
  102. SIMD.Float32x4(162,164,166,168),
  103. SIMD.Float32x4(170,172,174,176),
  104. SIMD.Float32x4(178,180,182,184),
  105. SIMD.Float32x4(186,188,190,192),
  106. SIMD.Float32x4(194,196,198,200),
  107. SIMD.Float32x4(202,204,206,208),
  108. SIMD.Float32x4(210,212,214,216),
  109. SIMD.Float32x4(218,220,222,224),
  110. SIMD.Float32x4(226,228,230,232),
  111. SIMD.Float32x4(234,236,238,240),
  112. SIMD.Float32x4(242,244,246,248),
  113. SIMD.Float32x4(250,252,254,256),
  114. SIMD.Float32x4(258,260,262,264),
  115. SIMD.Float32x4(266,268,270,272),
  116. SIMD.Float32x4(274,276,278,280),
  117. SIMD.Float32x4(282,284,286,288),
  118. SIMD.Float32x4(290,292,294,296),
  119. SIMD.Float32x4(298,300,302,304),
  120. SIMD.Float32x4(306,308,310,312),
  121. SIMD.Float32x4(314,316,318,320),
  122. SIMD.Float32x4(322,324,326,328),
  123. SIMD.Float32x4(330,332,334,336),
  124. SIMD.Float32x4(338,340,342,344),
  125. SIMD.Float32x4(346,348,350,352),
  126. SIMD.Float32x4(354,356,358,360),
  127. SIMD.Float32x4(362,364,366,368),
  128. SIMD.Float32x4(370,372,374,376),
  129. SIMD.Float32x4(378,380,382,384),
  130. SIMD.Float32x4(386,388,390,392),
  131. SIMD.Float32x4(394,396,398,400),
  132. SIMD.Float32x4(402,404,406,408),
  133. SIMD.Float32x4(410,412,414,416),
  134. SIMD.Float32x4(418,420,422,424),
  135. SIMD.Float32x4(426,428,430,432)
  136. ];
  137. var buffer = new ArrayBuffer(16 * 1024 * 1024);
  138. var m = asmModule(this, null, buffer);
  139. m.new2DMatrix(0, 18, 12);
  140. m.new2DMatrix(500, 18, 12);
  141. m.matrixAddition(0, 500, 1000);
  142. var values = new Float32Array(buffer).subarray(1000 + 2);
  143. verify_results(SIMD.Float32x4, exp_results, values, 54*4);
  144. print("PASS");