divByConstants_unsigned.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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 = [3, 5, 124, 248, 654, 987, 1026, 98768, 88754, 1<<32, 1<<30, 2147483648, 2147483647, 4294967295, 1<<31 -1, 65536, 46341];
  11. var results = [3,5,124,248,654,987,1026,98768,88754,1,1073741824,-2147483648,2147483647,-1,1073741824,65536,46341,1,1,41,82,218,329,342,32922,
  12. 29584,0,357913941,715827882,715827882,1431655765,357913941,21845,15447,0,1,24,49,130,197,205,19753,17750,0,214748364,429496729,429496729,
  13. 858993459,214748364,13107,9268,0,0,17,35,93,141,146,14109,12679,0,153391689,306783378,306783378,613566756,153391689,9362,6620,0,0,15,31,81,
  14. 123,128,12346,11094,0,134217728,268435456,268435455,536870911,134217728,8192,5792,0,0,13,27,72,109,114,10974,9861,0,119304647,238609294,
  15. 238609294,477218588,119304647,7281,5149,0,0,9,19,50,75,78,7597,6827,0,82595524,165191049,165191049,330382099,82595524,5041,3564,0,0,3,7,
  16. 19,29,31,2992,2689,0,32537631,65075262,65075262,130150524,32537631,1985,1404,0,0,2,4,10,16,17,1646,1479,0,17895697,35791394,35791394,71582788,
  17. 17895697,1092,772,0,0,1,2,6,9,10,987,887,0,10737418,21474836,21474836,42949672,10737418,655,463,0,0,1,2,5,8,8,823,739,0,8947848,17895697,17895697,
  18. 35791394,8947848,546,386,0,0,0,0,0,0,1,98,88,0,1072669,2145338,2145338,4290676,1072669,65,46,0,0,0,0,0,0,0,9,8,0,107384,214769,214769,429539,
  19. 107384,6,4,0,0,0,0,0,0,0,0,0,0,10737,21475,21475,42950,10737,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
  20. 0,0,0,0,0,0,0,1,0,1,0,0,0,0,2,1,2,0,0,0,2,2,1,1,2,1,0,1,1,0,3,0,4,3,4,2,1,3,4,1,4,3,2,0,4,1,1,3,5,5,3,3,0,4,5,1,1,1,2,1,3,1,2,1,3,5,12,10,10,7,
  21. 4,12,8,1,8,2,1,3,8,2,1,3,5,13,26,25,25,27,15,28,1,11,22,21,6,11,9,17,3,5,4,8,54,27,66,8,74,1,64,8,7,15,64,16,21,3,5,124,248,654,987,1026,98768,
  22. 88754,1,1073741824,-2147483648,2147483647,0,1073741824,65536,46341,3,5,124,248,654,987,1026,98768,88754,1,1073741824,0,2147483647,2147483647,1073741824,65536,46341]
  23. let passed = true;
  24. function check(expected, funName, ...args)
  25. {
  26. let fun = eval(funName);
  27. var result;
  28. try {
  29. result = fun(...args);
  30. } catch (e) {
  31. result = e.message;
  32. }
  33. if(result != expected) {
  34. passed = false;
  35. print(`${funName}(${[...args]}) \t produced ${result} \texpected ${expected}`);
  36. }
  37. }
  38. function GenerateBaseline(funName, ...args)
  39. {
  40. let fun = eval(funName);
  41. var result;
  42. try {
  43. result = fun(...args);
  44. } catch (e) {
  45. result = e.message;
  46. }
  47. return result;
  48. }
  49. const wasmModuleText = `(module
  50. (func (export "i32_div_1") (param $x i32) (result i32) (i32.div_u (get_local $x) (i32.const 1)) )
  51. (func (export "i32_div_3") (param $x i32) (result i32) (i32.div_u (get_local $x) (i32.const 3)) )
  52. (func (export "i32_div_5") (param $x i32) (result i32) (i32.div_u (get_local $x) (i32.const 5)) )
  53. (func (export "i32_div_7") (param $x i32) (result i32) (i32.div_u (get_local $x) (i32.const 7)) )
  54. (func (export "i32_div_8") (param $x i32) (result i32) (i32.div_u (get_local $x) (i32.const 8)) )
  55. (func (export "i32_div_9") (param $x i32) (result i32) (i32.div_u (get_local $x) (i32.const 9)) )
  56. (func (export "i32_div_13") (param $x i32) (result i32) (i32.div_u (get_local $x) (i32.const 13)) )
  57. (func (export "i32_div_33") (param $x i32) (result i32) (i32.div_u (get_local $x) (i32.const 33)) )
  58. (func (export "i32_div_60") (param $x i32) (result i32) (i32.div_u (get_local $x) (i32.const 60)) )
  59. (func (export "i32_div_100") (param $x i32) (result i32) (i32.div_u (get_local $x) (i32.const 100)) )
  60. (func (export "i32_div_120") (param $x i32) (result i32) (i32.div_u (get_local $x) (i32.const 120)) )
  61. (func (export "i32_div_1001") (param $x i32) (result i32) (i32.div_u (get_local $x) (i32.const 1001)) )
  62. (func (export "i32_div_9999") (param $x i32) (result i32) (i32.div_u (get_local $x) (i32.const 9999)) )
  63. (func (export "i32_div_99999") (param $x i32) (result i32) (i32.div_u (get_local $x) (i32.const 99999)) )
  64. (func (export "i32_div_max0") (param $x i32) (result i32) (i32.div_u (get_local $x) (i32.const 4294967295)) )
  65. (func (export "i32_div_max1") (param $x i32) (result i32) (i32.div_u (get_local $x) (i32.const 4294967295)) )
  66. (func (export "i32_div_max2") (param $x i32) (result i32) (i32.div_u (get_local $x) (i32.const 2147483648)) )
  67. (func (export "i32_rem_3") (param $x i32) (result i32) (i32.rem_u (get_local $x) (i32.const 3)) )
  68. (func (export "i32_rem_5") (param $x i32) (result i32) (i32.rem_u (get_local $x) (i32.const 5)) )
  69. (func (export "i32_rem_7") (param $x i32) (result i32) (i32.rem_u (get_local $x) (i32.const 7)) )
  70. (func (export "i32_rem_14") (param $x i32) (result i32) (i32.rem_u (get_local $x) (i32.const 14)) )
  71. (func (export "i32_rem_37") (param $x i32) (result i32) (i32.rem_u (get_local $x) (i32.const 37)) )
  72. (func (export "i32_rem_120") (param $x i32) (result i32) (i32.rem_u (get_local $x) (i32.const 120)) )
  73. (func (export "i32_rem_Max0") (param $x i32) (result i32) (i32.rem_u (get_local $x) (i32.const 4294967295)) )
  74. (func (export "i32_rem_Max1") (param $x i32) (result i32) (i32.rem_u (get_local $x) (i32.const 2147483648)) )
  75. )`;
  76. const mod = new WebAssembly.Module(WebAssembly.wabt.convertWast2Wasm(wasmModuleText));
  77. const {exports} = new WebAssembly.Instance(mod);
  78. var fns = [exports.i32_div_1,
  79. exports.i32_div_3,
  80. exports.i32_div_5,
  81. exports.i32_div_7,
  82. exports.i32_div_8,
  83. exports.i32_div_9,
  84. exports.i32_div_13,
  85. exports.i32_div_33,
  86. exports.i32_div_60,
  87. exports.i32_div_100,
  88. exports.i32_div_120,
  89. exports.i32_div_1001,
  90. exports.i32_div_9999,
  91. exports.i32_div_99999,
  92. exports.i32_div_max0,
  93. exports.i32_div_max1,
  94. exports.i32_div_max2,
  95. exports.i32_rem_3,
  96. exports.i32_rem_5,
  97. exports.i32_rem_7,
  98. exports.i32_rem_14,
  99. exports.i32_rem_37,
  100. exports.i32_rem_120,
  101. exports.i32_rem_Max0,
  102. exports.i32_rem_Max1];
  103. /*Math test for int div strength reduction*/
  104. function testSignedDivStrengthReduction() {
  105. var i = 0;
  106. fns.forEach(function (fn) {
  107. test_values.forEach(function (value) {
  108. if(debug && debugTestNum == -1)
  109. {
  110. print("Test# "+ i + " " + fn + " ("+ value + ") \t Expected:" + results[i] + "\t Found:" + GenerateBaseline(fn, value));
  111. }
  112. else if(debug && debugTestNum == i)
  113. {
  114. print("Test# "+ i + " " + fn + " ("+ value + ") \t Expected:" + results[i] + "\t Found:" + GenerateBaseline(fn, value));
  115. }
  116. else
  117. {
  118. check(results[i], fn, value);
  119. }
  120. ++i;
  121. }, this);
  122. }, this);
  123. }
  124. if( CreateBaseline )
  125. {
  126. var tmp = [];
  127. var i = 0;
  128. fns.forEach(function (fn) {
  129. test_values.forEach(function (value) {
  130. if(debug)
  131. {
  132. print("Test #"+i++ + " " + fn + "\t(" + value + ")\t Result: "+ GenerateBaseline(fn, value));
  133. }
  134. tmp.push(GenerateBaseline(fn, value));
  135. }, this);
  136. }, this);
  137. print("[" + tmp + "]");
  138. }
  139. else
  140. {
  141. // var a = new Date().getTime();
  142. // for (var i = 0; i < 1; ++i)
  143. testSignedDivStrengthReduction();
  144. // var b = new Date().getTime() - a;
  145. // print("ElapsedTime = " + b);
  146. }
  147. if(passed) {
  148. print("Passed");
  149. }