5253 if (CompressedOops::base() != nullptr) {
5254 sub(dst, src, rheapbase);
5255 data = dst;
5256 }
5257 if (CompressedOops::shift() != 0) {
5258 assert (LogMinObjAlignmentInBytes == CompressedOops::shift(), "decode alg wrong");
5259 lsr(dst, data, LogMinObjAlignmentInBytes);
5260 data = dst;
5261 }
5262 if (data == src)
5263 mov(dst, src);
5264 }
5265
5266 void MacroAssembler::decode_heap_oop(Register d, Register s) {
5267 #ifdef ASSERT
5268 verify_heapbase("MacroAssembler::decode_heap_oop: heap base corrupted?");
5269 #endif
5270 if (CompressedOops::base() == nullptr) {
5271 if (CompressedOops::shift() != 0) {
5272 lsl(d, s, CompressedOops::shift());
5273 } else if (d != s) {
5274 mov(d, s);
5275 }
5276 } else {
5277 Label done;
5278 if (d != s)
5279 mov(d, s);
5280 cbz(s, done);
5281 add(d, rheapbase, s, Assembler::LSL, LogMinObjAlignmentInBytes);
5282 bind(done);
5283 }
5284 verify_oop_msg(d, "broken oop in decode_heap_oop");
5285 }
5286
5287 void MacroAssembler::decode_heap_oop_not_null(Register r) {
5288 assert (UseCompressedOops, "should only be used for compressed headers");
5289 assert (Universe::heap() != nullptr, "java heap should be initialized");
5290 // Cannot assert, unverified entry point counts instructions (see .ad file)
5291 // vtableStubs also counts instructions in pd_code_size_limit.
5292 // Also do not verify_oop as this is called by verify_oop.
5293 if (CompressedOops::shift() != 0) {
5294 assert(LogMinObjAlignmentInBytes == CompressedOops::shift(), "decode alg wrong");
5295 if (CompressedOops::base() != nullptr) {
5296 add(r, rheapbase, r, Assembler::LSL, LogMinObjAlignmentInBytes);
5297 } else {
5298 add(r, zr, r, Assembler::LSL, LogMinObjAlignmentInBytes);
5299 }
5300 } else {
5301 assert (CompressedOops::base() == nullptr, "sanity");
5302 }
5303 }
5304
5305 void MacroAssembler::decode_heap_oop_not_null(Register dst, Register src) {
5306 assert (UseCompressedOops, "should only be used for compressed headers");
5307 assert (Universe::heap() != nullptr, "java heap should be initialized");
5308 // Cannot assert, unverified entry point counts instructions (see .ad file)
5309 // vtableStubs also counts instructions in pd_code_size_limit.
5310 // Also do not verify_oop as this is called by verify_oop.
5311 if (CompressedOops::shift() != 0) {
5312 assert(LogMinObjAlignmentInBytes == CompressedOops::shift(), "decode alg wrong");
5313 if (CompressedOops::base() != nullptr) {
5314 add(dst, rheapbase, src, Assembler::LSL, LogMinObjAlignmentInBytes);
5315 } else {
5316 add(dst, zr, src, Assembler::LSL, LogMinObjAlignmentInBytes);
5317 }
5318 } else {
5319 assert (CompressedOops::base() == nullptr, "sanity");
5320 if (dst != src) {
5321 mov(dst, src);
5322 }
5323 }
5324 }
5325
5326 MacroAssembler::KlassDecodeMode MacroAssembler::_klass_decode_mode(KlassDecodeNone);
5327
5328 MacroAssembler::KlassDecodeMode MacroAssembler::klass_decode_mode() {
5329 assert(Metaspace::initialized(), "metaspace not initialized yet");
5330 assert(_klass_decode_mode != KlassDecodeNone, "should be initialized");
5331 return _klass_decode_mode;
5332 }
5333
5334 MacroAssembler::KlassDecodeMode MacroAssembler::klass_decode_mode(address base, int shift, const size_t range) {
5335 assert(UseCompressedClassPointers, "not using compressed class pointers");
5336
5337 // KlassDecodeMode shouldn't be set already.
5338 assert(_klass_decode_mode == KlassDecodeNone, "set once");
5339
5340 if (base == nullptr) {
5341 return KlassDecodeZero;
5342 }
|
5253 if (CompressedOops::base() != nullptr) {
5254 sub(dst, src, rheapbase);
5255 data = dst;
5256 }
5257 if (CompressedOops::shift() != 0) {
5258 assert (LogMinObjAlignmentInBytes == CompressedOops::shift(), "decode alg wrong");
5259 lsr(dst, data, LogMinObjAlignmentInBytes);
5260 data = dst;
5261 }
5262 if (data == src)
5263 mov(dst, src);
5264 }
5265
5266 void MacroAssembler::decode_heap_oop(Register d, Register s) {
5267 #ifdef ASSERT
5268 verify_heapbase("MacroAssembler::decode_heap_oop: heap base corrupted?");
5269 #endif
5270 if (CompressedOops::base() == nullptr) {
5271 if (CompressedOops::shift() != 0) {
5272 lsl(d, s, CompressedOops::shift());
5273 } else {
5274 mov(d, s);
5275 }
5276 } else {
5277 Label done;
5278 mov(d, s);
5279 cbz(s, done);
5280 add(d, rheapbase, s, Assembler::LSL, LogMinObjAlignmentInBytes);
5281 bind(done);
5282 }
5283 verify_oop_msg(d, "broken oop in decode_heap_oop");
5284 }
5285
5286 void MacroAssembler::decode_heap_oop_not_null(Register r) {
5287 assert (UseCompressedOops, "should only be used for compressed headers");
5288 assert (Universe::heap() != nullptr, "java heap should be initialized");
5289 // Cannot assert, unverified entry point counts instructions (see .ad file)
5290 // vtableStubs also counts instructions in pd_code_size_limit.
5291 // Also do not verify_oop as this is called by verify_oop.
5292 if (CompressedOops::shift() != 0) {
5293 assert(LogMinObjAlignmentInBytes == CompressedOops::shift(), "decode alg wrong");
5294 if (CompressedOops::base() != nullptr) {
5295 add(r, rheapbase, r, Assembler::LSL, LogMinObjAlignmentInBytes);
5296 } else {
5297 add(r, zr, r, Assembler::LSL, LogMinObjAlignmentInBytes);
5298 }
5299 } else {
5300 assert (CompressedOops::base() == nullptr, "sanity");
5301 }
5302 }
5303
5304 void MacroAssembler::decode_heap_oop_not_null(Register dst, Register src) {
5305 assert (UseCompressedOops, "should only be used for compressed headers");
5306 assert (Universe::heap() != nullptr, "java heap should be initialized");
5307 // Cannot assert, unverified entry point counts instructions (see .ad file)
5308 // vtableStubs also counts instructions in pd_code_size_limit.
5309 // Also do not verify_oop as this is called by verify_oop.
5310 if (CompressedOops::shift() != 0) {
5311 assert(LogMinObjAlignmentInBytes == CompressedOops::shift(), "decode alg wrong");
5312 if (CompressedOops::base() != nullptr) {
5313 add(dst, rheapbase, src, Assembler::LSL, LogMinObjAlignmentInBytes);
5314 } else {
5315 add(dst, zr, src, Assembler::LSL, LogMinObjAlignmentInBytes);
5316 }
5317 } else {
5318 assert (CompressedOops::base() == nullptr, "sanity");
5319 mov(dst, src);
5320 }
5321 }
5322
5323 MacroAssembler::KlassDecodeMode MacroAssembler::_klass_decode_mode(KlassDecodeNone);
5324
5325 MacroAssembler::KlassDecodeMode MacroAssembler::klass_decode_mode() {
5326 assert(Metaspace::initialized(), "metaspace not initialized yet");
5327 assert(_klass_decode_mode != KlassDecodeNone, "should be initialized");
5328 return _klass_decode_mode;
5329 }
5330
5331 MacroAssembler::KlassDecodeMode MacroAssembler::klass_decode_mode(address base, int shift, const size_t range) {
5332 assert(UseCompressedClassPointers, "not using compressed class pointers");
5333
5334 // KlassDecodeMode shouldn't be set already.
5335 assert(_klass_decode_mode == KlassDecodeNone, "set once");
5336
5337 if (base == nullptr) {
5338 return KlassDecodeZero;
5339 }
|