divByConstants.js 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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. var CreateBaseline = false; // Set True to generate Baseline data. Copy the numbers from console to initialize the results variable below.
  6. var debug = false; // Set True to print debug messages.
  7. var debugTestNum = -1; // Set test num to run a specific test. -1 otherwise
  8. var test_values = [-5, 5, 124, 248, 654, 987, -1026, 98768, -88754, 1<<32, -(1<<32), (1<<32)-1, 1<<31, -(1<<31), 1<<25, -1<<25, -2147483648, 2147483647, 65536, 46341];
  9. var results = [-5,5,124,248,654,987,-1026,98768,-88754,1,-1,0,-2147483648,-2147483648,33554432,-33554432,-2147483648,2147483647,65536,46341,5,-5,-124,-248,-654,-987,1026,-98768,88754,-1,1,0,-2147483648,-2147483648,-33554432,33554432,-2147483648,-2147483647,-65536,-46341,
  10. -1,1,41,82,218,329,-342,32922,-29584,0,0,0,-715827882,-715827882,11184810,-11184810,-715827882,715827882,21845,15447,-1,1,24,49,130,197,-205,19753,-17750,0,0,0,-429496729,-429496729,6710886,-6710886,-429496729,429496729,13107,9268,0,0,17,35,93,141,-146,14109,
  11. -12679,0,0,0,-306783378,-306783378,4793490,-4793490,-306783378,306783378,9362,6620,1,-1,-41,-82,-218,-329,342,-32922,29584,0,0,0,715827882,715827882,-11184810,11184810,715827882,-715827882,-21845,-15447,1,-1,-24,-49,-130,-197,205,-19753,17750,0,0,0,
  12. 429496729,429496729,-6710886,6710886,429496729,-429496729,-13107,-9268,0,0,-17,-35,-93,-141,146,-14109,12679,0,0,0,306783378,306783378,-4793490,4793490,306783378,-306783378,-9362,-6620,0,0,15,31,81,123,-128,12346,-11094,0,0,0,-268435456,-268435456,4194304,-4194304,
  13. -268435456,268435455,8192,5792,0,0,13,27,72,109,-114,10974,-9861,0,0,0,-238609294,-238609294,3728270,-3728270,-238609294,238609294,7281,5149,0,0,9,19,50,75,-78,7597,-6827,0,0,0,-165191049,-165191049,2581110,-2581110,-165191049,165191049,5041,3564,0,0,3,7,19,
  14. 29,-31,2992,-2689,0,0,0,-65075262,-65075262,1016800,-1016800,-65075262,65075262,1985,1404,0,0,2,4,10,16,-17,1646,-1479,0,0,0,-35791394,-35791394,559240,-559240,-35791394,35791394,1092,772,0,0,1,2,6,9,-10,987,-887,0,0,0,-21474836,-21474836,335544,-335544,
  15. -21474836,21474836,655,463,0,0,1,2,5,8,-8,823,-739,0,0,0,-17895697,-17895697,279620,-279620,-17895697,17895697,546,386,0,0,0,0,0,0,-1,98,-88,0,0,0,-2145338,-2145338,33520,-33520,-2145338,2145338,65,46,0,0,0,0,0,0,0,9,-8,0,0,0,-214769,-214769,3355,-3355,-214769,
  16. 214769,6,4,0,0,0,0,0,0,0,0,0,0,0,0,-21475,-21475,335,-335,-21475,21475,0,0,-5,5,124,248,654,987,-1026,98768,-88754,1,-1,0,-2147483648,-2147483648,33554432,-33554432,-2147483648,2147483647,65536,46341,5,-5,-124,-248,-654,-987,1026,-98768,88754,-1,1,0,
  17. -2147483648,-2147483648,-33554432,33554432,-2147483648,-2147483647,-65536,-46341,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,0,0,-1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,-2,2,1,2,0,0,0,2,-2,1,-1,0,-2,-2,2,-2,-2,1,1,0,-2,2,1,2,0,0,0,2,
  18. -2,1,-1,0,-2,-2,2,-2,-2,1,1,0,0,0,4,3,4,2,-1,3,-4,1,-1,0,-3,-3,2,-2,-3,2,1,1,-5,5,5,3,3,0,-4,5,-1,1,-1,0,-2,-2,2,-2,-2,1,2,1,-5,5,5,3,3,0,-4,5,-1,1,-1,0,-2,-2,2,-2,-2,1,2,1,-5,5,7,1,4,12,-12,7,-3,1,-1,0,-11,-11,2,-2,-11,10,3,9,-5,5,19,3,24,7,-11,33,-29,1,-1,
  19. 0,-23,-23,2,-2,-23,22,16,1,-5,5,4,8,54,27,-66,8,-74,1,-1,0,-8,-8,32,-32,-8,7,16,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,5,124,248,654,987,-1026,98768,-88754,1,-1,0,0,0,33554432,-33554432,0,2147483647,65536,46341,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  20. -5,5,124,248,654,987,-1026,98768,-88754,1,-1,0,0,0,33554432,-33554432,0,2147483647,65536,46341]
  21. function asmModule() {
  22. "use asm";
  23. function div1(x) { x = x | 0; return ((x | 0) / 1) | 0; }
  24. function divn1(x) { x = x | 0; return ((x | 0) / -1) | 0; }
  25. function div3(x) { x = x | 0; return ((x | 0) / 3) | 0; } // Key Scenario 1
  26. function div5(x) { x = x | 0; return ((x | 0) / 5) | 0; } // Key Scenario 2
  27. function div7(x) { x = x | 0; return ((x | 0) / 7) | 0; } // Key Scenario 3
  28. function divn3(x) { x = x | 0; return ((x | 0) / -3) | 0; }
  29. function divn5(x) { x = x | 0; return ((x | 0) / -5) | 0; }
  30. function divn7(x) { x = x | 0; return ((x | 0) / -7) | 0; }
  31. function div8(x) { x = x | 0; return ((x | 0) / 8) | 0; }
  32. function div9(x) { x = x | 0; return ((x | 0) / 9) | 0; }
  33. function div13(x) { x = x | 0; return ((x | 0) / 13) | 0; }
  34. function div33(x) { x = x | 0; return ((x | 0) / 33) | 0; }
  35. function div60(x) { x = x | 0; return ((x | 0) / 60) | 0; }
  36. function div100(x) { x = x | 0; return ((x | 0) / 100) | 0; }
  37. function div120(x) { x = x | 0; return ((x | 0) / 120) | 0; }
  38. function div1001(x) { x = x | 0; return ((x | 0) / 1001) | 0; }
  39. function div9999(x) { x = x | 0; return ((x | 0) / 9999) | 0; }
  40. function div99999(x){ x = x | 0; return ((x | 0) / 99999) | 0; }
  41. function divMax0(x) { x = x | 0; return ((x | 0) / (1<<32)) | 0; }
  42. function divMax1(x) { x = x | 0; return ((x | 0) / ((1<<32)|0-1|0)) | 0; }
  43. function divMax2(x) { x = x | 0; return ((x | 0) / 2147483647) | 0; }
  44. function divMin0(x) { x = x | 0; return ((x | 0) / -2147483648)| 0; }
  45. function divMin1(x) { x = x | 0; return ((x | 0) / (1<<31)|0 * -1|0)| 0; }
  46. function rem3(x) { x = x|0; return ((x|0) % 3)|0; }
  47. function remn3(x) { x = x|0; return ((x|0) % -3)|0; }
  48. function rem5(x) { x = x|0; return ((x|0) % 5)|0; }
  49. function remn5(x) { x = x|0; return ((x|0) % -5)|0; }
  50. function rem7(x) { x = x|0; return ((x|0) % 7)|0; }
  51. function remn7(x) { x = x|0; return ((x|0) % -7)|0; }
  52. function rem15(x) { x = x|0; return ((x|0) % 13)|0; }
  53. function rem35(x) { x = x|0; return ((x|0) % 35)|0; }
  54. function rem120(x) { x = x|0; return ((x|0) % 120)|0; }
  55. function remMax0(x) { x = x|0; return ((x|0) % (1<<32)|0)|0; }
  56. function remMax1(x) { x = x|0; return ((x|0) % (1<<31)|0)|0; }
  57. function remMin0(x) { x = x|0; return ((x|0) % ((1<<32)|0 * -1|0))|0; }
  58. function remMin1(x) { x = x|0; return ((x|0) % ((1<<31)|0 * -1|0))|0; }
  59. return {
  60. div1 : div1,
  61. divn1 : divn1,
  62. div3 : div3,
  63. div5 : div5,
  64. div7 : div7,
  65. divn3 : divn3,
  66. divn5 : divn5,
  67. divn7 : divn7,
  68. div8 : div8,
  69. div9 : div9,
  70. div13 : div13,
  71. div33 : div33,
  72. div60 : div60,
  73. div100 : div100,
  74. div120 : div120,
  75. div1001 : div1001,
  76. div9999 : div9999,
  77. div99999: div99999,
  78. divMax0 : divMax0,
  79. divMax1 : divMax1,
  80. divMax2 : divMax2,
  81. divMin0 : divMin0,
  82. divMin1 : divMin1,
  83. rem3 : rem3,
  84. remn3 : remn3,
  85. rem5 : rem5,
  86. remn5 : remn5,
  87. rem7 : rem7,
  88. remn7 : remn7,
  89. rem15 : rem15,
  90. rem35 : rem35,
  91. rem120 : rem120,
  92. remMax0 : remMax0,
  93. remMax1 : remMax1,
  94. remMin0 : remMin0,
  95. remMin1 : remMin1
  96. };
  97. }
  98. var am = asmModule(); // produces AOT-compiled version
  99. var fns = [am.div1, am.divn1, am.div3, am.div5, am.div7, am.divn3, am.divn5, am.divn7, am.div8, am.div9, am.div13, am.div33, am.div60,
  100. am.div100, am.div120, am.div1001, am.div9999, am.div99999, am.divMax0, am.divMax1, am.divMax2, am.divMin0, am.divMin1,
  101. am.rem3, am.remn3, am.rem5, am.rem7, am.remn7, am.rem15, am.rem35, am.rem120, am.remMax0, am.remMax1, am.remMin0, am.remMin1];
  102. /*****Generate Baseline*********/
  103. function GenerateBaseline() {
  104. var tmp = [];
  105. var i = 0;
  106. fns.forEach(function (fn) {
  107. test_values.forEach(function (value) {
  108. if(debug)
  109. {
  110. print("Test# "+ i++ + " " + fn.name + "(" + value + ") \tResult: " + fn(value));
  111. }
  112. tmp.push(fn(value));
  113. }, this);
  114. }, this);
  115. print("[" + tmp + "]");
  116. }
  117. /******End Baseline gen */
  118. /*Math test for int div strength reduction*/
  119. var test_result = "PASSED";
  120. var total=0,fail=0;
  121. function testSignedDivStrengthReduction() {
  122. var i = 0;
  123. total = 0;
  124. fail = 0;
  125. fns.forEach(function (fn) {
  126. test_values.forEach(function (value) {
  127. if(debug && debugTestNum == -1)
  128. {
  129. print("Test# "+ i + " " + fn.name + "(" + value + ") :\t\tExpected " + results[i] + "\t Found " + fn(value));
  130. }
  131. else if(debug && i == debugTestNum)
  132. {
  133. print("Test# "+ i + " " + fn.name + "(" + value + ") :\tExpected " + results[i] + "\t Found " + fn(value));
  134. }
  135. if (results[i] != fn(value)) {
  136. print();
  137. print("TestFail at Test# "+ i + " " + fn.name + "(" + value + ") :\tExpected " + results[i] + "\tFound " + fn(value));
  138. test_result = "Fail";
  139. ++fail;
  140. }
  141. ++i;
  142. ++total;
  143. }, this);
  144. }, this);
  145. }
  146. if( CreateBaseline )
  147. {
  148. GenerateBaseline();
  149. }
  150. else
  151. {
  152. // var a = new Date().getTime();
  153. // for (var i = 0; i < 1; ++i)
  154. testSignedDivStrengthReduction();
  155. // var b = new Date().getTime() - a;
  156. // print("ElapsedTime = " + b);
  157. if (fail != 0)
  158. {
  159. print(fail + "/" + total + " tests Failed.");
  160. }
  161. // print(total + "/" + total + " tests Passed.")
  162. print(test_result);
  163. }