comparison src/cpu/x86/vm/assembler_x86.cpp @ 1571:2d127394260e

6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb Summary: Added new product ObjectAlignmentInBytes flag to control object alignment. Reviewed-by: twisti, ysr, iveresov
author kvn
date Thu, 27 May 2010 18:01:56 -0700
parents df736661d0c8
children e9ff18c4ace7
comparison
equal deleted inserted replaced
1570:de91a2f25c7e 1571:2d127394260e
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 }