|  | // 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. | 
|  | // Dart test optimization of modulo operator on Smi. | 
|  | // VMOptions=--optimization-counter-threshold=10 --no-use-osr | 
|  |  | 
|  | import "package:expect/expect.dart"; | 
|  |  | 
|  |  | 
|  | main() { | 
|  | // Prime IC cache. | 
|  | noDom(1); | 
|  | noDom(-1); | 
|  | for (int i = -30; i < 30; i++) { | 
|  | Expect.equals(i % 256, foo(i)); | 
|  | Expect.equals(i % -256, boo(i)); | 
|  | Expect.throws(() => hoo(i), (e) => e is IntegerDivisionByZeroException); | 
|  |  | 
|  | Expect.equals(i ~/ 254 + i % 254, fooTwo(i)); | 
|  | Expect.equals(i ~/ -254 + i % -254, booTwo(i)); | 
|  | Expect.throws(() => hooTwo(i), (e) => e is IntegerDivisionByZeroException); | 
|  | if (i > 0) { | 
|  | Expect.equals(i % 10, noDom(i)); | 
|  | } else { | 
|  | Expect.equals(i ~/ 10, noDom(i)); | 
|  | } | 
|  | Expect.equals((i ~/ 10) + (i % 10) + (i % 10), threeOp(i)); | 
|  | Expect.equals((i ~/ 10) + (i ~/ 12) + (i % 10) + (i % 12), fourOp(i)); | 
|  |  | 
|  | // Zero test is done outside the loop. | 
|  | if (i < 0) { | 
|  | Expect.equals(i % -i, foo2(i)); | 
|  | Expect.equals(i ~/ -i + i % -i, fooTwo2(i)); | 
|  | } else if (i > 0) { | 
|  | Expect.equals(i % i, foo2(i)); | 
|  | Expect.equals(i ~/ i + i % i, fooTwo2(i)); | 
|  | } | 
|  | } | 
|  | Expect.throws(() => foo2(0), (e) => e is IntegerDivisionByZeroException); | 
|  | Expect.throws(() => fooTwo2(0), (e) => e is IntegerDivisionByZeroException); | 
|  | } | 
|  |  | 
|  | foo(i) => i % 256;  // This will get optimized to AND instruction. | 
|  | boo(i) => i % -256; | 
|  | hoo(i) => i % 0; | 
|  |  | 
|  | fooTwo(i) => i ~/ 254 + i % 254; | 
|  | booTwo(i) => i ~/ -254 + i % -254; | 
|  | hooTwo(i) => i ~/ 0 + i % 0; | 
|  |  | 
|  | noDom(a) { | 
|  | var x; | 
|  | if (a > 0) { | 
|  | x = a % 10; | 
|  | } else { | 
|  | x = a ~/ 10; | 
|  | } | 
|  | return x; | 
|  | } | 
|  |  | 
|  | threeOp(a) { | 
|  | var x = a ~/ 10; | 
|  | var y = a % 10; | 
|  | var z = a % 10; | 
|  | return x + y + z; | 
|  | } | 
|  |  | 
|  |  | 
|  | fourOp(a) { | 
|  | var x0 = a ~/ 10; | 
|  | var x1 = a ~/ 12; | 
|  | var y0 = a % 10; | 
|  | var y1 = a % 12; | 
|  | return x0 + x1 + y0 + y1; | 
|  | } | 
|  |  | 
|  | foo2(i) { | 
|  | // Make sure x has a range computed. | 
|  | var x = 0; | 
|  | if (i < 0) { | 
|  | x = -i; | 
|  | } else { | 
|  | x = i; | 
|  | } | 
|  | return i % x; | 
|  | } | 
|  |  | 
|  |  | 
|  | fooTwo2(i) { | 
|  | // Make sure x has a range computed. | 
|  | var x = 0; | 
|  | if (i < 0) { | 
|  | x = -i; | 
|  | } else { | 
|  | x = i; | 
|  | } | 
|  | return i ~/ x + i % x; | 
|  | } |