mirror of
https://github.com/dart-lang/sdk
synced 2024-09-05 16:41:07 +00:00
8fd6d0aafd
Committed: https://code.google.com/p/dart/source/detail?r=19755 Reverted: http://code.google.com/p/dart/source/detail?r=19756 Review URL: https://codereview.chromium.org//12212016 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@20996 260f80e4-7a28-3924-810f-c04153c831b5
78 lines
1.7 KiB
Dart
78 lines
1.7 KiB
Dart
// 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.
|
|
//
|
|
// Tests optimizing (a << b) & c if c is a Smi constant.
|
|
|
|
import "package:expect/expect.dart";
|
|
|
|
main() {
|
|
checkshiftAnd32();
|
|
checkShiftAnd64();
|
|
// Optimize shiftAnd32.
|
|
for (int i = 0; i < 10000; i++) {
|
|
A.shiftAnd32(12, 17);
|
|
A.shiftAnd64(12, 17);
|
|
Expect.equals(72, A.multipleConstantUses(3, 4));
|
|
Expect.equals(34493956096, A.multipleShiftUse(134742016, 8));
|
|
}
|
|
checkshiftAnd32();
|
|
checkShiftAnd64();
|
|
|
|
Expect.throws(() => A.shiftAnd32(12, -5));
|
|
|
|
// Check environment dependency.
|
|
final a = new A(), b = new B();
|
|
for (var i = 0; i < 10000; i++) {
|
|
Expect.equals(0, bar(a));
|
|
}
|
|
Expect.equals(4294967296, bar(b));
|
|
}
|
|
|
|
|
|
checkshiftAnd32() {
|
|
Expect.equals(1572864, A.shiftAnd32(12, 17));
|
|
Expect.equals(12, A.shiftAnd32(12, 0));
|
|
Expect.equals(285212672, A.shiftAnd32(16779392, 17));
|
|
}
|
|
|
|
|
|
checkShiftAnd64() {
|
|
Expect.equals(1125936481173504, A.shiftAnd64(4611694814806147072, 7));
|
|
}
|
|
|
|
|
|
class A {
|
|
static const int MASK_32 = (1 << 30) - 1;
|
|
static const int MASK_64 = (1 << 62) - 1;
|
|
|
|
static shiftAnd32(a, c) {
|
|
return (a << c) & MASK_32;
|
|
}
|
|
|
|
static shiftAnd64(a, c) {
|
|
return (a << c) & MASK_64;
|
|
}
|
|
|
|
static multipleConstantUses(a, c) {
|
|
var j = (a << c) & 0xFF;
|
|
var k = (a << 3) & 0xFF;
|
|
return j + k;
|
|
}
|
|
|
|
// Make sure that left shift is nor marked as truncating.
|
|
static multipleShiftUse(a, c) {
|
|
var y = (a << c);
|
|
var x = y & 0x7F;
|
|
return y + x;
|
|
}
|
|
|
|
foo(x) { return x & 0xf; }
|
|
}
|
|
|
|
class B { foo(x) { return x; } }
|
|
|
|
bar (o) {
|
|
return o.foo(1 << 32);
|
|
}
|