blob: 5825d24dda62b0ca6c637b4730534d5044e6ddd0 [file] [log] [blame]
Calin Juravle7c4954d2014-10-28 16:57:40 +00001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17// Note that $opt$ is a marker for the optimizing compiler to ensure
18// it does compile the method.
19public class Main {
20
Calin Juravled0d48522014-11-04 16:40:20 +000021 public static void expectEquals(int expected, int result) {
22 if (expected != result) {
23 throw new Error("Expected: " + expected + ", found: " + result);
24 }
25 }
26
Calin Juravle7c4954d2014-10-28 16:57:40 +000027 public static void expectEquals(float expected, float result) {
28 if (expected != result) {
29 throw new Error("Expected: " + expected + ", found: " + result);
30 }
31 }
32
33 public static void expectEquals(double expected, double result) {
34 if (expected != result) {
35 throw new Error("Expected: " + expected + ", found: " + result);
36 }
37 }
38
39 public static void expectApproxEquals(float a, float b) {
40 float maxDelta = 0.00001F;
41 boolean aproxEquals = (a > b) ? ((a - b) < maxDelta) : ((b - a) < maxDelta);
42 if (!aproxEquals) {
43 throw new Error("Expected: " + a + ", found: " + b
44 + ", with delta: " + maxDelta + " " + (a - b));
45 }
46 }
47
48 public static void expectApproxEquals(double a, double b) {
49 double maxDelta = 0.00001D;
50 boolean aproxEquals = (a > b) ? ((a - b) < maxDelta) : ((b - a) < maxDelta);
51 if (!aproxEquals) {
52 throw new Error("Expected: " + a + ", found: "
53 + b + ", with delta: " + maxDelta + " " + (a - b));
54 }
55 }
56
57 public static void expectNaN(float a) {
58 if (a == a) {
59 throw new Error("Expected NaN: " + a);
60 }
61 }
62
63 public static void expectNaN(double a) {
64 if (a == a) {
65 throw new Error("Expected NaN: " + a);
66 }
67 }
68
Calin Juravled0d48522014-11-04 16:40:20 +000069 public static void expectDivisionByZero(int value) {
70 try {
71 $opt$Div(value, 0);
72 throw new Error("Expected RuntimeException when dividing by 0");
73 } catch (java.lang.RuntimeException e) {
74 }
75 try {
76 $opt$DivZero(value);
77 throw new Error("Expected RuntimeException when dividing by 0");
78 } catch (java.lang.RuntimeException e) {
79 }
80 }
Calin Juravle7c4954d2014-10-28 16:57:40 +000081 public static void main(String[] args) {
82 div();
83 }
84
85 public static void div() {
Calin Juravled0d48522014-11-04 16:40:20 +000086 divInt();
Calin Juravle7c4954d2014-10-28 16:57:40 +000087 divFloat();
88 divDouble();
89 }
90
Calin Juravled0d48522014-11-04 16:40:20 +000091 private static void divInt() {
92 expectEquals(2, $opt$DivLit(6));
93 expectEquals(2, $opt$Div(6, 3));
94 expectEquals(6, $opt$Div(6, 1));
95 expectEquals(-2, $opt$Div(6, -3));
96 expectEquals(1, $opt$Div(4, 3));
97 expectEquals(-1, $opt$Div(4, -3));
98 expectEquals(5, $opt$Div(23, 4));
99 expectEquals(-5, $opt$Div(-23, 4));
100
101 expectEquals(-Integer.MAX_VALUE, $opt$Div(Integer.MAX_VALUE, -1));
102 expectEquals(Integer.MIN_VALUE, $opt$Div(Integer.MIN_VALUE, -1)); // overflow
103 expectEquals(-1073741824, $opt$Div(Integer.MIN_VALUE, 2));
104
105 expectEquals(0, $opt$Div(0, Integer.MAX_VALUE));
106 expectEquals(0, $opt$Div(0, Integer.MIN_VALUE));
107
108 expectDivisionByZero(0);
109 expectDivisionByZero(1);
110 expectDivisionByZero(Integer.MAX_VALUE);
111 expectDivisionByZero(Integer.MIN_VALUE);
112 }
113
Calin Juravle7c4954d2014-10-28 16:57:40 +0000114 private static void divFloat() {
115 expectApproxEquals(1.6666666F, $opt$Div(5F, 3F));
116 expectApproxEquals(0F, $opt$Div(0F, 3F));
117 expectApproxEquals(-0.3333333F, $opt$Div(1F, -3F));
118 expectApproxEquals(4F, $opt$Div(-12F, -3F));
119 expectApproxEquals(0.5, $opt$Div(0.1F, 0.2F));
120 expectApproxEquals(-2.5F, $opt$Div(-0.5F, 0.2F));
121
122 expectEquals(0F, $opt$Div(0F, Float.POSITIVE_INFINITY));
123 expectEquals(0F, $opt$Div(11F, Float.POSITIVE_INFINITY));
124 expectEquals(0F, $opt$Div(0F, Float.NEGATIVE_INFINITY));
125 expectEquals(0F, $opt$Div(11F, Float.NEGATIVE_INFINITY));
126
127 expectNaN($opt$Div(0F, 0F));
128 expectNaN($opt$Div(Float.NaN, 11F));
129 expectNaN($opt$Div(-11F, Float.NaN));
130 expectNaN($opt$Div(Float.NEGATIVE_INFINITY, Float.NEGATIVE_INFINITY));
131 expectNaN($opt$Div(Float.NEGATIVE_INFINITY, Float.POSITIVE_INFINITY));
132 expectNaN($opt$Div(Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY));
133 expectNaN($opt$Div(Float.POSITIVE_INFINITY, Float.POSITIVE_INFINITY));
134 expectNaN($opt$Div(Float.NaN, Float.NEGATIVE_INFINITY));
135 expectNaN($opt$Div(Float.POSITIVE_INFINITY, Float.NaN));
136
137 expectEquals(Float.POSITIVE_INFINITY, $opt$Div(3F, 0F));
138 expectEquals(Float.NEGATIVE_INFINITY, $opt$Div(-3F, 0F));
139 expectEquals(Float.POSITIVE_INFINITY, $opt$Div(Float.MAX_VALUE, Float.MIN_VALUE));
140 expectEquals(Float.NEGATIVE_INFINITY, $opt$Div(-Float.MAX_VALUE, Float.MIN_VALUE));
141 }
142
143 private static void divDouble() {
144 expectApproxEquals(1.6666666D, $opt$Div(5D, 3D));
145 expectApproxEquals(0D, $opt$Div(0D, 3D));
146 expectApproxEquals(-0.3333333D, $opt$Div(1D, -3D));
147 expectApproxEquals(4D, $opt$Div(-12D, -3D));
148 expectApproxEquals(0.5, $opt$Div(0.1D, 0.2D));
149 expectApproxEquals(-2.5D, $opt$Div(-0.5D, 0.2D));
150
151 expectEquals(0D, $opt$Div(0D, Float.POSITIVE_INFINITY));
152 expectEquals(0D, $opt$Div(11D, Float.POSITIVE_INFINITY));
153 expectEquals(0D, $opt$Div(0D, Float.NEGATIVE_INFINITY));
154 expectEquals(0D, $opt$Div(11D, Float.NEGATIVE_INFINITY));
155
156 expectNaN($opt$Div(0D, 0D));
157 expectNaN($opt$Div(Float.NaN, 11D));
158 expectNaN($opt$Div(-11D, Float.NaN));
159 expectNaN($opt$Div(Float.NEGATIVE_INFINITY, Float.NEGATIVE_INFINITY));
160 expectNaN($opt$Div(Float.NEGATIVE_INFINITY, Float.POSITIVE_INFINITY));
161 expectNaN($opt$Div(Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY));
162 expectNaN($opt$Div(Float.POSITIVE_INFINITY, Float.POSITIVE_INFINITY));
163 expectNaN($opt$Div(Float.NaN, Float.NEGATIVE_INFINITY));
164 expectNaN($opt$Div(Float.POSITIVE_INFINITY, Float.NaN));
165
166 expectEquals(Float.POSITIVE_INFINITY, $opt$Div(3D, 0D));
167 expectEquals(Float.NEGATIVE_INFINITY, $opt$Div(-3D, 0D));
168 expectEquals(Float.POSITIVE_INFINITY, $opt$Div(Float.MAX_VALUE, Float.MIN_VALUE));
169 expectEquals(Float.NEGATIVE_INFINITY, $opt$Div(-Float.MAX_VALUE, Float.MIN_VALUE));
170 }
171
Calin Juravled0d48522014-11-04 16:40:20 +0000172 static int $opt$Div(int a, int b) {
173 return a / b;
174 }
175
176 static int $opt$DivZero(int a) {
177 return a / 0;
178 }
179
180 // Division by literals != 0 should not generate checks.
181 static int $opt$DivLit(int a) {
182 return a / 3;
183 }
184
Calin Juravle7c4954d2014-10-28 16:57:40 +0000185 static float $opt$Div(float a, float b) {
186 return a / b;
187 }
188
189 static double $opt$Div(double a, double b) {
190 return a / b;
191 }
192}