testLinearSearch.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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 InitBuffer1(buffer) {
  6. HEAP32 = new Int32Array(buffer);
  7. HEAP32[0] = 13654
  8. HEAP32[1] = 23
  9. HEAP32[2] = 13654
  10. HEAP32[3] = 13654
  11. HEAP32[4] = 423
  12. HEAP32[5] = 4
  13. HEAP32[6] = 5
  14. HEAP32[7] = 3
  15. HEAP32[8] = 145764
  16. HEAP32[9] = 53
  17. }
  18. function InitBuffer2(buffer) {
  19. HEAP32 = new Int32Array(buffer);
  20. for(var i = 0; i < 999999 - 1; i++) {
  21. HEAP32[i] = i + 1;
  22. }
  23. }
  24. function asmModule(stdlib, imports, buffer) {
  25. "use asm";
  26. var log = stdlib.Math.log;
  27. var i4 = stdlib.SIMD.Int32x4;
  28. var i4equal = i4.equal;
  29. var i4splat = i4.splat;
  30. var i4swizzle = i4.swizzle;
  31. var HEAP32 = new stdlib.Int32Array(buffer);
  32. var BLOCK_SIZE = 4;
  33. var i = 0;
  34. function linearSearch(value, length) {
  35. value = value | 0;
  36. length = length|0;
  37. var i4Value = i4(0, 0, 0, 0);
  38. var i4Heap = i4(0, 0, 0, 0);
  39. var i4Result = i4(0, 0, 0, 0);
  40. var i4Flipped = i4(0, 0, 0, 0);
  41. i4Value = i4splat(value | 0);
  42. for(i = 0; (i | 0) < (length | 0); i = (i + BLOCK_SIZE) | 0) {
  43. i4Heap = i4((HEAP32[(i << 2) >> 2] | 0), (HEAP32[((i + 1) << 2) >> 2] | 0), (HEAP32[((i + 2) << 2) >> 2] | 0), (HEAP32[((i + 3) << 2) >> 2] | 0));
  44. i4Result = i4equal(i4Heap, i4Value);
  45. if(i4Result.signMask != 0) {
  46. i4Flipped = i4swizzle(i4Result, 3, 2, 1, 0);
  47. return (i + BLOCK_SIZE - ~~(log(+(i4Flipped.signMask|0)) / log(2.0)) - 1)|0
  48. }
  49. }
  50. return -1;
  51. }
  52. return {linearSearch:linearSearch};
  53. }
  54. var buffer = new ArrayBuffer(16 * 1024 * 1024);
  55. var m = asmModule(this, null, buffer);
  56. InitBuffer1(buffer);
  57. WScript.Echo("List 1");
  58. WScript.Echo(m.linearSearch(13654, 10));
  59. WScript.Echo(m.linearSearch(23, 10));
  60. WScript.Echo(m.linearSearch(145764, 10));
  61. WScript.Echo(m.linearSearch(53, 10));
  62. WScript.Echo(m.linearSearch(-53, 10));
  63. InitBuffer2(buffer);
  64. WScript.Echo("List 2");
  65. WScript.Echo(m.linearSearch(13654, 999999));
  66. WScript.Echo(m.linearSearch(23, 999999));
  67. WScript.Echo(m.linearSearch(145764, 999999));
  68. WScript.Echo(m.linearSearch(-53, 999999));