xref: /aosp_15_r20/art/test/411-optimizing-arith/src/NegTest.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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