// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation

import "package:expect/expect.dart";

// Test arithmetic on 64-bit integers.

test_and_1() {
  try {  // Avoid optimizing this function.
    f(a, b) {
      var s = b;
      var t = a & s;
      return t == b;
    }
    var x = 0xffffffff;
    for (var i = 0; i < 20; i++) f(x, 0);
    Expect.equals(true, f(x, 0));
    Expect.equals(false, f(x, -1));  // Triggers deoptimization.
  } finally { }
}

test_and_2() {
  try {  // Avoid optimizing this function.
    f(a, b) {
      return a & b;
    }
    var x = 0xffffffff;
    for (var i = 0; i < 20; i++) f(x, x);
    Expect.equals(x, f(x, x));
    Expect.equals(1234, f(0xffffffff, 1234));
    Expect.equals(0x100000001, f(0x100000001,-1));
    Expect.equals(-0x40000000, f(-0x40000000, -1));
    Expect.equals(0x40000000, f(0x40000000, -1));
    Expect.equals(0x3fffffff, f(0x3fffffff, -1));
  } finally { }
}

test_xor_1() {
  try {  // Avoid optimizing this function.
    f(a, b) {
      var s = b;
      var t = a ^ s;
      return t;
    }
    var x = 0xffffffff;
    for (var i = 0; i < 20; i++) f(x, x);
    Expect.equals(0, f(x, x));
    Expect.equals(-x - 1, f(x, -1));
    var y  = 0xffffffffffffffff;
    Expect.equals(-y - 1, f(y, -1));  // Triggers deoptimization.
  } finally { }
}

test_or_1() {
  try {  // Avoid optimizing this function.
    f(a, b) {
      var s = b;
      var t = a | s;
      return t;
    }
    var x = 0xffffffff;
    for (var i = 0; i < 20; i++) f(x, x);
    Expect.equals(x, f(x, x));
    Expect.equals(-1, f(x, -1));
    var y  = 0xffffffffffffffff;
    Expect.equals(-1, f(y, -1));  // Triggers deoptimization.
  } finally { }
}

test_func(x, y) => (x & y) + 1.0;

test_mint_double_op() {
  for (var i = 0; i < 20; i++) test_func(4294967295, 1);
  Expect.equals(2.0, test_func(4294967295, 1));
}

main() {
  for (var i = 0; i < 5; i++) {
    test_and_1();
    test_and_2();
    test_xor_1();
    test_or_1();
    test_mint_double_op();
  }
}
