Mercurial > hg > truffle
comparison src/cpu/x86/vm/assembler_x86.cpp @ 898:60fea60a6db5
6864914: SPECjvm2008 produces invalid result with zero based Compressed Oops
Summary: Always use "lea" instruction for narrow oop decoding instead of "shift".
Reviewed-by: never
author | kvn |
---|---|
date | Thu, 30 Jul 2009 16:05:56 -0700 |
parents | df6caf649ff7 |
children | 62001a362ce9 |
comparison
equal
deleted
inserted
replaced
897:52898b0c43e9 | 898:60fea60a6db5 |
---|---|
8333 assert (UseCompressedOops, "should only be used for compressed headers"); | 8333 assert (UseCompressedOops, "should only be used for compressed headers"); |
8334 assert (Universe::heap() != NULL, "java heap should be initialized"); | 8334 assert (Universe::heap() != NULL, "java heap should be initialized"); |
8335 // Cannot assert, unverified entry point counts instructions (see .ad file) | 8335 // Cannot assert, unverified entry point counts instructions (see .ad file) |
8336 // vtableStubs also counts instructions in pd_code_size_limit. | 8336 // vtableStubs also counts instructions in pd_code_size_limit. |
8337 // Also do not verify_oop as this is called by verify_oop. | 8337 // Also do not verify_oop as this is called by verify_oop. |
8338 if (Universe::narrow_oop_base() == NULL) { | 8338 if (Universe::narrow_oop_shift() != 0) { |
8339 if (Universe::narrow_oop_shift() != 0) { | 8339 assert (Address::times_8 == LogMinObjAlignmentInBytes && |
8340 assert (LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong"); | 8340 Address::times_8 == Universe::narrow_oop_shift(), "decode alg wrong"); |
8341 shlq(r, LogMinObjAlignmentInBytes); | 8341 // Don't use Shift since it modifies flags. |
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)); | 8342 leaq(r, Address(r12_heapbase, r, Address::times_8, 0)); |
8343 } else { | |
8344 assert (Universe::narrow_oop_base() == NULL, "sanity"); | |
8347 } | 8345 } |
8348 } | 8346 } |
8349 | 8347 |
8350 void MacroAssembler::decode_heap_oop_not_null(Register dst, Register src) { | 8348 void MacroAssembler::decode_heap_oop_not_null(Register dst, Register src) { |
8351 assert (UseCompressedOops, "should only be used for compressed headers"); | 8349 assert (UseCompressedOops, "should only be used for compressed headers"); |
8356 if (Universe::narrow_oop_shift() != 0) { | 8354 if (Universe::narrow_oop_shift() != 0) { |
8357 assert (Address::times_8 == LogMinObjAlignmentInBytes && | 8355 assert (Address::times_8 == LogMinObjAlignmentInBytes && |
8358 Address::times_8 == Universe::narrow_oop_shift(), "decode alg wrong"); | 8356 Address::times_8 == Universe::narrow_oop_shift(), "decode alg wrong"); |
8359 leaq(dst, Address(r12_heapbase, src, Address::times_8, 0)); | 8357 leaq(dst, Address(r12_heapbase, src, Address::times_8, 0)); |
8360 } else if (dst != src) { | 8358 } else if (dst != src) { |
8359 assert (Universe::narrow_oop_base() == NULL, "sanity"); | |
8361 movq(dst, src); | 8360 movq(dst, src); |
8362 } | 8361 } |
8363 } | 8362 } |
8364 | 8363 |
8365 void MacroAssembler::set_narrow_oop(Register dst, jobject obj) { | 8364 void MacroAssembler::set_narrow_oop(Register dst, jobject obj) { |