js/src/jit-test/tests/ion/bug894786-2.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/js/src/jit-test/tests/ion/bug894786-2.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,91 @@
     1.4 +
     1.5 +function f56(x) {
     1.6 +  var a = x >>> 0; // Range = [0 .. UINT32_MAX] (bits = 32)
     1.7 +  var b = 0x800000; // == 2^23 (bits = 24)
     1.8 +  if (a > 0) {
     1.9 +    // Beta node: Range [1 .. UINT32_MAX] (bits = 32)
    1.10 +    var c = a * b; // Range = [0 .. +inf] (bits = a.bits + b.bits - 1 = 55)
    1.11 +    var d = c + 1; // Range = [0 .. +inf] (bits = c.bits + 1 = 56)
    1.12 +    return (d | 0) & 1;
    1.13 +  } else {
    1.14 +    return 1;
    1.15 +  }
    1.16 +}
    1.17 +
    1.18 +function f55(x) {
    1.19 +  var a = x >>> 0; // Range = [0 .. UINT32_MAX] (bits = 32)
    1.20 +  var b = 0x400000; // == 2^22 (bits = 23)
    1.21 +  if (a > 0) {
    1.22 +    // Beta node: Range [1 .. UINT32_MAX] (bits = 32)
    1.23 +    var c = a * b; // Range = [0 .. +inf] (bits = a.bits + b.bits - 1 = 54)
    1.24 +    var d = c + 1; // Range = [0 .. +inf] (bits = c.bits + 1 = 55)
    1.25 +    return (d | 0) & 1;
    1.26 +  } else {
    1.27 +    return 1;
    1.28 +  }
    1.29 +}
    1.30 +
    1.31 +// Still returns 1, because the top-level bit is not represented.
    1.32 +function f54(x) {
    1.33 +  var a = x >>> 0; // Range = [0 .. UINT32_MAX] (bits = 32)
    1.34 +  var b = 0x200000; // == 2^21 (bits = 22)
    1.35 +  if (a > 0) {
    1.36 +    // Beta node: Range [1 .. UINT32_MAX] (bits = 32)
    1.37 +    var c = a * b; // Range = [0 .. +inf] (bits = a.bits + b.bits - 1 = 53)
    1.38 +    var d = c + 1; // Range = [1 .. +inf] (bits = c.bits + 1 = 54)
    1.39 +    return (d | 0) & 1;
    1.40 +  } else {
    1.41 +    return 1;
    1.42 +  }
    1.43 +}
    1.44 +
    1.45 +// Can safely truncate after these operations. (the mantissa has 53 bits)
    1.46 +function f53(x) {
    1.47 +  var a = x >>> 0; // Range = [0 .. UINT32_MAX] (bits = 32)
    1.48 +  var b = 0x100000; // == 2^20 (bits = 21)
    1.49 +  if (a > 0) {
    1.50 +    // Beta node: Range [1 .. UINT32_MAX] (bits = 32)
    1.51 +    var c = a * b; // Range = [0 .. +inf] (bits = a.bits + b.bits - 1 = 52)
    1.52 +    var d = c + 1; // Range = [1 .. +inf] (bits = c.bits + 1 = 53)
    1.53 +    return (d | 0) & 1;
    1.54 +  } else {
    1.55 +    return 1;
    1.56 +  }
    1.57 +}
    1.58 +
    1.59 +function f52(x) {
    1.60 +  var a = x >>> 0; // Range = [0 .. UINT32_MAX] (bits = 32)
    1.61 +  var b = 0x80000; // == 2^19 (bits = 20)
    1.62 +  if (a > 0) {
    1.63 +    // Beta node: Range [1 .. UINT32_MAX] (bits = 32)
    1.64 +    var c = a * b; // Range = [0 .. +inf] (bits = a.bits + b.bits - 1 = 51)
    1.65 +    var d = c + 1; // Range = [1 .. +inf] (bits = c.bits + 1 = 52)
    1.66 +    return (d | 0) & 1;
    1.67 +  } else {
    1.68 +    return 1;
    1.69 +  }
    1.70 +}
    1.71 +
    1.72 +function f51(x) {
    1.73 +  var a = x >>> 0; // Range = [0 .. UINT32_MAX] (bits = 32)
    1.74 +  var b = 0x40000; // == 2^18 (bits = 19)
    1.75 +  if (a > 0) {
    1.76 +    // Beta node: Range [1 .. UINT32_MAX] (bits = 32)
    1.77 +    var c = a * b; // Range = [0 .. +inf] (bits = a.bits + b.bits - 1 = 50)
    1.78 +    var d = c + 1; // Range = [1 .. +inf] (bits = c.bits + 1 = 51)
    1.79 +    return (d | 0) & 1;
    1.80 +  } else {
    1.81 +    return 1;
    1.82 +  }
    1.83 +}
    1.84 +
    1.85 +var e = Math.pow(2, 32);
    1.86 +for (var i = 1; i < e; i = i * 1.5) {
    1.87 +    var x = i >>> 0;
    1.88 +    assertEq(f56(x) , (x >= Math.pow(2, 30)) ? 0 : 1);
    1.89 +    assertEq(f55(x), (x >= Math.pow(2, 31)) ? 0 : 1);
    1.90 +    assertEq(f54(x), 1);
    1.91 +    assertEq(f53(x), 1);
    1.92 +    assertEq(f52(x), 1);
    1.93 +    assertEq(f51(x), 1);
    1.94 +}

mercurial