// Copyright (c) 2015, 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. library bitops2_test; import 'dart:async'; import 'package:expect/async_helper.dart'; import '../helpers/compiler_helper.dart'; const COMMON = r""" int g1 = 0, g2 = 0; int sink1 = 0, sink2 = 0; main() { for (int i = 0; i < 0x100000000; i = i + (i >> 4) + 1) { g1 = g2 = i; sink1 = callFoo(i, 1 - i, i); sink2 = callFoo(2 - i, i, 3 - i); } } """; const String TEST1 = r""" int foo(int param) { return (param & 0xFF0000) >> 16; // Shift mask reduction. // present: 'return param >>> 16 & 255;' // absent: 'FF0000' // absent: '16711680' } """; const String TEST2 = r""" int foo(int param) { param &= 0xFFFFFFFF; if (param == 0) return -1; return param << 0; // Shift-by-zero reduction. // present: 'return param;' } """; const String TEST3 = r""" int foo(int param) { param &= 0xFFFFFFFF; if (param == 0) return -1; return ((param >> 8) & 7) << 8; // Shift-mask-unshift reduction. // present: 'return param & 1792;' } """; const String TEST4 = r""" foo(int color) { int alpha = 100; int red = (color & 0xFF0000) >> 16; int green = (color & 0xFF00) >> 8; int blue = (color & 0xFF) >> 0; return (alpha & 255) << 24 | (red & 255) << 16 | (green & 255) << 8 | (blue & 255) << 0; // present: 'color & 16777215 | 1677721600' // absent: '<<' // absent: '>>' } """; main() { runTests() async { Future check(String test) { String program = COMMON + '\n\n' + test; if (!test.contains('callFoo')) { program += 'int callFoo(int a, int b, int c) => foo(a);\n'; } return compile( program, entry: 'main', methodName: 'foo', disableTypeInference: false, check: checkerForAbsentPresent(test), ); } await check(TEST1); await check(TEST2); await check(TEST3); await check(TEST4); } asyncTest(() async { print('--test from kernel------------------------------------------------'); await runTests(); }); }