// Copyright (c) 2018, 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=--no_background_compilation --optimization_counter_threshold=10
// VMOptions=--no_background_compilation --optimization_counter_threshold=10 --use_slow_path

import "package:expect/expect.dart";

// Tests for long negations under
// 64-bit arithmetic wrap-around semantics.

final int maxInt32 = 2147483647;
final int minInt32 = -2147483648;
final int maxInt64 = 0x7fffffffffffffff;
final int minInt64 = 0x8000000000000000;

int negate(int x) {
  return -x;
}

doConstant() {
  Expect.equals(1, negate(-1));
  Expect.equals(0, negate(0));
  Expect.equals(-1, negate(1));

  Expect.equals(-maxInt32, negate(maxInt32));
  Expect.equals(-minInt32, negate(minInt32));
  Expect.equals(-maxInt64, negate(maxInt64));
  Expect.equals(minInt64, negate(minInt64)); // sic!
}

doVar() {
  int d = 0;
  for (int i = -88; i < 10; i++) {
    d += negate(i);
  }
  Expect.equals(3871, d);
}

main() {
  // Repeat tests to enter JIT (when applicable).
  for (int i = 0; i < 20; i++) {
    doConstant();
    doVar();
  }
}
