Main.java revision d2ec87d84057174d4884ee16f652cbcfd31362e9
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