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