5240 stop("null oop passed to encode_heap_oop_not_null2");
5241 bind(ok);
5242 }
5243 #endif
5244 verify_oop_msg(src, "broken oop in encode_heap_oop_not_null2");
5245
5246 Register data = src;
5247 if (CompressedOops::base() != nullptr) {
5248 sub(dst, src, rheapbase);
5249 data = dst;
5250 }
5251 if (CompressedOops::shift() != 0) {
5252 assert (LogMinObjAlignmentInBytes == CompressedOops::shift(), "decode alg wrong");
5253 lsr(dst, data, LogMinObjAlignmentInBytes);
5254 data = dst;
5255 }
5256 if (data == src)
5257 mov(dst, src);
5258 }
5259
5260 void MacroAssembler::decode_heap_oop(Register d, Register s) {
5261 #ifdef ASSERT
5262 verify_heapbase("MacroAssembler::decode_heap_oop: heap base corrupted?");
5263 #endif
5264 if (CompressedOops::base() == nullptr) {
5265 if (CompressedOops::shift() != 0) {
5266 lsl(d, s, CompressedOops::shift());
5267 } else if (d != s) {
5268 mov(d, s);
5269 }
5270 } else {
5271 Label done;
5272 if (d != s)
5273 mov(d, s);
5274 cbz(s, done);
5275 add(d, rheapbase, s, Assembler::LSL, LogMinObjAlignmentInBytes);
5276 bind(done);
5277 }
5278 verify_oop_msg(d, "broken oop in decode_heap_oop");
5279 }
5280
5281 void MacroAssembler::decode_heap_oop_not_null(Register r) {
5282 assert (UseCompressedOops, "should only be used for compressed headers");
5283 assert (Universe::heap() != nullptr, "java heap should be initialized");
5284 // Cannot assert, unverified entry point counts instructions (see .ad file)
5285 // vtableStubs also counts instructions in pd_code_size_limit.
5286 // Also do not verify_oop as this is called by verify_oop.
5287 if (CompressedOops::shift() != 0) {
5288 assert(LogMinObjAlignmentInBytes == CompressedOops::shift(), "decode alg wrong");
5289 if (CompressedOops::base() != nullptr) {
5290 add(r, rheapbase, r, Assembler::LSL, LogMinObjAlignmentInBytes);
5291 } else {
5292 add(r, zr, r, Assembler::LSL, LogMinObjAlignmentInBytes);
5293 }
5294 } else {
|
5240 stop("null oop passed to encode_heap_oop_not_null2");
5241 bind(ok);
5242 }
5243 #endif
5244 verify_oop_msg(src, "broken oop in encode_heap_oop_not_null2");
5245
5246 Register data = src;
5247 if (CompressedOops::base() != nullptr) {
5248 sub(dst, src, rheapbase);
5249 data = dst;
5250 }
5251 if (CompressedOops::shift() != 0) {
5252 assert (LogMinObjAlignmentInBytes == CompressedOops::shift(), "decode alg wrong");
5253 lsr(dst, data, LogMinObjAlignmentInBytes);
5254 data = dst;
5255 }
5256 if (data == src)
5257 mov(dst, src);
5258 }
5259
5260 void MacroAssembler::decode_heap_oop(Register d, Register s, Label* L_null_target) {
5261 #ifdef ASSERT
5262 verify_heapbase("MacroAssembler::decode_heap_oop: heap base corrupted?");
5263 #endif
5264 if (CompressedOops::base() == nullptr) {
5265 if (CompressedOops::shift() != 0) {
5266 lsl(d, s, CompressedOops::shift());
5267 } else if (d != s) {
5268 mov(d, s);
5269 }
5270 if (L_null_target != nullptr) {
5271 cbz(d, *L_null_target);
5272 }
5273 } else {
5274 Label done;
5275 if (d != s)
5276 mov(d, s);
5277 cbz(d, L_null_target != nullptr ? *L_null_target : done);
5278 add(d, rheapbase, s, Assembler::LSL, LogMinObjAlignmentInBytes);
5279 bind(done);
5280 }
5281 verify_oop_msg(d, "broken oop in decode_heap_oop");
5282 }
5283
5284 void MacroAssembler::decode_heap_oop_not_null(Register r) {
5285 assert (UseCompressedOops, "should only be used for compressed headers");
5286 assert (Universe::heap() != nullptr, "java heap should be initialized");
5287 // Cannot assert, unverified entry point counts instructions (see .ad file)
5288 // vtableStubs also counts instructions in pd_code_size_limit.
5289 // Also do not verify_oop as this is called by verify_oop.
5290 if (CompressedOops::shift() != 0) {
5291 assert(LogMinObjAlignmentInBytes == CompressedOops::shift(), "decode alg wrong");
5292 if (CompressedOops::base() != nullptr) {
5293 add(r, rheapbase, r, Assembler::LSL, LogMinObjAlignmentInBytes);
5294 } else {
5295 add(r, zr, r, Assembler::LSL, LogMinObjAlignmentInBytes);
5296 }
5297 } else {
|