8197 8198 void MacroAssembler::load_heap_oop(Register dst, Address src) { 8199 if (UseCompressedOops) { 8200 movl(dst, src); 8201 decode_heap_oop(dst); 8202 } else { 8203 movq(dst, src); 8204 } 8205 } 8206 8207 void MacroAssembler::store_heap_oop(Address dst, Register src) { 8208 if (UseCompressedOops) { 8209 assert(!dst.uses(src), "not enough registers"); 8210 encode_heap_oop(src); 8211 movl(dst, src); 8212 } else { 8213 movq(dst, src); 8214 } 8215 } 8216 8217 // Algorithm must match oop.inline.hpp encode_heap_oop. 8218 void MacroAssembler::encode_heap_oop(Register r) { 8219 assert (UseCompressedOops, "should be compressed"); 8220 assert (Universe::heap() != NULL, "java heap should be initialized"); 8221 if (Universe::narrow_oop_base() == NULL) { 8222 verify_oop(r, "broken oop in encode_heap_oop"); 8223 if (Universe::narrow_oop_shift() != 0) { 8224 assert (LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong"); 8225 shrq(r, LogMinObjAlignmentInBytes); 8226 } 8227 return; 8228 } 8229 #ifdef ASSERT 8230 if (CheckCompressedOops) { 8231 Label ok; 8232 push(rscratch1); // cmpptr trashes rscratch1 8233 cmpptr(r12_heapbase, ExternalAddress((address)Universe::narrow_oop_base_addr())); 8234 jcc(Assembler::equal, ok); 8235 stop("MacroAssembler::encode_heap_oop: heap base corrupted?"); 8236 bind(ok); | 8197 8198 void MacroAssembler::load_heap_oop(Register dst, Address src) { 8199 if (UseCompressedOops) { 8200 movl(dst, src); 8201 decode_heap_oop(dst); 8202 } else { 8203 movq(dst, src); 8204 } 8205 } 8206 8207 void MacroAssembler::store_heap_oop(Address dst, Register src) { 8208 if (UseCompressedOops) { 8209 assert(!dst.uses(src), "not enough registers"); 8210 encode_heap_oop(src); 8211 movl(dst, src); 8212 } else { 8213 movq(dst, src); 8214 } 8215 } 8216 8217 // Used for storing NULLs. 8218 void MacroAssembler::store_heap_oop_null(Address dst) { 8219 if (UseCompressedOops) { 8220 movl(dst, (int32_t)NULL_WORD); 8221 } else { 8222 movslq(dst, (int32_t)NULL_WORD); 8223 } 8224 } 8225 8226 // Algorithm must match oop.inline.hpp encode_heap_oop. 8227 void MacroAssembler::encode_heap_oop(Register r) { 8228 assert (UseCompressedOops, "should be compressed"); 8229 assert (Universe::heap() != NULL, "java heap should be initialized"); 8230 if (Universe::narrow_oop_base() == NULL) { 8231 verify_oop(r, "broken oop in encode_heap_oop"); 8232 if (Universe::narrow_oop_shift() != 0) { 8233 assert (LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong"); 8234 shrq(r, LogMinObjAlignmentInBytes); 8235 } 8236 return; 8237 } 8238 #ifdef ASSERT 8239 if (CheckCompressedOops) { 8240 Label ok; 8241 push(rscratch1); // cmpptr trashes rscratch1 8242 cmpptr(r12_heapbase, ExternalAddress((address)Universe::narrow_oop_base_addr())); 8243 jcc(Assembler::equal, ok); 8244 stop("MacroAssembler::encode_heap_oop: heap base corrupted?"); 8245 bind(ok); |