divByConstants.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  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 {fixupI64Return} = WScript.LoadScriptFile("./wasmutils.js");
  6. WScript.Flag("-wasmI64");
  7. var CreateBaseline = false; // Set True to generate Baseline data. Initialize results array with console output.
  8. var debug = false; // True for printing debug messages
  9. var debugTestNum = -1; // Set test number to run a specific test. Set to default -1 otherwise.
  10. var test_values = [-5, 5, 124, 248, 654, 987, -1026, 98768, -88754, 1<<32, -(1<<32), (1<<32)-1, (1<<31)-1, -(1<<31)+1, 1<<25, -1<<25, 65536, 46341];
  11. var results =
  12. [-5,5,124,248,654,987,-1026,98768,-88754,1,-1,0,2147483647,-2147483647,33554432,-33554432,65536,46341,5,-5,-124,-248,-654,-987,1026,-98768,88754,-1,1,0,-2147483647,2147483647,
  13. -33554432,33554432,-65536,-46341,-1,1,41,82,218,329,-342,32922,-29584,0,0,0,715827882,-715827882,11184810,-11184810,21845,15447,-1,1,24,49,130,197,-205,19753,-17750,
  14. 0,0,0,429496729,-429496729,6710886,-6710886,13107,9268,0,0,17,35,93,141,-146,14109,-12679,0,0,0,306783378,-306783378,4793490,-4793490,9362,6620,1,-1,-41,-82,-218,-329,
  15. 342,-32922,29584,0,0,0,-715827882,715827882,-11184810,11184810,-21845,-15447,1,-1,-24,-49,-130,-197,205,-19753,17750,0,0,0,-429496729,429496729,-6710886,6710886,-13107,-9268,
  16. 0,0,-17,-35,-93,-141,146,-14109,12679,0,0,0,-306783378,306783378,-4793490,4793490,-9362,-6620,0,0,15,31,81,123,-128,12346,-11094,0,0,0,268435455,-268435455,4194304,
  17. -4194304,8192,5792,0,0,13,27,72,109,-114,10974,-9861,0,0,0,238609294,-238609294,3728270,-3728270,7281,5149,0,0,9,19,50,75,-78,7597,-6827,0,0,0,165191049,-165191049,2581110,
  18. -2581110,5041,3564,0,0,3,7,19,29,-31,2992,-2689,0,0,0,65075262,-65075262,1016800,-1016800,1985,1404,0,0,2,4,10,16,-17,1646,-1479,0,0,0,35791394,-35791394,559240,-559240,1092,
  19. 772,0,0,1,2,6,9,-10,987,-887,0,0,0,21474836,-21474836,335544,-335544,655,463,0,0,1,2,5,8,-8,823,-739,0,0,0,17895697,-17895697,279620,-279620,546,386,0,0,0,0,0,0,
  20. -1,98,-88,0,0,0,2145338,-2145338,33520,-33520,65,46,0,0,0,0,0,0,0,9,-8,0,0,0,214769,-214769,3355,-3355,6,4,0,0,0,0,0,0,0,0,0,0,0,0,21475,-21475,335,-335,0,0,5,-5,-124,
  21. -248,-654,-987,1026,-98768,88754,-1,1,0,-2147483647,2147483647,-33554432,33554432,-65536,-46341,5,-5,-124,-248,-654,-987,1026,-98768,88754,-1,1,0,-2147483647,2147483647,
  22. -33554432,33554432,-65536,-46341,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1,0,0,0,0,-2,2,1,2,0,0,0,2,-2,1,-1,0,1
  23. ,-1,2,-2,1,0,0,0,4,3,4,2,-1,3,-4,1,-1,0,2,-2,2,-2,1,1,-5,5,5,3,3,0,-4,5,-1,1,-1,0,1,-1,2,-2,2,1,-2,2,1,2,0,0,0,2,-2,1,-1,0,1,-1,2,-2,1,0,0,0,4,3,4,2,-1,3,-4,1,-1,0,2,-2,
  24. 2,-2,1,1,-5,5,5,3,3,0,-4,5,-1,1,-1,0,1,-1,2,-2,2,1,-5,5,12,10,10,7,-4,12,-8,1,-1,0,1,-1,2,-2,2,1,-5,5,13,26,25,25,-27,15,-28,1,-1,0,21,-21,20,-20,9,17,-5,5,4,8,54,27,-66,
  25. 8,-74,1,-1,0,7,-7,32,-32,16,21,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,2147483647,-2147483647,33554432,-33554432,65536,46341,
  26. -5,5,124,248,654,987,-1026,98768,-88754,1,-1,0,2,-2,33554432,-33554432,65536,46341,-5,5,124,248,654,987,-1026,98768,-88754,1,-1,0,0,0,33554432,-33554432,65536,46341];
  27. let passed = true;
  28. function check(expected, funName, ...args)
  29. {
  30. let fun = eval(funName);
  31. var result;
  32. try {
  33. result = fun(...args);
  34. } catch (e) {
  35. result = e.message;
  36. }
  37. if(result != expected) {
  38. passed = false;
  39. print(`${funName}(${[...args]}) \t produced ${result} \texpected ${expected}`);
  40. }
  41. }
  42. function GenerateBaseline(funName, ...args)
  43. {
  44. let fun = eval(funName);
  45. var result;
  46. try {
  47. result = fun(...args);
  48. } catch (e) {
  49. result = e.message;
  50. }
  51. return result;
  52. }
  53. const wasmModuleText = `(module
  54. (func (export "i32_div_1") (param $x i32) (result i32) (i32.div_s (get_local $x) (i32.const 1)) )
  55. (func (export "i32_div_n1") (param $x i32) (result i32) (i32.div_s (get_local $x) (i32.const -1)) )
  56. (func (export "i32_div_3") (param $x i32) (result i32) (i32.div_s (get_local $x) (i32.const 3)) )
  57. (func (export "i32_div_5") (param $x i32) (result i32) (i32.div_s (get_local $x) (i32.const 5)) )
  58. (func (export "i32_div_7") (param $x i32) (result i32) (i32.div_s (get_local $x) (i32.const 7)) )
  59. (func (export "i32_div_n3") (param $x i32) (result i32) (i32.div_s (get_local $x) (i32.const -3)) )
  60. (func (export "i32_div_n5") (param $x i32) (result i32) (i32.div_s (get_local $x) (i32.const -5)) )
  61. (func (export "i32_div_n7") (param $x i32) (result i32) (i32.div_s (get_local $x) (i32.const -7)) )
  62. (func (export "i32_div_8") (param $x i32) (result i32) (i32.div_s (get_local $x) (i32.const 8)) )
  63. (func (export "i32_div_9") (param $x i32) (result i32) (i32.div_s (get_local $x) (i32.const 9)) )
  64. (func (export "i32_div_13") (param $x i32) (result i32) (i32.div_s (get_local $x) (i32.const 13)) )
  65. (func (export "i32_div_33") (param $x i32) (result i32) (i32.div_s (get_local $x) (i32.const 33)) )
  66. (func (export "i32_div_60") (param $x i32) (result i32) (i32.div_s (get_local $x) (i32.const 60)) )
  67. (func (export "i32_div_100") (param $x i32) (result i32) (i32.div_s (get_local $x) (i32.const 100)) )
  68. (func (export "i32_div_120") (param $x i32) (result i32) (i32.div_s (get_local $x) (i32.const 120)) )
  69. (func (export "i32_div_1001") (param $x i32) (result i32) (i32.div_s (get_local $x) (i32.const 1001)) )
  70. (func (export "i32_div_9999") (param $x i32) (result i32) (i32.div_s (get_local $x) (i32.const 9999)) )
  71. (func (export "i32_div_99999") (param $x i32) (result i32) (i32.div_s (get_local $x) (i32.const 99999)) )
  72. (func (export "i32_div_max0") (param $x i32) (result i32) (i32.div_s (get_local $x) (i32.const 4294967295)) )
  73. (func (export "i32_div_max1") (param $x i32) (result i32) (i32.div_s (get_local $x) (i32.const 4294967295)) )
  74. (func (export "i32_div_max2") (param $x i32) (result i32) (i32.div_s (get_local $x) (i32.const 2147483648)) )
  75. (func (export "i32_div_min0") (param $x i32) (result i32) (i32.div_s (get_local $x) (i32.const -429496729)) )
  76. (func (export "i32_div_min1") (param $x i32) (result i32) (i32.div_s (get_local $x) (i32.const -2147483647)) )
  77. (func (export "i32_rem_3") (param $x i32) (result i32) (i32.rem_s (get_local $x) (i32.const 3)) )
  78. (func (export "i32_rem_5") (param $x i32) (result i32) (i32.rem_s (get_local $x) (i32.const 5)) )
  79. (func (export "i32_rem_7") (param $x i32) (result i32) (i32.rem_s (get_local $x) (i32.const 7)) )
  80. (func (export "i32_rem_n3") (param $x i32) (result i32) (i32.rem_s (get_local $x) (i32.const -3)) )
  81. (func (export "i32_rem_n5") (param $x i32) (result i32) (i32.rem_s (get_local $x) (i32.const -5)) )
  82. (func (export "i32_rem_n7") (param $x i32) (result i32) (i32.rem_s (get_local $x) (i32.const -7)) )
  83. (func (export "i32_rem_14") (param $x i32) (result i32) (i32.rem_s (get_local $x) (i32.const 14)) )
  84. (func (export "i32_rem_37") (param $x i32) (result i32) (i32.rem_s (get_local $x) (i32.const 37)) )
  85. (func (export "i32_rem_120") (param $x i32) (result i32) (i32.rem_s (get_local $x) (i32.const 120)) )
  86. (func (export "i32_rem_Max0") (param $x i32) (result i32) (i32.rem_s (get_local $x) (i32.const 4294967295)) )
  87. (func (export "i32_rem_Max1") (param $x i32) (result i32) (i32.rem_s (get_local $x) (i32.const 2147483648)) )
  88. (func (export "i32_rem_Min0") (param $x i32) (result i32) (i32.rem_s (get_local $x) (i32.const -429496729)) )
  89. (func (export "i32_rem_Min1") (param $x i32) (result i32) (i32.rem_s (get_local $x) (i32.const -2147483647)) )
  90. )`;
  91. const mod = new WebAssembly.Module(WebAssembly.wabt.convertWast2Wasm(wasmModuleText));
  92. const {exports} = new WebAssembly.Instance(mod);
  93. var fns = [exports.i32_div_1,
  94. exports.i32_div_n1,
  95. exports.i32_div_3,
  96. exports.i32_div_5,
  97. exports.i32_div_7,
  98. exports.i32_div_n3,
  99. exports.i32_div_n5,
  100. exports.i32_div_n7,
  101. exports.i32_div_8,
  102. exports.i32_div_9,
  103. exports.i32_div_13,
  104. exports.i32_div_33,
  105. exports.i32_div_60,
  106. exports.i32_div_100,
  107. exports.i32_div_120,
  108. exports.i32_div_1001,
  109. exports.i32_div_9999,
  110. exports.i32_div_99999,
  111. exports.i32_div_max0,
  112. exports.i32_div_max1,
  113. exports.i32_div_max2,
  114. exports.i32_div_min0,
  115. exports.i32_div_min1,
  116. exports.i32_rem_3,
  117. exports.i32_rem_5,
  118. exports.i32_rem_7,
  119. exports.i32_rem_n3,
  120. exports.i32_rem_n5,
  121. exports.i32_rem_n7,
  122. exports.i32_rem_14,
  123. exports.i32_rem_37,
  124. exports.i32_rem_120,
  125. exports.i32_rem_Max0,
  126. exports.i32_rem_Max1,
  127. exports.i32_rem_Min0,
  128. exports.i32_rem_Min1];
  129. /*Math test for int div strength reduction*/
  130. function testSignedDivStrengthReduction() {
  131. var i = 0;
  132. fns.forEach(function (fn) {
  133. test_values.forEach(function (value) {
  134. if(debug && debugTestNum == -1)
  135. {
  136. print("Test# "+ i + " " + fn + " ("+ value + ") \t Expected:" + results[i] + "\t Found:" + GenerateBaseline(fn, value));
  137. }
  138. else if(debug && debugTestNum == i)
  139. {
  140. print("Test# "+ i + " " + fn + " ("+ value + ") \t Expected:" + results[i] + "\t Found:" + GenerateBaseline(fn, value));
  141. }
  142. else
  143. {
  144. check(results[i], fn, value);
  145. }
  146. ++i;
  147. }, this);
  148. }, this);
  149. }
  150. if( CreateBaseline )
  151. {
  152. var tmp = [];
  153. var i = 0;
  154. fns.forEach(function (fn) {
  155. test_values.forEach(function (value) {
  156. if(debug)
  157. {
  158. print("Test #"+i++ + " " + fn + "\t(" + value + ")\t Result: "+ GenerateBaseline(fn, value));
  159. }
  160. tmp.push(GenerateBaseline(fn, value));
  161. }, this);
  162. }, this);
  163. print("[" + tmp + "]");
  164. }
  165. else
  166. {
  167. // var a = new Date().getTime();
  168. // for (var i = 0; i < 1; ++i)
  169. testSignedDivStrengthReduction();
  170. // var b = new Date().getTime() - a;
  171. // print("ElapsedTime = " + b);
  172. }
  173. if(passed) {
  174. print("Passed");
  175. }