math.js 2.4 KB

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