1d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
2d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org// Redistribution and use in source and binary forms, with or without
3d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org// modification, are permitted provided that the following conditions are
4d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org// met:
5d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org//
6d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org//     * Redistributions of source code must retain the above copyright
7d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org//       notice, this list of conditions and the following disclaimer.
8d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org//     * Redistributions in binary form must reproduce the above
9d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org//       copyright notice, this list of conditions and the following
10d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org//       disclaimer in the documentation and/or other materials provided
11d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org//       with the distribution.
12d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org//     * Neither the name of Google Inc. nor the names of its
13d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org//       contributors may be used to endorse or promote products derived
14d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org//       from this software without specific prior written permission.
15d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org//
16d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
28d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org// Flags: --allow-natives-syntax
29d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
30d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org// Test CompareIC stubs for normal and strict equality comparison of known
31d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org// objects in hydrogen.
32d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
33d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgfunction lt(a, b) {
34d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  return a < b;
35d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org}
36d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
37d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgfunction gt(a, b) {
38d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  return a > b;
39d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org}
40d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
41d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgfunction eq(a, b) {
42d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  return a == b;
43d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org}
44d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
45d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgfunction eq_strict(a, b) {
46d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  return a === b;
47d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org}
48d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
49d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgfunction test(a, b, less, greater) {
50d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  // Check CompareIC for equality of known objects.
51d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  assertTrue(eq(a, a));
52d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  assertTrue(eq(b, b));
53d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  assertFalse(eq(a, b));
54d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  assertTrue(eq_strict(a, a));
55d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  assertTrue(eq_strict(b, b));
56d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  assertFalse(eq_strict(a, b));
57d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  assertEquals(lt(a, b), less);
58d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  assertEquals(gt(a, b), greater);
59d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  assertEquals(lt(b, a), greater);
60d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  assertEquals(gt(b, a), less);
61d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org}
62d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
63d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgvar obj1 = {toString: function() {return "1";}};
64d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgvar obj2 = {toString: function() {return "2";}};
65d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
66d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgvar less = obj1 < obj2;
67d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgvar greater = obj1 > obj2;
68d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
69d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgtest(obj1, obj2, less, greater);
70d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgtest(obj1, obj2, less, greater);
71d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgtest(obj1, obj2, less, greater);
72d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org%OptimizeFunctionOnNextCall(test);
73d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgtest(obj1, obj2, less, greater);
74d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgtest(obj1, obj2, less, greater);
75d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
76d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgobj1.x = 1;
77d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgtest(obj1, obj2, less, greater);
78d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
79d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgobj2.y = 2;
80d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgtest(obj1, obj2, less, greater);
81d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
82d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgvar obj1 = {test: 3};
83d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgvar obj2 = {test2: 3};
84d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
85d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgvar less = obj1 < obj2;
86d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgvar greater = obj1 > obj2;
87d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
88d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgtest(obj1, obj2, less, greater);
89d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgtest(obj1, obj2, less, greater);
90d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgtest(obj1, obj2, less, greater);
91d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org%OptimizeFunctionOnNextCall(test);
92d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgtest(obj1, obj2, less, greater);
93d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgtest(obj1, obj2, less, greater);
94d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
95d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgobj1.toString = function() {return "1"};
96d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgvar less = obj1 < obj2;
97d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgvar greater = obj1 > obj2;
98d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgtest(obj1, obj2, less, greater);
99d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org%OptimizeFunctionOnNextCall(test);
100d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgtest(obj1, obj2, less, greater);
101d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
102d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgobj2.toString = function() {return "2"};
103d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgvar less = true;
104d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgvar greater = false;
105d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
106d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgtest(obj1, obj2, less, greater);
107d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgobj2.y = 2;
108d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgtest(obj1, obj2, less, greater);
109