js/src/jit-test/tests/asm.js/testFloatingPoint.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/testFloatingPoint.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,134 @@
     1.4 +load(libdir + "asm.js");
     1.5 +
     1.6 +assertEq(asmLink(asmCompile(USE_ASM + "function f() { return 1.1 } return f"))(), 1.1);
     1.7 +assertEq(asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; return +(+(i|0) + .1) } return f"))(1), 1.1);
     1.8 +assertEq(asmLink(asmCompile(USE_ASM + "function f(d) { d=+d; return +d } return f"))(1.1), 1.1);
     1.9 +assertEq(asmLink(asmCompile(USE_ASM + "function f(d,e) { d=+d;e=+e; return +(d+e) } return f"))(1.0, .1), 1.1);
    1.10 +assertEq(asmLink(asmCompile(USE_ASM + "function f(i,e) { i=i|0;e=+e; return +(+~~i+e) } return f"))(1, .1), 1.1);
    1.11 +assertEq(asmLink(asmCompile(USE_ASM + "function f(d,i) { d=+d;i=i|0; return +(d + +(i|0)) } return f"))(.1, 1), 1.1);
    1.12 +assertEq(asmLink(asmCompile(USE_ASM + "function f(d,e) { d=+d;e=+e; return +(d-e) } return f"))(1.1, .8), (1.1-.8));
    1.13 +assertEq(asmLink(asmCompile(USE_ASM + "function f(d,e) { d=+d;e=+e; return +(d*e) } return f"))(1.1, 2.2), (1.1*2.2));
    1.14 +assertEq(asmLink(asmCompile(USE_ASM + "function g() { var i=2; return (~~(i=(i+1)|0))|0 } return g"))(), 3);
    1.15 +
    1.16 +var f = asmLink(asmCompile(USE_ASM + "function f(d,e) { d=+d;e=+e; return (d<e)|0 } return f"));
    1.17 +assertEq(f(1.1, 2.2), 1);
    1.18 +assertEq(f(1.1, 1.1), 0);
    1.19 +assertEq(f(2.1, 1.1), 0);
    1.20 +
    1.21 +var f = asmLink(asmCompile(USE_ASM + "function f(d,e) { d=+d;e=+e; return (d<=e)|0 } return f"));
    1.22 +assertEq(f(1.1, 2.2), 1);
    1.23 +assertEq(f(1.1, 1.1), 1);
    1.24 +assertEq(f(2.1, 1.1), 0);
    1.25 +assertEq(f(NaN, 1.1), 0);
    1.26 +assertEq(f(1.1, NaN), 0);
    1.27 +assertEq(f(NaN, NaN), 0);
    1.28 +
    1.29 +var f = asmLink(asmCompile(USE_ASM + "function f(d,e) { d=+d;e=+e; return (d>e)|0 } return f"));
    1.30 +assertEq(f(2.1, 1.1), 1);
    1.31 +assertEq(f(1.1, 1.1), 0);
    1.32 +assertEq(f(1.1, 2.1), 0);
    1.33 +assertEq(f(NaN, 1.1), 0);
    1.34 +assertEq(f(1.1, NaN), 0);
    1.35 +assertEq(f(NaN, NaN), 0);
    1.36 +
    1.37 +var f = asmLink(asmCompile(USE_ASM + "function f(d,e) { d=+d;e=+e; return (d>=e)|0 } return f"));
    1.38 +assertEq(f(2.1, 1.1), 1);
    1.39 +assertEq(f(1.0, 1.1), 0);
    1.40 +assertEq(f(1.1, 2.1), 0);
    1.41 +assertEq(f(NaN, 1.1), 0);
    1.42 +assertEq(f(1.1, NaN), 0);
    1.43 +assertEq(f(NaN, NaN), 0);
    1.44 +
    1.45 +var f = asmLink(asmCompile(USE_ASM + "function f(d,e) { d=+d;e=+e; return (d==e)|0 } return f"));
    1.46 +assertEq(f(2.1, 1.1), 0);
    1.47 +assertEq(f(1.1, 1.1), 1);
    1.48 +assertEq(f(1.1, 2.1), 0);
    1.49 +assertEq(f(NaN, 1.1), 0);
    1.50 +assertEq(f(1.1, NaN), 0);
    1.51 +assertEq(f(NaN, NaN), 0);
    1.52 +
    1.53 +var f = asmLink(asmCompile(USE_ASM + "function f(d,e) { d=+d;e=+e; return (d!=e)|0 } return f"));
    1.54 +assertEq(f(2.1, 1.1), 1);
    1.55 +assertEq(f(1.1, 1.1), 0);
    1.56 +assertEq(f(1.1, 2.1), 1);
    1.57 +assertEq(f(NaN, 1.1), 1);
    1.58 +assertEq(f(1.1, NaN), 1);
    1.59 +assertEq(f(NaN, NaN), 1);
    1.60 +
    1.61 +var f = asmLink(asmCompile(USE_ASM + "function f(d,e) { d=+d;e=+e; return +(d/e) } return f"));
    1.62 +assertEq(f(1.1, .1), (1.1/.1));
    1.63 +assertEq(f(1.1, 0),  (1.1/0));
    1.64 +assertEq(f(1.1, -0), (1.1/-0));
    1.65 +
    1.66 +var f = asmLink(asmCompile(USE_ASM + "function f(d,e) { d=+d;e=+e; return +(d%e) } return f"));
    1.67 +assertEq(f(1.1, .1), (1.1%.1));
    1.68 +assertEq(f(1.1, 0),  (1.1%0));
    1.69 +assertEq(f(1.1, -0), (1.1%-0));
    1.70 +
    1.71 +var f = asmLink(asmCompile(USE_ASM + "function f(d) { d=+d; var i = 0; i = ~~d; return i|0 } return f"));
    1.72 +assertEq(f(1.0), 1);
    1.73 +assertEq(f(1.9), 1);
    1.74 +assertEq(f(1.9999), 1);
    1.75 +assertEq(f(2.0), 2);
    1.76 +assertEq(f(Math.pow(2,40)), ~~Math.pow(2,40));
    1.77 +assertEq(f(-Math.pow(2,40)), ~~-Math.pow(2,40));
    1.78 +assertEq(f(4000000000), ~~4000000000);
    1.79 +assertEq(f(-4000000000), ~~-4000000000);
    1.80 +assertEq(f(NaN), 0);
    1.81 +assertEq(f(Infinity), 0);
    1.82 +assertEq(f(-Infinity), 0);
    1.83 +
    1.84 +assertAsmTypeFail(USE_ASM + "function f(i,j) { i=i|0;j=j|0; return +((i|0)/(j|0)) } return f");
    1.85 +assertAsmTypeFail(USE_ASM + "function f(i,j) { i=i|0;j=j|0; return +(i+j) } return f");
    1.86 +assertAsmTypeFail(USE_ASM + "function f(i,j) { i=i|0;j=j|0; return +(i-j) } return f");
    1.87 +
    1.88 +var f = asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=j|0; return +(((i|0)/(j|0))|0) } return f"));
    1.89 +assertEq(f(1,0), 0);
    1.90 +assertEq(f(-Math.pow(2,31),-1), -Math.pow(2,31));
    1.91 +
    1.92 +var f = asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=j|0; return +(((i|0)%(j|0))|0) } return f"));
    1.93 +assertEq(f(1,0), 0);
    1.94 +assertEq(f(-Math.pow(2,31),-1), 0);
    1.95 +
    1.96 +var {f,g} = asmLink(asmCompile(USE_ASM + "function f() { return 3.5 } function g(d) { d=+d; return +(d+3.5) } return {f:f,g:g}"));
    1.97 +assertEq(f(), 3.5);
    1.98 +assertEq(g(1), 1+3.5);
    1.99 +
   1.100 +var buf = new ArrayBuffer(4096);
   1.101 +var f64 = new Float64Array(buf);
   1.102 +var i32 = new Int32Array(buf);
   1.103 +var u32 = new Uint32Array(buf);
   1.104 +var f = asmLink(asmCompile('glob', 'imp', 'b', USE_ASM + HEAP_IMPORTS + 'function f() { return +f64[0] } return f'), this, null, buf);
   1.105 +f64[0] = 0;
   1.106 +assertEq(f(), 0);
   1.107 +f64[0] = -1;
   1.108 +assertEq(f(), -1);
   1.109 +f64[0] = 1;
   1.110 +assertEq(f(), 1);
   1.111 +f64[0] = Infinity;
   1.112 +assertEq(f(), Infinity);
   1.113 +f64[0] = -Infinity;
   1.114 +assertEq(f(), -Infinity);
   1.115 +
   1.116 +function ffi(d) { str = String(d) }
   1.117 +var g = asmLink(asmCompile('glob', 'imp', 'b', USE_ASM + HEAP_IMPORTS + 'var ffi=imp.ffi; function g() { ffi(+f64[0]) } return g'), this, {ffi:ffi}, buf);
   1.118 +var h = asmLink(asmCompile('glob', 'imp', 'b', USE_ASM + HEAP_IMPORTS + 'function g() { return +(+f64[0] < 0.0 ? -+f64[0] : +f64[0]) } return g'), this, null, buf)
   1.119 +
   1.120 +function ffi1() { return 2.6 }
   1.121 +assertEq(asmLink(asmCompile('glob', 'imp', USE_ASM + "var ffi1=imp.ffi1; function g() { var i=0,j=0.0; i=ffi1()|0; j=+ffi1(); return +(+(i|0)+j) } return g"), null, {ffi1:ffi1})(), 2+2.6);
   1.122 +
   1.123 +// that sounds dangerous!
   1.124 +var a = [0,1,0xffff0000,0x7fff0000,0xfff80000,0x7ff80000,0xfffc0000,0x7ffc0000,0xffffffff,0x0000ffff,0x00008fff7];
   1.125 +for (i of a) {
   1.126 +    for (j of a) {
   1.127 +        u32[0] = i;
   1.128 +        u32[1] = j;
   1.129 +
   1.130 +        assertEq(f(), f64[0]);
   1.131 +
   1.132 +        g();
   1.133 +        assertEq(str, String(f64[0]));
   1.134 +
   1.135 +        assertEq(h(), Math.abs(f64[0]));
   1.136 +    }
   1.137 +}

mercurial