annotate src/cpu/sparc/vm/methodHandles_sparc.cpp @ 6812:988bf00cc564

7200261: G1: Liveness counting inconsistencies during marking verification Summary: The clipping code in the routine that sets the bits for a range of cards, in the liveness accounting verification code was incorrect. It set all the bits in the card bitmap from the given starting index which would lead to spurious marking verification failures. Reviewed-by: brutisso, jwilhelm, jmasa
author johnc
date Thu, 27 Sep 2012 15:44:01 -0700
parents 75f33eecc1b3
children 2cb2f30450c7
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 /*
4818
82e5a84b7436 7120450: complete information dumped by frame_describe
bdelsart
parents: 4807
diff changeset
2 * Copyright (c) 2008, 2012, 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: 1916
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1916
diff changeset
26 #include "interpreter/interpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1916
diff changeset
27 #include "memory/allocation.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1916
diff changeset
28 #include "prims/methodHandles.hpp"
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
29
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
30 #define __ _masm->
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
31
1849
5beba6174298 6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents: 1846
diff changeset
32 #ifdef PRODUCT
5beba6174298 6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents: 1846
diff changeset
33 #define BLOCK_COMMENT(str) /* nothing */
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
34 #define STOP(error) stop(error)
1849
5beba6174298 6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents: 1846
diff changeset
35 #else
5beba6174298 6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents: 1846
diff changeset
36 #define BLOCK_COMMENT(str) __ block_comment(str)
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
37 #define STOP(error) block_comment(error); __ stop(error)
1849
5beba6174298 6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents: 1846
diff changeset
38 #endif
5beba6174298 6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents: 1846
diff changeset
39
5beba6174298 6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents: 1846
diff changeset
40 #define BIND(label) bind(label); BLOCK_COMMENT(#label ":")
5beba6174298 6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents: 1846
diff changeset
41
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
42 // Workaround for C++ overloading nastiness on '0' for RegisterOrConstant.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
43 static RegisterOrConstant constant(int value) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
44 return RegisterOrConstant(value);
3753
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
45 }
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
46
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
47 void MethodHandles::load_klass_from_Class(MacroAssembler* _masm, Register klass_reg, Register temp_reg, Register temp2_reg) {
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
48 if (VerifyMethodHandles)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
49 verify_klass(_masm, klass_reg, SystemDictionary::WK_KLASS_ENUM_NAME(java_lang_Class), temp_reg, temp2_reg,
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
50 "MH argument is a Class");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
51 __ ld_ptr(Address(klass_reg, java_lang_Class::klass_offset_in_bytes()), klass_reg);
3753
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
52 }
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
53
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
54 #ifdef ASSERT
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
55 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: 4824
diff changeset
56 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: 4824
diff changeset
57 return x;
3753
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
58 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
59 #define NONZERO(x) check_nonzero(#x, x)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
60 #else //ASSERT
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
61 #define NONZERO(x) (x)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
62 #endif //ASSERT
3753
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
63
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
64 #ifdef ASSERT
3753
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
65 void MethodHandles::verify_klass(MacroAssembler* _masm,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
66 Register obj_reg, SystemDictionary::WKID klass_id,
3753
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
67 Register temp_reg, Register temp2_reg,
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
68 const char* error_message) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
69 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
70 KlassHandle klass = SystemDictionary::well_known_klass(klass_id);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
71 bool did_save = false;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
72 if (temp_reg == noreg || temp2_reg == noreg) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
73 temp_reg = L1;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
74 temp2_reg = L2;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
75 __ save_frame_and_mov(0, obj_reg, L0);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
76 obj_reg = L0;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
77 did_save = true;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
78 }
3753
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
79 Label L_ok, L_bad;
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
80 BLOCK_COMMENT("verify_klass {");
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
81 __ verify_oop(obj_reg);
3839
3d42f82cd811 7063628: Use cbcond on T4
kvn
parents: 3808
diff changeset
82 __ br_null_short(obj_reg, Assembler::pn, L_bad);
3753
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
83 __ load_klass(obj_reg, temp_reg);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
84 __ set(ExternalAddress((Metadata**)klass_addr), temp2_reg);
3753
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
85 __ ld_ptr(Address(temp2_reg, 0), temp2_reg);
3839
3d42f82cd811 7063628: Use cbcond on T4
kvn
parents: 3808
diff changeset
86 __ cmp_and_brx_short(temp_reg, temp2_reg, Assembler::equal, Assembler::pt, L_ok);
3753
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
87 intptr_t super_check_offset = klass->super_check_offset();
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
88 __ ld_ptr(Address(temp_reg, super_check_offset), temp_reg);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
89 __ set(ExternalAddress((Metadata**)klass_addr), temp2_reg);
3753
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
90 __ ld_ptr(Address(temp2_reg, 0), temp2_reg);
3839
3d42f82cd811 7063628: Use cbcond on T4
kvn
parents: 3808
diff changeset
91 __ cmp_and_brx_short(temp_reg, temp2_reg, Assembler::equal, Assembler::pt, L_ok);
3753
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
92 __ BIND(L_bad);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
93 if (did_save) __ restore();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
94 __ STOP(error_message);
3753
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
95 __ BIND(L_ok);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
96 if (did_save) __ restore();
3753
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
97 BLOCK_COMMENT("} verify_klass");
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
98 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
99
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
100 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: 4824
diff changeset
101 Label L;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
102 BLOCK_COMMENT("verify_ref_kind {");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
103 __ lduw(Address(member_reg, NONZERO(java_lang_invoke_MemberName::flags_offset_in_bytes())), temp);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
104 __ srl( temp, java_lang_invoke_MemberName::MN_REFERENCE_KIND_SHIFT, temp);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
105 __ and3(temp, java_lang_invoke_MemberName::MN_REFERENCE_KIND_MASK, temp);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
106 __ cmp_and_br_short(temp, ref_kind, Assembler::equal, Assembler::pt, L);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
107 { 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: 4824
diff changeset
108 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: 4824
diff changeset
109 if (ref_kind == JVM_REF_invokeVirtual ||
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
110 ref_kind == JVM_REF_invokeSpecial)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
111 // 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: 4824
diff changeset
112 trace_method_handle(_masm, buf);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
113 __ STOP(buf);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
114 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
115 BLOCK_COMMENT("} verify_ref_kind");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
116 __ bind(L);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
117 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
118
3753
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
119 #endif // ASSERT
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
120
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
121 void MethodHandles::jump_from_method_handle(MacroAssembler* _masm, Register method, Register target, Register temp,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
122 bool for_compiler_entry) {
3808
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
123 assert(method == G5_method, "interpreter calling convention");
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
124
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
125 if (!for_compiler_entry && JvmtiExport::can_post_interpreter_events()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
126 Label 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
127 // 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
128 // 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
129 // 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
130 __ verify_thread();
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
131 const Address interp_only(G2_thread, JavaThread::interp_only_mode_offset());
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
132 __ ld(interp_only, temp);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
133 __ cmp_and_br_short(temp, 0, Assembler::zero, Assembler::pt, run_compiled_code);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
134 __ ld_ptr(G5_method, in_bytes(Method::interpreter_entry_offset()), target);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
135 __ jmp(target, 0);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
136 __ delayed()->nop();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
137 __ BIND(run_compiled_code);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
138 // Note: we could fill some delay slots here, but
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
139 // it doesn't matter, since this is interpreter code.
3808
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
140 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
141
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
142 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
143 Method::from_interpreted_offset();
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
144 __ ld_ptr(G5_method, in_bytes(entry_offset), target);
3808
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
145 __ jmp(target, 0);
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
146 __ delayed()->nop();
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
147 }
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
148
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
149 void MethodHandles::jump_to_lambda_form(MacroAssembler* _masm,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
150 Register recv, Register method_temp,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
151 Register temp2, Register temp3,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
152 bool for_compiler_entry) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
153 BLOCK_COMMENT("jump_to_lambda_form {");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
154 // 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: 4824
diff changeset
155 // 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: 4824
diff changeset
156 assert_different_registers(recv, method_temp, temp2, temp3);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
157 assert(method_temp == G5_method, "required register for loading method");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
158
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
159 //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: 4824
diff changeset
160
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
161 // 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: 4824
diff changeset
162 __ verify_oop(recv);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
163 __ load_heap_oop(Address(recv, NONZERO(java_lang_invoke_MethodHandle::form_offset_in_bytes())), method_temp);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
164 __ verify_oop(method_temp);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
165 __ load_heap_oop(Address(method_temp, NONZERO(java_lang_invoke_LambdaForm::vmentry_offset_in_bytes())), method_temp);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
166 __ verify_oop(method_temp);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
167 // 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
168 __ ld_ptr(Address(method_temp, NONZERO(java_lang_invoke_MemberName::vmtarget_offset_in_bytes())), method_temp);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
169
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
170 if (VerifyMethodHandles && !for_compiler_entry) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
171 // make sure recv is already on stack
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
172 __ load_sized_value(Address(method_temp, Method::size_of_parameters_offset()),
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
173 temp2,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
174 sizeof(u2), /*is_signed*/ false);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
175 // 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: 4824
diff changeset
176 Label L;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
177 __ ld_ptr(__ argument_address(temp2, temp2, -1), temp2);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
178 __ cmp_and_br_short(temp2, recv, Assembler::equal, Assembler::pt, L);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
179 __ STOP("receiver not on stack");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
180 __ BIND(L);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
181 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
182
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
183 jump_from_method_handle(_masm, method_temp, temp2, temp3, for_compiler_entry);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
184 BLOCK_COMMENT("} jump_to_lambda_form");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
185 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
186
3808
341a57af9b0a 6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents: 3781
diff changeset
187
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
188 // Code generation
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
189 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: 4824
diff changeset
190 vmIntrinsics::ID iid) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
191 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: 4824
diff changeset
192 assert(is_signature_polymorphic(iid), "expected invoke iid");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
193 if (iid == vmIntrinsics::_invokeGeneric ||
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
194 iid == vmIntrinsics::_compiledLambdaForm) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
195 // 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: 4824
diff changeset
196 // 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: 4824
diff changeset
197 // They all allow an appendix argument.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
198 __ should_not_reach_here(); // empty stubs make SG sick
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
199 return NULL;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
200 }
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 710
diff changeset
201
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
202 // I5_savedSP/O5_savedSP: 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
203 // G5_method: Method*
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
204 // G4 (Gargs): incoming argument list (must preserve)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
205 // O0: used as temp to hold mh or receiver
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
206 // O1, O4: garbage temps, blown away
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
207 Register O1_scratch = O1;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
208 Register O4_param_size = O4; // size of parameters
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
209
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
210 address code_start = __ pc();
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 710
diff changeset
211
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 710
diff changeset
212 // here's where control starts out:
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 710
diff changeset
213 __ align(CodeEntryAlignment);
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 710
diff changeset
214 address entry_point = __ pc();
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 710
diff changeset
215
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
216 if (VerifyMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
217 Label L;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
218 BLOCK_COMMENT("verify_intrinsic_id {");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
219 __ ldub(Address(G5_method, Method::intrinsic_id_offset_in_bytes()), O1_scratch);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
220 __ cmp_and_br_short(O1_scratch, (int) iid, Assembler::equal, Assembler::pt, L);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
221 if (iid == vmIntrinsics::_linkToVirtual ||
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
222 iid == vmIntrinsics::_linkToSpecial) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
223 // 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
224 trace_method_handle(_masm, "bad Method*::intrinsic_id");
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 710
diff changeset
225 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
226 __ STOP("bad Method*::intrinsic_id");
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
227 __ bind(L);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
228 BLOCK_COMMENT("} verify_intrinsic_id");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
229 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
230
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
231 // 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: 4824
diff changeset
232 Address O4_first_arg_addr;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
233 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: 4824
diff changeset
234 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: 4824
diff changeset
235 if (ref_kind == 0 || MethodHandles::ref_kind_has_receiver(ref_kind)) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
236 __ load_sized_value(Address(G5_method, Method::size_of_parameters_offset()),
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
237 O4_param_size,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
238 sizeof(u2), /*is_signed*/ false);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
239 // 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: 4824
diff changeset
240 O4_first_arg_addr = __ argument_address(O4_param_size, O4_param_size, -1);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
241 } else {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
242 DEBUG_ONLY(O4_param_size = noreg);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
243 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
244
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
245 Register O0_mh = noreg;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
246 if (!is_signature_polymorphic_static(iid)) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
247 __ ld_ptr(O4_first_arg_addr, O0_mh = O0);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
248 DEBUG_ONLY(O4_param_size = noreg);
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 710
diff changeset
249 }
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 710
diff changeset
250
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
251 // O4_first_arg_addr is live!
1911
fff777a71346 6994093: MethodHandle.invokeGeneric needs porting to SPARC
jrose
parents: 1901
diff changeset
252
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
253 if (TraceMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
254 const char* name = vmIntrinsics::name_at(iid);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
255 if (*name == '_') name += 1;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
256 const size_t len = strlen(name) + 50;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
257 char* qname = NEW_C_HEAP_ARRAY(char, len, mtInternal);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
258 const char* suffix = "";
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
259 if (vmIntrinsics::method_for(iid) == NULL ||
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
260 !vmIntrinsics::method_for(iid)->access_flags().is_public()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
261 if (is_signature_polymorphic_static(iid))
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
262 suffix = "/static";
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
263 else
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
264 suffix = "/private";
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
265 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
266 jio_snprintf(qname, len, "MethodHandle::interpreter_entry::%s%s", name, suffix);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
267 if (O0_mh != noreg)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
268 __ mov(O0_mh, G3_method_handle); // make stub happy
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
269 trace_method_handle(_masm, qname);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
270 }
1911
fff777a71346 6994093: MethodHandle.invokeGeneric needs porting to SPARC
jrose
parents: 1901
diff changeset
271
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
272 if (iid == vmIntrinsics::_invokeBasic) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
273 generate_method_handle_dispatch(_masm, iid, O0_mh, noreg, not_for_compiler_entry);
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 710
diff changeset
274
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
275 } else {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
276 // 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: 4824
diff changeset
277 Register O0_recv = noreg;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
278 if (MethodHandles::ref_kind_has_receiver(ref_kind)) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
279 // 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: 4824
diff changeset
280 __ ld_ptr(O4_first_arg_addr, O0_recv = O0);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
281 DEBUG_ONLY(O4_param_size = noreg);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
282 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
283 Register G5_member = G5_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: 4824
diff changeset
284 __ ld_ptr(__ argument_address(constant(0)), G5_member);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
285 __ add(Gargs, Interpreter::stackElementSize, Gargs);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
286 generate_method_handle_dispatch(_masm, iid, O0_recv, G5_member, not_for_compiler_entry);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
287 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
288
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
289 if (PrintMethodHandleStubs) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
290 address code_end = __ pc();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
291 tty->print_cr("--------");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
292 tty->print_cr("method handle interpreter entry for %s", vmIntrinsics::name_at(iid));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
293 Disassembler::decode(code_start, code_end);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
294 tty->cr();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
295 }
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 710
diff changeset
296
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 710
diff changeset
297 return entry_point;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
298 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents:
diff changeset
299
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
300 void MethodHandles::generate_method_handle_dispatch(MacroAssembler* _masm,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
301 vmIntrinsics::ID iid,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
302 Register receiver_reg,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
303 Register member_reg,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
304 bool for_compiler_entry) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
305 assert(is_signature_polymorphic(iid), "expected invoke iid");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
306 // 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: 4824
diff changeset
307 Register temp1 = (for_compiler_entry ? G1_scratch : O1);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
308 Register temp2 = (for_compiler_entry ? G4_scratch : O4);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
309 Register temp3 = G3_scratch;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
310 Register temp4 = (for_compiler_entry ? noreg : O2);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
311 if (for_compiler_entry) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
312 assert(receiver_reg == (iid == vmIntrinsics::_linkToStatic ? noreg : O0), "only valid assignment");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
313 assert_different_registers(temp1, O0, O1, O2, O3, O4, O5);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
314 assert_different_registers(temp2, O0, O1, O2, O3, O4, O5);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
315 assert_different_registers(temp3, O0, O1, O2, O3, O4, O5);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
316 assert_different_registers(temp4, O0, O1, O2, O3, O4, O5);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
317 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
318 if (receiver_reg != noreg) assert_different_registers(temp1, temp2, temp3, temp4, receiver_reg);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
319 if (member_reg != noreg) assert_different_registers(temp1, temp2, temp3, temp4, member_reg);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
320 if (!for_compiler_entry) assert_different_registers(temp1, temp2, temp3, temp4, O5_savedSP); // don't trash lastSP
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 710
diff changeset
321
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
322 if (iid == vmIntrinsics::_invokeBasic) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
323 // indirect through MH.form.vmentry.vmtarget
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
324 jump_to_lambda_form(_masm, receiver_reg, G5_method, temp2, temp3, for_compiler_entry);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
325
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
326 } else {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
327 // 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: 4824
diff changeset
328 if (VerifyMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
329 // 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
330 verify_klass(_masm, member_reg, SystemDictionary::WK_KLASS_ENUM_NAME(MemberName_klass),
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
331 temp1, temp2,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
332 "MemberName required for invokeVirtual etc.");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
333 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
334
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
335 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: 4824
diff changeset
336 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: 4824
diff changeset
337 Address member_vmtarget( member_reg, NONZERO(java_lang_invoke_MemberName::vmtarget_offset_in_bytes()));
3753
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
338
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
339 Register temp1_recv_klass = temp1;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
340 if (iid != vmIntrinsics::_linkToStatic) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
341 __ verify_oop(receiver_reg);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
342 if (iid == vmIntrinsics::_linkToSpecial) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
343 // 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: 4824
diff changeset
344 __ null_check(receiver_reg);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
345 } else {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
346 // load receiver klass itself
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
347 __ 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: 4824
diff changeset
348 __ load_klass(receiver_reg, temp1_recv_klass);
6740
75f33eecc1b3 7196681: NPG: Some JSR 292 tests crash in Windows exception handler
coleenp
parents: 6725
diff changeset
349 __ verify_klass_ptr(temp1_recv_klass);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
350 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
351 BLOCK_COMMENT("check_receiver {");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
352 // 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: 4824
diff changeset
353 // Check the receiver against the MemberName.clazz
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
354 if (VerifyMethodHandles && iid == vmIntrinsics::_linkToSpecial) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
355 // Did not load it above...
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
356 __ load_klass(receiver_reg, temp1_recv_klass);
6740
75f33eecc1b3 7196681: NPG: Some JSR 292 tests crash in Windows exception handler
coleenp
parents: 6725
diff changeset
357 __ verify_klass_ptr(temp1_recv_klass);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
358 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
359 if (VerifyMethodHandles && iid != vmIntrinsics::_linkToInterface) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
360 Label L_ok;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
361 Register temp2_defc = temp2;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
362 __ load_heap_oop(member_clazz, temp2_defc);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
363 load_klass_from_Class(_masm, temp2_defc, temp3, temp4);
6740
75f33eecc1b3 7196681: NPG: Some JSR 292 tests crash in Windows exception handler
coleenp
parents: 6725
diff changeset
364 __ verify_klass_ptr(temp2_defc);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
365 __ check_klass_subtype(temp1_recv_klass, temp2_defc, temp3, temp4, L_ok);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
366 // If we get here, the type check failed!
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
367 __ STOP("receiver class disagrees with MemberName.clazz");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
368 __ bind(L_ok);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
369 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
370 BLOCK_COMMENT("} check_receiver");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
371 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
372 if (iid == vmIntrinsics::_linkToSpecial ||
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
373 iid == vmIntrinsics::_linkToStatic) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
374 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: 4824
diff changeset
375 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
376
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
377 // Live registers at this point:
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
378 // member_reg - MemberName that was the trailing argument
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
379 // 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: 4824
diff changeset
380 // O5_savedSP - interpreter linkage (if interpreted)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
381 // O0..O7,G1,G4 - compiler arguments (if compiled)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
382
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
383 bool method_is_live = false;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
384 switch (iid) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
385 case vmIntrinsics::_linkToSpecial:
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
386 if (VerifyMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
387 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: 4824
diff changeset
388 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
389 __ ld_ptr(member_vmtarget, G5_method);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
390 method_is_live = true;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
391 break;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
392
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
393 case vmIntrinsics::_linkToStatic:
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
394 if (VerifyMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
395 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: 4824
diff changeset
396 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
397 __ ld_ptr(member_vmtarget, G5_method);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
398 method_is_live = true;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
399 break;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
400
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
401 case vmIntrinsics::_linkToVirtual:
3753
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
402 {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
403 // same as TemplateTable::invokevirtual,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
404 // minus the CP setup and profiling:
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
405
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
406 if (VerifyMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
407 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: 4824
diff changeset
408 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
409
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
410 // 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: 4824
diff changeset
411 Register temp2_index = temp2;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
412 __ ld_ptr(member_vmindex, temp2_index);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
413
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
414 if (VerifyMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
415 Label L_index_ok;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
416 __ cmp_and_br_short(temp2_index, (int) 0, Assembler::greaterEqual, Assembler::pn, L_index_ok);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
417 __ STOP("no virtual index");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
418 __ BIND(L_index_ok);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
419 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
420
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
421 // 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: 4824
diff changeset
422 // 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: 4824
diff changeset
423
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
424 // get target Method* & entry point
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
425 __ lookup_virtual_method(temp1_recv_klass, temp2_index, G5_method);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
426 method_is_live = true;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
427 break;
3753
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
428 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
429
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
430 case vmIntrinsics::_linkToInterface:
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
431 {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
432 // same as TemplateTable::invokeinterface
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
433 // (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: 4824
diff changeset
434 if (VerifyMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
435 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: 4824
diff changeset
436 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
437
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
438 Register temp3_intf = temp3;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
439 __ load_heap_oop(member_clazz, temp3_intf);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
440 load_klass_from_Class(_masm, temp3_intf, temp2, temp4);
6740
75f33eecc1b3 7196681: NPG: Some JSR 292 tests crash in Windows exception handler
coleenp
parents: 6725
diff changeset
441 __ verify_klass_ptr(temp3_intf);
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 710
diff changeset
442
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
443 Register G5_index = G5_method;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
444 __ ld_ptr(member_vmindex, G5_index);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
445 if (VerifyMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
446 Label L;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
447 __ cmp_and_br_short(G5_index, 0, Assembler::greaterEqual, Assembler::pt, L);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
448 __ STOP("invalid vtable index for MH.invokeInterface");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
449 __ bind(L);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
450 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
451
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
452 // 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: 4824
diff changeset
453 Label L_no_such_interface;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
454 Register no_sethi_temp = noreg;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
455 __ lookup_interface_method(temp1_recv_klass, temp3_intf,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
456 // note: next two args must be the same:
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
457 G5_index, G5_method,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
458 temp2, no_sethi_temp,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
459 L_no_such_interface);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
460
6740
75f33eecc1b3 7196681: NPG: Some JSR 292 tests crash in Windows exception handler
coleenp
parents: 6725
diff changeset
461 __ verify_method_ptr(G5_method);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
462 jump_from_method_handle(_masm, G5_method, temp2, temp3, for_compiler_entry);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
463
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
464 __ bind(L_no_such_interface);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
465 AddressLiteral icce(StubRoutines::throw_IncompatibleClassChangeError_entry());
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
466 __ jump_to(icce, temp3);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
467 __ delayed()->nop();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
468 break;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
469 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
470
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
471 default:
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
472 fatal(err_msg("unexpected intrinsic %d: %s", iid, vmIntrinsics::name_at(iid)));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
473 break;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
474 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
475
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
476 if (method_is_live) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
477 // live at this point: G5_method, O5_savedSP (if interpreted)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
478
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
479 // After figuring out which concrete method to call, jump into it.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
480 // Note that this works in the interpreter with no data motion.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
481 // But the compiled version will require that rcx_recv be shifted out.
6740
75f33eecc1b3 7196681: NPG: Some JSR 292 tests crash in Windows exception handler
coleenp
parents: 6725
diff changeset
482 __ verify_method_ptr(G5_method);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
483 jump_from_method_handle(_masm, G5_method, temp1, temp3, for_compiler_entry);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
484 }
3753
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
485 }
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3371
diff changeset
486 }
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 710
diff changeset
487
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
488 #ifndef PRODUCT
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 710
diff changeset
489 void trace_method_handle_stub(const char* adaptername,
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3277
diff changeset
490 oopDesc* mh,
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
491 intptr_t* saved_sp,
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
492 intptr_t* args,
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
493 intptr_t* tracing_fp) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
494 bool has_mh = (strstr(adaptername, "/static") == NULL &&
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
495 strstr(adaptername, "linkTo") == NULL); // static linkers don't have MH
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
496 const char* mh_reg_name = has_mh ? "G3_mh" : "G3";
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
497 tty->print_cr("MH %s %s="INTPTR_FORMAT " saved_sp=" INTPTR_FORMAT " args=" INTPTR_FORMAT,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
498 adaptername, mh_reg_name,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
499 (intptr_t) mh, saved_sp, args);
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
500
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
501 if (Verbose) {
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
502 // dumping last frame with frame::describe
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 JavaThread* p = JavaThread::active();
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 ResourceMark rm;
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
507 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
508 FrameValues values;
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
509
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
510 // 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
511 // 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
512 // without a valid return PC in O7 (e.g. not just after a call).
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
513 // 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
514 // => 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
515
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
516 // walk up to the right frame using the "tracing_fp" argument
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
517 intptr_t* cur_sp = StubRoutines::Sparc::flush_callers_register_windows_func()();
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
518 frame cur_frame(cur_sp, frame::unpatchable, NULL);
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
519
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
520 while (cur_frame.fp() != (intptr_t *)(STACK_BIAS+(uintptr_t)tracing_fp)) {
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
521 cur_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
522 }
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
523
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
524 // 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
525 intptr_t *dump_sp = cur_frame.sender_sp();
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
526 intptr_t *dump_fp = cur_frame.link();
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 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
529
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
530 // the sender for cur_frame is the caller of trace_method_handle
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
531 if (walkable) {
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
532 // 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
533 // 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
534 // failing. Alternatively, frame constructors could be
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
535 // 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
536 // 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
537 // 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
538 frame dump_frame = frame(dump_sp,
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
539 cur_frame.sp(), // younger_sp
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
540 false); // no adaptation
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
541 dump_frame.describe(values, 1);
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
542 } else {
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
543 // Robust dump for frames which cannot be constructed from sp/younger_sp
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
544 // 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
545 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
546 values.describe(-1, dump_sp, "sp");
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
547 }
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
548
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
549 bool has_args = has_mh; // whether Gargs is meaningful
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
550
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
551 // mark args, if seems valid (may not be valid for some adapters)
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
552 if (has_args) {
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
553 if ((args >= dump_sp) && (args < dump_fp)) {
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
554 values.describe(-1, args, "*G4_args");
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
555 }
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
556 }
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
557
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
558 // mark saved_sp, if seems valid (may not be valid for some adapters)
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
559 intptr_t *unbiased_sp = (intptr_t *)(STACK_BIAS+(uintptr_t)saved_sp);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
560 const int ARG_LIMIT = 255, SLOP = 45, UNREASONABLE_STACK_MOVE = (ARG_LIMIT + SLOP);
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
561 if ((unbiased_sp >= dump_sp - UNREASONABLE_STACK_MOVE) && (unbiased_sp < dump_fp)) {
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
562 values.describe(-1, unbiased_sp, "*saved_sp+STACK_BIAS");
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
563 }
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
564
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
565 // Note: the unextended_sp may not be correct
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
566 tty->print_cr(" stack layout:");
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
567 values.print(p);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
568 if (has_mh && mh->is_oop()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
569 mh->print();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
570 if (java_lang_invoke_MethodHandle::is_instance(mh)) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
571 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: 4824
diff changeset
572 java_lang_invoke_MethodHandle::form(mh)->print();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
573 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4824
diff changeset
574 }
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
575 }
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 710
diff changeset
576 }
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
577
1849
5beba6174298 6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents: 1846
diff changeset
578 void MethodHandles::trace_method_handle(MacroAssembler* _masm, const char* adaptername) {
5beba6174298 6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents: 1846
diff changeset
579 if (!TraceMethodHandles) return;
5beba6174298 6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents: 1846
diff changeset
580 BLOCK_COMMENT("trace_method_handle {");
5beba6174298 6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents: 1846
diff changeset
581 // save: Gargs, O5_savedSP
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
582 __ save_frame(16); // need space for saving required FPU state
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
583
1849
5beba6174298 6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents: 1846
diff changeset
584 __ set((intptr_t) adaptername, O0);
5beba6174298 6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents: 1846
diff changeset
585 __ mov(G3_method_handle, O1);
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3277
diff changeset
586 __ mov(I5_savedSP, O2);
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
587 __ mov(Gargs, O3);
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
588 __ mov(I6, O4); // frame identifier for safe stack walking
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
589
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
590 // Save scratched registers that might be needed. Robustness is more
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
591 // important than optimizing the saves for this debug only code.
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
592
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
593 // 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
594 Address d_save(FP, -sizeof(jdouble) + STACK_BIAS);
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
595 __ stf(FloatRegisterImpl::D, Ftos_d, d_save);
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
596 // Safely save all globals but G2 (handled by call_VM_leaf) and G7
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
597 // (OS reserved).
1849
5beba6174298 6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents: 1846
diff changeset
598 __ mov(G3_method_handle, L3);
5beba6174298 6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents: 1846
diff changeset
599 __ mov(Gargs, L4);
5beba6174298 6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents: 1846
diff changeset
600 __ mov(G5_method_type, L5);
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
601 __ mov(G6, L6);
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
602 __ mov(G1, L1);
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
603
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
604 __ call_VM_leaf(L2 /* for G2 */, CAST_FROM_FN_PTR(address, trace_method_handle_stub));
1849
5beba6174298 6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents: 1846
diff changeset
605
5beba6174298 6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents: 1846
diff changeset
606 __ mov(L3, G3_method_handle);
5beba6174298 6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents: 1846
diff changeset
607 __ mov(L4, Gargs);
5beba6174298 6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents: 1846
diff changeset
608 __ mov(L5, G5_method_type);
4824
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
609 __ mov(L6, G6);
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
610 __ mov(L1, G1);
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
611 __ ldf(FloatRegisterImpl::D, d_save, Ftos_d);
5dbed2f542ff 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 4818
diff changeset
612
1849
5beba6174298 6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents: 1846
diff changeset
613 __ restore();
5beba6174298 6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents: 1846
diff changeset
614 BLOCK_COMMENT("} trace_method_handle");
5beba6174298 6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents: 1846
diff changeset
615 }
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 710
diff changeset
616 #endif // PRODUCT