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