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 }