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