src/cpu/x86/vm/assembler_x86.cpp

Print this page




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(Address dst, intptr_t src) {
8219   assert(src == NULL_WORD, "use something else otherwise");
8220   if (UseCompressedOops) {
8221     movl(dst, (int32_t)src);
8222   } else {
8223     movslq(dst, (int32_t)src);
8224   }
8225 }
8226 
8227 // Algorithm must match oop.inline.hpp encode_heap_oop.
8228 void MacroAssembler::encode_heap_oop(Register r) {
8229   assert (UseCompressedOops, "should be compressed");
8230   assert (Universe::heap() != NULL, "java heap should be initialized");
8231   if (Universe::narrow_oop_base() == NULL) {
8232     verify_oop(r, "broken oop in encode_heap_oop");
8233     if (Universe::narrow_oop_shift() != 0) {
8234       assert (LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
8235       shrq(r, LogMinObjAlignmentInBytes);
8236     }
8237     return;
8238   }
8239 #ifdef ASSERT
8240   if (CheckCompressedOops) {
8241     Label ok;
8242     push(rscratch1); // cmpptr trashes rscratch1
8243     cmpptr(r12_heapbase, ExternalAddress((address)Universe::narrow_oop_base_addr()));
8244     jcc(Assembler::equal, ok);
8245     stop("MacroAssembler::encode_heap_oop: heap base corrupted?");
8246     bind(ok);