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_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);