diff -r 9f669cf29cb0 -r 110501f54a99 src/cpu/sparc/vm/sparc.ad --- 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 @@ // 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 @@ } const RegMask Matcher::method_handle_invoke_SP_save_mask() { - return RegMask(); + return L7_REGP_mask; } %} @@ -2441,6 +2444,16 @@ /*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 // CALL to fixup routine. Fixup routine uses ScopeDesc info to determine // who we intended to call. @@ -9213,6 +9226,7 @@ // Call Java Static Instruction instruct CallStaticJavaDirect( method meth ) %{ match(CallStaticJava); + predicate(! ((CallStaticJavaNode*)n)->is_method_handle_invoke()); effect(USE meth); size(8); @@ -9223,6 +9237,20 @@ 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); +%} + // Call Java Dynamic Instruction instruct CallDynamicJavaDirect( method meth ) %{ match(CallDynamicJava);