testLoadStore-2.js 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915
  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 asmModule(stdlib, imports, buffer) {
  6. "use asm";
  7. var i4 = stdlib.SIMD.Int32x4;
  8. var i4check = i4.check;
  9. var i4splat = i4.splat;
  10. var i4fromFloat64x2 = i4.fromFloat64x2;
  11. var i4fromFloat64x2Bits = i4.fromFloat64x2Bits;
  12. var i4fromFloat32x4 = i4.fromFloat32x4;
  13. var i4fromFloat32x4Bits = i4.fromFloat32x4Bits;
  14. //var i4abs = i4.abs;
  15. var i4neg = i4.neg;
  16. var i4add = i4.add;
  17. var i4sub = i4.sub;
  18. var i4mul = i4.mul;
  19. var i4swizzle = i4.swizzle;
  20. var i4shuffle = i4.shuffle;
  21. var i4lessThan = i4.lessThan;
  22. var i4equal = i4.equal;
  23. var i4greaterThan = i4.greaterThan;
  24. var i4select = i4.select;
  25. var i4and = i4.and;
  26. var i4or = i4.or;
  27. var i4xor = i4.xor;
  28. var i4not = i4.not;
  29. var i4load = i4.load;
  30. var i4load1 = i4.load1;
  31. var i4load2 = i4.load2;
  32. var i4load3 = i4.load3;
  33. var i4store = i4.store
  34. var i4store1 = i4.store1;
  35. var i4store2 = i4.store2;
  36. var i4store3 = i4.store3;
  37. //var i4shiftLeftByScalar = i4.shiftLeftByScalar;
  38. //var i4shiftRightByScalar = i4.shiftRightByScalar;
  39. //var i4shiftRightArithmeticByScalar = i4.shiftRightArithmeticByScalar;
  40. var f4 = stdlib.SIMD.Float32x4;
  41. var f4check = f4.check;
  42. var f4splat = f4.splat;
  43. var f4fromFloat64x2 = f4.fromFloat64x2;
  44. var f4fromFloat64x2Bits = f4.fromFloat64x2Bits;
  45. var f4fromInt32x4 = f4.fromInt32x4;
  46. var f4fromInt32x4Bits = f4.fromInt32x4Bits;
  47. var f4abs = f4.abs;
  48. var f4neg = f4.neg;
  49. var f4add = f4.add;
  50. var f4sub = f4.sub;
  51. var f4mul = f4.mul;
  52. var f4div = f4.div;
  53. var f4clamp = f4.clamp;
  54. var f4min = f4.min;
  55. var f4max = f4.max;
  56. var f4reciprocal = f4.reciprocal;
  57. var f4reciprocalSqrt = f4.reciprocalSqrt;
  58. var f4sqrt = f4.sqrt;
  59. var f4swizzle = f4.swizzle;
  60. var f4shuffle = f4.shuffle;
  61. var f4lessThan = f4.lessThan;
  62. var f4lessThanOrEqual = f4.lessThanOrEqual;
  63. var f4equal = f4.equal;
  64. var f4notEqual = f4.notEqual;
  65. var f4greaterThan = f4.greaterThan;
  66. var f4greaterThanOrEqual = f4.greaterThanOrEqual;
  67. var f4select = f4.select;
  68. var f4and = f4.and;
  69. var f4or = f4.or;
  70. var f4xor = f4.xor;
  71. var f4not = f4.not;
  72. var f4load = f4.load;
  73. var f4load1 = f4.load1;
  74. var f4load2 = f4.load2;
  75. var f4load3 = f4.load3;
  76. var f4store = f4.store;
  77. var f4store1 = f4.store1;
  78. var f4store2 = f4.store2;
  79. var f4store3 = f4.store3;
  80. var d2 = stdlib.SIMD.Float64x2;
  81. var d2check = d2.check;
  82. var d2splat = d2.splat;
  83. var d2fromFloat32x4 = d2.fromFloat32x4;
  84. var d2fromFloat32x4Bits = d2.fromFloat32x4Bits;
  85. var d2fromInt32x4 = d2.fromInt32x4;
  86. var d2fromInt32x4Bits = d2.fromInt32x4Bits;
  87. var d2abs = d2.abs;
  88. var d2neg = d2.neg;
  89. var d2add = d2.add;
  90. var d2sub = d2.sub;
  91. var d2mul = d2.mul;
  92. var d2div = d2.div;
  93. var d2clamp = d2.clamp;
  94. var d2min = d2.min;
  95. var d2max = d2.max;
  96. var d2reciprocal = d2.reciprocal;
  97. var d2reciprocalSqrt = d2.reciprocalSqrt;
  98. var d2sqrt = d2.sqrt;
  99. var d2swizzle = d2.swizzle;
  100. var d2shuffle = d2.shuffle;
  101. var d2lessThan = d2.lessThan;
  102. var d2lessThanOrEqual = d2.lessThanOrEqual;
  103. var d2equal = d2.equal;
  104. var d2notEqual = d2.notEqual;
  105. var d2greaterThan = d2.greaterThan;
  106. var d2greaterThanOrEqual = d2.greaterThanOrEqual;
  107. var d2select = d2.select;
  108. var d2load = d2.load;
  109. var d2load1 = d2.load1;
  110. var d2store = d2.store
  111. var d2store1 = d2.store1;
  112. var fround = stdlib.Math.fround;
  113. var globImportF4 = f4check(imports.g1); // global var import
  114. var globImportI4 = i4check(imports.g2); // global var import
  115. var globImportD2 = d2check(imports.g3); // global var import
  116. var g1 = f4(-5033.2,-3401.0,665.34,32234.1); // global var initialized
  117. var g2 = i4(1065353216, -1073741824, -1077936128, 1082130432); // global var initialized
  118. var g3 = d2(0.12344,-1.6578); // global var initialized
  119. var gval = 1234;
  120. var gval2 = 1234.0;
  121. var loopCOUNT = 3;
  122. var Int8Heap = new stdlib.Int8Array (buffer);
  123. var Uint8Heap = new stdlib.Uint8Array (buffer);
  124. var Int16Heap = new stdlib.Int16Array(buffer);
  125. var Uint16Heap = new stdlib.Uint16Array(buffer);
  126. var Int32Heap = new stdlib.Int32Array(buffer);
  127. var Uint32Heap = new stdlib.Uint32Array(buffer);
  128. var Float32Heap = new stdlib.Float32Array(buffer);
  129. function storeF32(value, idx)
  130. {
  131. value= i4check(value);
  132. idx = idx|0;
  133. idx = idx<<2;
  134. i4store(Float32Heap, (idx>>2), value);
  135. }
  136. function loadF32(idx)
  137. {
  138. idx = idx|0;
  139. idx = idx<<2;
  140. return i4load(Float32Heap, (idx>>2));
  141. }
  142. function storeUI32(value, idx)
  143. { value= i4check(value); idx = idx|0; idx = idx<<2;
  144. i4store(Uint32Heap, (idx>>2), value);}
  145. function loadUI32(idx)
  146. { idx = idx|0; idx = idx<<2; return i4load(Uint32Heap, (idx>>2)); }
  147. function storeI32(value, idx)
  148. { value= i4check(value); idx = idx|0; idx = idx<<2;
  149. i4store(Int32Heap, (idx>>2), value);}
  150. function loadI32(idx)
  151. { idx = idx|0; idx = idx<<2; return i4load(Int32Heap, (idx>>2)); }
  152. function storeI16(value, idx)
  153. { value= i4check(value); idx = idx|0; idx = idx<<1;
  154. i4store(Int16Heap, (idx>>1), value);}
  155. function loadI16(idx)
  156. { idx = idx|0; idx = idx<<1; return i4load(Int16Heap, (idx>>1)); }
  157. function storeUI16(value, idx)
  158. { value= i4check(value); idx = idx|0; idx = idx<<1;
  159. i4store(Uint16Heap, (idx>>1), value);}
  160. function loadUI16(idx)
  161. { idx = idx|0; idx = idx<<1; return i4load(Uint16Heap, (idx>>1)); }
  162. function storeI8(value, idx)
  163. { value= i4check(value); idx = idx|0; idx = idx<<0;
  164. i4store(Int8Heap, (idx>>0), value);}
  165. function loadI8(idx)
  166. { idx = idx|0; idx = idx<<0; return i4load(Int8Heap, (idx>>0)); }
  167. function storeUI8(value, idx)
  168. { value= i4check(value); idx = idx|0; idx = idx<<0;
  169. i4store(Uint8Heap, (idx>>0), value);}
  170. function loadUI8(idx)
  171. { idx = idx|0; idx = idx<<0; return i4load(Uint8Heap, (idx>>0)); }
  172. function loadStoreIndex1()
  173. {
  174. i4store(Float32Heap, 0, i4(-1,-2,3,-4));
  175. return i4load(Float32Heap, 0);
  176. }
  177. function store_1(functionPicker) //Function picker to pick store1/store2/store3/store
  178. {
  179. functionPicker = functionPicker|0;
  180. var v0 = i4(0,0,0,0);
  181. var loopIndex = 0, idx = 0, end = 256;
  182. while((loopIndex|0) < (loopCOUNT|0))
  183. {
  184. idx = 0;
  185. v0 = i4(5, -12, 3, 0);
  186. for(idx = idx << 2; (idx|0) < (end|0 << 2); idx = (idx + 16)|0)
  187. {
  188. switch(functionPicker|0)
  189. {
  190. case 5:
  191. i4store(Float32Heap, idx>>2, v0);
  192. break;
  193. case 6:
  194. i4store1(Float32Heap, idx>>2, v0);
  195. break;
  196. case 7:
  197. i4store2(Float32Heap, idx>>2, v0);
  198. break;
  199. case 8:
  200. i4store3(Float32Heap, idx>>2, v0);
  201. break;
  202. default:
  203. break;
  204. }
  205. v0 = i4add(v0, i4(1,1,1,1));
  206. }
  207. loopIndex = (loopIndex + 1)|0;
  208. }
  209. return i4load(Float32Heap, 0);
  210. }
  211. function store_2(functionPicker)
  212. {
  213. functionPicker = functionPicker|0;
  214. var v0 = i4(0,0,0,0);
  215. var loopIndex = 0, idx = 0, end = 256;
  216. for (loopIndex = 0; (loopIndex | 0) < (loopCOUNT | 0) ; loopIndex = (loopIndex + 1) | 0)
  217. {
  218. idx = 0;
  219. v0 = i4(0,0,0,0);
  220. for(idx = idx << 2; (idx|0) < (end|0 << 2); idx = (idx + 16)|0)
  221. {
  222. switch(functionPicker|0)
  223. {
  224. case 5:
  225. i4store(Float32Heap, idx>>2, v0);
  226. break;
  227. case 6:
  228. i4store1(Float32Heap, idx>>2, v0);
  229. break;
  230. case 7:
  231. i4store2(Float32Heap, idx>>2, v0);
  232. break;
  233. case 8:
  234. i4store3(Float32Heap, idx>>2, v0);
  235. break;
  236. default:
  237. break;
  238. }
  239. v0 = i4add(v0, i4(1, 1, 1, 1));
  240. }
  241. }
  242. return i4load(Float32Heap, 8);
  243. }
  244. function store_3(functionPicker)
  245. {
  246. functionPicker = functionPicker|0;
  247. var v0 = i4(0,0,0,0);
  248. var loopIndex = 0, idx = 0, end = 256;
  249. loopIndex = loopCOUNT | 0;
  250. do {
  251. idx = 0;
  252. v0 = i4(0,0,0,0);
  253. for(idx = idx << 2; (idx|0) < (end|0 << 2); idx = (idx + 16)|0)
  254. {
  255. switch(functionPicker|0)
  256. {
  257. case 5:
  258. i4store(Float32Heap, idx>>2, v0);
  259. break;
  260. case 6:
  261. i4store1(Float32Heap, idx>>2, v0);
  262. break;
  263. case 7:
  264. i4store2(Float32Heap, idx>>2, v0);
  265. break;
  266. case 8:
  267. i4store3(Float32Heap, idx>>2, v0);
  268. break;
  269. default:
  270. break;
  271. }
  272. v0 = i4add(v0, i4(1, 1, 1, 1));
  273. }
  274. loopIndex = (loopIndex - 1) | 0;
  275. }
  276. while ( (loopIndex | 0) > 0);
  277. return i4load(Float32Heap, 8);
  278. }
  279. function store_1_Int8(length)
  280. {
  281. length = length|0;
  282. var v0 = i4(0,0,0,0);
  283. var loopIndex = 0, idx = 0, end = 0;
  284. end = (length * 4)|0;
  285. while((loopIndex|0) < (loopCOUNT|0))
  286. {
  287. idx = 0;
  288. v0 = i4(0,0,0,0);
  289. for(idx = idx << 0; (idx|0) < (end|0 << 0); idx = (idx + 16)|0)
  290. {
  291. i4store(Int8Heap, idx>>0, v0);
  292. v0 = i4add(v0, i4(1, 1, 1, 1));
  293. }
  294. loopIndex = (loopIndex + 1)|0;
  295. }
  296. //Expects the heap to be: 0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3...15,15,15,15,0,0,0,0...
  297. return i4load(Float32Heap, 2);
  298. }
  299. function store_1_Uint8(length)
  300. {
  301. length = length|0;
  302. var v0 = i4(0,0,0,0);
  303. var loopIndex = 0, idx = 0, end = 0;
  304. end = (length * 4)|0;
  305. while((loopIndex|0) < (loopCOUNT|0))
  306. {
  307. idx = 0;
  308. v0 = i4(0,0,0,0);
  309. for(idx = idx << 0; (idx|0) < (end|0 << 0); idx = (idx + 16)|0)
  310. {
  311. i4store(Uint8Heap, idx>>0, v0);
  312. v0 = i4add(v0, i4(1, 1, 1, 1));
  313. }
  314. loopIndex = (loopIndex + 1)|0;
  315. }
  316. //Expects the heap to be: 0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3...15,15,15,15,0,0,0,0...
  317. return i4load(Float32Heap, 2);
  318. }
  319. function store_1_Int16(length)
  320. {
  321. length = length|0;
  322. var v0 = i4(0,0,0,0);
  323. var loopIndex = 0, idx = 0, end = 0;
  324. end = (length * 4)|0;
  325. while((loopIndex|0) < (loopCOUNT|0))
  326. {
  327. idx = 0;
  328. v0 = i4(0,0,0,0);
  329. for(idx = idx << 1; (idx|0) < (end|0 << 1); idx = (idx + 16)|0)
  330. {
  331. i4store(Int16Heap, idx>>1, v0);
  332. v0 = i4add(v0, i4(1, 1, 1, 1));
  333. }
  334. loopIndex = (loopIndex + 1)|0;
  335. }
  336. //Expects the heap to be: 0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3...15,15,15,15,0,0,0,0...
  337. return i4load(Float32Heap, 2);
  338. }
  339. function store_1_Uint16(length)
  340. {
  341. length = length|0;
  342. var v0 = i4(0,0,0,0);
  343. var loopIndex = 0, idx = 0, end = 0;
  344. end = (length * 4)|0;
  345. while((loopIndex|0) < (loopCOUNT|0))
  346. {
  347. idx = 0;
  348. v0 = i4(0,0,0,0);
  349. for(idx = idx << 1; (idx|0) < (end|0 << 1); idx = (idx + 16)|0)
  350. {
  351. i4store(Uint16Heap, idx>>1, v0);
  352. v0 = i4add(v0, i4(1, 1, 1, 1));
  353. }
  354. loopIndex = (loopIndex + 1)|0;
  355. }
  356. //Expects the heap to be: 0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3...15,15,15,15,0,0,0,0...
  357. return i4load(Float32Heap, 2);
  358. }
  359. function store_1_Int32(length)
  360. {
  361. length = length|0;
  362. var v0 = i4(0,0,0,0);
  363. var loopIndex = 0, idx = 0, end = 0;
  364. end = (length * 4)|0;
  365. while((loopIndex|0) < (loopCOUNT|0))
  366. {
  367. idx = 0;
  368. v0 = i4(0,0,0,0);
  369. for(idx = idx << 2; (idx|0) < (end|0 << 2); idx = (idx + 16)|0)
  370. {
  371. i4store(Int32Heap, idx>>2, v0);
  372. v0 = i4add(v0, i4(1, 1, 1, 1));
  373. }
  374. loopIndex = (loopIndex + 1)|0;
  375. }
  376. //Expects the heap to be: 0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3...15,15,15,15,0,0,0,0...
  377. return i4load(Float32Heap, 2);
  378. }
  379. function store_1_Uint32(length)
  380. {
  381. length = length|0;
  382. var v0 = i4(0,0,0,0);
  383. var loopIndex = 0, idx = 0, end = 0;
  384. end = (length * 4)|0;
  385. while((loopIndex|0) < (loopCOUNT|0))
  386. {
  387. idx = 0;
  388. v0 = i4(0,0,0,0);
  389. for(idx = idx << 2; (idx|0) < (end|0 << 2); idx = (idx + 16)|0)
  390. {
  391. i4store(Uint32Heap, idx>>2, v0);
  392. v0 = i4add(v0, i4(1, 1, 1, 1));
  393. }
  394. loopIndex = (loopIndex + 1)|0;
  395. }
  396. //Expects the heap to be: 0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3...15,15,15,15,0,0,0,0...
  397. return i4load(Float32Heap, 2);
  398. }
  399. ////////////////////////////Load////////////////////////////
  400. function load_1(functionPicker)
  401. {
  402. //length = length|0;
  403. functionPicker = functionPicker|0;
  404. var idx=0,end=16;//(length-4)|0;;
  405. var loopIndex = 0;
  406. var v = i4(0,0,0,0);
  407. while ( (loopIndex|0) < (loopCOUNT|0)) {
  408. idx=0;
  409. for(idx = idx << 2; (idx|0) <= (end << 2); idx = (idx + 1)|0)
  410. {
  411. switch(functionPicker|0)
  412. {
  413. case 1:
  414. v = i4load(Float32Heap, idx>>2);
  415. break;
  416. case 2:
  417. v = i4load1(Float32Heap, idx>>2);
  418. break;
  419. case 3:
  420. v = i4load2(Float32Heap, idx>>2);
  421. break;
  422. case 4:
  423. v = i4load3(Float32Heap, idx>>2);
  424. break;
  425. default:
  426. break;
  427. }
  428. }
  429. loopIndex = (loopIndex + 1) | 0;
  430. }
  431. return v;
  432. }
  433. function load_2(functionPicker)
  434. {
  435. //length = length|0;
  436. functionPicker = functionPicker|0;
  437. var idx=0,end=16;//(length-4)|0;;
  438. var loopIndex = 0;
  439. var v = i4(0,0,0,0);
  440. for (loopIndex = 0; (loopIndex | 0) < (loopCOUNT | 0) ; loopIndex = (loopIndex + 1) | 0)
  441. {
  442. idx=0;
  443. for(idx = idx << 2; (idx|0) <= (end << 2); idx = (idx + 1)|0)
  444. {
  445. switch(functionPicker|0)
  446. {
  447. case 1:
  448. v = i4load(Float32Heap, idx>>2);
  449. break;
  450. case 2:
  451. v = i4load1(Float32Heap, idx>>2);
  452. break;
  453. case 3:
  454. v = i4load2(Float32Heap, idx>>2);
  455. break;
  456. case 4:
  457. v = i4load3(Float32Heap, idx>>2);
  458. break;
  459. default:
  460. break;
  461. }
  462. }
  463. }
  464. return v;
  465. }
  466. function load_3(functionPicker)
  467. {
  468. //length = length|0;
  469. functionPicker = functionPicker|0;
  470. var idx=0,end=16;//(length-4)|0;;
  471. var loopIndex = 0;
  472. var v = i4(0,0,0,0);
  473. loopIndex = loopCOUNT | 0;
  474. do {
  475. idx = 0;
  476. for(idx = idx << 2; (idx|0) <= (end << 2); idx = (idx + 1)|0)
  477. {
  478. switch(functionPicker|0)
  479. {
  480. case 1:
  481. v = i4load(Float32Heap, idx>>2);
  482. break;
  483. case 2:
  484. v = i4load1(Float32Heap, idx>>2);
  485. break;
  486. case 3:
  487. v = i4load2(Float32Heap, idx>>2);
  488. break;
  489. case 4:
  490. v = i4load3(Float32Heap, idx>>2);
  491. break;
  492. default:
  493. break;
  494. }
  495. }
  496. loopIndex = (loopIndex - 1) | 0;
  497. }
  498. while ( (loopIndex | 0) > 0);
  499. return v;
  500. }
  501. function load_1_Int8(length)
  502. {
  503. length = length|0;
  504. var idx=0,end=0;
  505. var loopIndex = 0;
  506. var v = i4(0,0,0,0);
  507. end = (((length * 4)|0) - 16)|0;
  508. while ( (loopIndex|0) < (loopCOUNT|0)) {
  509. idx=0;
  510. for(idx = idx << 0; (idx|0) <= (end << 0); idx = (idx + 1)|0)
  511. {
  512. v = i4load(Int8Heap, idx>>0);
  513. }
  514. loopIndex = (loopIndex + 1) | 0;
  515. }
  516. return v;
  517. }
  518. function load_1_Uint8(length)
  519. {
  520. length = length|0;
  521. var idx=0,end=0;
  522. var loopIndex = 0;
  523. var v = i4(0,0,0,0);
  524. end = (((length * 4)|0) - 16)|0;
  525. while ( (loopIndex|0) < (loopCOUNT|0)) {
  526. idx=0;
  527. for(idx = idx << 0; (idx|0) <= (end << 0); idx = (idx + 1)|0)
  528. {
  529. v = i4load(Uint8Heap, idx>>0);
  530. }
  531. loopIndex = (loopIndex + 1) | 0;
  532. }
  533. return v;
  534. }
  535. function load_1_Int16(length)
  536. {
  537. length = length|0;
  538. var idx=0,end=0;
  539. var loopIndex = 0;
  540. var v = i4(0,0,0,0);
  541. end = (((length * 2)|0) - 8)|0;
  542. while ( (loopIndex|0) < (loopCOUNT|0)) {
  543. idx=0;
  544. for(idx = idx << 1; (idx|0) <= (end << 1); idx = (idx + 1)|0)
  545. {
  546. v = i4load(Int16Heap, idx>>1);
  547. }
  548. loopIndex = (loopIndex + 1) | 0;
  549. }
  550. return v;
  551. }
  552. function load_1_Uint16(length)
  553. {
  554. length = length|0;
  555. var idx=0,end=120;
  556. var loopIndex = 0;
  557. var v = i4(0,0,0,0);
  558. end = (((length * 2)|0) - 8)|0;
  559. while ( (loopIndex|0) < (loopCOUNT|0)) {
  560. idx=0;
  561. for(idx = idx << 1; (idx|0) <= (end << 1); idx = (idx + 1)|0)
  562. {
  563. v = i4load(Uint16Heap, idx>>1);
  564. }
  565. loopIndex = (loopIndex + 1) | 0;
  566. }
  567. return v;
  568. }
  569. function load_1_Int32(length)
  570. {
  571. length = length|0;
  572. var idx=0,end=60;
  573. var loopIndex = 0;
  574. var v = i4(0,0,0,0);
  575. end = (((length * 1)|0) - 4)|0;
  576. while ( (loopIndex|0) < (loopCOUNT|0)) {
  577. idx=0;
  578. for(idx = idx << 2; (idx|0) <= (end << 2); idx = (idx + 1)|0)
  579. {
  580. v = i4load(Int32Heap, idx>>2);
  581. }
  582. loopIndex = (loopIndex + 1) | 0;
  583. }
  584. return v;
  585. }
  586. function load_1_Uint32(length)
  587. {
  588. length = length|0;
  589. var idx=0,end=60;
  590. var loopIndex = 0;
  591. var v = i4(0,0,0,0);
  592. end = (((length * 1)|0) - 4)|0;
  593. while ( (loopIndex|0) < (loopCOUNT|0)) {
  594. idx=0;
  595. for(idx = idx << 2; (idx|0) <= (end << 2); idx = (idx + 1)|0)
  596. {
  597. v = i4load(Uint32Heap, idx>>2);
  598. }
  599. loopIndex = (loopIndex + 1) | 0;
  600. }
  601. return v;
  602. }
  603. return {store1:store_1
  604. ,store2:store_2
  605. ,store3:store_3
  606. ,store1Int8:store_1_Int8
  607. ,store1Uint8:store_1_Uint8
  608. ,store1Int16:store_1_Int16
  609. ,store1Uint16:store_1_Uint16
  610. ,store1Int32:store_1_Int32
  611. ,store1Uint32:store_1_Uint32
  612. ,load1:load_1
  613. ,load2:load_2
  614. ,load3:load_3
  615. ,load1Int8:load_1_Int8
  616. ,load1Uint8:load_1_Uint8
  617. ,load1Int16:load_1_Int16
  618. ,load1Uint16:load_1_Uint16
  619. ,load1Int32:load_1_Int32
  620. ,load1Uint32:load_1_Uint32
  621. ,loadF32:loadF32
  622. ,storeF32:storeF32
  623. ,storeUI32:storeUI32
  624. ,loadUI32:loadUI32
  625. ,storeI32:storeI32
  626. ,loadI32:loadI32
  627. ,storeI16:storeI16
  628. ,loadI16:loadI16
  629. ,storeUI16:storeUI16
  630. ,loadUI16:loadUI16
  631. ,storeI8:storeI8
  632. ,loadI8:loadI8
  633. ,storeUI8:storeUI8
  634. ,loadUI8:loadUI8
  635. ,loadStoreIndex1:loadStoreIndex1};
  636. }
  637. var buffer = new ArrayBuffer(0x10000); //16mb min 2^12
  638. //Reset or flush the buffer
  639. function initF32(buffer) {
  640. var values = new Float32Array( buffer );
  641. for( var i=0; i < values.length ; ++i ) {
  642. values[i] = i * 10;
  643. }
  644. return values.length;
  645. }
  646. function printBuffer(buffer, count)
  647. {
  648. var i4;
  649. for (var i = 0; i < count/* * 16*/; i += 16)
  650. {
  651. i4 = SIMD.Int32x4.load(buffer, i);
  652. print(i4.toString());
  653. }
  654. }
  655. function printResults(res)
  656. {
  657. print(typeof(res));
  658. print(res.toString());
  659. }
  660. inputLength = initF32(buffer);
  661. print(inputLength);
  662. //Enumerating SIMD loads to test.
  663. SIMDLoad = 1;
  664. SIMDLoad1 = 2;
  665. SIMDLoad2 = 3;
  666. SIMDLoad3 = 4;
  667. SIMDStore = 5;
  668. SIMDStore1 = 6;
  669. SIMDStore2 = 7;
  670. SIMDStore3 = 8;
  671. //Module initialization
  672. var m = asmModule(this, {g0:initF32(buffer),g1:SIMD.Float32x4(9,9,9,9), g2:SIMD.Int32x4(1, 2, 3, 4), g3:SIMD.Float64x2(10, 10, 10, 10)}, buffer);
  673. var values = new Float32Array(buffer);
  674. print("Stores:");
  675. print("Test1");
  676. var ret = m.store1(SIMDStore1);//Lane1 store
  677. printBuffer(values, 10);
  678. print("Test2");;
  679. inputLength = initF32(buffer);
  680. var ret = m.store1(SIMDStore2);//Lane 1,2 store
  681. printBuffer(values, 10);
  682. print("Test3");
  683. inputLength = initF32(buffer);
  684. var ret = m.store1(SIMDStore3);//Lane 1,2,3 store
  685. printBuffer(values, 10);
  686. print("Test4");
  687. inputLength = initF32(buffer);
  688. //Should change the buffer to 0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3...15,15,15,15,0,0,0,0...
  689. var ret = m.store1(SIMDStore);//Generic Store
  690. printBuffer(values, 10);
  691. print("Test5");
  692. inputLength = initF32(buffer);
  693. var ret = m.store2(SIMDStore);//Generic store
  694. printBuffer(values, 10);
  695. print("Test6");
  696. inputLength = initF32(buffer);
  697. var ret = m.store3(SIMDStore);//Generic store
  698. printBuffer(values, 10);
  699. print("Test7");
  700. inputLength = initF32(buffer);
  701. var ret = m.store1Int8(inputLength);//Int8Heap store
  702. printBuffer(values, 10);
  703. print("Test8");
  704. inputLength = initF32(buffer);
  705. var ret = m.store1Uint8(inputLength);//Uint8Heap store
  706. printBuffer(values, 10);
  707. print("Test9");
  708. inputLength = initF32(buffer);
  709. var ret = m.store1Int16(inputLength);//Int16Heap store
  710. printBuffer(values, 10);
  711. print("Test10");
  712. inputLength = initF32(buffer);
  713. var ret = m.store1Uint16(inputLength);//Uint16Heap store
  714. printBuffer(values, 10);
  715. print("Test12");
  716. inputLength = initF32(buffer);
  717. var ret = m.store1Int32(inputLength);//Int32Heap store
  718. printBuffer(values, 10);
  719. print("Test13");
  720. inputLength = initF32(buffer);
  721. var ret = m.store1Uint32(inputLength);//Uint32Heap store
  722. printBuffer(values, 10);
  723. print("Test14");
  724. inputLength = initF32(buffer);
  725. var ret = m.loadStoreIndex1();//Uint32Heap store
  726. printBuffer(values, 10);
  727. print("Loads");
  728. print("Test1");
  729. var ret = m.load1(SIMDLoad1);
  730. printResults(ret);
  731. print("Test2");
  732. var ret = m.load1(SIMDLoad2);
  733. printResults(ret);
  734. print("Test3");
  735. var ret = m.load1(SIMDLoad3);
  736. printResults(ret);
  737. print("Test4");
  738. var ret = m.load1(SIMDLoad);
  739. printResults(ret);
  740. print("Test5");
  741. var ret = m.load2(SIMDLoad);
  742. printResults(ret);
  743. print("Test6");
  744. var ret = m.load3(SIMDLoad);
  745. printResults(ret);
  746. print("Test7");
  747. var ret = m.load1Int8(inputLength); //Int8Heap load
  748. printResults(ret);
  749. print("Test8");
  750. var ret = m.load1Uint8(inputLength); //Int8Heap load
  751. printResults(ret);
  752. print("Test9");
  753. var ret = m.load1Int16(inputLength); //Int16Heap load
  754. printResults(ret);
  755. print("Test10");
  756. var ret = m.load1Uint16(inputLength); //Int16Heap load
  757. printResults(ret);
  758. print("Test11");
  759. var ret = m.load1Int32(inputLength); //Int32Heap load
  760. printResults(ret);
  761. print("Test12");
  762. var ret = m.load1Uint32(inputLength); //Int32Heap load
  763. printResults(ret);
  764. print("BoundCheck");
  765. var value = SIMD.Int32x4(9,1,3,5);
  766. print("Test1");
  767. try {m.storeF32(value, inputLength); print("Wrong");} catch(err) {print("Correct");}
  768. print("Test2");
  769. try {m.loadF32(inputLength); print("Wrong");} catch(err) {print("Correct");}
  770. print("Test3");
  771. try {m.storeF32(value, inputLength-1); print("Wrong");} catch(err) {print("Correct");}
  772. print("Test4");
  773. try {m.loadF32(inputLength-1); print("Wrong");} catch(err) {print("Correct");}
  774. print("Test5");
  775. try {m.storeF32(value, inputLength-4);print("Correct");} catch(err) {print("Wrong");}
  776. print("Test6");
  777. try {var v = m.loadF32(inputLength-4);print("Correct");} catch(err) {print("Wrong");}
  778. print("Test7");
  779. try {m.storeUI32(value, inputLength+1);print("Wrong");} catch(err) {print("Correct");}
  780. print("Test8");
  781. try { m.loadUI32(inputLength+1); print("Wrong"); } catch(err) { print("Correct"); }
  782. print("Test9");
  783. try {m.storeI32(value, inputLength+1); print("Wrong");} catch(err) {print("Correct");}
  784. print("Test10");
  785. try {m.loadI32(inputLength+1);print("Wrong");} catch(err) {print("Correct");}
  786. print("Test11");
  787. try{
  788. m.storeI16(value, inputLength*2-8);
  789. print("Correct");
  790. m.storeUI16(value, inputLength*2-8);
  791. print("Correct");
  792. m.storeI8(value, inputLength*4-16);
  793. print("Correct");
  794. m.storeUI8(value, inputLength*4-16);
  795. print("Correct");
  796. m.loadI16(inputLength*2-8);
  797. print("Correct");
  798. m.loadUI16(inputLength*2-8);
  799. print("Correct");
  800. m.loadI8(inputLength*4-16);
  801. print("Correct");
  802. m.loadUI8(inputLength*4-16);
  803. print("Correct");
  804. } catch(err){ print("Wrong"); }
  805. print("Test12");
  806. try {m.storeUI16(value, inputLength*2);print("Wrong");} catch(err) {print("Correct");}
  807. print("Test13");
  808. try {m.loadUI16(inputLength*2-7); print("Wrong");} catch(err) {print("Correct");}
  809. print("Test14");
  810. try {m.storeI16(value, inputLength*2-7); print("Wrong");} catch(err) {print("Correct");}
  811. print("Test15");
  812. try {m.loadI16(inputLength*2-7); print("Wrong");} catch(err) {print("Correct");}
  813. print("Test16");
  814. try {m.storeUI8(value, inputLength*4-15); print("Wrong");} catch(err) {print("Correct");}
  815. print("Test17");
  816. try {m.loadUI8(inputLength*4-15); print("Wrong");} catch(err) {print("Correct");}
  817. print("Test18");
  818. try {m.storeI8(value, inputLength*4-15); print("Wrong");} catch(err) {print("Correct");}
  819. print("Test19");
  820. try {m.loadI8(inputLength*4+15); print("Wrong");} catch(err) {print("Correct");}