// Copyright (c) 2021, 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.

// SharedOptions=--enable-experiment=triple-shift
// VMOptions=--deterministic --optimization_counter_threshold=50
// VMOptions=--no-intrinsify

// Test int.operator>>> in case of Smi range overflow and deoptimization.

import "package:expect/expect.dart";

@pragma('vm:never-inline')
void test1(int a, int b, int expected) {
  Expect.equals(expected, a >>> b);
}

@pragma('vm:never-inline')
void test2(int a, int b, int expected) {
  Expect.equals(expected, a >>> b);
}

@pragma('vm:never-inline')
void test3(int a, int b, int expected) {
  Expect.equals(expected, a >>> b);
}

@pragma('vm:never-inline')
void test4(int a, int b, int expected) {
  Expect.equals(expected, a >>> b);
}

@pragma('vm:never-inline')
void test5(int a, int b, int expected) {
  Expect.equals(expected, a >>> b);
}

@pragma('vm:never-inline')
void test6(int a, int b, int expected) {
  Expect.equals(expected, a >>> b);
}

@pragma('vm:never-inline')
void test7(int a, int b, int expected) {
  Expect.equals(expected, a >>> b);
}

@pragma('vm:never-inline')
void test8(int a, int b, int expected) {
  Expect.equals(expected, a >>> b);
}

@pragma('vm:never-inline')
void test9(int a, int b, int expected) {
  Expect.equals(expected, a >>> b);
}

@pragma('vm:never-inline')
void test10(int a, int b, int expected) {
  Expect.equals(expected, a >>> b);
}

@pragma('vm:never-inline')
void test11(int a, int b, int expected) {
  Expect.equals(expected, a >>> b);
}

@pragma('vm:never-inline')
void test12(int a, int b, int expected) {
  Expect.equals(expected, a >>> b);
}

@pragma('vm:never-inline')
void test13(int a, int b, int expected) {
  Expect.equals(expected, a >>> b);
}

@pragma('vm:never-inline')
void test14(int a, int b, int expected) {
  Expect.equals(expected, a >>> b);
}

void testCornerCases() {
  // Make sure test methods are optimized.
  for (int i = 0; i < 100; ++i) {
    test1(1, 1, 0);
    test2(1, 1, 0);
    test3(1, 1, 0);
    test4(1, 1, 0);
    test5(1, 1, 0);
    test6(1, 1, 0);
    test7(1, 1, 0);
    test8(1, 1, 0);
    test9(1, 1, 0);
    test10(1, 1, 0);
    test11(1, 1, 0);
    test12(1, 1, 0);
    test13(1, 1, 0);
    test14(1, 1, 0);
  }
  // Run tests, may trigger deoptimization.
  for (int i = 0; i < 100; ++i) {
    test1(0xffffffffffffffff, 1, 0x7fffffffffffffff);
    test2(0xffffffffffffabcd, 1, 0x7fffffffffffd5e6);
    test3(0xffffffffffffffff, 31, 0x1ffffffff);
    test4(0xffffffffffffffff, 32, 0xffffffff);
    test5(0xfedcba9876543210, 32, 0xfedcba98);
    test6(0xffffffffffffffff, 34, 0x3fffffff);
    test7(0xffffffffffffffff, 56, 0xff);
    test8(0xfeffffffffffabcd, 56, 0xfe);
    test9(0xffffffffffffffff, 63, 0x1);
    test10(0xffffffffffffffff, 64, 0);
    test11(0xffffffffffffffff, 70, 0);
    test12(0x8000000000000000, 1, 0x4000000000000000);
    test13(0x7fedcba987654321, 1, 0x3ff6e5d4c3b2a190);
    test14(0x7fedcba987654321, 40, 0x7fedcb);
  }
}

void testSingleOneBit() {
  for (int i = 0; i <= 63; ++i) {
    final int x = 1 << i;
    for (int j = 0; j <= 127; ++j) {
      Expect.equals((j > i) ? 0 : 1 << (i - j), x >>> j);
    }
  }
}

void testSingleZeroBit() {
  for (int i = 0; i <= 63; ++i) {
    final int x = ~(1 << i);
    for (int j = 0; j <= 127; ++j) {
      if (j >= 64) {
        Expect.equals(0, x >>> j);
      } else {
        final int mask = (1 << (64 - j)) - 1;
        if (j > i) {
          Expect.equals(mask, x >>> j);
        } else {
          Expect.equals(mask & ~(1 << (i - j)), x >>> j);
        }
      }
    }
  }
}

main() {
  testCornerCases();

  for (int i = 0; i < 100; ++i) {
    testSingleOneBit();
    testSingleZeroBit();
  }
}
