// Copyright (c) 2013, 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.
// Test division by power of two.
// Test that results before and after optimization are the same.
// VMOptions=--optimization-counter-threshold=10 --no-use-osr

// @dart = 2.9

import "package:expect/expect.dart";

// [function, [list of tuples argument/result]].
var expectedResults = [
  [
    divBy1,
    [
      [134217730, 134217730],
      [-134217730, -134217730],
      [10, 10],
      [-10, -10]
    ]
  ],
  [
    divByNeg1,
    [
      [134217730, -134217730],
      [-134217730, 134217730],
      [10, -10],
      [-10, 10]
    ]
  ],
  [
    divBy2,
    [
      [134217730, 67108865],
      [-134217730, -67108865],
      [10, 5],
      [-10, -5]
    ]
  ],
  [
    divByNeg2,
    [
      [134217730, -67108865],
      [-134217730, 67108865],
      [10, -5],
      [-10, 5]
    ]
  ],
  [
    divBy4,
    [
      [134217730, 33554432],
      [-134217730, -33554432],
      [10, 2],
      [-10, -2]
    ]
  ],
  [
    divByNeg4,
    [
      [134217730, -33554432],
      [-134217730, 33554432],
      [10, -2],
      [-10, 2]
    ]
  ],
  [
    divBy134217728,
    [
      [134217730, 1],
      [-134217730, -1],
      [10, 0],
      [-10, 0]
    ]
  ],
  [
    divByNeg134217728,
    [
      [134217730, -1],
      [-134217730, 1],
      [10, 0],
      [-10, 0]
    ]
  ],
  // Use different functions for 64 bit arguments.
  [
    divBy4_,
    [
      [549755813990, 137438953497],
      [-549755813990, -137438953497],
      [288230925907525632, 72057731476881408],
      [-288230925907525632, -72057731476881408]
    ]
  ],
  [
    divByNeg4_,
    [
      [549755813990, -137438953497],
      [-549755813990, 137438953497],
      [288230925907525632, -72057731476881408],
      [-288230925907525632, 72057731476881408]
    ]
  ],
  [
    divBy549755813888,
    [
      [549755813990, 1],
      [-549755813990, -1],
      [288230925907525632, 524289],
      [-288230925907525632, -524289]
    ]
  ],
  [
    divByNeg549755813888,
    [
      [549755813990, -1],
      [-549755813990, 1],
      [288230925907525632, -524289],
      [-288230925907525632, 524289]
    ]
  ],
];

divBy0(a) => a ~/ 0;
divBy1(a) => a ~/ 1;
divByNeg1(a) => a ~/ -1;
divBy2(a) => a ~/ 2;
divByNeg2(a) => a ~/ -2;
divBy4(a) => a ~/ 4;
divByNeg4(a) => a ~/ -4;
divBy134217728(a) => a ~/ 134217728;
divByNeg134217728(a) => a ~/ -134217728;

divBy4_(a) => a ~/ 4;
divByNeg4_(a) => a ~/ -4;
divBy549755813888(a) => a ~/ 549755813888;
divByNeg549755813888(a) => a ~/ -549755813888;

main() {
  for (int i = 0; i < 20; i++) {
    for (var e in expectedResults) {
      Function f = e[0];
      List values = e[1];
      for (var v in values) {
        int arg = v[0];
        int res = v[1];
        Expect.equals(res, f(arg));
      }
    }
  }
}
