// 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.

// @dart = 2.9

// 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 multiplication under
// 64-bit arithmetic wrap-around semantics.

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

int mul(int x, int y) {
  return x * y;
}

doConstants() {
  Expect.equals(0, mul(0, 0));
  Expect.equals(0, mul(0, 7));
  Expect.equals(0, mul(7, 0));
  Expect.equals(1, mul(1, 1));
  Expect.equals(7, mul(1, 7));
  Expect.equals(7, mul(7, 1));
  Expect.equals(21, mul(7, 3));
  Expect.equals(21, mul(3, 7));

  Expect.equals(21 << 32, mul(3 << 32, 7));
  Expect.equals(21 << 32, mul(3, 7 << 32));
  Expect.equals(0, mul(3 << 32, 7 << 32));

  Expect.equals(0, mul(0, maxInt32));
  Expect.equals(0, mul(maxInt32, 0));
  Expect.equals(maxInt32, mul(1, maxInt32));
  Expect.equals(maxInt32, mul(maxInt32, 1));
  Expect.equals(maxInt32 + maxInt32, mul(2, maxInt32));

  Expect.equals(0, mul(0, maxInt64));
  Expect.equals(0, mul(maxInt64, 0));
  Expect.equals(maxInt64, mul(1, maxInt64));
  Expect.equals(maxInt64, mul(maxInt64, 1));
  Expect.equals(-2, mul(2, maxInt64));

  Expect.equals(0, mul(0, minInt32));
  Expect.equals(0, mul(minInt32, 0));
  Expect.equals(minInt32, mul(1, minInt32));
  Expect.equals(minInt32, mul(minInt32, 1));
  Expect.equals(minInt32 + minInt32, mul(2, minInt32));

  Expect.equals(0, mul(0, minInt64));
  Expect.equals(0, mul(minInt64, 0));
  Expect.equals(minInt64, mul(1, minInt64));
  Expect.equals(minInt64, mul(minInt64, 1));
  Expect.equals(0, mul(2, minInt64));

  Expect.equals(4611686014132420609, mul(maxInt32, maxInt32));
  Expect.equals(-4611686016279904256, mul(maxInt32, minInt32));
  Expect.equals(9223372034707292161, mul(maxInt32, maxInt64));
  Expect.equals(minInt64, mul(maxInt32, minInt64));

  Expect.equals(-4611686016279904256, mul(minInt32, maxInt32));
  Expect.equals(4611686018427387904, mul(minInt32, minInt32));
  Expect.equals(2147483648, mul(minInt32, maxInt64));
  Expect.equals(0, mul(minInt32, minInt64));

  Expect.equals(9223372034707292161, mul(maxInt64, maxInt32));
  Expect.equals(2147483648, mul(maxInt64, minInt32));
  Expect.equals(1, mul(maxInt64, maxInt64));
  Expect.equals(minInt64, mul(maxInt64, minInt64));

  Expect.equals(minInt64, mul(minInt64, maxInt32));
  Expect.equals(0, mul(minInt64, minInt32));
  Expect.equals(minInt64, mul(minInt64, maxInt64));
  Expect.equals(0, mul(minInt64, minInt64));
}

doVars(int v) {
  int e = v;
  for (int i = 1; i < 256; i++) {
    Expect.equals(e, mul(i, v));
    Expect.equals(e, mul(v, i));
    e += v;
  }
}

main() {
  // Repeat tests to enter JIT (when applicable).
  for (int i = 0; i < 20; i++) {
    doConstants();
    doVars(1);
    doVars(maxInt32);
    doVars(minInt32);
    doVars(7 << 32);
    doVars(-(7 << 32));
    doVars(maxInt64);
    doVars(minInt64);
  }
}
