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