6934104: JSR 292 needs to support SPARC C2
authortwisti
Tue May 25 02:38:48 2010 -0700 (2 years ago)
changeset 1780110501f54a99
parent 17799f669cf29cb0
child 1782f9a202dd8899
6934104: JSR 292 needs to support SPARC C2
Summary: C2 for SPARC needs to support JSR 292.
Reviewed-by: kvn, never
src/cpu/sparc/vm/runtime_sparc.cpp
src/cpu/sparc/vm/sparc.ad
src/cpu/x86/vm/runtime_x86_32.cpp
src/cpu/x86/vm/sharedRuntime_x86_64.cpp
src/cpu/x86/vm/x86_32.ad
src/cpu/x86/vm/x86_64.ad
--- a/src/cpu/sparc/vm/runtime_sparc.cpp Mon May 24 14:15:14 2010 -0700
+++ b/src/cpu/sparc/vm/runtime_sparc.cpp Tue May 25 02:38:48 2010 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1998-2009 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1998-2010 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -116,6 +116,11 @@ void OptoRuntime::generate_exception_blo
__ mov(O0, G3_scratch); // Move handler address to temp
__ restore();
+ // Restore SP from L7 if the exception PC is a MethodHandle call site.
+ __ lduw(Address(G2_thread, JavaThread::is_method_handle_return_offset()), O7);
+ __ tst(O7);
+ __ movcc(Assembler::notZero, false, Assembler::icc, L7_mh_SP_save, SP);
+
// G3_scratch contains handler address
// Since this may be the deopt blob we must set O7 to look like we returned
// from the original pc that threw the exception
--- a/src/cpu/sparc/vm/sparc.ad Mon May 24 14:15:14 2010 -0700
+++ b/src/cpu/sparc/vm/sparc.ad Tue May 25 02:38:48 2010 -0700
@@ -534,7 +534,10 @@ bool can_branch_register( Node *bol, Nod
// The "return address" is the address of the call instruction, plus 8.
int MachCallStaticJavaNode::ret_addr_offset() {
- return NativeCall::instruction_size; // call; delay slot
+ int offset = NativeCall::instruction_size; // call; delay slot
+ if (_method_handle_invoke)
+ offset += 4; // restore SP
+ return offset;
}
int MachCallDynamicJavaNode::ret_addr_offset() {
@@ -1858,7 +1861,7 @@ RegMask Matcher::modL_proj_mask() {
}
const RegMask Matcher::method_handle_invoke_SP_save_mask() {
- return RegMask();
+ return L7_REGP_mask;
}
%}
@@ -2439,6 +2442,16 @@ encode %{
// The user of this is responsible for ensuring that R_L7 is empty (killed).
emit_call_reloc(cbuf, $meth$$method, relocInfo::runtime_call_type,
/*preserve_g2=*/true, /*force far call*/true);
+ %}
+
+ enc_class preserve_SP %{
+ MacroAssembler _masm(&cbuf);
+ __ mov(SP, L7_mh_SP_save);
+ %}
+
+ enc_class restore_SP %{
+ MacroAssembler _masm(&cbuf);
+ __ mov(L7_mh_SP_save, SP);
%}
enc_class Java_Static_Call (method meth) %{ // JAVA STATIC CALL
@@ -9213,12 +9226,27 @@ instruct safePoint_poll(iRegP poll) %{
// Call Java Static Instruction
instruct CallStaticJavaDirect( method meth ) %{
match(CallStaticJava);
+ predicate(! ((CallStaticJavaNode*)n)->is_method_handle_invoke());
effect(USE meth);
size(8);
ins_cost(CALL_COST);
format %{ "CALL,static ; NOP ==> " %}
ins_encode( Java_Static_Call( meth ), call_epilog );
+ ins_pc_relative(1);
+ ins_pipe(simple_call);
+%}
+
+// Call Java Static Instruction (method handle version)
+instruct CallStaticJavaHandle(method meth, l7RegP l7_mh_SP_save) %{
+ match(CallStaticJava);
+ predicate(((CallStaticJavaNode*)n)->is_method_handle_invoke());
+ effect(USE meth, KILL l7_mh_SP_save);
+
+ size(8);
+ ins_cost(CALL_COST);
+ format %{ "CALL,static/MethodHandle" %}
+ ins_encode(preserve_SP, Java_Static_Call(meth), restore_SP, call_epilog);
ins_pc_relative(1);
ins_pipe(simple_call);
%}
--- a/src/cpu/x86/vm/runtime_x86_32.cpp Mon May 24 14:15:14 2010 -0700
+++ b/src/cpu/x86/vm/runtime_x86_32.cpp Tue May 25 02:38:48 2010 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1998-2009 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1998-2010 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -117,7 +117,7 @@ void OptoRuntime::generate_exception_blo
// Restore SP from BP if the exception PC is a MethodHandle call site.
__ cmpl(Address(rcx, JavaThread::is_method_handle_return_offset()), 0);
- __ cmovptr(Assembler::notEqual, rsp, rbp);
+ __ cmovptr(Assembler::notEqual, rsp, rbp_mh_SP_save);
// We have a handler in rax, (could be deopt blob)
// rdx - throwing pc, deopt blob will need it.
--- a/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Mon May 24 14:15:14 2010 -0700
+++ b/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Tue May 25 02:38:48 2010 -0700
@@ -3305,7 +3305,7 @@ void OptoRuntime::generate_exception_blo
// Restore SP from BP if the exception PC is a MethodHandle call site.
__ cmpl(Address(r15_thread, JavaThread::is_method_handle_return_offset()), 0);
- __ cmovptr(Assembler::notEqual, rsp, rbp);
+ __ cmovptr(Assembler::notEqual, rsp, rbp_mh_SP_save);
// We have a handler in rax (could be deopt blob).
__ mov(r8, rax);
--- a/src/cpu/x86/vm/x86_32.ad Mon May 24 14:15:14 2010 -0700
+++ b/src/cpu/x86/vm/x86_32.ad Tue May 25 02:38:48 2010 -0700
@@ -1841,14 +1841,14 @@ encode %{
MacroAssembler _masm(&cbuf);
// RBP is preserved across all calls, even compiled calls.
// Use it to preserve RSP in places where the callee might change the SP.
- __ movptr(rbp, rsp);
+ __ movptr(rbp_mh_SP_save, rsp);
debug_only(int off1 = cbuf.code_size());
assert(off1 - off0 == preserve_SP_size(), "correct size prediction");
%}
enc_class restore_SP %{
MacroAssembler _masm(&cbuf);
- __ movptr(rsp, rbp);
+ __ movptr(rsp, rbp_mh_SP_save);
%}
enc_class Java_Static_Call (method meth) %{ // JAVA STATIC CALL
@@ -13570,7 +13570,7 @@ instruct CallStaticJavaDirect(method met
// Call Java Static Instruction (method handle version)
// Note: If this code changes, the corresponding ret_addr_offset() and
// compute_padding() functions will have to be adjusted.
-instruct CallStaticJavaHandle(method meth, eBPRegP ebp) %{
+instruct CallStaticJavaHandle(method meth, eBPRegP ebp_mh_SP_save) %{
match(CallStaticJava);
predicate(((CallStaticJavaNode*)n)->is_method_handle_invoke());
effect(USE meth);
--- a/src/cpu/x86/vm/x86_64.ad Mon May 24 14:15:14 2010 -0700
+++ b/src/cpu/x86/vm/x86_64.ad Tue May 25 02:38:48 2010 -0700
@@ -2635,14 +2635,14 @@ encode %{
MacroAssembler _masm(&cbuf);
// RBP is preserved across all calls, even compiled calls.
// Use it to preserve RSP in places where the callee might change the SP.
- __ movptr(rbp, rsp);
+ __ movptr(rbp_mh_SP_save, rsp);
debug_only(int off1 = cbuf.code_size());
assert(off1 - off0 == preserve_SP_size(), "correct size prediction");
%}
enc_class restore_SP %{
MacroAssembler _masm(&cbuf);
- __ movptr(rsp, rbp);
+ __ movptr(rsp, rbp_mh_SP_save);
%}
enc_class Java_Static_Call(method meth)
@@ -12604,7 +12604,7 @@ instruct CallStaticJavaDirect(method met
// Call Java Static Instruction (method handle version)
// Note: If this code changes, the corresponding ret_addr_offset() and
// compute_padding() functions will have to be adjusted.
-instruct CallStaticJavaHandle(method meth, rbp_RegP rbp) %{
+instruct CallStaticJavaHandle(method meth, rbp_RegP rbp_mh_SP_save) %{
match(CallStaticJava);
predicate(((CallStaticJavaNode*) n)->is_method_handle_invoke());
effect(USE meth);