load(libdir + 'simd.js'); setJitCompilerOption("ion.warmup.trigger", 30); var cast = (function() { var i32 = new Int32Array(1); var f32 = new Float32Array(i32.buffer); return { fromInt32Bits(x) { i32[0] = x; return f32[0]; }, fromFloat32Bits(x) { f32[0] = x; return i32[0]; } } })(); function f() { // No bailout here. var f4 = SIMD.Float32x4(1, 2, 3, 4); var i4 = SIMD.Int32x4(1, 2, 3, 4); var BitOrZero = (x) => x | 0; for (var i = 0; i < 150; i++) { assertEqX4(SIMD.Float32x4.fromInt32x4(i4), unaryX4(BitOrZero, f4, Math.fround)); assertEqX4(SIMD.Float32x4.fromInt32x4Bits(i4), unaryX4(cast.fromInt32Bits, f4, Math.fround)); assertEqX4(SIMD.Int32x4.fromFloat32x4(f4), unaryX4(Math.fround, i4, BitOrZero)); assertEqX4(SIMD.Int32x4.fromFloat32x4Bits(f4), unaryX4(cast.fromFloat32Bits, i4, BitOrZero)); } } function uglyDuckling(val) { // We bail out when i == 149 because the conversion will return // 0x80000000 and the input actually wasn't in bounds. val = Math.fround(val); for (var i = 0; i < 150; i++) { var caught = false; try { var v = SIMD.Float32x4(i < 149 ? 0 : val, 0, 0, 0) SIMD.Int32x4.fromFloat32x4(v); } catch(e) { assertEq(e instanceof RangeError, true); assertEq(i, 149); caught = true; } assertEq(i < 149 || caught, true); } } function dontBail() { // On x86, the conversion will return 0x80000000, which will imply that we // check the input values. However, we shouldn't bail out in this case. for (var i = 0; i < 150; i++) { var v = SIMD.Float32x4(i < 149 ? 0 : -Math.pow(2, 31), 0, 0, 0) SIMD.Int32x4.fromFloat32x4(v); } } f(); dontBail(); dontBail(); uglyDuckling(Math.pow(2, 31)); uglyDuckling(NaN); uglyDuckling(-Math.pow(2, 32));