1528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
2528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// Redistribution and use in source and binary forms, with or without
3528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// modification, are permitted provided that the following conditions are
4528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// met:
5528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org//
6528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org//     * Redistributions of source code must retain the above copyright
7528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org//       notice, this list of conditions and the following disclaimer.
8528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org//     * Redistributions in binary form must reproduce the above
9528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org//       copyright notice, this list of conditions and the following
10528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org//       disclaimer in the documentation and/or other materials provided
11528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org//       with the distribution.
12528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org//     * Neither the name of Google Inc. nor the names of its
13528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org//       contributors may be used to endorse or promote products derived
14528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org//       from this software without specific prior written permission.
15528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org//
16528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
28528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// Flags: --allow-natives-syntax --noenable-sse2
29528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
30528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// general tests
31528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgvar e31 = Math.pow(2, 31);
32528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
33528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(-e31, -1*e31);
34528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(e31, -1*e31*(-1));
35528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(e31, -1*-e31);
36528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(e31, -e31*(-1));
37528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
38528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgvar x = {toString : function() {return 1}}
39528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgfunction add(a,b){return a+b;}
40528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgadd(1,x);
41528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgadd(1,x);
42528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org%OptimizeFunctionOnNextCall(add);
43528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgadd(1,x);
44528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgx.toString = function() {return "2"};
45528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
46528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(add(1,x), "12");
47528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
48528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// Test the correct placement of the simulates in TruncateToNumber:
49528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgfunction Checker() {
50528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  this.str = "1";
51528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  var toStringCalled = 0;
52528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  var toStringExpected = 0;
53528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  this.toString = function() {
54528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    toStringCalled++;
55528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return this.str;
56528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  };
57528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  this.check = function() {
58528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    toStringExpected++;
59528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    assertEquals(toStringExpected, toStringCalled);
60528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  };
61528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org};
62528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgvar left = new Checker();
63528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgvar right = new Checker();
64528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
65528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgfunction test(fun,check_fun,a,b,does_throw) {
66528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  left.str = a;
67528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  right.str = b;
68528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  try {
69528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    assertEquals(check_fun(a,b), fun(left, right));
70528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    assertTrue(!does_throw);
71528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  } catch(e) {
72528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    if (e instanceof TypeError) {
73528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      assertTrue(!!does_throw);
74528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    } else {
75528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      throw e;
76528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    }
77528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  } finally {
78528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    left.check();
79528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    if (!does_throw || does_throw>1) {
80528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      right.check();
81528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    }
82528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  }
83528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org}
84528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
85528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgfunction minus(a,b) { return a-b };
86528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgfunction check_minus(a,b) { return a-b };
87528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgfunction mod(a,b) { return a%b };
88528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgfunction check_mod(a,b) { return a%b };
89528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
90528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(minus,check_minus,1,2);
91528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// Bailout on left
92528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(minus,check_minus,1<<30,1);
93528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// Bailout on right
94528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(minus,check_minus,1,1<<30);
95528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// Bailout on result
96528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(minus,check_minus,1<<30,-(1<<30));
97528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
98528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// Some more interesting things
99528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(minus,check_minus,1,1.4);
100528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(minus,check_minus,1.3,4);
101528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(minus,check_minus,1.3,1.4);
102528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(minus,check_minus,1,2);
103528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(minus,check_minus,1,undefined);
104528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(minus,check_minus,1,2);
105528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(minus,check_minus,1,true);
106528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(minus,check_minus,1,2);
107528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(minus,check_minus,1,null);
108528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(minus,check_minus,1,2);
109528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(minus,check_minus,1,"");
110528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(minus,check_minus,1,2);
111528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
112528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// Throw on left
113528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(minus,check_minus,{},1,1);
114528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// Throw on right
115528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(minus,check_minus,1,{},2);
116528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// Throw both
117528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(minus,check_minus,{},{},1);
118528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
119528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(minus,check_minus,1,2);
120528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
121528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// Now with optimized code
122528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(mod,check_mod,1,2);
123528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org%OptimizeFunctionOnNextCall(mod);
124528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(mod,check_mod,1,2);
125528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
126528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(mod,check_mod,1<<30,1);
127528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org%OptimizeFunctionOnNextCall(mod);
128528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(mod,check_mod,1<<30,1);
129528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(mod,check_mod,1,1<<30);
130528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org%OptimizeFunctionOnNextCall(mod);
131528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(mod,check_mod,1,1<<30);
132528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(mod,check_mod,1<<30,-(1<<30));
133528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org%OptimizeFunctionOnNextCall(mod);
134528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(mod,check_mod,1<<30,-(1<<30));
135528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
136528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(mod,check_mod,1,{},2);
137528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org%OptimizeFunctionOnNextCall(mod);
138528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(mod,check_mod,1,{},2);
139528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
140528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgtest(mod,check_mod,1,2);
141528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
142528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
143528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// test oddballs
144528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgfunction t1(a, b) {return a-b}
145528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(t1(1,2), 1-2);
146528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(t1(2,true), 2-1);
147528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(t1(false,2), 0-2);
148528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(t1(1,2.4), 1-2.4);
149528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(t1(1.3,2.4), 1.3-2.4);
150528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(t1(true,2.4), 1-2.4);
151528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(t1(1,undefined), 1-NaN);
152528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(t1(1,1<<30), 1-(1<<30));
153528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(t1(1,2), 1-2);
154528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
155528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgfunction t2(a, b) {return a/b}
156528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(t2(1,2), 1/2);
157528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(t2(null,2), 0/2);
158528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(t2(null,-2), 0/-2);
159528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(t2(2,null), 2/0);
160528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(t2(-2,null), -2/0);
161528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(t2(1,2.4), 1/2.4);
162528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(t2(1.3,2.4), 1.3/2.4);
163528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(t2(null,2.4), 0/2.4);
164528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(t2(1.3,null), 1.3/0);
165528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(t2(undefined,2), NaN/2);
166528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(t2(1,1<<30), 1/(1<<30));
167528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgassertEquals(t2(1,2), 1/2);
168