math.js 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. var {fixupI64Return} = WScript.LoadScriptFile("./wasmutils.js");
  6. let passed = true;
  7. function check(expected, funName, ...args)
  8. {
  9. let fun = eval(funName);
  10. var result;
  11. try {
  12. result = fun(...args);
  13. } catch (e) {
  14. result = e.message;
  15. }
  16. if(result != expected) {
  17. passed = false;
  18. print(`${funName}(${[...args]}) produced ${result}, expected ${expected}`);
  19. }
  20. }
  21. let ffi = {};
  22. var mod = new WebAssembly.Module(readbuffer('math.wasm'));
  23. var exports = new WebAssembly.Instance(mod, ffi).exports;
  24. check(0, "exports.ctz", 1);
  25. check(2, "exports.ctz", 4);
  26. check(31, "exports.ctz", -Math.pow(2,31));
  27. check(32, "exports.ctz", 0);
  28. //i32 div/rem
  29. check(2,"exports.i32_div_s_by_two", 5);
  30. check("Overflow","exports.i32_div_s_over", 5);
  31. check("Overflow","exports.i32_div_s_over", 5, 0);
  32. check("Division by zero","exports.i32_div_s", 5, 0);
  33. check("Overflow","exports.i32_div_s", -2147483648, -1);
  34. check("Division by zero","exports.i32_div_u", 5, 0);
  35. check("Division by zero","exports.i32_rem_u", 5, 0);
  36. check("Division by zero","exports.i32_rem_s", 5, 0);
  37. check(-2,"exports.i32_div_s", 5, -2);
  38. check(2,"exports.i32_div_u", 5, 2);
  39. check(0,"exports.i32_rem_u", 5, 1);
  40. check(0,"exports.i32_rem_s", 5, -1);
  41. check(1,"exports.i32_rem_s", 5, 2);
  42. fixupI64Return(exports, Object.keys(exports).filter(key => key.toLowerCase().includes("i64")));
  43. //i64 div/rem
  44. check("Overflow","exports.i64_div_s_over");
  45. check("Division by zero","exports.i64_div_s", 5, 0);
  46. check("Division by zero","exports.i64_div_u", 5, 0);
  47. check("Division by zero","exports.i64_rem_s", 5, 0);
  48. check("Division by zero","exports.i64_rem_u", 5, 0);
  49. check("0xfffffffffffffffe","exports.i64_div_s", 5, -2);
  50. check("0x0000000000000002","exports.i64_div_u", 5, 2);
  51. check("0x0000000000000000","exports.i64_rem_s", 5, -1);
  52. check("0x000000000000000c","exports.i64_rem_u", -4, 16);
  53. check("0x0000000000000040", "exports.ctzI64", 0);
  54. check("0x0000000000000040", "exports.ctzI64", "0");
  55. check("0x0000000000000000", "exports.ctzI64", "1");
  56. check("0x000000000000001f", "exports.ctzI64", "" + -Math.pow(2,31));
  57. check("0x000000000000003a", "exports.ctzI64", "0x3400000000000000");
  58. check("0x000000000000003f", "exports.ctzI64", "-9223372036854775808");
  59. if(passed) {
  60. print("Passed");
  61. }