setJitCompilerOption("baseline.warmup.trigger", 10); setJitCompilerOption("ion.warmup.trigger", 20); //var log = print; var log = function(x){} function ceil(x) { // A nice but not always efficient polyfill. return -Math.floor(-x); } function doubleCheck(g) { for (var j = 0; j < 200; j++) { var i = j; assertEq(g(i), i); assertEq(g(i+.5), i+1); assertEq(g(-i), -i); assertEq(g(-i-.5), -i); } } function floatCheck(g, val) { for (var j = 0; j < 200; j++) { var i = Math.fround(j); assertEq(g(i), i); assertEq(g(i+.5), i+1); assertEq(g(-i), -i); assertEq(g(-i-.5), -i); } } function testBailout(value) { var dceil = eval('(function(x) { return Math.ceil(x) })'); log('start double'); doubleCheck(dceil); log('bailout'); // At this point, the compiled code should bailout, if 'value' is in the // edge case set. assertEq(dceil(value), ceil(value)); var fceil = eval('(function(x) { return Math.ceil(Math.fround(x)) })'); log('start float'); floatCheck(fceil, value); log('bailout'); assertEq(fceil(Math.fround(value)), ceil(Math.fround(value))); } var INT_MAX = Math.pow(2, 31) - 1; var INT_MIN = INT_MAX + 1 | 0; var UINT_MAX = Math.pow(2, 32) - 1; // Values in ]-1; -0] testBailout(-0); testBailout(-.5); // Values outside the INT32 range, when represented in either double or // single precision testBailout(INT_MAX + .5); testBailout(INT_MIN - 129); // (UINT_MAX; +inf] have special behavior on ARM testBailout(UINT_MAX); testBailout(UINT_MAX + .5); testBailout(UINT_MAX + 1); testBailout(UINT_MAX + 2); // BatNaN testBailout(NaN);