annotate src/cpu/x86/vm/methodHandles_x86.cpp @ 15388:769fc3629f59

Add phase FlowSensitiveReductionPhase. It is possible to remove GuardingPiNodes, CheckCastNodes, and FixedGuards during HighTier under certain conditions (control-flow sensitive conditions). The phase added in this commit (FlowSensitiveReductionPhase) does that, and in addition replaces usages with "downcasting" PiNodes when possible thus resulting in more precise object stamps (e.g., non-null). Finally, usages of floating, side-effects free, expressions are also simplified (as per control-flow sensitive conditions). The newly added phase runs only during HighTier and can be deactivated using Graal option FlowSensitiveReduction (it is active by default).
author Miguel Garcia <miguel.m.garcia@oracle.com>
date Fri, 25 Apr 2014 16:50:52 +0200
parents 268e7a2178d7
children 78bbf4d43a14
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
1 /*
12332
dc261f466b6d 8025260: Methodhandles/JSR292: NullPointerException (NPE) thrown instead of AbstractMethodError (AME)
drchase
parents: 9060
diff changeset
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
4 *
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
7 * published by the Free Software Foundation.
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
8 *
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
13 * accompanied this code).
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
14 *
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1507
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1507
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1507
diff changeset
21 * questions.
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
22 *
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
23 */
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1872
diff changeset
25 #include "precompiled.hpp"
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 6847
diff changeset
26 #include "asm/macroAssembler.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1872
diff changeset
27 #include "interpreter/interpreter.hpp"
3755
5cf771a79037 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3753
diff changeset
28 #include "interpreter/interpreterRuntime.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1872
diff changeset
29 #include "memory/allocation.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1872
diff changeset
30 #include "prims/methodHandles.hpp"
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
31
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
32 #define __ _masm->
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
33
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1552
diff changeset
34 #ifdef PRODUCT
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1552
diff changeset
35 #define BLOCK_COMMENT(str) /* nothing */
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
36 #define STOP(error) stop(error)
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1552
diff changeset
37 #else
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1552
diff changeset
38 #define BLOCK_COMMENT(str) __ block_comment(str)
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
39 #define STOP(error) block_comment(error); __ stop(error)
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1552
diff changeset
40 #endif
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1552
diff changeset
41
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1552
diff changeset
42 #define BIND(label) bind(label); BLOCK_COMMENT(#label ":")
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1552
diff changeset
43
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
44 void MethodHandles::load_klass_from_Class(MacroAssembler* _masm, Register klass_reg) {
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
45 if (VerifyMethodHandles)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
46 verify_klass(_masm, klass_reg, SystemDictionary::WK_KLASS_ENUM_NAME(java_lang_Class),
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
47 "MH argument is a Class");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
48 __ movptr(klass_reg, Address(klass_reg, java_lang_Class::klass_offset_in_bytes()));
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
49 }
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
50
3388
a80577f854f9 7045513: JSR 292 inlining causes crashes in methodHandleWalk.cpp
never
parents: 3371
diff changeset
51 #ifdef ASSERT
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
52 static int check_nonzero(const char* xname, int x) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
53 assert(x != 0, err_msg("%s should be nonzero", xname));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
54 return x;
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
55 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
56 #define NONZERO(x) check_nonzero(#x, x)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
57 #else //ASSERT
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
58 #define NONZERO(x) (x)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
59 #endif //ASSERT
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
60
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
61 #ifdef ASSERT
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
62 void MethodHandles::verify_klass(MacroAssembler* _masm,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
63 Register obj, SystemDictionary::WKID klass_id,
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
64 const char* error_message) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
65 Klass** klass_addr = SystemDictionary::well_known_klass_addr(klass_id);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
66 KlassHandle klass = SystemDictionary::well_known_klass(klass_id);
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
67 Register temp = rdi;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
68 Register temp2 = noreg;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
69 LP64_ONLY(temp2 = rscratch1); // used by MacroAssembler::cmpptr
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
70 Label L_ok, L_bad;
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
71 BLOCK_COMMENT("verify_klass {");
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
72 __ verify_oop(obj);
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
73 __ testptr(obj, obj);
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
74 __ jcc(Assembler::zero, L_bad);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
75 __ push(temp); if (temp2 != noreg) __ push(temp2);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
76 #define UNPUSH { if (temp2 != noreg) __ pop(temp2); __ pop(temp); }
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
77 __ load_klass(temp, obj);
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
78 __ cmpptr(temp, ExternalAddress((address) klass_addr));
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
79 __ jcc(Assembler::equal, L_ok);
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
80 intptr_t super_check_offset = klass->super_check_offset();
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
81 __ movptr(temp, Address(temp, super_check_offset));
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
82 __ cmpptr(temp, ExternalAddress((address) klass_addr));
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
83 __ jcc(Assembler::equal, L_ok);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
84 UNPUSH;
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
85 __ bind(L_bad);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
86 __ STOP(error_message);
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
87 __ BIND(L_ok);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
88 UNPUSH;
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
89 BLOCK_COMMENT("} verify_klass");
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
90 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
91
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
92 void MethodHandles::verify_ref_kind(MacroAssembler* _masm, int ref_kind, Register member_reg, Register temp) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
93 Label L;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
94 BLOCK_COMMENT("verify_ref_kind {");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
95 __ movl(temp, Address(member_reg, NONZERO(java_lang_invoke_MemberName::flags_offset_in_bytes())));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
96 __ shrl(temp, java_lang_invoke_MemberName::MN_REFERENCE_KIND_SHIFT);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
97 __ andl(temp, java_lang_invoke_MemberName::MN_REFERENCE_KIND_MASK);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
98 __ cmpl(temp, ref_kind);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
99 __ jcc(Assembler::equal, L);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
100 { char* buf = NEW_C_HEAP_ARRAY(char, 100, mtInternal);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
101 jio_snprintf(buf, 100, "verify_ref_kind expected %x", ref_kind);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
102 if (ref_kind == JVM_REF_invokeVirtual ||
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
103 ref_kind == JVM_REF_invokeSpecial)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
104 // could do this for all ref_kinds, but would explode assembly code size
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
105 trace_method_handle(_masm, buf);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
106 __ STOP(buf);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
107 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
108 BLOCK_COMMENT("} verify_ref_kind");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
109 __ bind(L);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
110 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
111
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
112 #endif //ASSERT
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
113
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
114 void MethodHandles::jump_from_method_handle(MacroAssembler* _masm, Register method, Register temp,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
115 bool for_compiler_entry) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
116 assert(method == rbx, "interpreter calling convention");
12332
dc261f466b6d 8025260: Methodhandles/JSR292: NullPointerException (NPE) thrown instead of AbstractMethodError (AME)
drchase
parents: 9060
diff changeset
117
dc261f466b6d 8025260: Methodhandles/JSR292: NullPointerException (NPE) thrown instead of AbstractMethodError (AME)
drchase
parents: 9060
diff changeset
118 Label L_no_such_method;
dc261f466b6d 8025260: Methodhandles/JSR292: NullPointerException (NPE) thrown instead of AbstractMethodError (AME)
drchase
parents: 9060
diff changeset
119 __ testptr(rbx, rbx);
dc261f466b6d 8025260: Methodhandles/JSR292: NullPointerException (NPE) thrown instead of AbstractMethodError (AME)
drchase
parents: 9060
diff changeset
120 __ jcc(Assembler::zero, L_no_such_method);
dc261f466b6d 8025260: Methodhandles/JSR292: NullPointerException (NPE) thrown instead of AbstractMethodError (AME)
drchase
parents: 9060
diff changeset
121
6740
75f33eecc1b3 7196681: NPG: Some JSR 292 tests crash in Windows exception handler
coleenp
parents: 6725
diff changeset
122 __ verify_method_ptr(method);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
123
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
124 if (!for_compiler_entry && JvmtiExport::can_post_interpreter_events()) {
3808
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
125 Label run_compiled_code;
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
126 // JVMTI events, such as single-stepping, are implemented partly by avoiding running
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
127 // compiled code in threads for which the event is enabled. Check here for
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
128 // interp_only_mode if these events CAN be enabled.
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
129 #ifdef _LP64
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
130 Register rthread = r15_thread;
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
131 #else
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
132 Register rthread = temp;
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
133 __ get_thread(rthread);
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
134 #endif
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
135 // interp_only is an int, on little endian it is sufficient to test the byte only
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
136 // Is a cmpl faster?
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
137 __ cmpb(Address(rthread, JavaThread::interp_only_mode_offset()), 0);
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
138 __ jccb(Assembler::zero, run_compiled_code);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
139 __ jmp(Address(method, Method::interpreter_entry_offset()));
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
140 __ BIND(run_compiled_code);
3808
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
141 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
142
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
143 const ByteSize entry_offset = for_compiler_entry ? Method::from_compiled_offset() :
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
144 Method::from_interpreted_offset();
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
145 __ jmp(Address(method, entry_offset));
12332
dc261f466b6d 8025260: Methodhandles/JSR292: NullPointerException (NPE) thrown instead of AbstractMethodError (AME)
drchase
parents: 9060
diff changeset
146
dc261f466b6d 8025260: Methodhandles/JSR292: NullPointerException (NPE) thrown instead of AbstractMethodError (AME)
drchase
parents: 9060
diff changeset
147 __ bind(L_no_such_method);
dc261f466b6d 8025260: Methodhandles/JSR292: NullPointerException (NPE) thrown instead of AbstractMethodError (AME)
drchase
parents: 9060
diff changeset
148 __ jump(RuntimeAddress(StubRoutines::throw_AbstractMethodError_entry()));
3808
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
149 }
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
150
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
151 void MethodHandles::jump_to_lambda_form(MacroAssembler* _masm,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
152 Register recv, Register method_temp,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
153 Register temp2,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
154 bool for_compiler_entry) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
155 BLOCK_COMMENT("jump_to_lambda_form {");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
156 // This is the initial entry point of a lazy method handle.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
157 // After type checking, it picks up the invoker from the LambdaForm.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
158 assert_different_registers(recv, method_temp, temp2);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
159 assert(recv != noreg, "required register");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
160 assert(method_temp == rbx, "required register for loading method");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
161
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
162 //NOT_PRODUCT({ FlagSetting fs(TraceMethodHandles, true); trace_method_handle(_masm, "LZMH"); });
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
163
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
164 // Load the invoker, as MH -> MH.form -> LF.vmentry
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
165 __ verify_oop(recv);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
166 __ load_heap_oop(method_temp, Address(recv, NONZERO(java_lang_invoke_MethodHandle::form_offset_in_bytes())));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
167 __ verify_oop(method_temp);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
168 __ load_heap_oop(method_temp, Address(method_temp, NONZERO(java_lang_invoke_LambdaForm::vmentry_offset_in_bytes())));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
169 __ verify_oop(method_temp);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
170 // the following assumes that a Method* is normally compressed in the vmtarget field:
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
171 __ movptr(method_temp, Address(method_temp, NONZERO(java_lang_invoke_MemberName::vmtarget_offset_in_bytes())));
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
172
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
173 if (VerifyMethodHandles && !for_compiler_entry) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
174 // make sure recv is already on stack
7402
fd74228fd5ca 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 7199
diff changeset
175 __ movptr(temp2, Address(method_temp, Method::const_offset()));
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
176 __ load_sized_value(temp2,
7402
fd74228fd5ca 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 7199
diff changeset
177 Address(temp2, ConstMethod::size_of_parameters_offset()),
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
178 sizeof(u2), /*is_signed*/ false);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
179 // assert(sizeof(u2) == sizeof(Method::_size_of_parameters), "");
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
180 Label L;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
181 __ cmpptr(recv, __ argument_address(temp2, -1));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
182 __ jcc(Assembler::equal, L);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
183 __ movptr(rax, __ argument_address(temp2, -1));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
184 __ STOP("receiver not on stack");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
185 __ BIND(L);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
186 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
187
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
188 jump_from_method_handle(_masm, method_temp, temp2, for_compiler_entry);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
189 BLOCK_COMMENT("} jump_to_lambda_form");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
190 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
191
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
192
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
193 // Code generation
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
194 address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler* _masm,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
195 vmIntrinsics::ID iid) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
196 const bool not_for_compiler_entry = false; // this is the interpreter entry
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
197 assert(is_signature_polymorphic(iid), "expected invoke iid");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
198 if (iid == vmIntrinsics::_invokeGeneric ||
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
199 iid == vmIntrinsics::_compiledLambdaForm) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
200 // Perhaps surprisingly, the symbolic references visible to Java are not directly used.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
201 // They are linked to Java-generated adapters via MethodHandleNatives.linkMethod.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
202 // They all allow an appendix argument.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
203 __ hlt(); // empty stubs make SG sick
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
204 return NULL;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
205 }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
206
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
207 // rsi/r13: sender SP (must preserve; see prepare_to_jump_from_interpreted)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
208 // rbx: Method*
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
209 // rdx: argument locator (parameter slot count, added to rsp)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
210 // rcx: used as temp to hold mh or receiver
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
211 // rax, rdi: garbage temps, blown away
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
212 Register rdx_argp = rdx; // argument list ptr, live on error paths
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
213 Register rax_temp = rax;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
214 Register rcx_mh = rcx; // MH receiver; dies quickly and is recycled
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
215 Register rbx_method = rbx; // eventual target of this invocation
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
216
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
217 // here's where control starts out:
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
218 __ align(CodeEntryAlignment);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
219 address entry_point = __ pc();
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
220
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
221 if (VerifyMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
222 Label L;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
223 BLOCK_COMMENT("verify_intrinsic_id {");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
224 __ cmpb(Address(rbx_method, Method::intrinsic_id_offset_in_bytes()), (int) iid);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
225 __ jcc(Assembler::equal, L);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
226 if (iid == vmIntrinsics::_linkToVirtual ||
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
227 iid == vmIntrinsics::_linkToSpecial) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
228 // could do this for all kinds, but would explode assembly code size
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
229 trace_method_handle(_masm, "bad Method*::intrinsic_id");
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
230 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
231 __ STOP("bad Method*::intrinsic_id");
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
232 __ bind(L);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
233 BLOCK_COMMENT("} verify_intrinsic_id");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
234 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
235
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
236 // First task: Find out how big the argument list is.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
237 Address rdx_first_arg_addr;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
238 int ref_kind = signature_polymorphic_intrinsic_ref_kind(iid);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
239 assert(ref_kind != 0 || iid == vmIntrinsics::_invokeBasic, "must be _invokeBasic or a linkTo intrinsic");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
240 if (ref_kind == 0 || MethodHandles::ref_kind_has_receiver(ref_kind)) {
7402
fd74228fd5ca 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 7199
diff changeset
241 __ movptr(rdx_argp, Address(rbx_method, Method::const_offset()));
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
242 __ load_sized_value(rdx_argp,
7402
fd74228fd5ca 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 7199
diff changeset
243 Address(rdx_argp, ConstMethod::size_of_parameters_offset()),
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
244 sizeof(u2), /*is_signed*/ false);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
245 // assert(sizeof(u2) == sizeof(Method::_size_of_parameters), "");
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
246 rdx_first_arg_addr = __ argument_address(rdx_argp, -1);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
247 } else {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
248 DEBUG_ONLY(rdx_argp = noreg);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
249 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
250
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
251 if (!is_signature_polymorphic_static(iid)) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
252 __ movptr(rcx_mh, rdx_first_arg_addr);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
253 DEBUG_ONLY(rdx_argp = noreg);
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
254 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
255
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
256 // rdx_first_arg_addr is live!
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
257
6847
65d07d9ee446 8000263: JSR 292: signature types may appear to be unloaded
twisti
parents: 6790
diff changeset
258 trace_method_handle_interpreter_entry(_masm, iid);
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1552
diff changeset
259
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
260 if (iid == vmIntrinsics::_invokeBasic) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
261 generate_method_handle_dispatch(_masm, iid, rcx_mh, noreg, not_for_compiler_entry);
3755
5cf771a79037 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3753
diff changeset
262
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
263 } else {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
264 // Adjust argument list by popping the trailing MemberName argument.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
265 Register rcx_recv = noreg;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
266 if (MethodHandles::ref_kind_has_receiver(ref_kind)) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
267 // Load the receiver (not the MH; the actual MemberName's receiver) up from the interpreter stack.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
268 __ movptr(rcx_recv = rcx, rdx_first_arg_addr);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
269 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
270 DEBUG_ONLY(rdx_argp = noreg);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
271 Register rbx_member = rbx_method; // MemberName ptr; incoming method ptr is dead now
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
272 __ pop(rax_temp); // return address
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
273 __ pop(rbx_member); // extract last argument
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
274 __ push(rax_temp); // re-push return address
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
275 generate_method_handle_dispatch(_masm, iid, rcx_recv, rbx_member, not_for_compiler_entry);
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1552
diff changeset
276 }
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1552
diff changeset
277
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
278 return entry_point;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
279 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
280
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
281 void MethodHandles::generate_method_handle_dispatch(MacroAssembler* _masm,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
282 vmIntrinsics::ID iid,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
283 Register receiver_reg,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
284 Register member_reg,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
285 bool for_compiler_entry) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
286 assert(is_signature_polymorphic(iid), "expected invoke iid");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
287 Register rbx_method = rbx; // eventual target of this invocation
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
288 // temps used in this code are not used in *either* compiled or interpreted calling sequences
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
289 #ifdef _LP64
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
290 Register temp1 = rscratch1;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
291 Register temp2 = rscratch2;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
292 Register temp3 = rax;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
293 if (for_compiler_entry) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
294 assert(receiver_reg == (iid == vmIntrinsics::_linkToStatic ? noreg : j_rarg0), "only valid assignment");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
295 assert_different_registers(temp1, j_rarg0, j_rarg1, j_rarg2, j_rarg3, j_rarg4, j_rarg5);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
296 assert_different_registers(temp2, j_rarg0, j_rarg1, j_rarg2, j_rarg3, j_rarg4, j_rarg5);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
297 assert_different_registers(temp3, j_rarg0, j_rarg1, j_rarg2, j_rarg3, j_rarg4, j_rarg5);
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
298 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
299 #else
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
300 Register temp1 = (for_compiler_entry ? rsi : rdx);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
301 Register temp2 = rdi;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
302 Register temp3 = rax;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
303 if (for_compiler_entry) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
304 assert(receiver_reg == (iid == vmIntrinsics::_linkToStatic ? noreg : rcx), "only valid assignment");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
305 assert_different_registers(temp1, rcx, rdx);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
306 assert_different_registers(temp2, rcx, rdx);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
307 assert_different_registers(temp3, rcx, rdx);
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
308 }
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
309 #endif
6790
2cb2f30450c7 7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents: 6740
diff changeset
310 else {
2cb2f30450c7 7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents: 6740
diff changeset
311 assert_different_registers(temp1, temp2, temp3, saved_last_sp_register()); // don't trash lastSP
2cb2f30450c7 7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents: 6740
diff changeset
312 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
313 assert_different_registers(temp1, temp2, temp3, receiver_reg);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
314 assert_different_registers(temp1, temp2, temp3, member_reg);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
315
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
316 if (iid == vmIntrinsics::_invokeBasic) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
317 // indirect through MH.form.vmentry.vmtarget
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
318 jump_to_lambda_form(_masm, receiver_reg, rbx_method, temp1, for_compiler_entry);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
319
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
320 } else {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
321 // The method is a member invoker used by direct method handles.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
322 if (VerifyMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
323 // make sure the trailing argument really is a MemberName (caller responsibility)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
324 verify_klass(_masm, member_reg, SystemDictionary::WK_KLASS_ENUM_NAME(java_lang_invoke_MemberName),
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
325 "MemberName required for invokeVirtual etc.");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
326 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
327
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
328 Address member_clazz( member_reg, NONZERO(java_lang_invoke_MemberName::clazz_offset_in_bytes()));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
329 Address member_vmindex( member_reg, NONZERO(java_lang_invoke_MemberName::vmindex_offset_in_bytes()));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
330 Address member_vmtarget( member_reg, NONZERO(java_lang_invoke_MemberName::vmtarget_offset_in_bytes()));
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
331
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
332 Register temp1_recv_klass = temp1;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
333 if (iid != vmIntrinsics::_linkToStatic) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
334 __ verify_oop(receiver_reg);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
335 if (iid == vmIntrinsics::_linkToSpecial) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
336 // Don't actually load the klass; just null-check the receiver.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
337 __ null_check(receiver_reg);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
338 } else {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
339 // load receiver klass itself
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
340 __ null_check(receiver_reg, oopDesc::klass_offset_in_bytes());
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
341 __ load_klass(temp1_recv_klass, receiver_reg);
6740
75f33eecc1b3 7196681: NPG: Some JSR 292 tests crash in Windows exception handler
coleenp
parents: 6725
diff changeset
342 __ verify_klass_ptr(temp1_recv_klass);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
343 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
344 BLOCK_COMMENT("check_receiver {");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
345 // The receiver for the MemberName must be in receiver_reg.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
346 // Check the receiver against the MemberName.clazz
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
347 if (VerifyMethodHandles && iid == vmIntrinsics::_linkToSpecial) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
348 // Did not load it above...
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
349 __ load_klass(temp1_recv_klass, receiver_reg);
6740
75f33eecc1b3 7196681: NPG: Some JSR 292 tests crash in Windows exception handler
coleenp
parents: 6725
diff changeset
350 __ verify_klass_ptr(temp1_recv_klass);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
351 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
352 if (VerifyMethodHandles && iid != vmIntrinsics::_linkToInterface) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
353 Label L_ok;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
354 Register temp2_defc = temp2;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
355 __ load_heap_oop(temp2_defc, member_clazz);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
356 load_klass_from_Class(_masm, temp2_defc);
6740
75f33eecc1b3 7196681: NPG: Some JSR 292 tests crash in Windows exception handler
coleenp
parents: 6725
diff changeset
357 __ verify_klass_ptr(temp2_defc);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
358 __ check_klass_subtype(temp1_recv_klass, temp2_defc, temp3, L_ok);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
359 // If we get here, the type check failed!
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
360 __ STOP("receiver class disagrees with MemberName.clazz");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
361 __ bind(L_ok);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
362 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
363 BLOCK_COMMENT("} check_receiver");
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
364 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
365 if (iid == vmIntrinsics::_linkToSpecial ||
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
366 iid == vmIntrinsics::_linkToStatic) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
367 DEBUG_ONLY(temp1_recv_klass = noreg); // these guys didn't load the recv_klass
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
368 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
369
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
370 // Live registers at this point:
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
371 // member_reg - MemberName that was the trailing argument
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
372 // temp1_recv_klass - klass of stacked receiver, if needed
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
373 // rsi/r13 - interpreter linkage (if interpreted)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
374 // rcx, rdx, rsi, rdi, r8, r8 - compiler arguments (if compiled)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
375
6790
2cb2f30450c7 7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents: 6740
diff changeset
376 Label L_incompatible_class_change_error;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
377 switch (iid) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
378 case vmIntrinsics::_linkToSpecial:
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
379 if (VerifyMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
380 verify_ref_kind(_masm, JVM_REF_invokeSpecial, member_reg, temp3);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
381 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
382 __ movptr(rbx_method, member_vmtarget);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
383 break;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
384
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
385 case vmIntrinsics::_linkToStatic:
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
386 if (VerifyMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
387 verify_ref_kind(_masm, JVM_REF_invokeStatic, member_reg, temp3);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
388 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
389 __ movptr(rbx_method, member_vmtarget);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
390 break;
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
391
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
392 case vmIntrinsics::_linkToVirtual:
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
393 {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
394 // same as TemplateTable::invokevirtual,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
395 // minus the CP setup and profiling:
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
396
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
397 if (VerifyMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
398 verify_ref_kind(_masm, JVM_REF_invokeVirtual, member_reg, temp3);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
399 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
400
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
401 // pick out the vtable index from the MemberName, and then we can discard it:
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
402 Register temp2_index = temp2;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
403 __ movptr(temp2_index, member_vmindex);
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
404
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
405 if (VerifyMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
406 Label L_index_ok;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
407 __ cmpl(temp2_index, 0);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
408 __ jcc(Assembler::greaterEqual, L_index_ok);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
409 __ STOP("no virtual index");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
410 __ BIND(L_index_ok);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
411 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
412
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
413 // Note: The verifier invariants allow us to ignore MemberName.clazz and vmtarget
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
414 // at this point. And VerifyMethodHandles has already checked clazz, if needed.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
415
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
416 // get target Method* & entry point
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
417 __ lookup_virtual_method(temp1_recv_klass, temp2_index, rbx_method);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
418 break;
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
419 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
420
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
421 case vmIntrinsics::_linkToInterface:
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
422 {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
423 // same as TemplateTable::invokeinterface
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
424 // (minus the CP setup and profiling, with different argument motion)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
425 if (VerifyMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
426 verify_ref_kind(_masm, JVM_REF_invokeInterface, member_reg, temp3);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
427 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
428
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
429 Register temp3_intf = temp3;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
430 __ load_heap_oop(temp3_intf, member_clazz);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
431 load_klass_from_Class(_masm, temp3_intf);
6740
75f33eecc1b3 7196681: NPG: Some JSR 292 tests crash in Windows exception handler
coleenp
parents: 6725
diff changeset
432 __ verify_klass_ptr(temp3_intf);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
433
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
434 Register rbx_index = rbx_method;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
435 __ movptr(rbx_index, member_vmindex);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
436 if (VerifyMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
437 Label L;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
438 __ cmpl(rbx_index, 0);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
439 __ jcc(Assembler::greaterEqual, L);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
440 __ STOP("invalid vtable index for MH.invokeInterface");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
441 __ bind(L);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
442 }
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
443
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
444 // given intf, index, and recv klass, dispatch to the implementation method
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
445 __ lookup_interface_method(temp1_recv_klass, temp3_intf,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
446 // note: next two args must be the same:
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
447 rbx_index, rbx_method,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
448 temp2,
6790
2cb2f30450c7 7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents: 6740
diff changeset
449 L_incompatible_class_change_error);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
450 break;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
451 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
452
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
453 default:
6790
2cb2f30450c7 7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents: 6740
diff changeset
454 fatal(err_msg_res("unexpected intrinsic %d: %s", iid, vmIntrinsics::name_at(iid)));
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
455 break;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
456 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
457
6790
2cb2f30450c7 7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents: 6740
diff changeset
458 // Live at this point:
2cb2f30450c7 7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents: 6740
diff changeset
459 // rbx_method
2cb2f30450c7 7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents: 6740
diff changeset
460 // rsi/r13 (if interpreted)
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
461
6790
2cb2f30450c7 7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents: 6740
diff changeset
462 // After figuring out which concrete method to call, jump into it.
2cb2f30450c7 7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents: 6740
diff changeset
463 // Note that this works in the interpreter with no data motion.
2cb2f30450c7 7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents: 6740
diff changeset
464 // But the compiled version will require that rcx_recv be shifted out.
2cb2f30450c7 7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents: 6740
diff changeset
465 __ verify_method_ptr(rbx_method);
2cb2f30450c7 7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents: 6740
diff changeset
466 jump_from_method_handle(_masm, rbx_method, temp1, for_compiler_entry);
2cb2f30450c7 7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents: 6740
diff changeset
467
2cb2f30450c7 7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents: 6740
diff changeset
468 if (iid == vmIntrinsics::_linkToInterface) {
2cb2f30450c7 7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents: 6740
diff changeset
469 __ bind(L_incompatible_class_change_error);
2cb2f30450c7 7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents: 6740
diff changeset
470 __ jump(RuntimeAddress(StubRoutines::throw_IncompatibleClassChangeError_entry()));
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
471 }
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
472 }
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
473 }
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
474
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
475 #ifndef PRODUCT
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
476 void trace_method_handle_stub(const char* adaptername,
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
477 oop mh,
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
478 intptr_t* saved_regs,
4939
45a1bf98f1bb 7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents: 4874
diff changeset
479 intptr_t* entry_sp) {
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
480 // called as a leaf from native code: do not block the JVM!
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
481 bool has_mh = (strstr(adaptername, "/static") == NULL &&
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
482 strstr(adaptername, "linkTo") == NULL); // static linkers don't have MH
4939
45a1bf98f1bb 7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents: 4874
diff changeset
483 const char* mh_reg_name = has_mh ? "rcx_mh" : "rcx";
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
484 tty->print_cr("MH %s %s="PTR_FORMAT" sp="PTR_FORMAT,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
485 adaptername, mh_reg_name,
12316
190899198332 7195622: CheckUnhandledOops has limited usefulness now
hseigel
parents: 9060
diff changeset
486 (void *)mh, entry_sp);
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
487
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1552
diff changeset
488 if (Verbose) {
4939
45a1bf98f1bb 7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents: 4874
diff changeset
489 tty->print_cr("Registers:");
45a1bf98f1bb 7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents: 4874
diff changeset
490 const int saved_regs_count = RegisterImpl::number_of_registers;
45a1bf98f1bb 7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents: 4874
diff changeset
491 for (int i = 0; i < saved_regs_count; i++) {
45a1bf98f1bb 7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents: 4874
diff changeset
492 Register r = as_Register(i);
45a1bf98f1bb 7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents: 4874
diff changeset
493 // The registers are stored in reverse order on the stack (by pusha).
45a1bf98f1bb 7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents: 4874
diff changeset
494 tty->print("%3s=" PTR_FORMAT, r->name(), saved_regs[((saved_regs_count - 1) - i)]);
45a1bf98f1bb 7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents: 4874
diff changeset
495 if ((i + 1) % 4 == 0) {
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
496 tty->cr();
4939
45a1bf98f1bb 7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents: 4874
diff changeset
497 } else {
45a1bf98f1bb 7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents: 4874
diff changeset
498 tty->print(", ");
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
499 }
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
500 }
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
501 tty->cr();
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
502
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
503 {
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
504 // dumping last frame with frame::describe
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
505
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
506 JavaThread* p = JavaThread::active();
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
507
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
508 ResourceMark rm;
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
509 PRESERVE_EXCEPTION_MARK; // may not be needed by safer and unexpensive here
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
510 FrameValues values;
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
511
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
512 // Note: We want to allow trace_method_handle from any call site.
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
513 // While trace_method_handle creates a frame, it may be entered
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
514 // without a PC on the stack top (e.g. not just after a call).
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
515 // Walking that frame could lead to failures due to that invalid PC.
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
516 // => carefully detect that frame when doing the stack walking
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
517
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
518 // Current C frame
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
519 frame cur_frame = os::current_frame();
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
520
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
521 // Robust search of trace_calling_frame (independant of inlining).
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
522 // Assumes saved_regs comes from a pusha in the trace_calling_frame.
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
523 assert(cur_frame.sp() < saved_regs, "registers not saved on stack ?");
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
524 frame trace_calling_frame = os::get_sender_for_C_frame(&cur_frame);
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
525 while (trace_calling_frame.fp() < saved_regs) {
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
526 trace_calling_frame = os::get_sender_for_C_frame(&trace_calling_frame);
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
527 }
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
528
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
529 // safely create a frame and call frame::describe
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
530 intptr_t *dump_sp = trace_calling_frame.sender_sp();
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
531 intptr_t *dump_fp = trace_calling_frame.link();
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
532
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
533 bool walkable = has_mh; // whether the traced frame shoud be walkable
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
534
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
535 if (walkable) {
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
536 // The previous definition of walkable may have to be refined
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
537 // if new call sites cause the next frame constructor to start
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
538 // failing. Alternatively, frame constructors could be
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
539 // modified to support the current or future non walkable
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
540 // frames (but this is more intrusive and is not considered as
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
541 // part of this RFE, which will instead use a simpler output).
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
542 frame dump_frame = frame(dump_sp, dump_fp);
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
543 dump_frame.describe(values, 1);
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
544 } else {
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
545 // Stack may not be walkable (invalid PC above FP):
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
546 // Add descriptions without building a Java frame to avoid issues
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
547 values.describe(-1, dump_fp, "fp for #1 <not parsed, cannot trust pc>");
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
548 values.describe(-1, dump_sp, "sp for #1");
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
549 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
550 values.describe(-1, entry_sp, "raw top of stack");
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
551
4939
45a1bf98f1bb 7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents: 4874
diff changeset
552 tty->print_cr("Stack layout:");
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
553 values.print(p);
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
554 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
555 if (has_mh && mh->is_oop()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
556 mh->print();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
557 if (java_lang_invoke_MethodHandle::is_instance(mh)) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
558 if (java_lang_invoke_MethodHandle::form_offset_in_bytes() != 0)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
559 java_lang_invoke_MethodHandle::form(mh)->print();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
560 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4939
diff changeset
561 }
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1552
diff changeset
562 }
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1552
diff changeset
563 }
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
564
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
565 // The stub wraps the arguments in a struct on the stack to avoid
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
566 // dealing with the different calling conventions for passing 6
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
567 // arguments.
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
568 struct MethodHandleStubArguments {
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
569 const char* adaptername;
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
570 oopDesc* mh;
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
571 intptr_t* saved_regs;
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
572 intptr_t* entry_sp;
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
573 };
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
574 void trace_method_handle_stub_wrapper(MethodHandleStubArguments* args) {
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
575 trace_method_handle_stub(args->adaptername,
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
576 args->mh,
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
577 args->saved_regs,
4939
45a1bf98f1bb 7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents: 4874
diff changeset
578 args->entry_sp);
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
579 }
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
580
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1552
diff changeset
581 void MethodHandles::trace_method_handle(MacroAssembler* _masm, const char* adaptername) {
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1552
diff changeset
582 if (!TraceMethodHandles) return;
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1552
diff changeset
583 BLOCK_COMMENT("trace_method_handle {");
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
584 __ enter();
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
585 __ andptr(rsp, -16); // align stack if needed for FPU state
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1552
diff changeset
586 __ pusha();
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
587 __ mov(rbx, rsp); // for retreiving saved_regs
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
588 // Note: saved_regs must be in the entered frame for the
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
589 // robust stack walking implemented in trace_method_handle_stub.
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
590
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
591 // save FP result, valid at some call sites (adapter_opt_return_float, ...)
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
592 __ increment(rsp, -2 * wordSize);
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
593 if (UseSSE >= 2) {
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
594 __ movdbl(Address(rsp, 0), xmm0);
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
595 } else if (UseSSE == 1) {
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
596 __ movflt(Address(rsp, 0), xmm0);
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
597 } else {
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
598 __ fst_d(Address(rsp, 0));
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
599 }
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
600
4939
45a1bf98f1bb 7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents: 4874
diff changeset
601 // Incoming state:
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2357
diff changeset
602 // rcx: method handle
4939
45a1bf98f1bb 7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents: 4874
diff changeset
603 //
45a1bf98f1bb 7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents: 4874
diff changeset
604 // To avoid calling convention issues, build a record on the stack
45a1bf98f1bb 7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents: 4874
diff changeset
605 // and pass the pointer to that instead.
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
606 __ push(rbp); // entry_sp (with extra align space)
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
607 __ push(rbx); // pusha saved_regs
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
608 __ push(rcx); // mh
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
609 __ push(rcx); // slot for adaptername
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
610 __ movptr(Address(rsp, 0), (intptr_t) adaptername);
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
611 __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, trace_method_handle_stub_wrapper), rsp);
4939
45a1bf98f1bb 7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents: 4874
diff changeset
612 __ increment(rsp, sizeof(MethodHandleStubArguments));
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
613
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
614 if (UseSSE >= 2) {
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
615 __ movdbl(xmm0, Address(rsp, 0));
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
616 } else if (UseSSE == 1) {
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
617 __ movflt(xmm0, Address(rsp, 0));
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
618 } else {
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
619 __ fld_d(Address(rsp, 0));
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
620 }
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
621 __ increment(rsp, 2 * wordSize);
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
622
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1552
diff changeset
623 __ popa();
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
624 __ leave();
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1552
diff changeset
625 BLOCK_COMMENT("} trace_method_handle");
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
626 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
627 #endif //PRODUCT