hotspot/src/cpu/x86/vm/assembler_x86.cpp
changeset 5702 201c5cde25bb
parent 5547 f4b087cbb361
parent 5694 1e0532a6abff
child 5706 0c91076143f9
equal deleted inserted replaced
5685:0e4c848d5c06 5702:201c5cde25bb
  8183 #ifdef _LP64
  8183 #ifdef _LP64
  8184   if (UseCompressedOops) {
  8184   if (UseCompressedOops) {
  8185     assert (Universe::heap() != NULL, "java heap should be initialized");
  8185     assert (Universe::heap() != NULL, "java heap should be initialized");
  8186     movl(dst, Address(src, oopDesc::klass_offset_in_bytes()));
  8186     movl(dst, Address(src, oopDesc::klass_offset_in_bytes()));
  8187     if (Universe::narrow_oop_shift() != 0) {
  8187     if (Universe::narrow_oop_shift() != 0) {
  8188       assert(Address::times_8 == LogMinObjAlignmentInBytes &&
  8188       assert(LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
  8189              Address::times_8 == Universe::narrow_oop_shift(), "decode alg wrong");
  8189       if (LogMinObjAlignmentInBytes == Address::times_8) {
  8190       movq(dst, Address(r12_heapbase, dst, Address::times_8, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
  8190         movq(dst, Address(r12_heapbase, dst, Address::times_8, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
       
  8191       } else {
       
  8192         // OK to use shift since we don't need to preserve flags.
       
  8193         shlq(dst, LogMinObjAlignmentInBytes);
       
  8194         movq(dst, Address(r12_heapbase, dst, Address::times_1, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
       
  8195       }
  8191     } else {
  8196     } else {
  8192       movq(dst, Address(dst, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
  8197       movq(dst, Address(dst, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
  8193     }
  8198     }
  8194   } else
  8199   } else
  8195 #endif
  8200 #endif
  8359   bind(done);
  8364   bind(done);
  8360   verify_oop(r, "broken oop in decode_heap_oop");
  8365   verify_oop(r, "broken oop in decode_heap_oop");
  8361 }
  8366 }
  8362 
  8367 
  8363 void  MacroAssembler::decode_heap_oop_not_null(Register r) {
  8368 void  MacroAssembler::decode_heap_oop_not_null(Register r) {
       
  8369   // Note: it will change flags
  8364   assert (UseCompressedOops, "should only be used for compressed headers");
  8370   assert (UseCompressedOops, "should only be used for compressed headers");
  8365   assert (Universe::heap() != NULL, "java heap should be initialized");
  8371   assert (Universe::heap() != NULL, "java heap should be initialized");
  8366   // Cannot assert, unverified entry point counts instructions (see .ad file)
  8372   // Cannot assert, unverified entry point counts instructions (see .ad file)
  8367   // vtableStubs also counts instructions in pd_code_size_limit.
  8373   // vtableStubs also counts instructions in pd_code_size_limit.
  8368   // Also do not verify_oop as this is called by verify_oop.
  8374   // Also do not verify_oop as this is called by verify_oop.
  8369   if (Universe::narrow_oop_shift() != 0) {
  8375   if (Universe::narrow_oop_shift() != 0) {
  8370     assert (Address::times_8 == LogMinObjAlignmentInBytes &&
  8376     assert(LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
  8371             Address::times_8 == Universe::narrow_oop_shift(), "decode alg wrong");
  8377     shlq(r, LogMinObjAlignmentInBytes);
  8372     // Don't use Shift since it modifies flags.
  8378     if (Universe::narrow_oop_base() != NULL) {
  8373     leaq(r, Address(r12_heapbase, r, Address::times_8, 0));
  8379       addq(r, r12_heapbase);
       
  8380     }
  8374   } else {
  8381   } else {
  8375     assert (Universe::narrow_oop_base() == NULL, "sanity");
  8382     assert (Universe::narrow_oop_base() == NULL, "sanity");
  8376   }
  8383   }
  8377 }
  8384 }
  8378 
  8385 
  8379 void  MacroAssembler::decode_heap_oop_not_null(Register dst, Register src) {
  8386 void  MacroAssembler::decode_heap_oop_not_null(Register dst, Register src) {
       
  8387   // Note: it will change flags
  8380   assert (UseCompressedOops, "should only be used for compressed headers");
  8388   assert (UseCompressedOops, "should only be used for compressed headers");
  8381   assert (Universe::heap() != NULL, "java heap should be initialized");
  8389   assert (Universe::heap() != NULL, "java heap should be initialized");
  8382   // Cannot assert, unverified entry point counts instructions (see .ad file)
  8390   // Cannot assert, unverified entry point counts instructions (see .ad file)
  8383   // vtableStubs also counts instructions in pd_code_size_limit.
  8391   // vtableStubs also counts instructions in pd_code_size_limit.
  8384   // Also do not verify_oop as this is called by verify_oop.
  8392   // Also do not verify_oop as this is called by verify_oop.
  8385   if (Universe::narrow_oop_shift() != 0) {
  8393   if (Universe::narrow_oop_shift() != 0) {
  8386     assert (Address::times_8 == LogMinObjAlignmentInBytes &&
  8394     assert(LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
  8387             Address::times_8 == Universe::narrow_oop_shift(), "decode alg wrong");
  8395     if (LogMinObjAlignmentInBytes == Address::times_8) {
  8388     leaq(dst, Address(r12_heapbase, src, Address::times_8, 0));
  8396       leaq(dst, Address(r12_heapbase, src, Address::times_8, 0));
       
  8397     } else {
       
  8398       if (dst != src) {
       
  8399         movq(dst, src);
       
  8400       }
       
  8401       shlq(dst, LogMinObjAlignmentInBytes);
       
  8402       if (Universe::narrow_oop_base() != NULL) {
       
  8403         addq(dst, r12_heapbase);
       
  8404       }
       
  8405     }
  8389   } else if (dst != src) {
  8406   } else if (dst != src) {
  8390     assert (Universe::narrow_oop_base() == NULL, "sanity");
  8407     assert (Universe::narrow_oop_base() == NULL, "sanity");
  8391     movq(dst, src);
  8408     movq(dst, src);
  8392   }
  8409   }
  8393 }
  8410 }