src/cpu/x86/vm/x86_64.ad
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File
*** old/src/cpu/x86/vm/x86_64.ad Wed Jun 4 12:01:45 2008
--- new/src/cpu/x86/vm/x86_64.ad Wed Jun 4 12:01:45 2008
*** 1838,1859 ****
--- 1838,1856 ----
//=============================================================================
#ifndef PRODUCT
void MachUEPNode::format(PhaseRegAlloc* ra_, outputStream* st) const
{
if (UseCompressedOops) {
! st->print_cr("movl rscratch1, [j_rarg0 + oopDesc::klass_offset_in_bytes() #%d]\t", oopDesc::klass_offset_in_bytes());
! st->print_cr("leaq rscratch1, [r12_heapbase, r, Address::times_8, 0]");
! st->print_cr("cmpq rax, rscratch1\t # Inline cache check");
! st->print("subq rax, r12_heapbase\t # encode_heap_oop_not_null(rax)\n\t");
! st->print("shrq rax, %d\n\t", LogMinObjAlignmentInBytes);
! st->print_cr("cmpl rax, [j_rarg0 + oopDesc::klass_offset_in_bytes() #%d]\t"
+ "# Inline cache check", oopDesc::klass_offset_in_bytes());
} else {
st->print_cr("cmpq rax, [j_rarg0 + oopDesc::klass_offset_in_bytes() #%d]\t"
"# Inline cache check", oopDesc::klass_offset_in_bytes());
}
st->print_cr("\tjne SharedRuntime::_ic_miss_stub");
st->print_cr("\tnop");
if (!OptoBreakpoint) {
st->print_cr("\tnop");
}
}
#endif
void MachUEPNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const
{
*** 1860,1901 ****
--- 1857,1887 ----
MacroAssembler masm(&cbuf);
#ifdef ASSERT
uint code_size = cbuf.code_size();
#endif
if (UseCompressedOops) {
! masm.load_klass(rscratch1, j_rarg0);
! masm.cmpq(rax, rscratch1);
! // masm.encode_heap_oop_not_null(rax);
! masm.subq(rax, r12_heapbase);
+ masm.shrq(rax, LogMinObjAlignmentInBytes);
+ masm.cmpl(rax, Address(j_rarg0, oopDesc::klass_offset_in_bytes()));
} else {
masm.cmpq(rax, Address(j_rarg0, oopDesc::klass_offset_in_bytes()));
}
masm.jump_cc(Assembler::notEqual, RuntimeAddress(SharedRuntime::get_ic_miss_stub()));
/* WARNING these NOPs are critical so that verified entry point is properly
! aligned (4 bytes) for patching by NativeJump::patch_verified_entry() */
int nops_cnt = 1;
if (!OptoBreakpoint) {
// Leave space for int3
nops_cnt += 1;
}
if (UseCompressedOops) {
// ??? divisible by 4 is aligned?
nops_cnt += 1;
}
masm.nop(nops_cnt);
assert(cbuf.code_size() - code_size == size(ra_),
! "checking code size of inline cache node");
+ // C2 aligns Start block (verified entry point) to InteriorEntryAlignment
! assert((InteriorEntryAlignment & 0x3) == 0, "verified entry point should be aligned to 4 bytes");
}
uint MachUEPNode::size(PhaseRegAlloc* ra_) const
{
if (UseCompressedOops) {
return OptoBreakpoint ? 19 : 20;
} else {
return OptoBreakpoint ? 11 : 12;
}
+ return MachNode::size(ra_); // too many variables; just compute it
+ // the hard way
}
//=============================================================================
uint size_exception_handler()
*** 6147,6157 ****
--- 6133,6143 ----
instruct loadNKlass(rRegN dst, memory mem)
%{
match(Set dst (LoadNKlass mem));
ins_cost(125); // XXX
- format %{ "movl $dst, $mem\t# compressed klass ptr\n\t" %}
ins_encode %{
Address addr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp);
Register dst = as_Register($dst$$reg);
__ movl(dst, addr);
%}
src/cpu/x86/vm/x86_64.ad
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File