133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// Copyright 2011 the V8 project authors. All rights reserved. 233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// Redistribution and use in source and binary forms, with or without 333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// modification, are permitted provided that the following conditions are 433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// met: 533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// 633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// * Redistributions of source code must retain the above copyright 733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// notice, this list of conditions and the following disclaimer. 833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// * Redistributions in binary form must reproduce the above 933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// copyright notice, this list of conditions and the following 1033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// disclaimer in the documentation and/or other materials provided 1133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// with the distribution. 1233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// * Neither the name of Google Inc. nor the names of its 1333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// contributors may be used to endorse or promote products derived 1433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// from this software without specific prior written permission. 1533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// 1633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 2833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// Flags: --max-new-space-size=256 --allow-natives-syntax 2933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 3033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgvar test_id = 0; 3133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 3233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfunction testFloor(expect, input) { 3333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org var test = new Function('n', 3433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org '"' + (test_id++) + '";return Math.floor(n)'); 3533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org assertEquals(expect, test(input)); 3633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org assertEquals(expect, test(input)); 3733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org assertEquals(expect, test(input)); 3833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org %OptimizeFunctionOnNextCall(test); 3933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org assertEquals(expect, test(input)); 4033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org} 4133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 4233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfunction zero() { 4333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org var x = 0.5; 4433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return (function() { return x - 0.5; })(); 4533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org} 4633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 4733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfunction test() { 4833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org testFloor(0, 0); 4933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org testFloor(0, zero()); 5033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org testFloor(-0, -0); 5133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org testFloor(Infinity, Infinity); 5233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org testFloor(-Infinity, -Infinity); 5333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org testFloor(NaN, NaN); 5433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org} 5533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 5633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 5733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// Test in a loop to cover the custom IC and GC-related issues. 5833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfor (var i = 0; i < 100; i++) { 5933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org test(); 6033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org} 6133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 6233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 6333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// Regression test for a bug where a negative zero coming from Math.floor 6433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// was not properly handled by other operations. 6533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfunction floorsum(i, n) { 6633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org var ret = Math.floor(n); 6733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org while (--i > 0) { 6833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org ret += Math.floor(n); 6933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org } 7033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return ret; 7133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org} 7233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertEquals(-0, floorsum(1, -0)); 7333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org%OptimizeFunctionOnNextCall(floorsum); 7433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// The optimized function will deopt. Run it with enough iterations to try 7533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// to optimize via OSR (triggering the bug). 7633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertEquals(-0, floorsum(100000, -0)); 77