unsigned.js 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. const ops = ["/", "%", "<", "<=", ">", ">=", "==", "!="];
  6. const makeFunc = (name, op1, op2) => `
  7. function ${name}(x, y) {
  8. x = x|0;
  9. y = y|0;
  10. var a1 = 0, a2 = 0;
  11. a1 = ${op1};
  12. a2 = ${op2};
  13. multiReturn(a1|0, a2|0);
  14. }`;
  15. const info = ops.reduce((all, op, i) => {
  16. const unsignedOp = `((x>>>0)${op}(y>>>0))|0`;
  17. const signedOp = `((x|0)${op}(y|0))|0`;
  18. const n1 = `f${i}_u_s`;
  19. const n2 = `f${i}_s_u`;
  20. all.module += makeFunc(n1, unsignedOp, signedOp);
  21. all.module += makeFunc(n2, unsignedOp, signedOp);
  22. all.funcs.push({op, name: n1}, {op, name: n2});
  23. return all;
  24. }, {module: "", funcs: []});
  25. const moduleCore = `
  26. var multiReturn = imports.multiReturn;
  27. var multiReturnDouble = imports.multiReturnDouble;
  28. ${info.module}
  29. return {
  30. ${info.funcs.map(({name}) => `${name}: ${name},`).join("\n ")}
  31. }
  32. `;
  33. const asmModuleTxt = `return function(stdlib, imports) { "use asm" ${moduleCore} }`;
  34. const nonAsmModuleTxt = `return function(stdlib, imports) { ${moduleCore} }`;
  35. const asmImp = (new Function(asmModuleTxt))()({}, {multiReturn, multiReturnDouble: multiReturn});
  36. const nonAsmImp = (new Function(nonAsmModuleTxt))()({}, {multiReturn, multiReturnDouble: multiReturn});
  37. let results;
  38. function multiReturn(a, b) {
  39. results.push([a, b]);
  40. }
  41. function test(a, b) {
  42. for (const fnInfo of info.funcs) {
  43. const {op, name: fn} = fnInfo;
  44. results = [];
  45. nonAsmImp[fn](a, b);
  46. asmImp[fn](a, b);
  47. if (results.length !== 2) {
  48. print("Bad length of results " + results);
  49. } else if (
  50. results[0][0] !== results[1][0] ||
  51. results[0][1] !== results[1][1]
  52. ) {
  53. print(`Failed. Expected ${fn}(${a} ${op} ${b}) to be [${results[0].join(", ")}]. Got [${results[1].join(", ")}]`);
  54. }
  55. }
  56. }
  57. function foo() {}
  58. var all = [ undefined, null,
  59. true, false, new Boolean(true), new Boolean(false),
  60. NaN, +0, -0, 0, 1, 10.0, 10.1, -1, -5, 5,
  61. 124, 248, 654, 987, -1026, +98768.2546, -88754.15478,
  62. 1<<32, -(1<<32), (1<<32)-1, 1<<31, -(1<<31), 1<<25, -1<<25,
  63. Number.MAX_VALUE, Number.MIN_VALUE, Number.NaN, Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY,
  64. new Number(NaN), new Number(+0), new Number( -0), new Number(0), new Number(1),
  65. new Number(10.0), new Number(10.1),
  66. new Number(Number.MAX_VALUE), new Number(Number.MIN_VALUE), new Number(Number.NaN),
  67. new Number(Number.POSITIVE_INFINITY), new Number(Number.NEGATIVE_INFINITY),
  68. "", "hello", "hel" + "lo", "+0", "-0", "0", "1", "10.0", "10.1",
  69. new String(""), new String("hello"), new String("he" + "llo"),
  70. new Object(), [1,2,3], new Object(), [1,2,3] , foo
  71. ];
  72. for (const a1 of all) {
  73. for (const a2 of all) {
  74. test(a1, a2);
  75. }
  76. }
  77. print("PASSED");