19a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
29a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org// Redistribution and use in source and binary forms, with or without
39a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org// modification, are permitted provided that the following conditions are
49a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org// met:
59a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org//
69a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org//     * Redistributions of source code must retain the above copyright
79a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org//       notice, this list of conditions and the following disclaimer.
89a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org//     * Redistributions in binary form must reproduce the above
99a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org//       copyright notice, this list of conditions and the following
109a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org//       disclaimer in the documentation and/or other materials provided
119a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org//       with the distribution.
129a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org//     * Neither the name of Google Inc. nor the names of its
139a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org//       contributors may be used to endorse or promote products derived
149a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org//       from this software without specific prior written permission.
159a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org//
169a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
179a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
189a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
199a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
209a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
219a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
229a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
239a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
249a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
259a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
269a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
279a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
289a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org// Flags: --allow-natives-syntax
299a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
309a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgfunction test_helper_for_ics(func, b1, b2, b3, b4) {
319a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  assertEquals(b1, func(.5, .5));
329a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  assertEquals(b2, func(.5, undefined));
339a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  assertEquals(b3, func(undefined, .5));
349a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  assertEquals(b4, func(undefined, undefined));
359a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org}
369a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
379a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgfunction test_helper_for_crankshaft(func, b1, b2, b3, b4) {
389a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  assertEquals(b1, func(.5, .5));
399a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  %OptimizeFunctionOnNextCall(func);
409a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  assertEquals(b1, func(.5, .5));
419a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  assertEquals(b2, func(.5, undefined));
429a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  assertEquals(b3, func(undefined, .5));
439a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  assertEquals(b4, func(undefined, undefined));
449a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org}
459a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
469a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgfunction less_1(a, b) {
479a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  return a < b;
489a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org}
499a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
509a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgtest_helper_for_ics(less_1, false, false, false, false);
519a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
529a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgfunction less_2(a, b) {
539a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  return a < b;
549a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org}
559a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
569a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgtest_helper_for_crankshaft(less_1, false, false, false, false);
579a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
589a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgfunction greater_1(a, b) {
599a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  return a > b;
609a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org}
619a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
629a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgtest_helper_for_ics(greater_1, false, false, false, false);
639a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
649a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgfunction greater_2(a, b) {
659a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  return a > b;
669a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org}
679a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
689a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgtest_helper_for_crankshaft(greater_1, false, false, false, false);
699a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
709a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgfunction less_equal_1(a, b) {
719a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  return a <= b;
729a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org}
739a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
749a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgtest_helper_for_ics(less_equal_1, true, false, false, false);
759a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
769a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgfunction less_equal_2(a, b) {
779a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  return a <= b;
789a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org}
799a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
809a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgtest_helper_for_crankshaft(less_equal_1, true, false, false, false);
819a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
829a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgfunction greater_equal_1(a, b) {
839a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  return a >= b;
849a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org}
859a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
869a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgtest_helper_for_ics(greater_equal_1, true, false, false, false);
879a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
889a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgfunction greater_equal_2(a, b) {
899a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  return a >= b;
909a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org}
919a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
929a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgtest_helper_for_crankshaft(greater_equal_1, true, false, false, false);
939a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
949a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgfunction equal_1(a, b) {
959a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  return a == b;
969a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org}
979a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
989a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgtest_helper_for_ics(equal_1, true, false, false, true);
999a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
1009a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgfunction equal_2(a, b) {
1019a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  return a == b;
1029a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org}
1039a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
1049a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgtest_helper_for_crankshaft(equal_2, true, false, false, true);
1059a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
1069a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgfunction strict_equal_1(a, b) {
1079a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  return a === b;
1089a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org}
1099a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
1109a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgtest_helper_for_ics(strict_equal_1, true, false, false, true);
1119a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
1129a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgfunction strict_equal_2(a, b) {
1139a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  return a === b;
1149a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org}
1159a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
1169a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgtest_helper_for_crankshaft(strict_equal_2, true, false, false, true);
1179a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
1189a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgfunction not_equal_1(a, b) {
1199a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  return a != b;
1209a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org}
1219a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
1229a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgtest_helper_for_ics(not_equal_1, false, true, true, false);
1239a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
1249a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgfunction not_equal_2(a, b) {
1259a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  return a != b;
1269a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org}
1279a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
1289a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgtest_helper_for_crankshaft(not_equal_2, false, true, true, false);
129