@@ -5291,32 +5291,47 @@ void MacroAssembler::decode_heap_oop_not_null(Register dst, Register src) {
52915291MacroAssembler::KlassDecodeMode MacroAssembler::_klass_decode_mode (KlassDecodeNone);
52925292
52935293MacroAssembler::KlassDecodeMode MacroAssembler::klass_decode_mode () {
5294- assert (UseCompressedClassPointers, " not using compressed class pointers" );
52955294 assert (Metaspace::initialized (), " metaspace not initialized yet" );
5295+ assert (_klass_decode_mode != KlassDecodeNone, " should be initialized" );
5296+ return _klass_decode_mode;
5297+ }
52965298
5297- if (_klass_decode_mode != KlassDecodeNone) {
5298- return _klass_decode_mode;
5299- }
5299+ MacroAssembler::KlassDecodeMode MacroAssembler::klass_decode_mode (address base, int shift, const size_t range) {
5300+ assert (UseCompressedClassPointers, " not using compressed class pointers" );
5301+
5302+ // KlassDecodeMode shouldn't be set already.
5303+ assert (_klass_decode_mode == KlassDecodeNone, " set once" );
53005304
5301- if (CompressedKlassPointers:: base() == nullptr ) {
5302- return (_klass_decode_mode = KlassDecodeZero) ;
5305+ if (base == nullptr ) {
5306+ return KlassDecodeZero;
53035307 }
53045308
53055309 if (operand_valid_for_logical_immediate (
5306- /* is32*/ false , (uint64_t )CompressedKlassPointers::base ())) {
5307- const size_t range = CompressedKlassPointers::klass_range_end () - CompressedKlassPointers::base ();
5310+ /* is32*/ false , (uint64_t )base)) {
53085311 const uint64_t range_mask = right_n_bits (log2i_ceil (range));
5309- if (((uint64_t )CompressedKlassPointers:: base() & range_mask) == 0 ) {
5310- return (_klass_decode_mode = KlassDecodeXor) ;
5312+ if (((uint64_t )base & range_mask) == 0 ) {
5313+ return KlassDecodeXor;
53115314 }
53125315 }
53135316
53145317 const uint64_t shifted_base =
5315- (uint64_t )CompressedKlassPointers::base () >> CompressedKlassPointers::shift ();
5316- guarantee ((shifted_base & 0xffff0000ffffffff ) == 0 ,
5317- " compressed class base bad alignment" );
5318+ (uint64_t )base >> shift;
5319+ if ((shifted_base & 0xffff0000ffffffff ) == 0 ) {
5320+ return KlassDecodeMovk;
5321+ }
5322+
5323+ // No valid encoding.
5324+ return KlassDecodeNone;
5325+ }
5326+
5327+ // Check if one of the above decoding modes will work for given base, shift and range.
5328+ bool MacroAssembler::check_klass_decode_mode (address base, int shift, const size_t range) {
5329+ return klass_decode_mode (base, shift, range) != KlassDecodeNone;
5330+ }
53185331
5319- return (_klass_decode_mode = KlassDecodeMovk);
5332+ bool MacroAssembler::set_klass_decode_mode (address base, int shift, const size_t range) {
5333+ _klass_decode_mode = klass_decode_mode (base, shift, range);
5334+ return _klass_decode_mode != KlassDecodeNone;
53205335}
53215336
53225337void MacroAssembler::encode_klass_not_null (Register dst, Register src) {
0 commit comments