testLinearSearch.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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 Float32Array(buffer);
  7. HEAP32[0] = 13654.67
  8. HEAP32[1] = 23.0
  9. HEAP32[2] = 13654.565
  10. HEAP32[3] = 13654.111
  11. HEAP32[4] = 423.00006
  12. HEAP32[5] = 4.0
  13. HEAP32[6] = 5.56
  14. HEAP32[7] = 3.56
  15. HEAP32[8] = 145764.56756
  16. HEAP32[9] = 53.57
  17. }
  18. function InitBuffer2(buffer) {
  19. HEAP32 = new Float32Array(buffer);
  20. for (var i = 0.0; i < 999999.0 - 1; i = i + 1.0) {
  21. HEAP32[i] = i + 1.0;
  22. }
  23. }
  24. function asmModule(stdlib, imports, buffer) {
  25. "use asm";
  26. var log = stdlib.Math.log;
  27. var toF = stdlib.Math.fround;
  28. var i4 = stdlib.SIMD.Int32x4;
  29. var i4swizzle = i4.swizzle;
  30. var i4check = i4.check;
  31. var f4 = stdlib.SIMD.Float32x4;
  32. var f4equal = f4.equal;
  33. var f4lessThan = f4.lessThan;
  34. var f4splat = f4.splat;
  35. var f4load = f4.load;
  36. var f4check = f4.check;
  37. var f4abs = f4.abs;
  38. var f4sub = f4.sub;
  39. var HEAP32 = new stdlib.Float32Array(buffer);
  40. var BLOCK_SIZE = 4;
  41. var i = 0;
  42. function linearSearch(value, length) {
  43. value = toF(value);
  44. length = length | 0;
  45. var f4Value = f4(0.0, 0.0, 0.0, 0.0);
  46. var f4Heap = f4(0.0, 0.0, 0.0, 0.0);
  47. var i4Result = i4(0, 0, 0, 0);
  48. var i4Flipped = i4(0, 0, 0, 0);
  49. f4Value = f4splat(value);
  50. for (i = 0; (i | 0) < (length|0); i = (i + BLOCK_SIZE) | 0) {
  51. //f4Heap = f4(HEAP32[(i << 2) >> 2], HEAP32[((i + 1) << 2) >> 2], HEAP32[((i + 2) << 2) >> 2], HEAP32[((i + 3) << 2) >> 2]);
  52. f4Heap = f4load(HEAP32, (i << 2) >> 2);
  53. i4Result = i4check(f4nearlyEqual(f4Heap, f4Value, toF(0.0001)));
  54. if (i4Result.signMask != 0) {
  55. i4Flipped = i4swizzle(i4Result, 3, 2, 1, 0);
  56. return (i + BLOCK_SIZE - ~~(log(+(i4Flipped.signMask | 0)) / log(2.0)) - 1) | 0
  57. }
  58. }
  59. return -1;
  60. }
  61. function f4nearlyEqual(a, b, epsilon) {
  62. a = f4check(a);
  63. b = f4check(b);
  64. epsilon = toF(epsilon);
  65. var diff = f4(0.0, 0.0, 0.0, 0.0);
  66. diff = f4abs(f4sub(a, b));
  67. return f4lessThan(diff, f4splat(epsilon));
  68. }
  69. return { linearSearch: linearSearch };
  70. }
  71. var buffer = new ArrayBuffer(16 * 1024 * 1024);
  72. var m = asmModule(this, null, buffer);
  73. InitBuffer1(buffer);
  74. print("List 1");
  75. print(m.linearSearch(13654.67, 10));
  76. print(m.linearSearch(23.0, 10));
  77. print(m.linearSearch(145764.56756, 10));
  78. print(m.linearSearch(53.57, 10));
  79. print(m.linearSearch(-53, 10));
  80. InitBuffer2(buffer);
  81. print("List 2");
  82. print(m.linearSearch(13654.0, 999999));
  83. print(m.linearSearch(23.0, 999999));
  84. print(m.linearSearch(145764.0, 999999));
  85. print(m.linearSearch(-53.0, 999999));