--- old/src/share/vm/oops/klass.hpp 2017-03-16 13:22:46.241160747 +0100 +++ new/src/share/vm/oops/klass.hpp 2017-03-16 13:22:46.133158493 +0100 @@ -79,7 +79,7 @@ // distinct bytes, as follows: // MSB:[tag, hsz, ebt, log2(esz)]:LSB // where: - // tag is 0x80 if the elements are oops, 0xC0 if non-oops + // tag is 0x80 if the elements are oops, 0xC0 if non-oops, 0xA0 if value types // hsz is array header size in bytes (i.e., offset of first element) // ebt is the BasicType of the elements // esz is the element size in bytes @@ -316,13 +316,11 @@ _lh_header_size_shift = BitsPerByte*2, _lh_header_size_mask = right_n_bits(BitsPerByte), // shifted mask - // Additional array type bits - _lh_valuetype_bit = 29, // maybe objArray or valueArrayOop - - _lh_array_tag_bits = 2, + _lh_array_tag_bits = 3, _lh_array_tag_shift = BitsPerInt - _lh_array_tag_bits, - _lh_array_tag_type_value = ~0x00, // 0xC0000000 >> 30 - _lh_array_tag_obj_value = ~0x01 // 0x80000000 >> 30 + _lh_array_tag_type_value = ~0x3, // bits ~100 compare as int, ie. sign extended + _lh_array_tag_vt_value = ~0x2, // bits ~101 + _lh_array_tag_obj_value = ~0x1, // bits ~110 }; static int layout_helper_size_in_bytes(jint lh) { @@ -346,7 +344,7 @@ return _lh_array_tag_obj_value == (lh >> _lh_array_tag_shift); } static bool layout_helper_is_valueArray(jint lh) { - return (lh >> _lh_valuetype_bit) & 1; + return _lh_array_tag_vt_value == (lh >> _lh_array_tag_shift); } static int layout_helper_header_size(jint lh) { assert(lh < (jint)_lh_neutral_value, "must be array");