js/src/jit-test/tests/asm.js/testFFI.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/js/src/jit-test/tests/asm.js/testFFI.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,98 @@
     1.4 +load(libdir + "asm.js");
     1.5 +load(libdir + "asserts.js");
     1.6 +
     1.7 +function ffi(a,b,c,d) {
     1.8 +    return a+b+c+d;
     1.9 +}
    1.10 +
    1.11 +var f = asmLink(asmCompile('global','imp', USE_ASM + 'var ffi=imp.ffi; function g() { return 1 } function f() { var i=0; i=g()|0; return ((ffi(4,5,6,7)|0)+i)|0 } return f'), null, {ffi:ffi});
    1.12 +assertEq(f(1), 23);
    1.13 +
    1.14 +var counter = 0;
    1.15 +function inc() { return counter++ }
    1.16 +function add1(x) { return x+1 }
    1.17 +function add2(x,y) { return x+y }
    1.18 +function add3(x,y,z) { return x+y+z }
    1.19 +function addN() {
    1.20 +    var sum = 0;
    1.21 +    for (var i = 0; i < arguments.length; i++)
    1.22 +        sum += arguments[i];
    1.23 +    return sum;
    1.24 +}
    1.25 +var imp = { inc:inc, add1:add1, add2:add2, add3:add3, addN:addN, identity: x => x };
    1.26 +
    1.27 +assertAsmTypeFail('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { incc() } return f');
    1.28 +assertAsmTypeFail('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { var i = 0; return (i + inc)|0 } return f');
    1.29 +assertAsmTypeFail('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { inc = 0 } return f');
    1.30 +assertAsmTypeFail('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { return (inc() + 1)|0 } return f');
    1.31 +assertAsmTypeFail('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { return +((inc()|0) + 1.1) } return f');
    1.32 +assertAsmTypeFail('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { return +(inc() + 1.1) } return f');
    1.33 +assertAsmTypeFail('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { return (+inc() + 1)|0 } return f');
    1.34 +assertAsmTypeFail('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { var i = 0; inc(i>>>0) } return f');
    1.35 +assertAsmTypeFail('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { return inc(); return } return f');
    1.36 +assertAsmTypeFail('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { inc(inc()) } return f');
    1.37 +assertAsmTypeFail('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { g(inc()) } function g() {} return f');
    1.38 +assertAsmTypeFail('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { inc()|inc() } return f');
    1.39 +
    1.40 +assertAsmLinkFail(asmCompile('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { return inc()|0 } return f'), null, {});
    1.41 +assertAsmLinkFail(asmCompile('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { return inc()|0 } return f'), null, {inc:0});
    1.42 +assertAsmLinkFail(asmCompile('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { return inc()|0 } return f'), null, {inc:{}});
    1.43 +
    1.44 +assertEq(asmLink(asmCompile('glob', 'imp', USE_ASM + 'var inc=imp.inc; function g() { inc() } return g'), null, imp)(), undefined);
    1.45 +assertEq(counter, 1);
    1.46 +
    1.47 +var f = asmLink(asmCompile('glob', 'imp', USE_ASM + 'var inc=imp.inc; function g() { return inc()|0 } return g'), null, imp);
    1.48 +assertEq(f(), 1);
    1.49 +assertEq(counter, 2);
    1.50 +assertEq(f(), 2);
    1.51 +assertEq(counter, 3);
    1.52 +
    1.53 +assertEq(asmLink(asmCompile('glob', 'imp', USE_ASM + 'var add1=imp.add1; function g(i) { i=i|0; return add1(i|0)|0 } return g'), null, imp)(9), 10);
    1.54 +assertEq(asmLink(asmCompile('glob', 'imp', USE_ASM + 'const add1=imp.add1; function g(i) { i=i|0; return add1(i|0)|0 } return g'), null, imp)(9), 10);
    1.55 +assertEq(asmLink(asmCompile('glob', 'imp', USE_ASM + 'var add3=imp.add3; function g() { var i=1,j=3,k=9; return add3(i|0,j|0,k|0)|0 } return g'), null, imp)(), 13);
    1.56 +assertEq(asmLink(asmCompile('glob', 'imp', USE_ASM + 'const add3=imp.add3; function g() { var i=1,j=3,k=9; return add3(i|0,j|0,k|0)|0 } return g'), null, imp)(), 13);
    1.57 +assertEq(asmLink(asmCompile('glob', 'imp', USE_ASM + 'var add3=imp.add3; function g() { var i=1.4,j=2.3,k=32.1; return +add3(i,j,k) } return g'), null, imp)(), 1.4+2.3+32.1);
    1.58 +assertEq(asmLink(asmCompile('glob', 'imp', USE_ASM + 'const add3=imp.add3; function g() { var i=1.4,j=2.3,k=32.1; return +add3(i,j,k) } return g'), null, imp)(), 1.4+2.3+32.1);
    1.59 +
    1.60 +assertEq(asmLink(asmCompile('glob', 'imp', USE_ASM + 'var add3=imp.add3; function f(i,j,k) { i=i|0;j=+j;k=k|0; return add3(i|0,j,k|0)|0 } return f'), null, imp)(1, 2.5, 3), 6);
    1.61 +assertEq(asmLink(asmCompile('glob', 'imp', USE_ASM + 'var addN=imp.addN; function f() { return +addN(1,2,3,4.1,5,6.1,7,8.1,9.1,10,11.1,12,13,14.1,15.1,16.1,17.1,18.1) } return f'), null, imp)(), 1+2+3+4.1+5+6.1+7+8.1+9.1+10+11.1+12+13+14.1+15.1+16.1+17.1+18.1);
    1.62 +
    1.63 +assertEq(asmLink(asmCompile('glob', 'imp', USE_ASM + 'var add2=imp.add2; function f(i,j) { i=i|0;j=+j; return +(+(add2(i|0,1)|0) + +add2(j,1) + +add2(+~~i,j)) } return f'), null, imp)(2, 5.5), 3+(5.5+1)+(2+5.5));
    1.64 +assertEq(asmLink(asmCompile('glob', 'imp', USE_ASM + 'var addN=imp.addN; function f(i,j) { i=i|0;j=+j; return +(+addN(i|0,j,3,j,i|0) + +addN() + +addN(j,j,j)) } return f'), null, imp)(1, 2.2), (1+2.2+3+2.2+1)+(2.2+2.2+2.2));
    1.65 +
    1.66 +counter = 0;
    1.67 +assertEq(asmLink(asmCompile('glob', 'imp', USE_ASM + 'var addN=imp.addN,inc=imp.inc; function f() { return ((addN(inc()|0,inc(3.3)|0,inc()|0)|0) + (addN(inc(0)|0)|0))|0 } return f'), null, imp)(), 6);
    1.68 +assertEq(counter, 4);
    1.69 +
    1.70 +var recurse = function(i,j) { if (i == 0) return j; return f(i-1,j+1)+j }
    1.71 +imp.recurse = recurse;
    1.72 +var f = asmLink(asmCompile('glob', 'imp', USE_ASM + 'var r=imp.recurse; function f(i,j) { i=i|0;j=+j; return +r(i|0,j) } return f'), null, imp);
    1.73 +assertEq(f(0,3.3), 3.3);
    1.74 +assertEq(f(1,3.3), 3.3+4.3);
    1.75 +assertEq(f(2,3.3), 3.3+4.3+5.3);
    1.76 +
    1.77 +function maybeThrow(i, j) {
    1.78 +    if (i == 0)
    1.79 +        throw j;
    1.80 +    try {
    1.81 +        return f(i-1, j);
    1.82 +    } catch(e) {
    1.83 +        assertEq(typeof e, "number");
    1.84 +        return e;
    1.85 +    }
    1.86 +}
    1.87 +var f = asmLink(asmCompile('glob', 'imp', USE_ASM + 'var ffi=imp.ffi; function f(i, j) { i=i|0;j=j|0; return ffi(i|0, (j+1)|0)|0 } return f'), null, {ffi:maybeThrow});
    1.88 +assertThrowsValue(function() { f(0,0) }, 1);
    1.89 +assertThrowsValue(function() { f(0,Math.pow(2,31)-1) }, -Math.pow(2,31));
    1.90 +assertEq(f(1,0), 2);
    1.91 +assertEq(f(2,0), 3);
    1.92 +assertEq(f(3,0), 4);
    1.93 +assertEq(f(4,5), 10);
    1.94 +
    1.95 +var recurse = function(i,j) { if (i == 0) throw j; f(i-1,j) }
    1.96 +var f = asmLink(asmCompile('glob', 'imp', USE_ASM + 'var ffi=imp.ffi; function g(i,j,k) { i=i|0;j=+j;k=k|0; if (!(k|0)) ffi(i|0,j)|0; else g(i, j+1.0, (k-1)|0) } function f(i,j) { i=i|0;j=+j; g(i,j,4) } return f'), null, {ffi:recurse});
    1.97 +assertThrowsValue(function() { f(0,2.4) }, 2.4+4);
    1.98 +assertThrowsValue(function() { f(1,2.4) }, 2.4+8);
    1.99 +assertThrowsValue(function() { f(8,2.4) }, 2.4+36);
   1.100 +
   1.101 +assertEq(asmLink(asmCompile('glob', 'imp', USE_ASM + 'var identity=imp.identity; function g(x) { x=+x; return +identity(x) } return g'), null, imp)(13.37), 13.37);

mercurial