< prev index next >

src/cpu/aarch32/vm/templateInterpreter_aarch32.cpp

Print this page
rev 8069 : 8164652: aarch32: C1 port

*** 140,149 **** --- 140,155 ---- __ pop(c_rarg2); } // expression stack must be empty before entering the VM if an // exception happened __ empty_expression_stack(); + // FIXME shouldn't it be in rest of generate_* ? + // rdispatch assumed to cache dispatch table. This code can be called from + // signal handler, so it can't assume execption caller preserved the register, + // so restore it here + __ get_dispatch(); + // FIXME shouldn't get_method be here ? // setup parameters __ lea(c_rarg1, Address((address)name)); if (pass_oop) { __ call_VM(r0, CAST_FROM_FN_PTR(address, InterpreterRuntime::
*** 506,516 **** // check against the current stack bottom __ cmp(sp, r0); __ b(after_frame_check, Assembler::HI); // Remove the incoming args, peeling the machine SP back to where it ! // was in the caller. __ mov(sp, r4); // Note: the restored frame is not necessarily interpreted. // Use the shared runtime version of the StackOverflowError. assert(StubRoutines::throw_StackOverflowError_entry() != NULL, "stub not yet generated"); --- 512,524 ---- // check against the current stack bottom __ cmp(sp, r0); __ b(after_frame_check, Assembler::HI); // Remove the incoming args, peeling the machine SP back to where it ! // was in the caller. This is not strictly necessary, but unless we ! // do so the stack frame may have a garbage FP; this ensures a ! // correct call stack that we can always unwind. __ mov(sp, r4); // Note: the restored frame is not necessarily interpreted. // Use the shared runtime version of the StackOverflowError. assert(StubRoutines::throw_StackOverflowError_entry() != NULL, "stub not yet generated");
*** 1037,1047 **** __ str(rscratch1, Address(rscratch2)); __ reg_printf("before os::is_MP\n"); if (os::is_MP()) { if (UseMembar) { // Force this write out before the read below ! __ dsb(Assembler::SY); } else { // Write serialization page so VM thread can do a pseudo remote membar. // We use the current thread pointer to calculate a thread specific // offset to write to within the page. This minimizes bus traffic // due to cache line collision. --- 1045,1055 ---- __ str(rscratch1, Address(rscratch2)); __ reg_printf("before os::is_MP\n"); if (os::is_MP()) { if (UseMembar) { // Force this write out before the read below ! __ membar(Assembler::AnyAny); } else { // Write serialization page so VM thread can do a pseudo remote membar. // We use the current thread pointer to calculate a thread specific // offset to write to within the page. This minimizes bus traffic // due to cache line collision.
*** 1990,2010 **** // Non-product code #ifndef PRODUCT address TemplateInterpreterGenerator::generate_trace_code(TosState state) { address entry = __ pc(); - __ push(lr); __ push(state); ! __ push(RegSet::range(r0, r12), sp); __ mov(c_rarg2, r0); // Pass itos __ mov(c_rarg3, r1); // Pass ltos/dtos high part __ call_VM(noreg, CAST_FROM_FN_PTR(address, SharedRuntime::trace_bytecode), c_rarg1, c_rarg2, c_rarg3); ! __ pop(RegSet::range(r0, r12), sp); __ pop(state); - __ pop(lr); __ b(lr); // return from result handler return entry; } --- 1998,2017 ---- // Non-product code #ifndef PRODUCT address TemplateInterpreterGenerator::generate_trace_code(TosState state) { address entry = __ pc(); __ push(state); ! // Save all registers on stack, so omit SP and PC ! __ push(RegSet::range(r0, r12) + lr, sp); __ mov(c_rarg2, r0); // Pass itos __ mov(c_rarg3, r1); // Pass ltos/dtos high part __ call_VM(noreg, CAST_FROM_FN_PTR(address, SharedRuntime::trace_bytecode), c_rarg1, c_rarg2, c_rarg3); ! __ pop(RegSet::range(r0, r12) + lr, sp); __ pop(state); __ b(lr); // return from result handler return entry; }
< prev index next >