Main.java revision bacfec30ee9f2f6fdfd190f11b105b609938efca
1bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle/*
2bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle * Copyright (C) 2014 The Android Open Source Project
3bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle *
4bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle * Licensed under the Apache License, Version 2.0 (the "License");
5bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle * you may not use this file except in compliance with the License.
6bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle * You may obtain a copy of the License at
7bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle *
8bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle *      http://www.apache.org/licenses/LICENSE-2.0
9bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle *
10bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle * Unless required by applicable law or agreed to in writing, software
11bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle * distributed under the License is distributed on an "AS IS" BASIS,
12bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle * See the License for the specific language governing permissions and
14bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle * limitations under the License.
15bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle */
16bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
17bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravlepublic class Main {
18bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
19bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  public static void expectEquals(int expected, int result) {
20bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    if (expected != result) {
21bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle      throw new Error("Expected: " + expected + ", found: " + result);
22bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    }
23bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  }
24bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
25bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  public static void expectEquals(long expected, long result) {
26bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    if (expected != result) {
27bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle      throw new Error("Expected: " + expected + ", found: " + result);
28bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    }
29bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  }
30bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
31bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  public static void expectDivisionByZero(int value) {
32bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    try {
33bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle      $opt$Rem(value, 0);
34bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle      throw new Error("Expected RuntimeException when modulo by 0");
35bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    } catch (java.lang.RuntimeException e) {
36bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    }
37bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    try {
38bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle      $opt$RemZero(value);
39bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle      throw new Error("Expected RuntimeException when modulo by 0");
40bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    } catch (java.lang.RuntimeException e) {
41bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    }
42bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  }
43bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
44bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  public static void expectDivisionByZero(long value) {
45bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    try {
46bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle      $opt$Rem(value, 0L);
47bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle      throw new Error("Expected RuntimeException when modulo by 0");
48bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    } catch (java.lang.RuntimeException e) {
49bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    }
50bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    try {
51bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle      $opt$RemZero(value);
52bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle      throw new Error("Expected RuntimeException when modulo by 0");
53bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    } catch (java.lang.RuntimeException e) {
54bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    }
55bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  }
56bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
57bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  public static void main(String[] args) {
58bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    rem();
59bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  }
60bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
61bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  public static void rem() {
62bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    remInt();
63bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    remLong();
64bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  }
65bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
66bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  private static void remInt() {
67bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(2, $opt$RemConst(6));
68bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(2, $opt$Rem(6, 4));
69bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(2, $opt$Rem(6, -4));
70bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(6, 3));
71bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(6, -3));
72bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(6, 1));
73bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(6, -1));
74bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(-1, $opt$Rem(-7, 3));
75bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(-1, $opt$Rem(-7, -3));
76bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(6, 6));
77bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(-6, -6));
78bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(7, $opt$Rem(7, 9));
79bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(7, $opt$Rem(7, -9));
80bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(-7, $opt$Rem(-7, 9));
81bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(-7, $opt$Rem(-7, -9));
82bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
83bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(Integer.MAX_VALUE, 1));
84bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(Integer.MAX_VALUE, -1));
85bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(Integer.MIN_VALUE, 1));
86bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(Integer.MIN_VALUE, -1)); // no overflow
87bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(-1, $opt$Rem(Integer.MIN_VALUE, Integer.MAX_VALUE));
88bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(Integer.MAX_VALUE, $opt$Rem(Integer.MAX_VALUE, Integer.MIN_VALUE));
89bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
90bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(0, 7));
91bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(0, Integer.MAX_VALUE));
92bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(0, Integer.MIN_VALUE));
93bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
94bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectDivisionByZero(0);
95bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectDivisionByZero(1);
96bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectDivisionByZero(5);
97bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectDivisionByZero(Integer.MAX_VALUE);
98bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectDivisionByZero(Integer.MIN_VALUE);
99bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  }
100bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
101bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  private static void remLong() {
102bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(2L, $opt$RemConst(6L));
103bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(2L, $opt$Rem(6L, 4L));
104bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(2L, $opt$Rem(6L, -4L));
105bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0L, $opt$Rem(6L, 3L));
106bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0L, $opt$Rem(6L, -3L));
107bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0L, $opt$Rem(6L, 1L));
108bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0L, $opt$Rem(6L, -1L));
109bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(-1L, $opt$Rem(-7L, 3L));
110bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(-1L, $opt$Rem(-7L, -3L));
111bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0L, $opt$Rem(6L, 6L));
112bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0L, $opt$Rem(-6L, -6L));
113bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(7L, $opt$Rem(7L, 9L));
114bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(7L, $opt$Rem(7L, -9L));
115bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(-7L, $opt$Rem(-7L, 9L));
116bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(-7L, $opt$Rem(-7L, -9L));
117bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
118bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0L, $opt$Rem(Integer.MAX_VALUE, 1L));
119bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0L, $opt$Rem(Integer.MAX_VALUE, -1L));
120bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0L, $opt$Rem(Integer.MIN_VALUE, 1L));
121bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0L, $opt$Rem(Integer.MIN_VALUE, -1L)); // no overflow
122bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(-1L, $opt$Rem(Integer.MIN_VALUE, Integer.MAX_VALUE));
123bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(Integer.MAX_VALUE, $opt$Rem(Integer.MAX_VALUE, Integer.MIN_VALUE));
124bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
125bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0L, $opt$Rem(0L, 7L));
126bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0L, $opt$Rem(0L, Integer.MAX_VALUE));
127bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0L, $opt$Rem(0L, Integer.MIN_VALUE));
128bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
129bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectDivisionByZero(0L);
130bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectDivisionByZero(1L);
131bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectDivisionByZero(5L);
132bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectDivisionByZero(Integer.MAX_VALUE);
133bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectDivisionByZero(Integer.MIN_VALUE);
134bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  }
135bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
136bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  static int $opt$Rem(int a, int b) {
137bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    return a % b;
138bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  }
139bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
140bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  static int $opt$RemZero(int a) {
141bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    return a % 0;
142bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  }
143bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
144bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  // Modulo by literals != 0 should not generate checks.
145bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  static int $opt$RemConst(int a) {
146bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    return a % 4;
147bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  }
148bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
149bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  static long $opt$RemConst(long a) {
150bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    return a % 4L;
151bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  }
152bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
153bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  static long $opt$Rem(long a, long b) {
154bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    return a % b;
155bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  }
156bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
157bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  static long $opt$RemZero(long a) {
158bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    return a % 0L;
159bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  }
160bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle}
161