// 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=--optimization-counter-threshold=10 --no-background-compilation
// VMOptions=--optimization-counter-threshold=10 --no-background-compilation --use_slow_path

// Test for special cases of << and >> integer operations with int64.

import "package:expect/expect.dart";

// int64 value, does not fit to smi
int v1 = 0x778899aabbccddee;
int v2 = 0x6000000000000000;
int v3 = -0x778899aabbccddee;
int negativeInt64 = -0x7000000000000000;
int smi = 128;
int negativeSmi = -3;

int shl(int a, int b) => a << b;
int shr(int a, int b) => a >> b;

int shlUint32(int a, int b) => ((a & 0xffff) << b) & 0xffff;
int shrUint32(int a, int b) => (a & 0xffff) >> b;

int testInt64ShlByNegative1(int a, int b) {
  int x = a + 1;
  int y = a - 2;
  try {
    x = a << b;
    Expect.fail('Shift by negative count should throw an error');
  } on ArgumentError {
    Expect.equals(0x778899aabbccddef, x);
    Expect.equals(0x778899aabbccddec, y);
  }
}

int testInt64ShlByNegative2(int a, int b) {
  int x = a + 1;
  int y = a - 2;
  try {
    x = shl(a, b);
    Expect.fail('Shift by negative count should throw an error');
  } on ArgumentError {
    Expect.equals(0x778899aabbccddef, x);
    Expect.equals(0x778899aabbccddec, y);
  }
}

int testInt64ShlByNegative3(int a) {
  int x = a + 1;
  int y = a - 2;
  try {
    int i = -64;
    x = a << i;
    Expect.fail('Shift by negative count should throw an error');
  } on ArgumentError {
    Expect.equals(0x778899aabbccddef, x);
    Expect.equals(0x778899aabbccddec, y);
  }
}

int testInt64ShrByNegative1(int a, int b) {
  int x = a + 1;
  int y = a - 2;
  try {
    x = a >> b;
    Expect.fail('Shift by negative count should throw an error');
  } on ArgumentError {
    Expect.equals(0x778899aabbccddef, x);
    Expect.equals(0x778899aabbccddec, y);
  }
}

int testInt64ShrByNegative2(int a, int b) {
  int x = a + 1;
  int y = a - 2;
  try {
    x = shr(a, b);
    Expect.fail('Shift by negative count should throw an error');
  } on ArgumentError {
    Expect.equals(0x778899aabbccddef, x);
    Expect.equals(0x778899aabbccddec, y);
  }
}

int testInt64ShrByNegative3(int a) {
  int x = a + 1;
  int y = a - 2;
  try {
    int i = -64;
    x = a >> i;
    Expect.fail('Shift by negative count should throw an error');
  } on ArgumentError {
    Expect.equals(0x778899aabbccddef, x);
    Expect.equals(0x778899aabbccddec, y);
  }
}

int testInt64ShlByLarge1(int a, int b) {
  int x = a << b;
  Expect.equals(0, x);
}

int testInt64ShlByLarge2(int a) {
  int i = 64;
  int x = a << i;
  Expect.equals(0, x);
}

int testInt64ShlByLarge3(int a) {
  int i = 0x7fffffffffffffff;
  int x = a << i;
  Expect.equals(0, x);
}

int testInt64ShrByLarge1a(int a, int b) {
  int x = a >> b;
  Expect.equals(0, x);
}

int testInt64ShrByLarge1b(int a, int b) {
  int x = a >> b;
  Expect.equals(-1, x);
}

int testInt64ShrByLarge2a(int a) {
  int i = 64;
  int x = a >> i;
  Expect.equals(0, x);
}

int testInt64ShrByLarge2b(int a) {
  int i = 64;
  int x = a >> i;
  Expect.equals(-1, x);
}

int testInt64ShrByLarge3a(int a) {
  int i = 0x7fffffffffffffff;
  int x = a >> i;
  Expect.equals(0, x);
}

int testInt64ShrByLarge3b(int a) {
  int i = 0x7fffffffffffffff;
  int x = a >> i;
  Expect.equals(-1, x);
}

int testUint32ShlByNegative1(int a, int b) {
  int x = (a & 0xfff) + 1;
  int y = (a & 0xfff) - 2;
  try {
    x = ((a & 0xffff) << b) & 0xffff;
    Expect.fail('Shift by negative count should throw an error');
  } on ArgumentError {
    Expect.equals(0xdef, x);
    Expect.equals(0xdec, y);
  }
  return x;
}

int testUint32ShlByNegative2(int a, int b) {
  int x = (a & 0xfff) + 1;
  int y = (a & 0xfff) - 2;
  try {
    x = shlUint32(a, b);
    Expect.fail('Shift by negative count should throw an error');
  } on ArgumentError {
    Expect.equals(0xdef, x);
    Expect.equals(0xdec, y);
  }
}

int testUint32ShlByNegative3(int a) {
  int x = (a & 0xfff) + 1;
  int y = (a & 0xfff) - 2;
  try {
    int i = -64;
    x = ((a & 0xffff) << i) & 0xffff;
    Expect.fail('Shift by negative count should throw an error');
  } on ArgumentError {
    Expect.equals(0xdef, x);
    Expect.equals(0xdec, y);
  }
}

