8318 Label done; 8319 shlq(r, LogMinObjAlignmentInBytes); 8320 jccb(Assembler::equal, done); 8321 addq(r, r12_heapbase); 8322 #if 0 8323 // alternate decoding probably a wash. 8324 testq(r, r); 8325 jccb(Assembler::equal, done); 8326 leaq(r, Address(r12_heapbase, r, Address::times_8, 0)); 8327 #endif 8328 bind(done); 8329 verify_oop(r, "broken oop in decode_heap_oop"); 8330 } 8331 8332 void MacroAssembler::decode_heap_oop_not_null(Register r) { 8333 assert (UseCompressedOops, "should only be used for compressed headers"); 8334 assert (Universe::heap() != NULL, "java heap should be initialized"); 8335 // Cannot assert, unverified entry point counts instructions (see .ad file) 8336 // vtableStubs also counts instructions in pd_code_size_limit. 8337 // Also do not verify_oop as this is called by verify_oop. 8338 if (Universe::narrow_oop_base() == NULL) { 8339 if (Universe::narrow_oop_shift() != 0) { 8340 assert (LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong"); 8341 shlq(r, LogMinObjAlignmentInBytes); 8342 } 8343 } else { 8344 assert (Address::times_8 == LogMinObjAlignmentInBytes && 8345 Address::times_8 == Universe::narrow_oop_shift(), "decode alg wrong"); 8346 leaq(r, Address(r12_heapbase, r, Address::times_8, 0)); 8347 } 8348 } 8349 8350 void MacroAssembler::decode_heap_oop_not_null(Register dst, Register src) { 8351 assert (UseCompressedOops, "should only be used for compressed headers"); 8352 assert (Universe::heap() != NULL, "java heap should be initialized"); 8353 // Cannot assert, unverified entry point counts instructions (see .ad file) 8354 // vtableStubs also counts instructions in pd_code_size_limit. 8355 // Also do not verify_oop as this is called by verify_oop. 8356 if (Universe::narrow_oop_shift() != 0) { 8357 assert (Address::times_8 == LogMinObjAlignmentInBytes && 8358 Address::times_8 == Universe::narrow_oop_shift(), "decode alg wrong"); 8359 leaq(dst, Address(r12_heapbase, src, Address::times_8, 0)); 8360 } else if (dst != src) { 8361 movq(dst, src); 8362 } 8363 } 8364 8365 void MacroAssembler::set_narrow_oop(Register dst, jobject obj) { 8366 assert (UseCompressedOops, "should only be used for compressed headers"); 8367 assert (Universe::heap() != NULL, "java heap should be initialized"); 8368 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder"); 8369 int oop_index = oop_recorder()->find_index(obj); 8370 RelocationHolder rspec = oop_Relocation::spec(oop_index); 8371 mov_narrow_oop(dst, oop_index, rspec); 8372 } 8373 8374 void MacroAssembler::set_narrow_oop(Address dst, jobject obj) { 8375 assert (UseCompressedOops, "should only be used for compressed headers"); 8376 assert (Universe::heap() != NULL, "java heap should be initialized"); 8377 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder"); 8378 int oop_index = oop_recorder()->find_index(obj); 8379 RelocationHolder rspec = oop_Relocation::spec(oop_index); 8380 mov_narrow_oop(dst, oop_index, rspec); | 8318 Label done; 8319 shlq(r, LogMinObjAlignmentInBytes); 8320 jccb(Assembler::equal, done); 8321 addq(r, r12_heapbase); 8322 #if 0 8323 // alternate decoding probably a wash. 8324 testq(r, r); 8325 jccb(Assembler::equal, done); 8326 leaq(r, Address(r12_heapbase, r, Address::times_8, 0)); 8327 #endif 8328 bind(done); 8329 verify_oop(r, "broken oop in decode_heap_oop"); 8330 } 8331 8332 void MacroAssembler::decode_heap_oop_not_null(Register r) { 8333 assert (UseCompressedOops, "should only be used for compressed headers"); 8334 assert (Universe::heap() != NULL, "java heap should be initialized"); 8335 // Cannot assert, unverified entry point counts instructions (see .ad file) 8336 // vtableStubs also counts instructions in pd_code_size_limit. 8337 // Also do not verify_oop as this is called by verify_oop. 8338 if (Universe::narrow_oop_shift() != 0) { 8339 assert (Address::times_8 == LogMinObjAlignmentInBytes && 8340 Address::times_8 == Universe::narrow_oop_shift(), "decode alg wrong"); 8341 // Don't use Shift since it modifies flags. 8342 leaq(r, Address(r12_heapbase, r, Address::times_8, 0)); 8343 } else { 8344 assert (Universe::narrow_oop_base() == NULL, "sanity"); 8345 } 8346 } 8347 8348 void MacroAssembler::decode_heap_oop_not_null(Register dst, Register src) { 8349 assert (UseCompressedOops, "should only be used for compressed headers"); 8350 assert (Universe::heap() != NULL, "java heap should be initialized"); 8351 // Cannot assert, unverified entry point counts instructions (see .ad file) 8352 // vtableStubs also counts instructions in pd_code_size_limit. 8353 // Also do not verify_oop as this is called by verify_oop. 8354 if (Universe::narrow_oop_shift() != 0) { 8355 assert (Address::times_8 == LogMinObjAlignmentInBytes && 8356 Address::times_8 == Universe::narrow_oop_shift(), "decode alg wrong"); 8357 leaq(dst, Address(r12_heapbase, src, Address::times_8, 0)); 8358 } else if (dst != src) { 8359 assert (Universe::narrow_oop_base() == NULL, "sanity"); 8360 movq(dst, src); 8361 } 8362 } 8363 8364 void MacroAssembler::set_narrow_oop(Register dst, jobject obj) { 8365 assert (UseCompressedOops, "should only be used for compressed headers"); 8366 assert (Universe::heap() != NULL, "java heap should be initialized"); 8367 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder"); 8368 int oop_index = oop_recorder()->find_index(obj); 8369 RelocationHolder rspec = oop_Relocation::spec(oop_index); 8370 mov_narrow_oop(dst, oop_index, rspec); 8371 } 8372 8373 void MacroAssembler::set_narrow_oop(Address dst, jobject obj) { 8374 assert (UseCompressedOops, "should only be used for compressed headers"); 8375 assert (Universe::heap() != NULL, "java heap should be initialized"); 8376 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder"); 8377 int oop_index = oop_recorder()->find_index(obj); 8378 RelocationHolder rspec = oop_Relocation::spec(oop_index); 8379 mov_narrow_oop(dst, oop_index, rspec); |