testMisc.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  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. this.WScript.LoadScriptFile("..\\UnitTestFramework\\SimdJsHelpers.js");
  6. function asmModule(stdlib, imports,buffer) {
  7. "use asm";
  8. var i4 = stdlib.SIMD.Int32x4;
  9. var i4check = i4.check;
  10. var i4splat = i4.splat;
  11. var i4fromFloat32x4 = i4.fromFloat32x4;
  12. var i4fromFloat32x4Bits = i4.fromFloat32x4Bits;
  13. //var i4abs = i4.abs;
  14. var i4neg = i4.neg;
  15. var i4add = i4.add;
  16. var i4sub = i4.sub;
  17. var i4mul = i4.mul;
  18. //var i4swizzle = i4.swizzle;
  19. //var i4shuffle = i4.shuffle;
  20. var i4lessThan = i4.lessThan;
  21. var i4equal = i4.equal;
  22. var i4greaterThan = i4.greaterThan;
  23. var i4select = i4.select;
  24. var i4and = i4.and;
  25. var i4or = i4.or;
  26. var i4xor = i4.xor;
  27. var i4not = i4.not;
  28. var i4shiftLeftByScalar = i4.shiftLeftByScalar;
  29. var i4shiftRightByScalar = i4.shiftRightByScalar;
  30. var i8 = stdlib.SIMD.Int16x8;
  31. var i8check = i8.check;
  32. var i8extractLane = i8.extractLane ;
  33. var i8swizzle = i8.swizzle ;
  34. var i8shuffle = i8.shuffle ;
  35. var i8splat = i8.splat ;
  36. var i8replaceLane = i8.replaceLane ;
  37. var i8and = i8.and ;
  38. var i8or = i8.or ;
  39. var i8xor = i8.xor ;
  40. var i8not = i8.not ;
  41. var i8add = i8.add ;
  42. var i8sub = i8.sub ;
  43. var i8mul = i8.mul ;
  44. var i8neg = i8.neg ;
  45. var i8shiftLeftByScalar = i8.shiftLeftByScalar ;
  46. var i8shiftRightByScalar= i8.shiftRightByScalar ;
  47. var i8addSaturate = i8.addSaturate ;
  48. var i8subSaturate = i8.subSaturate ;
  49. var i8load = i8.load ;
  50. var i8store = i8.store ;
  51. var i8fromFloat32x4Bits = i8.fromFloat32x4Bits ;
  52. var i8fromInt32x4Bits = i8.fromInt32x4Bits ;
  53. var i8fromUint32x4Bits = i8.fromUint32x4Bits ;
  54. var i8fromUint16x8Bits = i8.fromUint16x8Bits ;
  55. var i8fromUint8x16Bits = i8.fromUint8x16Bits ;
  56. var u4 = stdlib.SIMD.Uint32x4;
  57. var u4check = u4.check;
  58. var u8 = stdlib.SIMD.Uint16x8;
  59. var u8check = u8.check;
  60. var u16 = stdlib.SIMD.Uint8x16;
  61. var u16check = u16.check;
  62. var f4 = stdlib.SIMD.Float32x4;
  63. var f4check = f4.check;
  64. var f4splat = f4.splat;
  65. var f4fromInt32x4 = f4.fromInt32x4;
  66. var f4fromInt32x4Bits = f4.fromInt32x4Bits;
  67. var f4abs = f4.abs;
  68. var f4neg = f4.neg;
  69. var f4add = f4.add;
  70. var f4sub = f4.sub;
  71. var f4mul = f4.mul;
  72. var f4div = f4.div;
  73. var f4sqrt = f4.sqrt;
  74. //var f4swizzle = f4.swizzle;
  75. //var f4shuffle = f4.shuffle;
  76. var f4lessThan = f4.lessThan;
  77. var f4lessThanOrEqual = f4.lessThanOrEqual;
  78. var f4equal = f4.equal;
  79. var f4notEqual = f4.notEqual;
  80. var f4greaterThan = f4.greaterThan;
  81. var f4greaterThanOrEqual = f4.greaterThanOrEqual;
  82. var f4select = f4.select;
  83. var fround = stdlib.Math.fround;
  84. var globImportF4 = f4check(imports.g1); // global var import
  85. var globImportI4 = i4check(imports.g2); // global var import
  86. var f4g1 = f4(-5033.2,-3401.0,665.34,32234.1); // global var initialized
  87. var f4g2 = f4(1194580.33,-11201.5,63236.93,334.8); // global var initialized
  88. var i4g1 = i4(1065353216, -1073741824, -1077936128, 1082130432); // global var initialized
  89. var i4g2 = i4(353216, -492529, -1128, 1085); // global var initialized
  90. var i8g1 = i8(1065353216, -1073741824, -1077936128, 1082130432, 1065353216, -1073741824, -1077936128, 1082130432);
  91. var i8g2 = i8(0, -124, 6128, 10432, 216, -824, -3128, 10);
  92. var gval = 1234;
  93. var gval2 = 1234.0;
  94. var Int8Heap = new stdlib.Int8Array (buffer);
  95. var Uint8Heap = new stdlib.Uint8Array (buffer);
  96. var Int16Heap = new stdlib.Int16Array(buffer);
  97. var Uint16Heap = new stdlib.Uint16Array(buffer);
  98. var Int32Heap = new stdlib.Int32Array(buffer);
  99. var Uint32Heap = new stdlib.Uint32Array(buffer);
  100. var Float32Heap = new stdlib.Float32Array(buffer);
  101. var loopCOUNT = 3;
  102. function func1()
  103. {
  104. var x = i8(-1, -2, -3, -4, -5, -6, -7, -8);;
  105. var y = 0;
  106. var s = 0;
  107. var loopIndex = 0;
  108. var loopCOUNT = 3;
  109. x = i8g2;
  110. while ( (loopIndex|0) < (loopCOUNT|0)) {
  111. y = i8extractLane(x, 0);
  112. s = ( s + y ) | 0;
  113. y = i8extractLane(x, 1);
  114. s = ( s + y ) | 0;
  115. y = i8extractLane(x, 2);
  116. s = ( s + y ) | 0;
  117. y = i8extractLane(x, 3);
  118. s = ( s + y ) | 0;
  119. y = i8extractLane(x, 4);
  120. s = ( s + y ) | 0;
  121. y = i8extractLane(x, 5);
  122. s = ( s + y ) | 0;
  123. y = i8extractLane(x, 6);
  124. s = ( s + y ) | 0;
  125. y = i8extractLane(x, 7);
  126. s = ( s + y ) | 0;
  127. loopIndex = (loopIndex + 1) | 0;
  128. }
  129. return s | 0;
  130. }
  131. function func2(a)
  132. {
  133. a = i8check(a);
  134. var x = i8(0, 0, 0, 0, 0, 0, 0, 0);
  135. var loopIndex = 0;
  136. var loopCOUNT = 3;
  137. while ( (loopIndex|0) < (loopCOUNT|0)) {
  138. x = i8swizzle(x, 1, 2, 3, 4, 0, 7, 7, 7);
  139. x = i8shuffle(a, x, 0, 1, 10, 11, 2, 3, 12, 13);
  140. loopIndex = (loopIndex + 1) | 0;
  141. }
  142. return i8check(x);
  143. }
  144. function func3(a)
  145. {
  146. a = i8check(a);
  147. var x = i8(0, 0, 0, 0, 0, 0, 0, 0);
  148. var y = i8(0, 0, 0, 0, 0, 0, 0, 0);
  149. var loopIndex = 0;
  150. var loopCOUNT = 3;
  151. while ( (loopIndex|0) < (loopCOUNT|0)) {
  152. x = i8splat(loopIndex);
  153. x = i8replaceLane(x, 0, 200);
  154. x = i8replaceLane(x, 7, loopIndex);
  155. y = x;
  156. loopIndex = (loopIndex + 1) | 0;
  157. }
  158. return i8check(y);
  159. }
  160. function func4(a, b, c, d, e)
  161. {
  162. a = i8check(a);
  163. b = i8check(b);
  164. c = i8check(c);
  165. d = i8check(d);
  166. e = i8check(e);
  167. var x = i8(0, 0, 0, 0, 0, 0, 0, 0);
  168. var y = i8(0, 0, 0, 0, 0, 0, 0, 0);
  169. var loopIndex = 0;
  170. var loopCOUNT = 3;
  171. while ( (loopIndex|0) < (loopCOUNT|0)) {
  172. x = i8and(a, b);
  173. x = i8or(x, d);
  174. x = i8xor(x, e);
  175. x = i8not(x);
  176. loopIndex = (loopIndex + 1) | 0;
  177. }
  178. return i8check(x);
  179. }
  180. function func5(a, b, c, d, e)
  181. {
  182. a = i8check(a);
  183. b = i8check(b);
  184. c = i8check(c);
  185. d = i8check(d);
  186. e = i8check(e);
  187. var x = i8(0, 0, 0, 0, 0, 0, 0, 0);
  188. var y = i8(0, 0, 0, 0, 0, 0, 0, 0);
  189. var loopIndex = 0;
  190. var loopCOUNT = 3;
  191. while ( (loopIndex|0) < (loopCOUNT|0)) {
  192. x = i8add(a, b);
  193. x = i8sub(x, d);
  194. x = i8mul(x, e);
  195. x = i8neg(x);
  196. loopIndex = (loopIndex + 1) | 0;
  197. }
  198. return i8check(x);
  199. }
  200. function func7()
  201. {
  202. var loopIndex = 0;
  203. var loopCOUNT = 3;
  204. var index = 100;
  205. var size = 10;
  206. var x = i8(1, 2, 3, 4, -1, -2, -3, -4);
  207. var y = i8(0, 0, 0, 0, 0, 0, 0, 0);
  208. var t = i8(0, 0, 0, 0, 0, 0, 0, 0);
  209. for (loopIndex = 0; (loopIndex | 0) < (size | 0) ; loopIndex = (loopIndex + 1) | 0)
  210. {
  211. i8store(Uint32Heap, index >> 2, x);
  212. index = (index + 16 ) | 0;
  213. }
  214. index = 100;
  215. for (loopIndex = 0; (loopIndex | 0) < (size | 0) ; loopIndex = (loopIndex + 1) | 0)
  216. {
  217. t = i8load(Float32Heap, index >> 2);
  218. y = i8add(y, t);
  219. index = (index + 16 ) | 0;
  220. }
  221. return i8check(y);
  222. }
  223. function func8()
  224. {
  225. var loopIndex = 0;
  226. var loopCOUNT = 3;
  227. var index = 100;
  228. var size = 10;
  229. var x = i8(1, 2, 3, 4, -1, -2, -3, -4);
  230. var y = i8(0, 0, 0, 0, 0, 0, 0, 0);
  231. var t = i8(0, 0, 0, 0, 0, 0, 0, 0);
  232. var v_i4 = i4(-29,34,10,4);
  233. var v_f4 = f4(1.0, -200.0, 123.443, 3000.1);
  234. var v_u4 = u4(-29,0xffff,10,4);
  235. var v_u8 = u8(-29,0xffff,10,4, -104, -9999, 1, 22);
  236. var v_u16 = u16(-29,0xffff,10,4, -104, -9999, 1, 22, -29,0xffff,10,4, -104, -9999, 1, 22);
  237. for (loopIndex = 0; (loopIndex | 0) < (size | 0) ; loopIndex = (loopIndex + 1) | 0)
  238. {
  239. x = i8add(x, i8fromFloat32x4Bits(v_f4));
  240. x = i8add(x, i8fromInt32x4Bits(v_i4));
  241. x = i8add(x, i8fromUint32x4Bits(v_u4));
  242. x = i8add(x, i8fromUint16x8Bits(v_u8));
  243. x = i8add(x, i8fromUint8x16Bits(v_u16));
  244. }
  245. return i8check(x);
  246. }
  247. function bug1() //simd tmp reg reuse.
  248. {
  249. var a = i4(1,2,3,4);
  250. var x = i8(-1, -2, -3, -4,-1, -2, -3, -4);
  251. i8add(x,x);
  252. return i4check(a);
  253. }
  254. return {func1:func1, func2: func2, func3:func3, func4:func4,
  255. func5: func5, func7:func7, func8:func8, bug1:bug1};
  256. }
  257. var buffer = new ArrayBuffer(0x10000);
  258. var m = asmModule(this, {g1:SIMD.Float32x4(90934.2,123.9,419.39,449.0), g2:SIMD.Int32x4(-1065353216, -1073741824,-1077936128, -1082130432)/*, g3:SIMD.Float64x2(110.20, 58967.0, 14511.670, 191766.23431)*/}, buffer);
  259. var v1 = SIMD.Int16x8(1, 2, 3, 4, 5, 6, 7, 8);
  260. var v2 = SIMD.Int16x8(134, 211, -333, 422, -165, 999996, 0xffff, 0xf0f0);
  261. var v3 = SIMD.Int16x8(0xcccc, -211, 189, 422, -165, -999996, 0xffff, 0xf0f0);
  262. var ret1 = m.func1();
  263. equal(38130, ret1);
  264. var ret2 = m.func2(v1);
  265. //printSimdBaseline(ret2, "SIMD.Int16x8", "ret2", "func2");
  266. equalSimd([1, 2, 3, 3, 3, 4, 1, 0], ret2, SIMD.Int16x8, "func2");
  267. var ret3 = m.func3(v1);
  268. //printSimdBaseline(ret3, "SIMD.Int16x8", "ret3", "func3");
  269. equalSimd([200, 2, 2, 2, 2, 2, 2, 2], ret3, SIMD.Int16x8, "func3");
  270. var ret4 = m.func4(v1, v2, v3, v1, v2);
  271. //printSimdBaseline(ret4, "SIMD.Int16x8", "ret4", "func4");
  272. equalSimd([-136, -210, 335, -419, 161, -16955, 7, 3847], ret4, SIMD.Int16x8, "func4");
  273. var ret5 = m.func5(v1, v2, v3, v1, v2);
  274. //printSimdBaseline(ret5, "SIMD.Int16x8", "ret5", "func5");
  275. equalSimd([-17956, 21015, 20183, 18524, -27225, 496, -1, 7936], ret5, SIMD.Int16x8, "func5");
  276. var ret7 = m.func7(v1, v2, v3, v1, v2);
  277. //printSimdBaseline(ret7, "SIMD.Int16x8", "ret7", "func7");
  278. equalSimd([10, 20, 30, 40, -10, -20, -30, -40], ret7, SIMD.Int16x8, "func7");
  279. var ret8 = m.func8(v1, v2, v3, v1, v2);
  280. //printSimdBaseline(ret8, "SIMD.Int16x8", "ret8", "func8");
  281. equalSimd([-1159, -23736, 29089, 32006, -10305, 16232, -32693, -28368], ret8, SIMD.Int16x8, "func8")
  282. ret8 = m.bug1();
  283. //printSimdBaseline(ret8, "SIMD.Int16x8", "ret8", "func8");
  284. equalSimd([1,2,3,4], ret8, SIMD.Int32x4, "bug1")
  285. print("PASS");