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 main(String[] args) {
20bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    remInt();
21bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    remLong();
22bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  }
23bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
24bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  private static void remInt() {
25bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(2, $opt$RemConst(6));
26bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(2, $opt$Rem(6, 4));
27bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(2, $opt$Rem(6, -4));
28bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(6, 3));
29bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(6, -3));
30bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(6, 1));
31bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(6, -1));
32bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(-1, $opt$Rem(-7, 3));
33bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(-1, $opt$Rem(-7, -3));
34bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(6, 6));
35bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(-6, -6));
36bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(7, $opt$Rem(7, 9));
37bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(7, $opt$Rem(7, -9));
38bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(-7, $opt$Rem(-7, 9));
39bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(-7, $opt$Rem(-7, -9));
40bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
41bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(Integer.MAX_VALUE, 1));
42bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(Integer.MAX_VALUE, -1));
43bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(Integer.MIN_VALUE, 1));
44bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(Integer.MIN_VALUE, -1)); // no overflow
45bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(-1, $opt$Rem(Integer.MIN_VALUE, Integer.MAX_VALUE));
46bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(Integer.MAX_VALUE, $opt$Rem(Integer.MAX_VALUE, Integer.MIN_VALUE));
47bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
48bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(0, 7));
49bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(0, Integer.MAX_VALUE));
50bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0, $opt$Rem(0, Integer.MIN_VALUE));
51bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
52bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectDivisionByZero(0);
53bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectDivisionByZero(1);
54bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectDivisionByZero(5);
55bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectDivisionByZero(Integer.MAX_VALUE);
56bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectDivisionByZero(Integer.MIN_VALUE);
57bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  }
58bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
59bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  private static void remLong() {
60bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(2L, $opt$RemConst(6L));
61bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(2L, $opt$Rem(6L, 4L));
62bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(2L, $opt$Rem(6L, -4L));
63bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0L, $opt$Rem(6L, 3L));
64bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0L, $opt$Rem(6L, -3L));
65bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0L, $opt$Rem(6L, 1L));
66bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0L, $opt$Rem(6L, -1L));
67bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(-1L, $opt$Rem(-7L, 3L));
68bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(-1L, $opt$Rem(-7L, -3L));
69bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0L, $opt$Rem(6L, 6L));
70bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0L, $opt$Rem(-6L, -6L));
71bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(7L, $opt$Rem(7L, 9L));
72bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(7L, $opt$Rem(7L, -9L));
73bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(-7L, $opt$Rem(-7L, 9L));
74bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(-7L, $opt$Rem(-7L, -9L));
75bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
76d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    expectEquals(0L, $opt$Rem(Long.MAX_VALUE, 1L));
77d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    expectEquals(0L, $opt$Rem(Long.MAX_VALUE, -1L));
78d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    expectEquals(0L, $opt$Rem(Long.MIN_VALUE, 1L));
79d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    expectEquals(0L, $opt$Rem(Long.MIN_VALUE, -1L)); // no overflow
80d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    expectEquals(-1L, $opt$Rem(Long.MIN_VALUE, Long.MAX_VALUE));
81d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    expectEquals(Long.MAX_VALUE, $opt$Rem(Long.MAX_VALUE, Long.MIN_VALUE));
82bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
83bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectEquals(0L, $opt$Rem(0L, 7L));
84d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    expectEquals(0L, $opt$Rem(0L, Long.MAX_VALUE));
85d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    expectEquals(0L, $opt$Rem(0L, Long.MIN_VALUE));
86bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
87bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectDivisionByZero(0L);
88bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectDivisionByZero(1L);
89bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    expectDivisionByZero(5L);
90d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    expectDivisionByZero(Long.MAX_VALUE);
91d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    expectDivisionByZero(Long.MIN_VALUE);
92bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  }
93bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
94bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  static int $opt$Rem(int a, int b) {
95bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    return a % b;
96bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  }
97bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
98bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  static int $opt$RemZero(int a) {
99bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    return a % 0;
100bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  }
101bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
102bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  // Modulo by literals != 0 should not generate checks.
103bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  static int $opt$RemConst(int a) {
104bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    return a % 4;
105bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  }
106bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
107bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  static long $opt$RemConst(long a) {
108bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    return a % 4L;
109bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  }
110bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
111bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  static long $opt$Rem(long a, long b) {
112bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    return a % b;
113bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  }
114bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle
115bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  static long $opt$RemZero(long a) {
116bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle    return a % 0L;
117bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle  }
118d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle
119d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle  public static void expectEquals(int expected, int result) {
120d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    if (expected != result) {
121d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle      throw new Error("Expected: " + expected + ", found: " + result);
122d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    }
123d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle  }
124d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle
125d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle  public static void expectEquals(long expected, long result) {
126d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    if (expected != result) {
127d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle      throw new Error("Expected: " + expected + ", found: " + result);
128d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    }
129d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle  }
130d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle
131d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle  public static void expectDivisionByZero(int value) {
132d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    try {
133d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle      $opt$Rem(value, 0);
134d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle      throw new Error("Expected RuntimeException when modulo by 0");
135d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    } catch (java.lang.RuntimeException e) {
136d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    }
137d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    try {
138d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle      $opt$RemZero(value);
139d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle      throw new Error("Expected RuntimeException when modulo by 0");
140d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    } catch (java.lang.RuntimeException e) {
141d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    }
142d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle  }
143d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle
144d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle  public static void expectDivisionByZero(long value) {
145d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    try {
146d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle      $opt$Rem(value, 0L);
147d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle      throw new Error("Expected RuntimeException when modulo by 0");
148d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    } catch (java.lang.RuntimeException e) {
149d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    }
150d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    try {
151d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle      $opt$RemZero(value);
152d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle      throw new Error("Expected RuntimeException when modulo by 0");
153d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    } catch (java.lang.RuntimeException e) {
154d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle    }
155d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle  }
156d2ec87d84057174d4884ee16f652cbcfd31362e9Calin Juravle
157bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle}
158