| // 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=--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(); |
| } |
| } |