|  | // 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. | 
|  | // Test division by power of two. | 
|  | // Test that results before and after optimization are the same. | 
|  | // VMOptions=--optimization-counter-threshold=10 --no-use-osr | 
|  |  | 
|  | import "package:expect/expect.dart"; | 
|  |  | 
|  | // [function, [list of tuples argument/result]]. | 
|  | var expectedResults = [ | 
|  | [ | 
|  | divBy1, | 
|  | [ | 
|  | [134217730, 134217730], | 
|  | [-134217730, -134217730], | 
|  | [10, 10], | 
|  | [-10, -10] | 
|  | ] | 
|  | ], | 
|  | [ | 
|  | divByNeg1, | 
|  | [ | 
|  | [134217730, -134217730], | 
|  | [-134217730, 134217730], | 
|  | [10, -10], | 
|  | [-10, 10] | 
|  | ] | 
|  | ], | 
|  | [ | 
|  | divBy2, | 
|  | [ | 
|  | [134217730, 67108865], | 
|  | [-134217730, -67108865], | 
|  | [10, 5], | 
|  | [-10, -5] | 
|  | ] | 
|  | ], | 
|  | [ | 
|  | divByNeg2, | 
|  | [ | 
|  | [134217730, -67108865], | 
|  | [-134217730, 67108865], | 
|  | [10, -5], | 
|  | [-10, 5] | 
|  | ] | 
|  | ], | 
|  | [ | 
|  | divBy4, | 
|  | [ | 
|  | [134217730, 33554432], | 
|  | [-134217730, -33554432], | 
|  | [10, 2], | 
|  | [-10, -2] | 
|  | ] | 
|  | ], | 
|  | [ | 
|  | divByNeg4, | 
|  | [ | 
|  | [134217730, -33554432], | 
|  | [-134217730, 33554432], | 
|  | [10, -2], | 
|  | [-10, 2] | 
|  | ] | 
|  | ], | 
|  | [ | 
|  | divBy134217728, | 
|  | [ | 
|  | [134217730, 1], | 
|  | [-134217730, -1], | 
|  | [10, 0], | 
|  | [-10, 0] | 
|  | ] | 
|  | ], | 
|  | [ | 
|  | divByNeg134217728, | 
|  | [ | 
|  | [134217730, -1], | 
|  | [-134217730, 1], | 
|  | [10, 0], | 
|  | [-10, 0] | 
|  | ] | 
|  | ], | 
|  | // Use different functions for 64 bit arguments. | 
|  | [ | 
|  | divBy4_, | 
|  | [ | 
|  | [549755813990, 137438953497], | 
|  | [-549755813990, -137438953497], | 
|  | [288230925907525632, 72057731476881408], | 
|  | [-288230925907525632, -72057731476881408] | 
|  | ] | 
|  | ], | 
|  | [ | 
|  | divByNeg4_, | 
|  | [ | 
|  | [549755813990, -137438953497], | 
|  | [-549755813990, 137438953497], | 
|  | [288230925907525632, -72057731476881408], | 
|  | [-288230925907525632, 72057731476881408] | 
|  | ] | 
|  | ], | 
|  | [ | 
|  | divBy549755813888, | 
|  | [ | 
|  | [549755813990, 1], | 
|  | [-549755813990, -1], | 
|  | [288230925907525632, 524289], | 
|  | [-288230925907525632, -524289] | 
|  | ] | 
|  | ], | 
|  | [ | 
|  | divByNeg549755813888, | 
|  | [ | 
|  | [549755813990, -1], | 
|  | [-549755813990, 1], | 
|  | [288230925907525632, -524289], | 
|  | [-288230925907525632, 524289] | 
|  | ] | 
|  | ], | 
|  | ]; | 
|  |  | 
|  | divBy0(a) => a ~/ 0; | 
|  | divBy1(a) => a ~/ 1; | 
|  | divByNeg1(a) => a ~/ -1; | 
|  | divBy2(a) => a ~/ 2; | 
|  | divByNeg2(a) => a ~/ -2; | 
|  | divBy4(a) => a ~/ 4; | 
|  | divByNeg4(a) => a ~/ -4; | 
|  | divBy134217728(a) => a ~/ 134217728; | 
|  | divByNeg134217728(a) => a ~/ -134217728; | 
|  |  | 
|  | divBy4_(a) => a ~/ 4; | 
|  | divByNeg4_(a) => a ~/ -4; | 
|  | divBy549755813888(a) => a ~/ 549755813888; | 
|  | divByNeg549755813888(a) => a ~/ -549755813888; | 
|  |  | 
|  | main() { | 
|  | for (int i = 0; i < 20; i++) { | 
|  | for (var e in expectedResults) { | 
|  | Function f = e[0]; | 
|  | List values = e[1]; | 
|  | for (var v in values) { | 
|  | int arg = v[0]; | 
|  | int res = v[1]; | 
|  | Expect.equals(res, f(arg)); | 
|  | } | 
|  | } | 
|  | Expect.throws(() => divBy0(4), | 
|  | (e) => e is IntegerDivisionByZeroException || e is UnsupportedError); | 
|  | } | 
|  | } |