1// Copyright 2013 the V8 project authors. All rights reserved. 2// Redistribution and use in source and binary forms, with or without 3// modification, are permitted provided that the following conditions are 4// met: 5// 6// * Redistributions of source code must retain the above copyright 7// notice, this list of conditions and the following disclaimer. 8// * Redistributions in binary form must reproduce the above 9// copyright notice, this list of conditions and the following 10// disclaimer in the documentation and/or other materials provided 11// with the distribution. 12// * Neither the name of Google Inc. nor the names of its 13// contributors may be used to endorse or promote products derived 14// from this software without specific prior written permission. 15// 16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 28 29// Flags: --nodead-code-elimination --fold-constants --allow-natives-syntax --nostress-opt 30 31function test(f) { 32 f(); 33 f(); 34 %OptimizeFunctionOnNextCall(f); 35 f(); 36 // Assert that there has been no deopt. 37 assertOptimized(f); 38} 39 40test(function add() { 41 assertEquals(2, 1 + 1); 42 assertEquals(2.5, 1.25 + 1.25); 43 assertEquals("Infinity", String(Infinity + Infinity)); 44 assertEquals("Infinity", String(Infinity + 3)); 45 assertEquals("NaN", String(Infinity + (-Infinity))); 46 assertEquals("NaN", String(NaN + 2)); 47 assertEquals("-Infinity", String(1 / (-0.0 + (-0.0)))); 48 assertEquals("Infinity", String(1 / (-0.0 + 0.0))); 49}); 50 51test(function inc() { 52 var a = 1; 53 var b = Infinity; 54 var c = -Infinity; 55 var d = NaN; 56 assertEquals(2, ++a); 57 assertEquals("Infinity", String(++b)); 58 assertEquals("-Infinity", String(++c)); 59 assertEquals("NaN", String(++d)); 60}); 61 62test(function dec() { 63 var a = 1; 64 var b = Infinity; 65 var c = -Infinity; 66 var d = NaN; 67 assertEquals(0, --a); 68 assertEquals("Infinity", String(--b)); 69 assertEquals("-Infinity", String(--c)); 70 assertEquals("NaN", String(--d)); 71}); 72 73test(function sub() { 74 assertEquals(0, 1 - 1); 75 assertEquals(0.5, 1.5 - 1); 76 assertEquals("Infinity", String(Infinity - (-Infinity))); 77 assertEquals("Infinity", String(Infinity - 3)); 78 assertEquals("NaN", String(Infinity - Infinity)); 79 assertEquals("NaN", String(NaN - 2)); 80 assertEquals("-Infinity", String(1 / (-0.0 - 0.0))); 81 assertEquals("Infinity", String(1 / (0.0 - 0.0))); 82}); 83 84test(function mul() { 85 assertEquals(1, 1 * 1); 86 assertEquals(2.25, 1.5 * 1.5); 87 assertEquals("Infinity", String(Infinity * Infinity)); 88 assertEquals("-Infinity", String(Infinity * (-Infinity))); 89 assertEquals("Infinity", String(Infinity * 3)); 90 assertEquals("-Infinity", String(Infinity * (-3))); 91 assertEquals("NaN", String(NaN * 3)); 92 assertEquals("-Infinity", String(1 / (-0.0 * 0.0))); 93 assertEquals("Infinity", String(1 / (0.0 * 0.0))); 94}); 95 96test(function div() { 97 assertEquals(1, 1 / 1); 98 assertEquals(1.5, 2.25 / 1.5); 99 assertEquals("NaN", String(Infinity / Infinity)); 100 assertEquals("Infinity", String(Infinity / 3)); 101 assertEquals("-Infinity", String(Infinity / (-3))); 102 assertEquals("NaN", String(NaN / 3)); 103 assertEquals("-Infinity", String(1 / (-0.0))); 104 assertEquals("Infinity", String(Infinity/0.0)); 105}); 106 107test(function mathMin() { 108 assertEquals(1, Math.min(1, 10)); 109 assertEquals(1.5, Math.min(1.5, 2.5)); 110 assertEquals(0, Math.min(Infinity, 0)); 111 assertEquals("Infinity", String(Math.min(Infinity, Infinity))); 112 assertEquals("-Infinity", String(Math.min(Infinity, -Infinity))); 113 assertEquals("NaN", String(Math.min(NaN, 1))); 114 assertEquals("Infinity", String(1 / Math.min(0.0, 0.0))); 115 assertEquals("-Infinity", String(1 / Math.min(-0.0, -0.0))); 116 assertEquals("-Infinity", String(1 / Math.min(0.0, -0.0))); 117}); 118 119test(function mathMax() { 120 assertEquals(10, Math.max(1, 10)); 121 assertEquals(2.5, Math.max(1.5, 2.5)); 122 assertEquals(Infinity, Math.max(Infinity, 0)); 123 assertEquals("-Infinity", String(Math.max(-Infinity, -Infinity))); 124 assertEquals("Infinity", String(Math.max(Infinity, -Infinity))); 125 assertEquals("NaN", String(Math.max(NaN, 1))); 126 assertEquals("Infinity", String(1 / Math.max(0.0, 0.0))); 127 assertEquals("-Infinity", String(1 / Math.max(-0.0, -0.0))); 128 assertEquals("Infinity", String(1 / Math.max(0.0, -0.0))); 129}); 130 131test(function mathExp() { 132 assertEquals(1.0, Math.exp(0.0)); 133 assertTrue(2.7 < Math.exp(1) && Math.exp(1) < 2.8); 134 assertEquals("Infinity", String(Math.exp(Infinity))); 135 assertEquals("0", String(Math.exp(-Infinity))); 136 assertEquals("NaN", String(Math.exp(NaN))); 137}); 138 139test(function mathLog() { 140 assertEquals(0.0, Math.log(1.0)); 141 assertTrue(1 < Math.log(3) && Math.log(3) < 1.5); 142 assertEquals("Infinity", String(Math.log(Infinity))); 143 assertEquals("NaN", String(Math.log(-Infinity))); 144 assertEquals("NaN", String(Math.exp(NaN))); 145}); 146 147test(function mathSqrt() { 148 assertEquals(1.0, Math.sqrt(1.0)); 149 assertEquals("NaN", String(Math.sqrt(-1.0))); 150 assertEquals("Infinity", String(Math.sqrt(Infinity))); 151 assertEquals("NaN", String(Math.sqrt(-Infinity))); 152 assertEquals("NaN", String(Math.sqrt(NaN))); 153}); 154 155test(function mathPowHalf() { 156 assertEquals(1.0, Math.pow(1.0, 0.5)); 157 assertEquals("NaN", String(Math.sqrt(-1.0))); 158 assertEquals("Infinity", String(Math.pow(Infinity, 0.5))); 159 assertEquals("NaN", String(Math.sqrt(-Infinity, 0.5))); 160 assertEquals(0, Math.pow(Infinity, -0.5)); 161 assertEquals("NaN", String(Math.sqrt(-Infinity, -0.5))); 162 assertEquals("NaN", String(Math.sqrt(NaN, 0.5))); 163}); 164 165test(function mathAbs() { 166 assertEquals(1.5, Math.abs(1.5)); 167 assertEquals(1.5, Math.abs(-1.5)); 168 assertEquals("Infinity", String(Math.abs(Infinity))); 169 assertEquals("Infinity", String(Math.abs(-Infinity))); 170 assertEquals("NaN", String(Math.abs(NaN))); 171}); 172 173test(function mathRound() { 174 assertEquals(2, Math.round(1.5)); 175 assertEquals(-1, Math.round(-1.5)); 176 assertEquals("Infinity", String(Math.round(Infinity))); 177 assertEquals("-Infinity", String(Math.round(-Infinity))); 178 assertEquals("Infinity", String(1 / Math.round(0.0))); 179 assertEquals("-Infinity", String(1 / Math.round(-0.0))); 180 assertEquals("NaN", String(Math.round(NaN))); 181 assertEquals(Math.pow(2, 52) + 1, Math.round(Math.pow(2, 52) + 1)); 182}); 183 184test(function mathFround() { 185 assertTrue(isNaN(Math.fround(NaN))); 186 assertEquals("Infinity", String(1/Math.fround(0))); 187 assertEquals("-Infinity", String(1/Math.fround(-0))); 188 assertEquals("Infinity", String(Math.fround(Infinity))); 189 assertEquals("-Infinity", String(Math.fround(-Infinity))); 190 assertEquals("Infinity", String(Math.fround(1E200))); 191 assertEquals("-Infinity", String(Math.fround(-1E200))); 192 assertEquals(3.1415927410125732, Math.fround(Math.PI)); 193}); 194 195test(function mathFloor() { 196 assertEquals(1, Math.floor(1.5)); 197 assertEquals(-2, Math.floor(-1.5)); 198 assertEquals("Infinity", String(Math.floor(Infinity))); 199 assertEquals("-Infinity", String(Math.floor(-Infinity))); 200 assertEquals("Infinity", String(1 / Math.floor(0.0))); 201 assertEquals("-Infinity", String(1 / Math.floor(-0.0))); 202 assertEquals("NaN", String(Math.floor(NaN))); 203 assertEquals(Math.pow(2, 52) + 1, Math.floor(Math.pow(2, 52) + 1)); 204}); 205 206test(function mathPow() { 207 assertEquals(2.25, Math.pow(1.5, 2)); 208 assertTrue(1.8 < Math.pow(1.5, 1.5) && Math.pow(1.5, 1.5) < 1.9); 209 assertEquals("Infinity", String(Math.pow(Infinity, 0.5))); 210 assertEquals("Infinity", String(Math.pow(-Infinity, 0.5))); 211 assertEquals(0, Math.pow(Infinity, -0.5)); 212 assertEquals(0, Math.pow(Infinity, -0.5)); 213 assertEquals("Infinity", String(Math.pow(Infinity, Infinity))); 214 assertEquals(0, Math.pow(Infinity, -Infinity)); 215 assertEquals("NaN", String(Math.pow(Infinity, NaN))); 216 assertEquals("NaN", String(Math.pow(NaN, 2))); 217}); 218 219test(function stringAdd() { 220 assertEquals("", "" + ""); 221 assertEquals("folded constant", "folded " + "constant"); 222 assertEquals("not folded constant1", "not folded constant" + 1); 223}); 224 225test(function stringLength() { 226 assertEquals(6, "abcdef".length); 227 assertEquals(0, "".length); 228 assertEquals(-5, { length: -5 }.length); 229}); 230 231test(function stringCharCodeAt() { 232 assertEquals(99, "abc".charCodeAt(2)); 233 assertEquals("NaN", String("abc".charCodeAt(-1))); 234 assertEquals("NaN", String("abc".charCodeAt(4))); 235 assertEquals(98, "abc".charCodeAt(1.1)); 236 assertEquals("NaN", String("abc".charCodeAt(4.1))); 237}); 238 239test(function stringCharAt() { 240 assertEquals("c", "abc".charAt(2)); 241 assertEquals("", "abc".charAt(-1)); 242 assertEquals("", "abc".charAt(4)); 243 assertEquals("b", "abc".charAt(1.1)); 244 assertEquals("", "abc".charAt(4.1)); 245}); 246 247 248test(function int32Mod() { 249 assertEquals(-0, -2147483648 % (-1)); 250}); 251 252test(function int32Div() { 253 assertEquals(2147483648, -2147483648 / (-1)); 254}); 255