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, and that $noinline$ is a marker to 19*795d594fSAndroid Build Coastguard Worker // test that it does not inline it. 20*795d594fSAndroid Build Coastguard Worker public class NegTest { 21*795d594fSAndroid Build Coastguard Worker assertEquals(int expected, int result)22*795d594fSAndroid Build Coastguard Worker public static void assertEquals(int expected, int result) { 23*795d594fSAndroid Build Coastguard Worker if (expected != result) { 24*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 25*795d594fSAndroid Build Coastguard Worker } 26*795d594fSAndroid Build Coastguard Worker } 27*795d594fSAndroid Build Coastguard Worker assertEquals(long expected, long result)28*795d594fSAndroid Build Coastguard Worker public static void assertEquals(long expected, long result) { 29*795d594fSAndroid Build Coastguard Worker if (expected != result) { 30*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 31*795d594fSAndroid Build Coastguard Worker } 32*795d594fSAndroid Build Coastguard Worker } 33*795d594fSAndroid Build Coastguard Worker assertEquals(float expected, float result)34*795d594fSAndroid Build Coastguard Worker public static void assertEquals(float expected, float result) { 35*795d594fSAndroid Build Coastguard Worker if (expected != result) { 36*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 37*795d594fSAndroid Build Coastguard Worker } 38*795d594fSAndroid Build Coastguard Worker } 39*795d594fSAndroid Build Coastguard Worker assertEquals(String expected, float result)40*795d594fSAndroid Build Coastguard Worker public static void assertEquals(String expected, float result) { 41*795d594fSAndroid Build Coastguard Worker if (!expected.equals(new Float(result).toString())) { 42*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 43*795d594fSAndroid Build Coastguard Worker } 44*795d594fSAndroid Build Coastguard Worker } 45*795d594fSAndroid Build Coastguard Worker assertEquals(double expected, double result)46*795d594fSAndroid Build Coastguard Worker public static void assertEquals(double expected, double result) { 47*795d594fSAndroid Build Coastguard Worker if (expected != result) { 48*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 49*795d594fSAndroid Build Coastguard Worker } 50*795d594fSAndroid Build Coastguard Worker } 51*795d594fSAndroid Build Coastguard Worker assertEquals(String expected, double result)52*795d594fSAndroid Build Coastguard Worker public static void assertEquals(String expected, double result) { 53*795d594fSAndroid Build Coastguard Worker if (!expected.equals(new Double(result).toString())) { 54*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 55*795d594fSAndroid Build Coastguard Worker } 56*795d594fSAndroid Build Coastguard Worker } 57*795d594fSAndroid Build Coastguard Worker assertIsNaN(float result)58*795d594fSAndroid Build Coastguard Worker public static void assertIsNaN(float result) { 59*795d594fSAndroid Build Coastguard Worker if (!Float.isNaN(result)) { 60*795d594fSAndroid Build Coastguard Worker throw new Error("Expected NaN: " + result); 61*795d594fSAndroid Build Coastguard Worker } 62*795d594fSAndroid Build Coastguard Worker } 63*795d594fSAndroid Build Coastguard Worker assertIsNaN(double result)64*795d594fSAndroid Build Coastguard Worker public static void assertIsNaN(double result) { 65*795d594fSAndroid Build Coastguard Worker if (!Double.isNaN(result)) { 66*795d594fSAndroid Build Coastguard Worker throw new Error("Expected NaN: " + result); 67*795d594fSAndroid Build Coastguard Worker } 68*795d594fSAndroid Build Coastguard Worker } 69*795d594fSAndroid Build Coastguard Worker main()70*795d594fSAndroid Build Coastguard Worker public static void main() { 71*795d594fSAndroid Build Coastguard Worker negInt(); 72*795d594fSAndroid Build Coastguard Worker $opt$noinline$InplaceNegOneInt(1); 73*795d594fSAndroid Build Coastguard Worker 74*795d594fSAndroid Build Coastguard Worker negLong(); 75*795d594fSAndroid Build Coastguard Worker $opt$noinline$InplaceNegOneLong(1L); 76*795d594fSAndroid Build Coastguard Worker 77*795d594fSAndroid Build Coastguard Worker negFloat(); 78*795d594fSAndroid Build Coastguard Worker negDouble(); 79*795d594fSAndroid Build Coastguard Worker } 80*795d594fSAndroid Build Coastguard Worker negInt()81*795d594fSAndroid Build Coastguard Worker private static void negInt() { 82*795d594fSAndroid Build Coastguard Worker assertEquals(-1, $opt$noinline$NegInt(1)); 83*795d594fSAndroid Build Coastguard Worker assertEquals(1, $opt$noinline$NegInt(-1)); 84*795d594fSAndroid Build Coastguard Worker assertEquals(0, $opt$noinline$NegInt(0)); 85*795d594fSAndroid Build Coastguard Worker assertEquals(51, $opt$noinline$NegInt(-51)); 86*795d594fSAndroid Build Coastguard Worker assertEquals(-51, $opt$noinline$NegInt(51)); 87*795d594fSAndroid Build Coastguard Worker assertEquals(2147483647, $opt$noinline$NegInt(-2147483647)); // -(2^31 - 1) 88*795d594fSAndroid Build Coastguard Worker assertEquals(-2147483647, $opt$noinline$NegInt(2147483647)); // 2^31 - 1 89*795d594fSAndroid Build Coastguard Worker // From the Java 7 SE Edition specification: 90*795d594fSAndroid Build Coastguard Worker // http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.15.4 91*795d594fSAndroid Build Coastguard Worker // 92*795d594fSAndroid Build Coastguard Worker // For integer values, negation is the same as subtraction from 93*795d594fSAndroid Build Coastguard Worker // zero. The Java programming language uses two's-complement 94*795d594fSAndroid Build Coastguard Worker // representation for integers, and the range of two's-complement 95*795d594fSAndroid Build Coastguard Worker // values is not symmetric, so negation of the maximum negative 96*795d594fSAndroid Build Coastguard Worker // int or long results in that same maximum negative number. 97*795d594fSAndroid Build Coastguard Worker // Overflow occurs in this case, but no exception is thrown. 98*795d594fSAndroid Build Coastguard Worker // For all integer values x, -x equals (~x)+1.'' 99*795d594fSAndroid Build Coastguard Worker assertEquals(-2147483648, $opt$noinline$NegInt(-2147483648)); // -(2^31) 100*795d594fSAndroid Build Coastguard Worker } 101*795d594fSAndroid Build Coastguard Worker negLong()102*795d594fSAndroid Build Coastguard Worker private static void negLong() { 103*795d594fSAndroid Build Coastguard Worker assertEquals(-1L, $opt$noinline$NegLong(1L)); 104*795d594fSAndroid Build Coastguard Worker assertEquals(1L, $opt$noinline$NegLong(-1L)); 105*795d594fSAndroid Build Coastguard Worker assertEquals(0L, $opt$noinline$NegLong(0L)); 106*795d594fSAndroid Build Coastguard Worker assertEquals(51L, $opt$noinline$NegLong(-51L)); 107*795d594fSAndroid Build Coastguard Worker assertEquals(-51L, $opt$noinline$NegLong(51L)); 108*795d594fSAndroid Build Coastguard Worker 109*795d594fSAndroid Build Coastguard Worker assertEquals(2147483647L, $opt$noinline$NegLong(-2147483647L)); // -(2^31 - 1) 110*795d594fSAndroid Build Coastguard Worker assertEquals(-2147483647L, $opt$noinline$NegLong(2147483647L)); // (2^31 - 1) 111*795d594fSAndroid Build Coastguard Worker assertEquals(2147483648L, $opt$noinline$NegLong(-2147483648L)); // -(2^31) 112*795d594fSAndroid Build Coastguard Worker assertEquals(-2147483648L, $opt$noinline$NegLong(2147483648L)); // 2^31 113*795d594fSAndroid Build Coastguard Worker 114*795d594fSAndroid Build Coastguard Worker assertEquals(9223372036854775807L, $opt$noinline$NegLong(-9223372036854775807L)); // -(2^63 - 1) 115*795d594fSAndroid Build Coastguard Worker assertEquals(-9223372036854775807L, $opt$noinline$NegLong(9223372036854775807L)); // 2^63 - 1 116*795d594fSAndroid Build Coastguard Worker // See remark regarding the negation of the maximum negative 117*795d594fSAndroid Build Coastguard Worker // (long) value in negInt(). 118*795d594fSAndroid Build Coastguard Worker assertEquals(-9223372036854775808L, $opt$noinline$NegLong(-9223372036854775808L)); // -(2^63) 119*795d594fSAndroid Build Coastguard Worker } 120*795d594fSAndroid Build Coastguard Worker negFloat()121*795d594fSAndroid Build Coastguard Worker private static void negFloat() { 122*795d594fSAndroid Build Coastguard Worker assertEquals("-0.0", $opt$noinline$NegFloat(0F)); 123*795d594fSAndroid Build Coastguard Worker assertEquals("0.0", $opt$noinline$NegFloat(-0F)); 124*795d594fSAndroid Build Coastguard Worker assertEquals(-1F, $opt$noinline$NegFloat(1F)); 125*795d594fSAndroid Build Coastguard Worker assertEquals(1F, $opt$noinline$NegFloat(-1F)); 126*795d594fSAndroid Build Coastguard Worker assertEquals(51F, $opt$noinline$NegFloat(-51F)); 127*795d594fSAndroid Build Coastguard Worker assertEquals(-51F, $opt$noinline$NegFloat(51F)); 128*795d594fSAndroid Build Coastguard Worker 129*795d594fSAndroid Build Coastguard Worker assertEquals(-0.1F, $opt$noinline$NegFloat(0.1F)); 130*795d594fSAndroid Build Coastguard Worker assertEquals(0.1F, $opt$noinline$NegFloat(-0.1F)); 131*795d594fSAndroid Build Coastguard Worker assertEquals(343597.38362F, $opt$noinline$NegFloat(-343597.38362F)); 132*795d594fSAndroid Build Coastguard Worker assertEquals(-343597.38362F, $opt$noinline$NegFloat(343597.38362F)); 133*795d594fSAndroid Build Coastguard Worker 134*795d594fSAndroid Build Coastguard Worker assertEquals(-Float.MIN_NORMAL, $opt$noinline$NegFloat(Float.MIN_NORMAL)); 135*795d594fSAndroid Build Coastguard Worker assertEquals(Float.MIN_NORMAL, $opt$noinline$NegFloat(-Float.MIN_NORMAL)); 136*795d594fSAndroid Build Coastguard Worker assertEquals(-Float.MIN_VALUE, $opt$noinline$NegFloat(Float.MIN_VALUE)); 137*795d594fSAndroid Build Coastguard Worker assertEquals(Float.MIN_VALUE, $opt$noinline$NegFloat(-Float.MIN_VALUE)); 138*795d594fSAndroid Build Coastguard Worker assertEquals(-Float.MAX_VALUE, $opt$noinline$NegFloat(Float.MAX_VALUE)); 139*795d594fSAndroid Build Coastguard Worker assertEquals(Float.MAX_VALUE, $opt$noinline$NegFloat(-Float.MAX_VALUE)); 140*795d594fSAndroid Build Coastguard Worker 141*795d594fSAndroid Build Coastguard Worker assertEquals(Float.NEGATIVE_INFINITY, $opt$noinline$NegFloat(Float.POSITIVE_INFINITY)); 142*795d594fSAndroid Build Coastguard Worker assertEquals(Float.POSITIVE_INFINITY, $opt$noinline$NegFloat(Float.NEGATIVE_INFINITY)); 143*795d594fSAndroid Build Coastguard Worker assertIsNaN($opt$noinline$NegFloat(Float.NaN)); 144*795d594fSAndroid Build Coastguard Worker } 145*795d594fSAndroid Build Coastguard Worker negDouble()146*795d594fSAndroid Build Coastguard Worker private static void negDouble() { 147*795d594fSAndroid Build Coastguard Worker assertEquals("-0.0", $opt$noinline$NegDouble(0D)); 148*795d594fSAndroid Build Coastguard Worker assertEquals("0.0", $opt$noinline$NegDouble(-0D)); 149*795d594fSAndroid Build Coastguard Worker assertEquals(-1D, $opt$noinline$NegDouble(1D)); 150*795d594fSAndroid Build Coastguard Worker assertEquals(1D, $opt$noinline$NegDouble(-1D)); 151*795d594fSAndroid Build Coastguard Worker assertEquals(51D, $opt$noinline$NegDouble(-51D)); 152*795d594fSAndroid Build Coastguard Worker assertEquals(-51D, $opt$noinline$NegDouble(51D)); 153*795d594fSAndroid Build Coastguard Worker 154*795d594fSAndroid Build Coastguard Worker assertEquals(-0.1D, $opt$noinline$NegDouble(0.1D)); 155*795d594fSAndroid Build Coastguard Worker assertEquals(0.1D, $opt$noinline$NegDouble(-0.1D)); 156*795d594fSAndroid Build Coastguard Worker assertEquals(343597.38362D, $opt$noinline$NegDouble(-343597.38362D)); 157*795d594fSAndroid Build Coastguard Worker assertEquals(-343597.38362D, $opt$noinline$NegDouble(343597.38362D)); 158*795d594fSAndroid Build Coastguard Worker 159*795d594fSAndroid Build Coastguard Worker assertEquals(-Double.MIN_NORMAL, $opt$noinline$NegDouble(Double.MIN_NORMAL)); 160*795d594fSAndroid Build Coastguard Worker assertEquals(Double.MIN_NORMAL, $opt$noinline$NegDouble(-Double.MIN_NORMAL)); 161*795d594fSAndroid Build Coastguard Worker assertEquals(-Double.MIN_VALUE, $opt$noinline$NegDouble(Double.MIN_VALUE)); 162*795d594fSAndroid Build Coastguard Worker assertEquals(Double.MIN_VALUE, $opt$noinline$NegDouble(-Double.MIN_VALUE)); 163*795d594fSAndroid Build Coastguard Worker assertEquals(-Double.MAX_VALUE, $opt$noinline$NegDouble(Double.MAX_VALUE)); 164*795d594fSAndroid Build Coastguard Worker assertEquals(Double.MAX_VALUE, $opt$noinline$NegDouble(-Double.MAX_VALUE)); 165*795d594fSAndroid Build Coastguard Worker 166*795d594fSAndroid Build Coastguard Worker assertEquals(Double.NEGATIVE_INFINITY, $opt$noinline$NegDouble(Double.POSITIVE_INFINITY)); 167*795d594fSAndroid Build Coastguard Worker assertEquals(Double.POSITIVE_INFINITY, $opt$noinline$NegDouble(Double.NEGATIVE_INFINITY)); 168*795d594fSAndroid Build Coastguard Worker assertIsNaN($opt$noinline$NegDouble(Double.NaN)); 169*795d594fSAndroid Build Coastguard Worker } 170*795d594fSAndroid Build Coastguard Worker 171*795d594fSAndroid Build Coastguard Worker $opt$noinline$InplaceNegOneInt(int a)172*795d594fSAndroid Build Coastguard Worker private static void $opt$noinline$InplaceNegOneInt(int a) { 173*795d594fSAndroid Build Coastguard Worker a = -a; 174*795d594fSAndroid Build Coastguard Worker assertEquals(-1, a); 175*795d594fSAndroid Build Coastguard Worker } 176*795d594fSAndroid Build Coastguard Worker $opt$noinline$InplaceNegOneLong(long a)177*795d594fSAndroid Build Coastguard Worker private static void $opt$noinline$InplaceNegOneLong(long a) { 178*795d594fSAndroid Build Coastguard Worker a = -a; 179*795d594fSAndroid Build Coastguard Worker assertEquals(-1L, a); 180*795d594fSAndroid Build Coastguard Worker } 181*795d594fSAndroid Build Coastguard Worker $opt$noinline$NegInt(int a)182*795d594fSAndroid Build Coastguard Worker private static int $opt$noinline$NegInt(int a){ 183*795d594fSAndroid Build Coastguard Worker return -a; 184*795d594fSAndroid Build Coastguard Worker } 185*795d594fSAndroid Build Coastguard Worker $opt$noinline$NegLong(long a)186*795d594fSAndroid Build Coastguard Worker private static long $opt$noinline$NegLong(long a){ 187*795d594fSAndroid Build Coastguard Worker return -a; 188*795d594fSAndroid Build Coastguard Worker } 189*795d594fSAndroid Build Coastguard Worker $opt$noinline$NegFloat(float a)190*795d594fSAndroid Build Coastguard Worker private static float $opt$noinline$NegFloat(float a){ 191*795d594fSAndroid Build Coastguard Worker return -a; 192*795d594fSAndroid Build Coastguard Worker } 193*795d594fSAndroid Build Coastguard Worker $opt$noinline$NegDouble(double a)194*795d594fSAndroid Build Coastguard Worker private static double $opt$noinline$NegDouble(double a){ 195*795d594fSAndroid Build Coastguard Worker return -a; 196*795d594fSAndroid Build Coastguard Worker } 197*795d594fSAndroid Build Coastguard Worker } 198