[aarch64-port-dev ] A miscellany
Andrew Haley
aph at redhat.com
Mon Aug 4 15:52:04 UTC 2014
A bunch of things that were either buggy, Unimplemented(), or generated
poor code.
Andrew.
# HG changeset patch
# User aph
# Date 1407165603 14400
# Mon Aug 04 11:20:03 2014 -0400
# Node ID 08a7c21eaa48859085a7d2c5704c561980a1421a
# Parent 5b248d10f0ae75bf43738120ec9515eb6a78dbd0
Miscellaneous bug fixes.
Implement VtableStub::pd_code_size_limit.
Fix CountCompiledCalls.
Implement MacroAssembler::delayed_value_impl.
Fix MacroAssembler::incrementw and MacroAssembler::increment.
Fix DebugVtables.
Fix VtableStub::pd_code_size_limit.
diff -r 5b248d10f0ae -r 08a7c21eaa48 src/cpu/aarch64/vm/macroAssembler_aarch64.cpp
--- a/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp Thu Jul 31 04:53:53 2014 -0400
+++ b/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp Mon Aug 04 11:20:03 2014 -0400
@@ -735,15 +735,29 @@
while (offset() % modulus != 0) nop();
}
-// these are meant to be no-ops overridden by InterpreterMacroAssembler
-
-void MacroAssembler::check_and_handle_earlyret(Register java_thread) { Unimplemented(); }
-
-void MacroAssembler::check_and_handle_popframe(Register java_thread) { Unimplemented(); }
+// these are no-ops overridden by InterpreterMacroAssembler
+
+void MacroAssembler::check_and_handle_earlyret(Register java_thread) { }
+
+void MacroAssembler::check_and_handle_popframe(Register java_thread) { }
+
RegisterOrConstant MacroAssembler::delayed_value_impl(intptr_t* delayed_value_addr,
Register tmp,
- int offset) { Unimplemented(); return RegisterOrConstant(r0); }
+ int offset) {
+ intptr_t value = *delayed_value_addr;
+ if (value != 0)
+ return RegisterOrConstant(value + offset);
+
+ // load indirectly to solve generation ordering problem
+ ldr(tmp, ExternalAddress((address) delayed_value_addr));
+
+ if (offset != 0)
+ add(tmp, tmp, offset);
+
+ return RegisterOrConstant(tmp);
+}
+
void MacroAssembler:: notify(int type) {
if (type == bytecode_start) {
@@ -1671,7 +1685,7 @@
}
}
-void MacroAssembler::increment(Address dst, int value)
+void MacroAssembler::incrementw(Address dst, int value)
{
assert(!dst.uses(rscratch1), "invalid dst for address increment");
ldrw(rscratch1, dst);
@@ -1679,7 +1693,7 @@
strw(rscratch1, dst);
}
-void MacroAssembler::incrementw(Address dst, int value)
+void MacroAssembler::increment(Address dst, int value)
{
assert(!dst.uses(rscratch1), "invalid dst for address increment");
ldr(rscratch1, dst);
diff -r 5b248d10f0ae -r 08a7c21eaa48 src/cpu/aarch64/vm/vtableStubs_aarch64.cpp
--- a/src/cpu/aarch64/vm/vtableStubs_aarch64.cpp Thu Jul 31 04:53:53 2014 -0400
+++ b/src/cpu/aarch64/vm/vtableStubs_aarch64.cpp Mon Aug 04 11:20:03 2014 -0400
@@ -58,7 +58,8 @@
#ifndef PRODUCT
if (CountCompiledCalls) {
- __ increment(ExternalAddress((address) SharedRuntime::nof_megamorphic_calls_addr()));
+ __ lea(r19, ExternalAddress((address) SharedRuntime::nof_megamorphic_calls_addr()));
+ __ incrementw(Address(r19));
}
#endif
@@ -73,12 +74,14 @@
if (DebugVtables) {
Label L;
// check offset vs vtable length
- __ ldrw(rscratch1, Address(r0, InstanceKlass::vtable_length_offset() * wordSize));
+ __ ldrw(rscratch1, Address(r19, InstanceKlass::vtable_length_offset() * wordSize));
__ cmpw(rscratch1, vtable_index * vtableEntry::size());
__ br(Assembler::GT, L);
+ __ enter();
__ mov(r2, vtable_index);
__ call_VM(noreg,
CAST_FROM_FN_PTR(address, bad_compiled_vtable_index), j_rarg0, r2);
+ __ leave();
__ bind(L);
}
#endif // PRODUCT
@@ -109,9 +112,6 @@
(int)(s->code_end() - __ pc()));
}
guarantee(__ pc() <= s->code_end(), "overflowed buffer");
- // shut the door on sizing bugs
- int slop = 3; // 32-bit offset is this much larger than an 8-bit one
- assert(vtable_index > 10 || __ pc() + slop <= s->code_end(), "room for 32-bit offset");
s->set_exception_points(npe_addr, ame_addr);
return s;
@@ -130,7 +130,8 @@
#ifndef PRODUCT
if (CountCompiledCalls) {
- __ increment(ExternalAddress((address) SharedRuntime::nof_megamorphic_calls_addr()));
+ __ lea(r10, ExternalAddress((address) SharedRuntime::nof_megamorphic_calls_addr()));
+ __ incrementw(Address(r10));
}
#endif
@@ -190,9 +191,6 @@
(int)(s->code_end() - __ pc()));
}
guarantee(__ pc() <= s->code_end(), "overflowed buffer");
- // shut the door on sizing bugs
- int slop = 3; // 32-bit offset is this much larger than an 8-bit one
- assert(itable_index > 10 || __ pc() + slop <= s->code_end(), "room for 32-bit offset");
s->set_exception_points(npe_addr, ame_addr);
return s;
@@ -200,8 +198,49 @@
int VtableStub::pd_code_size_limit(bool is_vtable_stub) {
+ int size = DebugVtables ? 216 : 0;
+ if (CountCompiledCalls)
+ size += 6 * 4;
// FIXME
- return 200;
+ if (is_vtable_stub)
+ size += 52;
+ else
+ size += 104;
+ return size;
+
+ // In order to tune these parameters, run the JVM with VM options
+ // +PrintMiscellaneous and +WizardMode to see information about
+ // actual itable stubs. Run it with -Xmx31G -XX:+UseCompressedOops.
+ //
+ // If Universe::narrow_klass_base is nonzero, decoding a compressed
+ // class can take zeveral instructions. Run it with -Xmx31G
+ // -XX:+UseCompressedOops.
+ //
+ // The JVM98 app. _202_jess has a megamorphic interface call.
+ // The itable code looks like this:
+ // Decoding VtableStub itbl[1]@12
+ // ldr w10, [x1,#8]
+ // lsl x10, x10, #3
+ // ldr w11, [x10,#280]
+ // add x11, x10, x11, uxtx #3
+ // add x11, x11, #0x1b8
+ // ldr x12, [x11]
+ // cmp x9, x12
+ // b.eq success
+ // loop:
+ // cbz x12, throw_icce
+ // add x11, x11, #0x10
+ // ldr x12, [x11]
+ // cmp x9, x12
+ // b.ne loop
+ // success:
+ // ldr x11, [x11,#8]
+ // ldr x12, [x10,x11]
+ // ldr x8, [x12,#72]
+ // br x8
+ // throw_icce:
+ // b throw_ICCE_entry
+
}
int VtableStub::pd_code_alignment() { return 4; }
More information about the aarch64-port-dev
mailing list