int testUint32ShrByNegative1(int a, int b) {
  int x = (a & 0xfff) + 1;
  int y = (a & 0xfff) - 2;
  try {
    x = ((a & 0xffff) >> b) & 0xffff;
    Expect.fail('Shift by negative count should throw an error');
  } on ArgumentError {
    Expect.equals(0xdef, x);
    Expect.equals(0xdec, y);
  }
}

int testUint32ShrByNegative2(int a, int b) {
  int x = (a & 0xfff) + 1;
  int y = (a & 0xfff) - 2;
  try {
    x = shrUint32(a, b);
    Expect.fail('Shift by negative count should throw an error');
  } on ArgumentError {
    Expect.equals(0xdef, x);
    Expect.equals(0xdec, y);
  }
}

int testUint32ShrByNegative3(int a) {
  int x = (a & 0xfff) + 1;
  int y = (a & 0xfff) - 2;
  try {
    int i = -64;
    x = ((a & 0xffff) >> i) & 0xffff;
    Expect.fail('Shift by negative count should throw an error');
  } on ArgumentError {
    Expect.equals(0xdef, x);
    Expect.equals(0xdec, y);
  }
}

int testUint32ShlByLarge1(int a, int b) {
  int x = ((a & 0xffff) << b) & 0xffff;
  Expect.equals(0, x);
}

int testUint32ShlByLarge2(int a) {
  int i = 64;
  int x = ((a & 0xffff) << i) & 0xffff;
  Expect.equals(0, x);
}

int testUint32ShlByLarge3(int a) {
  int i = 0x7fffffffffffffff;
  int x = ((a & 0xffff) << i) & 0xffff;
  Expect.equals(0, x);
}

int testUint32ShrByLarge1(int a, int b) {
  int x = ((a & 0xffff) >> b) & 0xffff;
  Expect.equals(0, x);
}

int testUint32ShrByLarge2(int a) {
  int i = 64;
  int x = ((a & 0xffff) >> i) & 0xffff;
  Expect.equals(0, x);
}

int testUint32ShrByLarge3(int a) {
  int i = 0x7fffffffffffffff;
  int x = ((a & 0xffff) >> i) & 0xffff;
  Expect.equals(0, x);
}

doTests1() {
  testInt64ShlByNegative1(v1, negativeSmi);
  testInt64ShlByNegative2(v1, negativeSmi);
  testInt64ShlByNegative3(v1);

  testInt64ShrByNegative1(v1, negativeSmi);
  testInt64ShrByNegative2(v1, negativeSmi);
  testInt64ShrByNegative3(v1);

  testInt64ShlByLarge1(v1, smi);
  testInt64ShlByLarge1(v3, smi);

  testInt64ShlByLarge2(v1);
  testInt64ShlByLarge2(v3);

  testInt64ShlByLarge3(v1);
  testInt64ShlByLarge3(v3);

  testInt64ShrByLarge1a(v1, smi);
  testInt64ShrByLarge1b(v3, smi);

  testInt64ShrByLarge2a(v1);
  testInt64ShrByLarge2b(v3);

  testInt64ShrByLarge3a(v1);
  testInt64ShrByLarge3b(v3);

  testUint32ShlByNegative1(v1, negativeSmi);
  testUint32ShlByNegative2(v1, negativeSmi);
  testUint32ShlByNegative3(v1);

  testUint32ShrByNegative1(v1, negativeSmi);
  testUint32ShrByNegative2(v1, negativeSmi);
  testUint32ShrByNegative3(v1);

  testUint32ShlByLarge1(v1, smi);
  testUint32ShlByLarge1(v3, smi);

  testUint32ShlByLarge2(v1);
  testUint32ShlByLarge2(v3);

  testUint32ShlByLarge3(v1);
  testUint32ShlByLarge3(v3);

  testUint32ShrByLarge1(v1, smi);
  testUint32ShrByLarge1(v3, smi);

  testUint32ShrByLarge2(v1);
  testUint32ShrByLarge2(v3);

  testUint32ShrByLarge3(v1);
  testUint32ShrByLarge3(v3);
}

doTests2() {
  testInt64ShlByNegative1(v1, negativeInt64);
  testInt64ShlByNegative2(v1, negativeInt64);

  testInt64ShrByNegative1(v1, negativeInt64);
  testInt64ShrByNegative2(v1, negativeInt64);

  testInt64ShlByLarge1(v1, v2);
  testInt64ShlByLarge1(v3, v2);

  testInt64ShrByLarge1a(v1, v2);
  testInt64ShrByLarge1b(v3, v2);

  testUint32ShlByNegative1(v1, negativeInt64);
  testUint32ShlByNegative2(v1, negativeInt64);

  testUint32ShrByNegative1(v1, negativeInt64);
  testUint32ShrByNegative2(v1, negativeInt64);

  testUint32ShlByLarge1(v1, v2);
  testUint32ShlByLarge1(v3, v2);

  testUint32ShrByLarge1(v1, v2);
  testUint32ShrByLarge1(v3, v2);
}

main() {
  for (var i = 0; i < 20; ++i) {
    doTests1();
  }
  for (var i = 0; i < 50; ++i) {
    doTests2();
  }
}
