1f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// Copyright 2010 the V8 project authors. All rights reserved. 2f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// Redistribution and use in source and binary forms, with or without 3f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// modification, are permitted provided that the following conditions are 4f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// met: 5f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// 6f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// * Redistributions of source code must retain the above copyright 7f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// notice, this list of conditions and the following disclaimer. 8f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// * Redistributions in binary form must reproduce the above 9f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// copyright notice, this list of conditions and the following 10f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// disclaimer in the documentation and/or other materials provided 11f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// with the distribution. 12f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// * Neither the name of Google Inc. nor the names of its 13f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// contributors may be used to endorse or promote products derived 14f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// from this software without specific prior written permission. 15f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// 16f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 283c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org// Flags: --max-semi-space-size=1 --allow-natives-syntax 29f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 30f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.orgfunction zero() { 31f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org var x = 0.5; 32f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org return (function() { return x - 0.5; })(); 33f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org} 34f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 35f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.orgfunction test() { 36f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(0, Math.abs(0)); 37f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(0, Math.abs(zero())); 38160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org assertEquals(0, Math.abs(-0)); 39f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(Infinity, Math.abs(Infinity)); 40f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(Infinity, Math.abs(-Infinity)); 41160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org assertEquals(NaN, Math.abs(NaN)); 42160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org assertEquals(NaN, Math.abs(-NaN)); 43160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org assertEquals('Infinity', Math.abs(Number('+Infinity')).toString()); 44160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org assertEquals('Infinity', Math.abs(Number('-Infinity')).toString()); 45f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals('NaN', Math.abs(NaN).toString()); 46f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals('NaN', Math.abs(-NaN).toString()); 47f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 48f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(0.1, Math.abs(0.1)); 49f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(0.5, Math.abs(0.5)); 50f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(0.1, Math.abs(-0.1)); 51f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(0.5, Math.abs(-0.5)); 52f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(1, Math.abs(1)); 53f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(1.1, Math.abs(1.1)); 54f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(1.5, Math.abs(1.5)); 55f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(1, Math.abs(-1)); 56f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(1.1, Math.abs(-1.1)); 57f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(1.5, Math.abs(-1.5)); 58f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 59f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(Number.MIN_VALUE, Math.abs(Number.MIN_VALUE)); 60f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(Number.MIN_VALUE, Math.abs(-Number.MIN_VALUE)); 61f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(Number.MAX_VALUE, Math.abs(Number.MAX_VALUE)); 62f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(Number.MAX_VALUE, Math.abs(-Number.MAX_VALUE)); 63f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 64f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org // 2^30 is a smi boundary on arm and ia32. 65f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org var two_30 = 1 << 30; 66f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 67f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(two_30, Math.abs(two_30)); 68f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(two_30, Math.abs(-two_30)); 69f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 70f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(two_30 + 1, Math.abs(two_30 + 1)); 71f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(two_30 + 1, Math.abs(-two_30 - 1)); 72f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 73f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(two_30 - 1, Math.abs(two_30 - 1)); 74f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(two_30 - 1, Math.abs(-two_30 + 1)); 75f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 76f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org // 2^31 is a smi boundary on x64. 77f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org var two_31 = 2 * two_30; 78f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 79f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(two_31, Math.abs(two_31)); 80f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(two_31, Math.abs(-two_31)); 81f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 82f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(two_31 + 1, Math.abs(two_31 + 1)); 83f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(two_31 + 1, Math.abs(-two_31 - 1)); 84f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 85f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(two_31 - 1, Math.abs(two_31 - 1)); 86f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(two_31 - 1, Math.abs(-two_31 + 1)); 87f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 88160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org assertEquals(NaN, Math.abs("not a number")); 89160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org assertEquals(NaN, Math.abs([1, 2, 3])); 90f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(42, Math.abs({valueOf: function() { return 42; } })); 91f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org assertEquals(42, Math.abs({valueOf: function() { return -42; } })); 92f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org} 93f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 94f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 95f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org// Test in a loop to cover the custom IC and GC-related issues. 96f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.orgfor (var i = 0; i < 500; i++) { 97f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org test(); 98f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org} 9904921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org 10004921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org// Regression test for optimized version of Math.abs, see: 10104921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org// http://codereview.chromium.org/6875002. 10204921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.orgfunction foo(x) { 10304921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org return Math.abs(x); 10404921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org} 10504921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org// Get some smi type feedback. 10604921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.orgfor(var i = 0; i < 1000; i++) { 10704921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org foo(-i); 10804921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org} 10904921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.orgassertEquals(42, foo(-42)); 11004921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org%OptimizeFunctionOnNextCall(foo) 11104921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.orgassertEquals(42, foo(-42)); 112594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 113594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// Regression test for SMI input of Math.abs on X64, see: 114594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// https://codereview.chromium.org/21180004/ 115594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgvar a = [-1, -2]; 116594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgfunction foo2() { 117594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return Math.abs(a[0]); 118594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org} 119594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgassertEquals(1, foo2()); 120594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgassertEquals(1, foo2()); 121594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org%OptimizeFunctionOnNextCall(foo2); 122594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgassertEquals(1, foo2()); 123