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 // Note that $opt$ is a marker for the optimizing compiler to test 18*795d594fSAndroid Build Coastguard Worker // it does compile the method. 19*795d594fSAndroid Build Coastguard Worker public class SubTest { 20*795d594fSAndroid Build Coastguard Worker expectEquals(int expected, int result)21*795d594fSAndroid Build Coastguard Worker public static void expectEquals(int expected, int result) { 22*795d594fSAndroid Build Coastguard Worker if (expected != result) { 23*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 24*795d594fSAndroid Build Coastguard Worker } 25*795d594fSAndroid Build Coastguard Worker } 26*795d594fSAndroid Build Coastguard Worker expectEquals(long expected, long result)27*795d594fSAndroid Build Coastguard Worker public static void expectEquals(long expected, long result) { 28*795d594fSAndroid Build Coastguard Worker if (expected != result) { 29*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 30*795d594fSAndroid Build Coastguard Worker } 31*795d594fSAndroid Build Coastguard Worker } 32*795d594fSAndroid Build Coastguard Worker expectEquals(float expected, float result)33*795d594fSAndroid Build Coastguard Worker public static void expectEquals(float expected, float result) { 34*795d594fSAndroid Build Coastguard Worker if (expected != result) { 35*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 36*795d594fSAndroid Build Coastguard Worker } 37*795d594fSAndroid Build Coastguard Worker } 38*795d594fSAndroid Build Coastguard Worker expectEquals(double expected, double result)39*795d594fSAndroid Build Coastguard Worker public static void expectEquals(double expected, double result) { 40*795d594fSAndroid Build Coastguard Worker if (expected != result) { 41*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 42*795d594fSAndroid Build Coastguard Worker } 43*795d594fSAndroid Build Coastguard Worker } 44*795d594fSAndroid Build Coastguard Worker expectApproxEquals(float a, float b)45*795d594fSAndroid Build Coastguard Worker public static void expectApproxEquals(float a, float b) { 46*795d594fSAndroid Build Coastguard Worker float maxDelta = 0.0001F; 47*795d594fSAndroid Build Coastguard Worker boolean aproxEquals = (a > b) ? ((a - b) < maxDelta) : ((b - a) < maxDelta); 48*795d594fSAndroid Build Coastguard Worker if (!aproxEquals) { 49*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + a + ", found: " + b + ", with delta: " + maxDelta + " " + (a - b)); 50*795d594fSAndroid Build Coastguard Worker } 51*795d594fSAndroid Build Coastguard Worker } 52*795d594fSAndroid Build Coastguard Worker expectApproxEquals(double a, double b)53*795d594fSAndroid Build Coastguard Worker public static void expectApproxEquals(double a, double b) { 54*795d594fSAndroid Build Coastguard Worker double maxDelta = 0.00001D; 55*795d594fSAndroid Build Coastguard Worker boolean aproxEquals = (a > b) ? ((a - b) < maxDelta) : ((b - a) < maxDelta); 56*795d594fSAndroid Build Coastguard Worker if (!aproxEquals) { 57*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + a + ", found: " + b + ", with delta: " + maxDelta + " " + (a - b)); 58*795d594fSAndroid Build Coastguard Worker } 59*795d594fSAndroid Build Coastguard Worker } 60*795d594fSAndroid Build Coastguard Worker expectNaN(float a)61*795d594fSAndroid Build Coastguard Worker public static void expectNaN(float a) { 62*795d594fSAndroid Build Coastguard Worker if (a == a) { 63*795d594fSAndroid Build Coastguard Worker throw new Error("Expected NaN: " + a); 64*795d594fSAndroid Build Coastguard Worker } 65*795d594fSAndroid Build Coastguard Worker } 66*795d594fSAndroid Build Coastguard Worker expectNaN(double a)67*795d594fSAndroid Build Coastguard Worker public static void expectNaN(double a) { 68*795d594fSAndroid Build Coastguard Worker if (a == a) { 69*795d594fSAndroid Build Coastguard Worker throw new Error("Expected NaN: " + a); 70*795d594fSAndroid Build Coastguard Worker } 71*795d594fSAndroid Build Coastguard Worker } 72*795d594fSAndroid Build Coastguard Worker main()73*795d594fSAndroid Build Coastguard Worker public static void main() { 74*795d594fSAndroid Build Coastguard Worker subInt(); 75*795d594fSAndroid Build Coastguard Worker subLong(); 76*795d594fSAndroid Build Coastguard Worker subFloat(); 77*795d594fSAndroid Build Coastguard Worker subDouble(); 78*795d594fSAndroid Build Coastguard Worker } 79*795d594fSAndroid Build Coastguard Worker subInt()80*795d594fSAndroid Build Coastguard Worker private static void subInt() { 81*795d594fSAndroid Build Coastguard Worker expectEquals(2, $opt$Sub(5, 3)); 82*795d594fSAndroid Build Coastguard Worker expectEquals(0, $opt$Sub(0, 0)); 83*795d594fSAndroid Build Coastguard Worker expectEquals(-3, $opt$Sub(0, 3)); 84*795d594fSAndroid Build Coastguard Worker expectEquals(3, $opt$Sub(3, 0)); 85*795d594fSAndroid Build Coastguard Worker expectEquals(4, $opt$Sub(1, -3)); 86*795d594fSAndroid Build Coastguard Worker expectEquals(-9, $opt$Sub(-12, -3)); 87*795d594fSAndroid Build Coastguard Worker expectEquals(134217724, $opt$Sub(134217729, 5)); // (2^27 + 1) - 5 88*795d594fSAndroid Build Coastguard Worker } 89*795d594fSAndroid Build Coastguard Worker subLong()90*795d594fSAndroid Build Coastguard Worker private static void subLong() { 91*795d594fSAndroid Build Coastguard Worker expectEquals(2L, $opt$Sub(5L, 3L)); 92*795d594fSAndroid Build Coastguard Worker expectEquals(0L, $opt$Sub(0L, 0L)); 93*795d594fSAndroid Build Coastguard Worker expectEquals(-3L, $opt$Sub(0L, 3L)); 94*795d594fSAndroid Build Coastguard Worker expectEquals(3L, $opt$Sub(3L, 0L)); 95*795d594fSAndroid Build Coastguard Worker expectEquals(4L, $opt$Sub(1L, -3L)); 96*795d594fSAndroid Build Coastguard Worker expectEquals(-9L, $opt$Sub(-12L, -3L)); 97*795d594fSAndroid Build Coastguard Worker expectEquals(134217724L, $opt$Sub(134217729L, 5L)); // (2^27 + 1) - 5 98*795d594fSAndroid Build Coastguard Worker expectEquals(34359738362L, $opt$Sub(34359738369L, 7L)); // (2^35 + 1) - 7 99*795d594fSAndroid Build Coastguard Worker } 100*795d594fSAndroid Build Coastguard Worker subFloat()101*795d594fSAndroid Build Coastguard Worker private static void subFloat() { 102*795d594fSAndroid Build Coastguard Worker expectApproxEquals(2F, $opt$Sub(5F, 3F)); 103*795d594fSAndroid Build Coastguard Worker expectApproxEquals(0F, $opt$Sub(0F, 0F)); 104*795d594fSAndroid Build Coastguard Worker expectApproxEquals(-3F, $opt$Sub(0F, 3F)); 105*795d594fSAndroid Build Coastguard Worker expectApproxEquals(3F, $opt$Sub(3F, 0F)); 106*795d594fSAndroid Build Coastguard Worker expectApproxEquals(4F, $opt$Sub(1F, -3F)); 107*795d594fSAndroid Build Coastguard Worker expectApproxEquals(-9F, $opt$Sub(-12F, -3F)); 108*795d594fSAndroid Build Coastguard Worker expectApproxEquals(34359738362F, $opt$Sub(34359738369F, 7F)); // (2^35 + 1) - 7 109*795d594fSAndroid Build Coastguard Worker expectApproxEquals(-0.1F, $opt$Sub(0.1F, 0.2F)); 110*795d594fSAndroid Build Coastguard Worker expectApproxEquals(0.2F, $opt$Sub(-0.5F, -0.7F)); 111*795d594fSAndroid Build Coastguard Worker 112*795d594fSAndroid Build Coastguard Worker expectNaN($opt$Sub(Float.NEGATIVE_INFINITY, Float.NEGATIVE_INFINITY)); 113*795d594fSAndroid Build Coastguard Worker expectNaN($opt$Sub(Float.POSITIVE_INFINITY, Float.POSITIVE_INFINITY)); 114*795d594fSAndroid Build Coastguard Worker expectNaN($opt$Sub(Float.NaN, 11F)); 115*795d594fSAndroid Build Coastguard Worker expectNaN($opt$Sub(Float.NaN, -11F)); 116*795d594fSAndroid Build Coastguard Worker expectNaN($opt$Sub(Float.NaN, Float.NEGATIVE_INFINITY)); 117*795d594fSAndroid Build Coastguard Worker expectNaN($opt$Sub(Float.NaN, Float.POSITIVE_INFINITY)); 118*795d594fSAndroid Build Coastguard Worker 119*795d594fSAndroid Build Coastguard Worker expectEquals(Float.NEGATIVE_INFINITY, $opt$Sub(-Float.MAX_VALUE, Float.MAX_VALUE)); 120*795d594fSAndroid Build Coastguard Worker expectEquals(Float.NEGATIVE_INFINITY, $opt$Sub(2F, Float.POSITIVE_INFINITY)); 121*795d594fSAndroid Build Coastguard Worker expectEquals(Float.POSITIVE_INFINITY, $opt$Sub(Float.MAX_VALUE, -Float.MAX_VALUE)); 122*795d594fSAndroid Build Coastguard Worker expectEquals(Float.POSITIVE_INFINITY, $opt$Sub(2F, Float.NEGATIVE_INFINITY)); 123*795d594fSAndroid Build Coastguard Worker expectEquals(Float.POSITIVE_INFINITY, $opt$Sub(Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY)); 124*795d594fSAndroid Build Coastguard Worker expectEquals(Float.NEGATIVE_INFINITY, $opt$Sub(Float.NEGATIVE_INFINITY, Float.POSITIVE_INFINITY)); 125*795d594fSAndroid Build Coastguard Worker } 126*795d594fSAndroid Build Coastguard Worker subDouble()127*795d594fSAndroid Build Coastguard Worker private static void subDouble() { 128*795d594fSAndroid Build Coastguard Worker expectApproxEquals(2D, $opt$Sub(5D, 3D)); 129*795d594fSAndroid Build Coastguard Worker expectApproxEquals(0D, $opt$Sub(0D, 0D)); 130*795d594fSAndroid Build Coastguard Worker expectApproxEquals(-3D, $opt$Sub(0D, 3D)); 131*795d594fSAndroid Build Coastguard Worker expectApproxEquals(3D, $opt$Sub(3D, 0D)); 132*795d594fSAndroid Build Coastguard Worker expectApproxEquals(4D, $opt$Sub(1D, -3D)); 133*795d594fSAndroid Build Coastguard Worker expectApproxEquals(-9D, $opt$Sub(-12D, -3D)); 134*795d594fSAndroid Build Coastguard Worker expectApproxEquals(134217724D, $opt$Sub(134217729D, 5D)); // (2^27 + 1) - 5 135*795d594fSAndroid Build Coastguard Worker expectApproxEquals(34359738362D, $opt$Sub(34359738369D, 7D)); // (2^35 + 1) - 7 136*795d594fSAndroid Build Coastguard Worker expectApproxEquals(-0.1D, $opt$Sub(0.1D, 0.2D)); 137*795d594fSAndroid Build Coastguard Worker expectApproxEquals(0.2D, $opt$Sub(-0.5D, -0.7D)); 138*795d594fSAndroid Build Coastguard Worker 139*795d594fSAndroid Build Coastguard Worker expectNaN($opt$Sub(Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY)); 140*795d594fSAndroid Build Coastguard Worker expectNaN($opt$Sub(Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY)); 141*795d594fSAndroid Build Coastguard Worker expectNaN($opt$Sub(Double.NaN, 11D)); 142*795d594fSAndroid Build Coastguard Worker expectNaN($opt$Sub(Double.NaN, -11D)); 143*795d594fSAndroid Build Coastguard Worker expectNaN($opt$Sub(Double.NaN, Double.NEGATIVE_INFINITY)); 144*795d594fSAndroid Build Coastguard Worker expectNaN($opt$Sub(Double.NaN, Double.POSITIVE_INFINITY)); 145*795d594fSAndroid Build Coastguard Worker 146*795d594fSAndroid Build Coastguard Worker expectEquals(Double.NEGATIVE_INFINITY, $opt$Sub(-Double.MAX_VALUE, Double.MAX_VALUE)); 147*795d594fSAndroid Build Coastguard Worker expectEquals(Double.NEGATIVE_INFINITY, $opt$Sub(2D, Double.POSITIVE_INFINITY)); 148*795d594fSAndroid Build Coastguard Worker expectEquals(Double.POSITIVE_INFINITY, $opt$Sub(Double.MAX_VALUE, -Double.MAX_VALUE)); 149*795d594fSAndroid Build Coastguard Worker expectEquals(Double.POSITIVE_INFINITY, $opt$Sub(2D, Double.NEGATIVE_INFINITY)); 150*795d594fSAndroid Build Coastguard Worker expectEquals(Double.POSITIVE_INFINITY, $opt$Sub(Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY)); 151*795d594fSAndroid Build Coastguard Worker expectEquals(Double.NEGATIVE_INFINITY, $opt$Sub(Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY)); 152*795d594fSAndroid Build Coastguard Worker } 153*795d594fSAndroid Build Coastguard Worker $opt$Sub(int a, int b)154*795d594fSAndroid Build Coastguard Worker static int $opt$Sub(int a, int b) { 155*795d594fSAndroid Build Coastguard Worker return a - b; 156*795d594fSAndroid Build Coastguard Worker } 157*795d594fSAndroid Build Coastguard Worker $opt$Sub(long a, long b)158*795d594fSAndroid Build Coastguard Worker static long $opt$Sub(long a, long b) { 159*795d594fSAndroid Build Coastguard Worker return a - b; 160*795d594fSAndroid Build Coastguard Worker } 161*795d594fSAndroid Build Coastguard Worker $opt$Sub(float a, float b)162*795d594fSAndroid Build Coastguard Worker static float $opt$Sub(float a, float b) { 163*795d594fSAndroid Build Coastguard Worker return a - b; 164*795d594fSAndroid Build Coastguard Worker } 165*795d594fSAndroid Build Coastguard Worker $opt$Sub(double a, double b)166*795d594fSAndroid Build Coastguard Worker static double $opt$Sub(double a, double b) { 167*795d594fSAndroid Build Coastguard Worker return a - b; 168*795d594fSAndroid Build Coastguard Worker } 169*795d594fSAndroid Build Coastguard Worker 170*795d594fSAndroid Build Coastguard Worker } 171