diff --git a/src/hotspot/share/utilities/globalDefinitions.hpp b/src/hotspot/share/utilities/globalDefinitions.hpp index 2a179f5814f..1ef548d6510 100644 --- a/src/hotspot/share/utilities/globalDefinitions.hpp +++ b/src/hotspot/share/utilities/globalDefinitions.hpp @@ -641,19 +641,11 @@ inline jdouble jdouble_cast (jlong x) { return ((DoubleLongConv*)&x)->d; } inline jint low (jlong value) { return jint(value); } inline jint high(jlong value) { return jint(value >> 32); } -// the fancy casts are a hopefully portable way -// to do unsigned 32 to 64 bit type conversion -inline void set_low (jlong* value, jint low ) { *value &= (jlong)0xffffffff << 32; - *value |= (jlong)(julong)(juint)low; } - -inline void set_high(jlong* value, jint high) { *value &= (jlong)(julong)(juint)0xffffffff; - *value |= (jlong)high << 32; } - inline jlong jlong_from(jint h, jint l) { - jlong result = 0; // initialization to avoid warning - set_high(&result, h); - set_low(&result, l); - return result; + // First cast jint values to juint, so cast to julong will zero-extend. + julong high = (julong)(juint)h << 32; + julong low = (julong)(juint)l; + return (jlong)(high | low); } union jlong_accessor { diff --git a/test/hotspot/gtest/utilities/test_globalDefinitions.cpp b/test/hotspot/gtest/utilities/test_globalDefinitions.cpp index 38aa7aa477b..4c04b77a51b 100644 --- a/test/hotspot/gtest/utilities/test_globalDefinitions.cpp +++ b/test/hotspot/gtest/utilities/test_globalDefinitions.cpp @@ -295,3 +295,30 @@ TEST(globalDefinitions, format_specifiers) { // Check all platforms print this compatibly without leading 0x. check_format(UINT64_FORMAT_0, (u8)0x123, "0000000000000123"); } + +TEST(globalDefinitions, jlong_from) { + jlong val = jlong_from(0xFF, 0); + EXPECT_EQ(val, CONST64(0x00000000FF00000000)); + + val = jlong_from(0, 0xFF); + EXPECT_EQ(val, CONST64(0x00000000000000FF)); + + val = jlong_from(0xFFFFFFFF, 0); + EXPECT_EQ((julong)val, UCONST64(0xFFFFFFFF00000000)); + + val = jlong_from(0, 0xFFFFFFFF); + EXPECT_EQ(val, CONST64(0x00000000FFFFFFFF)); + + val = jlong_from(0, -1); + EXPECT_EQ(val, CONST64(0x00000000FFFFFFFF)); + + val = jlong_from(-1, 0); + EXPECT_EQ((julong)val, UCONST64(0xFFFFFFFF00000000)); + + val = jlong_from(-1, -1); + EXPECT_EQ((julong)val, UCONST64(0xFFFFFFFFFFFFFFFF)); + EXPECT_EQ(val, CONST64(-1)); + + val = jlong_from(0xABCD, 0xEFEF); + EXPECT_EQ(val, CONST64(0x0000ABCD0000EFEF)); +}