|
1 /* |
|
2 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. |
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
|
4 * |
|
5 * This code is free software; you can redistribute it and/or modify it |
|
6 * under the terms of the GNU General Public License version 2 only, as |
|
7 * published by the Free Software Foundation. |
|
8 * |
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
|
13 * accompanied this code). |
|
14 * |
|
15 * You should have received a copy of the GNU General Public License version |
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
18 * |
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
20 * or visit www.oracle.com if you need additional information or have any |
|
21 * questions. |
|
22 * |
|
23 */ |
|
24 |
|
25 #include "precompiled.hpp" |
|
26 #include "memory/allocation.hpp" |
|
27 #include "utilities/globalDefinitions.hpp" |
|
28 #include "unittest.hpp" |
|
29 |
|
30 class TestJavaArithSupport : public AllStatic { |
|
31 public: |
|
32 template<typename T> struct BinOpData { T x; T y; T r; }; |
|
33 template<typename T> struct ShiftOpData { T x; jint shift; T r; }; |
|
34 }; |
|
35 |
|
36 typedef TestJavaArithSupport::BinOpData<jint> BinOpJintData; |
|
37 typedef TestJavaArithSupport::BinOpData<jlong> BinOpJlongData; |
|
38 |
|
39 typedef TestJavaArithSupport::ShiftOpData<jint> ShiftOpJintData; |
|
40 typedef TestJavaArithSupport::ShiftOpData<jlong> ShiftOpJlongData; |
|
41 |
|
42 const BinOpJintData add_jint_data[] = { |
|
43 { 0, 0, 0 }, |
|
44 { 0, 1, 1 }, |
|
45 { 0, -1, -1 }, |
|
46 { max_jint, 1, min_jint }, |
|
47 { max_jint, -1, max_jint - 1 }, |
|
48 { min_jint, 1, min_jint + 1 }, |
|
49 { min_jint, -1, max_jint }, |
|
50 { max_jint, 10, min_jint + 9 }, |
|
51 { max_jint, -10, max_jint - 10 }, |
|
52 { min_jint, 10, min_jint + 10 }, |
|
53 { min_jint, -10, max_jint - 9 }, |
|
54 { max_jint, max_jint, -2 }, |
|
55 { min_jint, min_jint, 0 } |
|
56 }; |
|
57 |
|
58 const BinOpJlongData add_jlong_data[] = { |
|
59 { 0, 0, 0 }, |
|
60 { 0, 1, 1 }, |
|
61 { 0, -1, -1 }, |
|
62 { max_jlong, 1, min_jlong }, |
|
63 { max_jlong, -1, max_jlong - 1 }, |
|
64 { min_jlong, 1, min_jlong + 1 }, |
|
65 { min_jlong, -1, max_jlong }, |
|
66 { max_jlong, 10, min_jlong + 9 }, |
|
67 { max_jlong, -10, max_jlong - 10 }, |
|
68 { min_jlong, 10, min_jlong + 10 }, |
|
69 { min_jlong, -10, max_jlong - 9 }, |
|
70 { max_jlong, max_jlong, -2 }, |
|
71 { min_jlong, min_jlong, 0 } |
|
72 }; |
|
73 |
|
74 TEST(TestJavaArithmetic, add_sub_jint) { |
|
75 const volatile BinOpJintData* data = add_jint_data; |
|
76 for (size_t i = 0; i < ARRAY_SIZE(add_jint_data); ++i) { |
|
77 ASSERT_EQ(data[i].r, java_add(data[i].x, data[i].y)); |
|
78 ASSERT_EQ(data[i].r, java_add(data[i].y, data[i].x)); |
|
79 ASSERT_EQ(data[i].x, java_subtract(data[i].r, data[i].y)); |
|
80 ASSERT_EQ(data[i].y, java_subtract(data[i].r, data[i].x)); |
|
81 } |
|
82 } |
|
83 |
|
84 TEST(TestJavaArithmetic, add_sub_jlong) { |
|
85 const volatile BinOpJlongData* data = add_jlong_data; |
|
86 for (size_t i = 0; i < ARRAY_SIZE(add_jlong_data); ++i) { |
|
87 ASSERT_EQ(data[i].r, java_add(data[i].x, data[i].y)); |
|
88 ASSERT_EQ(data[i].r, java_add(data[i].y, data[i].x)); |
|
89 ASSERT_EQ(data[i].x, java_subtract(data[i].r, data[i].y)); |
|
90 ASSERT_EQ(data[i].y, java_subtract(data[i].r, data[i].x)); |
|
91 } |
|
92 } |
|
93 |
|
94 static const BinOpJintData mul_jint_data[] = { |
|
95 { 0, 0, 0 }, |
|
96 { 0, 1, 0 }, |
|
97 { 0, max_jint, 0 }, |
|
98 { 0, min_jint, 0 }, |
|
99 { 1, 1, 1 }, |
|
100 { 1, max_jint, max_jint }, |
|
101 { 1, min_jint, min_jint }, |
|
102 { -1, 1, -1 }, |
|
103 { -1, max_jint, min_jint + 1 }, |
|
104 { 5, max_jint, max_jint - 4 }, |
|
105 { -5, max_jint, min_jint + 5 }, |
|
106 { max_jint, max_jint, 1 }, |
|
107 { max_jint, min_jint, min_jint }, |
|
108 { min_jint, min_jint, 0 } |
|
109 }; |
|
110 |
|
111 static const BinOpJlongData mul_jlong_data[] = { |
|
112 { 0, 0, 0 }, |
|
113 { 0, 1, 0 }, |
|
114 { 0, max_jlong, 0 }, |
|
115 { 0, min_jlong, 0 }, |
|
116 { 1, 1, 1 }, |
|
117 { 1, max_jlong, max_jlong }, |
|
118 { 1, min_jlong, min_jlong }, |
|
119 { -1, 1, -1 }, |
|
120 { -1, max_jlong, min_jlong + 1 }, |
|
121 { 5, max_jlong, max_jlong - 4 }, |
|
122 { -5, max_jlong, min_jlong + 5 }, |
|
123 { max_jlong, max_jlong, 1 }, |
|
124 { max_jlong, min_jlong, min_jlong }, |
|
125 { min_jlong, min_jlong, 0 } |
|
126 }; |
|
127 |
|
128 TEST(TestJavaArithmetic, mul_jint) { |
|
129 const volatile BinOpJintData* data = mul_jint_data; |
|
130 for (size_t i = 0; i < ARRAY_SIZE(mul_jint_data); ++i) { |
|
131 ASSERT_EQ(data[i].r, java_multiply(data[i].x, data[i].y)); |
|
132 ASSERT_EQ(data[i].r, java_multiply(data[i].y, data[i].x)); |
|
133 } |
|
134 } |
|
135 |
|
136 TEST(TestJavaArithmetic, mul_jlong) { |
|
137 const volatile BinOpJlongData* data = mul_jlong_data; |
|
138 for (size_t i = 0; i < ARRAY_SIZE(mul_jlong_data); ++i) { |
|
139 ASSERT_EQ(data[i].r, java_multiply(data[i].x, data[i].y)); |
|
140 ASSERT_EQ(data[i].r, java_multiply(data[i].y, data[i].x)); |
|
141 } |
|
142 } |
|
143 |
|
144 static const ShiftOpJintData asl_jint_data[] = { |
|
145 { 0, 0, 0 }, |
|
146 { 0, 10, 0 }, |
|
147 { 0, 50, 0 }, |
|
148 { 1, 0, 1 }, |
|
149 { 1, 10, (jint)1 << 10 }, |
|
150 { 1, 50, (jint)1 << 18 }, |
|
151 { 5, 0, 5 }, |
|
152 { 5, 10, (jint)5 << 10 }, |
|
153 { 5, 50, (jint)5 << 18 }, |
|
154 { -1, 0, -1 }, |
|
155 { -1, 10, (jint)-1 * (1 << 10) }, |
|
156 { -1, 50, (jint)-1 * (1 << 18) }, |
|
157 { -5, 0, -5 }, |
|
158 { -5, 10, (jint)-5 * (1 << 10) }, |
|
159 { -5, 50, (jint)-5 * (1 << 18) }, |
|
160 { max_jint, 0, max_jint }, |
|
161 { max_jint, 10, (jint)0xFFFFFC00 }, |
|
162 { max_jint, 50, (jint)0xFFFC0000 }, |
|
163 { min_jint, 0, min_jint }, |
|
164 { min_jint, 10, 0 }, |
|
165 { min_jint, 50, 0 } |
|
166 }; |
|
167 |
|
168 static const ShiftOpJlongData asl_jlong_data[] = { |
|
169 { 0, 0, 0 }, |
|
170 { 0, 10, 0 }, |
|
171 { 0, 82, 0 }, |
|
172 { 1, 0, 1 }, |
|
173 { 1, 10, (jlong)1 << 10 }, |
|
174 { 1, 82, (jlong)1 << 18 }, |
|
175 { 5, 0, 5 }, |
|
176 { 5, 10, (jlong)5 << 10 }, |
|
177 { 5, 82, (jlong)5 << 18 }, |
|
178 { -1, 0, -1 }, |
|
179 { -1, 10, (jlong)-1 * (1 << 10) }, |
|
180 { -1, 82, (jlong)-1 * (1 << 18) }, |
|
181 { -5, 0, -5 }, |
|
182 { -5, 10, (jlong)-5 * (1 << 10) }, |
|
183 { -5, 82, (jlong)-5 * (1 << 18) }, |
|
184 { max_jlong, 0, max_jlong }, |
|
185 { max_jlong, 10, (jlong)0xFFFFFFFFFFFFFC00 }, |
|
186 { max_jlong, 82, (jlong)0xFFFFFFFFFFFC0000 }, |
|
187 { min_jlong, 0, min_jlong }, |
|
188 { min_jlong, 10, 0 }, |
|
189 { min_jlong, 82, 0 } |
|
190 }; |
|
191 |
|
192 TEST(TestJavaArithmetic, shift_left_jint) { |
|
193 const volatile ShiftOpJintData* data = asl_jint_data; |
|
194 for (size_t i = 0; i < ARRAY_SIZE(asl_jint_data); ++i) { |
|
195 ASSERT_EQ(data[i].r, java_shift_left(data[i].x, data[i].shift)); |
|
196 } |
|
197 } |
|
198 |
|
199 TEST(TestJavaArithmetic, shift_left_jlong) { |
|
200 const volatile ShiftOpJlongData* data = asl_jlong_data; |
|
201 for (size_t i = 0; i < ARRAY_SIZE(asl_jlong_data); ++i) { |
|
202 ASSERT_EQ(data[i].r, java_shift_left(data[i].x, data[i].shift)); |
|
203 } |
|
204 } |
|
205 |
|
206 static const ShiftOpJintData asr_jint_data[] = { |
|
207 { 0, 0, 0 }, |
|
208 { 0, 10, 0 }, |
|
209 { 0, 50, 0 }, |
|
210 { 1, 0, 1 }, |
|
211 { 1, 10, 0 }, |
|
212 { 1, 50, 0 }, |
|
213 { 5, 0, 5 }, |
|
214 { 5, 1, 2 }, |
|
215 { 5, 10, 0 }, |
|
216 { 5, 33, 2 }, |
|
217 { 5, 50, 0 }, |
|
218 { -1, 0, -1 }, |
|
219 { -1, 10, -1 }, |
|
220 { -1, 50, -1 }, |
|
221 { -5, 0, -5 }, |
|
222 { -5, 1, -3 }, |
|
223 { -5, 10, -1 }, |
|
224 { -5, 33, -3 }, |
|
225 { -5, 50, -1 }, |
|
226 { max_jint, 0, max_jint }, |
|
227 { max_jint, 10, (jint)0x001FFFFF }, |
|
228 { max_jint, 50, (jint)0x00001FFF }, |
|
229 { min_jint, 0, min_jint }, |
|
230 { min_jint, 10, (jint)0xFFE00000 }, |
|
231 { min_jint, 50, (jint)0xFFFFE000 } |
|
232 }; |
|
233 |
|
234 static const ShiftOpJlongData asr_jlong_data[] = { |
|
235 { 0, 0, 0 }, |
|
236 { 0, 10, 0 }, |
|
237 { 0, 82, 0 }, |
|
238 { 1, 0, 1 }, |
|
239 { 1, 10, 0 }, |
|
240 { 1, 82, 0 }, |
|
241 { 5, 0, 5 }, |
|
242 { 5, 1, 2 }, |
|
243 { 5, 10, 0 }, |
|
244 { 5, 65, 2 }, |
|
245 { 5, 82, 0 }, |
|
246 { -1, 0, -1 }, |
|
247 { -1, 10, -1 }, |
|
248 { -1, 82, -1 }, |
|
249 { -5, 0, -5 }, |
|
250 { -5, 1, -3 }, |
|
251 { -5, 10, -1 }, |
|
252 { -5, 65, -3 }, |
|
253 { -5, 82, -1 }, |
|
254 { max_jlong, 0, max_jlong }, |
|
255 { max_jlong, 10, (jlong)0x001FFFFFFFFFFFFF }, |
|
256 { max_jlong, 82, (jlong)0x00001FFFFFFFFFFF }, |
|
257 { min_jlong, 0, min_jlong }, |
|
258 { min_jlong, 10, (jlong)0xFFE0000000000000 }, |
|
259 { min_jlong, 82, (jlong)0xFFFFE00000000000 } |
|
260 }; |
|
261 |
|
262 TEST(TestJavaArithmetic, shift_right_jint) { |
|
263 const volatile ShiftOpJintData* data = asr_jint_data; |
|
264 for (size_t i = 0; i < ARRAY_SIZE(asr_jint_data); ++i) { |
|
265 ASSERT_EQ(data[i].r, java_shift_right(data[i].x, data[i].shift)); |
|
266 } |
|
267 } |
|
268 |
|
269 TEST(TestJavaArithmetic, shift_right_jlong) { |
|
270 const volatile ShiftOpJlongData* data = asr_jlong_data; |
|
271 for (size_t i = 0; i < ARRAY_SIZE(asr_jlong_data); ++i) { |
|
272 ASSERT_EQ(data[i].r, java_shift_right(data[i].x, data[i].shift)); |
|
273 } |
|
274 } |
|
275 |
|
276 static const ShiftOpJintData lsr_jint_data[] = { |
|
277 { 0, 0, 0 }, |
|
278 { 0, 10, 0 }, |
|
279 { 0, 50, 0 }, |
|
280 { 1, 0, 1 }, |
|
281 { 1, 10, 0 }, |
|
282 { 1, 50, 0 }, |
|
283 { 5, 0, 5 }, |
|
284 { 5, 1, 2 }, |
|
285 { 5, 10, 0 }, |
|
286 { 5, 33, 2 }, |
|
287 { 5, 50, 0 }, |
|
288 { -1, 0, -1 }, |
|
289 { -1, 10, (jint)0x003FFFFF }, |
|
290 { -1, 50, (jint)0x00003FFF }, |
|
291 { -5, 0, -5 }, |
|
292 { -5, 1, (jint)0x7FFFFFFD }, |
|
293 { -5, 10, (jint)0x003FFFFF }, |
|
294 { -5, 50, (jint)0x00003FFF }, |
|
295 { max_jint, 0, max_jint }, |
|
296 { max_jint, 1, (jint)0x3FFFFFFF }, |
|
297 { max_jint, 10, (jint)0x001FFFFF }, |
|
298 { max_jint, 50, (jint)0x00001FFF }, |
|
299 { min_jint, 0, min_jint }, |
|
300 { min_jint, 1, (jint)0x40000000 }, |
|
301 { min_jint, 10, (jint)0x00200000 }, |
|
302 { min_jint, 50, (jint)0x00002000 } |
|
303 }; |
|
304 |
|
305 static const ShiftOpJlongData lsr_jlong_data[] = { |
|
306 { 0, 0, 0 }, |
|
307 { 0, 10, 0 }, |
|
308 { 0, 82, 0 }, |
|
309 { 1, 0, 1 }, |
|
310 { 1, 10, 0 }, |
|
311 { 1, 82, 0 }, |
|
312 { 5, 0, 5 }, |
|
313 { 5, 1, 2 }, |
|
314 { 5, 10, 0 }, |
|
315 { 5, 65, 2 }, |
|
316 { 5, 82, 0 }, |
|
317 { -1, 0, -1 }, |
|
318 { -1, 10, (jlong)0x003FFFFFFFFFFFFF }, |
|
319 { -1, 82, (jlong)0x00003FFFFFFFFFFF }, |
|
320 { -5, 0, -5 }, |
|
321 { -5, 1, (jlong)0x7FFFFFFFFFFFFFFD }, |
|
322 { -5, 10, (jlong)0x003FFFFFFFFFFFFF }, |
|
323 { -5, 82, (jlong)0x00003FFFFFFFFFFF }, |
|
324 { max_jlong, 0, max_jlong }, |
|
325 { max_jlong, 1, (jlong)0x3FFFFFFFFFFFFFFF }, |
|
326 { max_jlong, 10, (jlong)0x001FFFFFFFFFFFFF }, |
|
327 { max_jlong, 82, (jlong)0x00001FFFFFFFFFFF }, |
|
328 { min_jlong, 0, min_jlong }, |
|
329 { min_jlong, 1, (jlong)0x4000000000000000 }, |
|
330 { min_jlong, 10, (jlong)0x0020000000000000 }, |
|
331 { min_jlong, 82, (jlong)0x0000200000000000 } |
|
332 }; |
|
333 |
|
334 TEST(TestJavaArithmetic, shift_right_unsigned_jint) { |
|
335 const volatile ShiftOpJintData* data = lsr_jint_data; |
|
336 for (size_t i = 0; i < ARRAY_SIZE(lsr_jint_data); ++i) { |
|
337 ASSERT_EQ(data[i].r, java_shift_right_unsigned(data[i].x, data[i].shift)); |
|
338 } |
|
339 } |
|
340 |
|
341 TEST(TestJavaArithmetic, shift_right_unsigned_jlong) { |
|
342 const volatile ShiftOpJlongData* data = lsr_jlong_data; |
|
343 for (size_t i = 0; i < ARRAY_SIZE(lsr_jlong_data); ++i) { |
|
344 ASSERT_EQ(data[i].r, java_shift_right_unsigned(data[i].x, data[i].shift)); |
|
345 } |
|
346 } |