annotate src/cpu/zero/vm/cppInterpreter_zero.cpp @ 3249:e1162778c1c8

7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error Summary: A referent object that is only weakly reachable at the start of concurrent marking but is re-attached to the strongly reachable object graph during marking may not be marked as live. This can cause the reference object to be processed prematurely and leave dangling pointers to the referent object. Implement a read barrier for the java.lang.ref.Reference::referent field by intrinsifying the Reference.get() method, and intercepting accesses though JNI, reflection, and Unsafe, so that when a non-null referent object is read it is also logged in an SATB buffer. Reviewed-by: kvn, iveresov, never, tonyp, dholmes
author johnc
date Thu, 07 Apr 2011 09:53:20 -0700
parents c7f3d0b4570f
children 732454aaf5cb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
1 /*
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 1972
diff changeset
2 * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
1256
c09ee209b65c 6926048: Improve Zero performance
kvn
parents: 1139
diff changeset
3 * Copyright 2007, 2008, 2009, 2010 Red Hat, Inc.
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
5 *
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
6 * This code is free software; you can redistribute it and/or modify it
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
7 * under the terms of the GNU General Public License version 2 only, as
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
8 * published by the Free Software Foundation.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
9 *
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
10 * This code is distributed in the hope that it will be useful, but WITHOUT
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
13 * version 2 for more details (a copy is included in the LICENSE file that
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
14 * accompanied this code).
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
15 *
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License version
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
17 * 2 along with this work; if not, write to the Free Software Foundation,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
19 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1514
diff changeset
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1514
diff changeset
21 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1514
diff changeset
22 * questions.
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
23 *
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
24 */
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
25
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
26 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
27 #include "asm/assembler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
28 #include "interpreter/bytecodeHistogram.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
29 #include "interpreter/cppInterpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
30 #include "interpreter/interpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
31 #include "interpreter/interpreterGenerator.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
32 #include "interpreter/interpreterRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
33 #include "oops/arrayOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
34 #include "oops/methodDataOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
35 #include "oops/methodOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
36 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
37 #include "prims/jvmtiExport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
38 #include "prims/jvmtiThreadState.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
39 #include "runtime/arguments.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
40 #include "runtime/deoptimization.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
41 #include "runtime/frame.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
42 #include "runtime/interfaceSupport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
43 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
44 #include "runtime/stubRoutines.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
45 #include "runtime/synchronizer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
46 #include "runtime/timer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
47 #include "runtime/vframeArray.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
48 #include "stack_zero.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
49 #include "utilities/debug.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
50 #ifdef SHARK
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
51 #include "shark/shark_globals.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1605
diff changeset
52 #endif
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
53
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
54 #ifdef CC_INTERP
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
55
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
56 #define fixup_after_potential_safepoint() \
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
57 method = istate->method()
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
58
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
59 #define CALL_VM_NOCHECK(func) \
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
60 thread->set_last_Java_frame(); \
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
61 func; \
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
62 thread->reset_last_Java_frame(); \
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
63 fixup_after_potential_safepoint()
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
64
1514
22af4ce8dba1 6951784: Zero deoptimizer changes
twisti
parents: 1505
diff changeset
65 int CppInterpreter::normal_entry(methodOop method, intptr_t UNUSED, TRAPS) {
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
66 JavaThread *thread = (JavaThread *) THREAD;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
67
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
68 // Allocate and initialize our frame.
1514
22af4ce8dba1 6951784: Zero deoptimizer changes
twisti
parents: 1505
diff changeset
69 InterpreterFrame *frame = InterpreterFrame::build(method, CHECK_0);
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
70 thread->push_zero_frame(frame);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
71
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
72 // Execute those bytecodes!
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
73 main_loop(0, THREAD);
1514
22af4ce8dba1 6951784: Zero deoptimizer changes
twisti
parents: 1505
diff changeset
74
22af4ce8dba1 6951784: Zero deoptimizer changes
twisti
parents: 1505
diff changeset
75 // No deoptimized frames on the stack
22af4ce8dba1 6951784: Zero deoptimizer changes
twisti
parents: 1505
diff changeset
76 return 0;
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
77 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
78
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
79 void CppInterpreter::main_loop(int recurse, TRAPS) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
80 JavaThread *thread = (JavaThread *) THREAD;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
81 ZeroStack *stack = thread->zero_stack();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
82
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
83 // If we are entering from a deopt we may need to call
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
84 // ourself a few times in order to get to our frame.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
85 if (recurse)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
86 main_loop(recurse - 1, THREAD);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
87
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
88 InterpreterFrame *frame = thread->top_zero_frame()->as_interpreter_frame();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
89 interpreterState istate = frame->interpreter_state();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
90 methodOop method = istate->method();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
91
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
92 intptr_t *result = NULL;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
93 int result_slots = 0;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
94
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
95 while (true) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
96 // We can set up the frame anchor with everything we want at
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
97 // this point as we are thread_in_Java and no safepoints can
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
98 // occur until we go to vm mode. We do have to clear flags
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
99 // on return from vm but that is it.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
100 thread->set_last_Java_frame();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
101
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
102 // Call the interpreter
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
103 if (JvmtiExport::can_post_interpreter_events())
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
104 BytecodeInterpreter::runWithChecks(istate);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
105 else
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
106 BytecodeInterpreter::run(istate);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
107 fixup_after_potential_safepoint();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
108
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
109 // Clear the frame anchor
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
110 thread->reset_last_Java_frame();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
111
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
112 // Examine the message from the interpreter to decide what to do
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
113 if (istate->msg() == BytecodeInterpreter::call_method) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
114 methodOop callee = istate->callee();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
115
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
116 // Trim back the stack to put the parameters at the top
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
117 stack->set_sp(istate->stack() + 1);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
118
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
119 // Make the call
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
120 Interpreter::invoke_method(callee, istate->callee_entry_point(), THREAD);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
121 fixup_after_potential_safepoint();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
122
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
123 // Convert the result
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
124 istate->set_stack(stack->sp() - 1);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
125
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
126 // Restore the stack
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
127 stack->set_sp(istate->stack_limit() + 1);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
128
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
129 // Resume the interpreter
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
130 istate->set_msg(BytecodeInterpreter::method_resume);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
131 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
132 else if (istate->msg() == BytecodeInterpreter::more_monitors) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
133 int monitor_words = frame::interpreter_frame_monitor_size();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
134
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
135 // Allocate the space
1379
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
136 stack->overflow_check(monitor_words, THREAD);
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
137 if (HAS_PENDING_EXCEPTION)
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
138 break;
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
139 stack->alloc(monitor_words * wordSize);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
140
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
141 // Move the expression stack contents
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
142 for (intptr_t *p = istate->stack() + 1; p < istate->stack_base(); p++)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
143 *(p - monitor_words) = *p;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
144
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
145 // Move the expression stack pointers
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
146 istate->set_stack_limit(istate->stack_limit() - monitor_words);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
147 istate->set_stack(istate->stack() - monitor_words);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
148 istate->set_stack_base(istate->stack_base() - monitor_words);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
149
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
150 // Zero the new monitor so the interpreter can find it.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
151 ((BasicObjectLock *) istate->stack_base())->set_obj(NULL);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
152
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
153 // Resume the interpreter
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
154 istate->set_msg(BytecodeInterpreter::got_monitors);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
155 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
156 else if (istate->msg() == BytecodeInterpreter::return_from_method) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
157 // Copy the result into the caller's frame
1256
c09ee209b65c 6926048: Improve Zero performance
kvn
parents: 1139
diff changeset
158 result_slots = type2size[result_type_of(method)];
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
159 assert(result_slots >= 0 && result_slots <= 2, "what?");
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
160 result = istate->stack() + result_slots;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
161 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
162 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
163 else if (istate->msg() == BytecodeInterpreter::throwing_exception) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
164 assert(HAS_PENDING_EXCEPTION, "should do");
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
165 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
166 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
167 else if (istate->msg() == BytecodeInterpreter::do_osr) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
168 // Unwind the current frame
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
169 thread->pop_zero_frame();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
170
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
171 // Remove any extension of the previous frame
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
172 int extra_locals = method->max_locals() - method->size_of_parameters();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
173 stack->set_sp(stack->sp() + extra_locals);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
174
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
175 // Jump into the OSR method
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
176 Interpreter::invoke_osr(
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
177 method, istate->osr_entry(), istate->osr_buf(), THREAD);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
178 return;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
179 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
180 else {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
181 ShouldNotReachHere();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
182 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
183 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
184
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
185 // Unwind the current frame
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
186 thread->pop_zero_frame();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
187
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
188 // Pop our local variables
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
189 stack->set_sp(stack->sp() + method->max_locals());
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
190
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
191 // Push our result
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
192 for (int i = 0; i < result_slots; i++)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
193 stack->push(result[-i]);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
194 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
195
1514
22af4ce8dba1 6951784: Zero deoptimizer changes
twisti
parents: 1505
diff changeset
196 int CppInterpreter::native_entry(methodOop method, intptr_t UNUSED, TRAPS) {
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
197 // Make sure method is native and not abstract
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
198 assert(method->is_native() && !method->is_abstract(), "should be");
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
199
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
200 JavaThread *thread = (JavaThread *) THREAD;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
201 ZeroStack *stack = thread->zero_stack();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
202
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
203 // Allocate and initialize our frame
1514
22af4ce8dba1 6951784: Zero deoptimizer changes
twisti
parents: 1505
diff changeset
204 InterpreterFrame *frame = InterpreterFrame::build(method, CHECK_0);
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
205 thread->push_zero_frame(frame);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
206 interpreterState istate = frame->interpreter_state();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
207 intptr_t *locals = istate->locals();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
208
1078
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1010
diff changeset
209 // Update the invocation counter
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1010
diff changeset
210 if ((UseCompiler || CountCompiledCalls) && !method->is_synchronized()) {
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1010
diff changeset
211 InvocationCounter *counter = method->invocation_counter();
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1010
diff changeset
212 counter->increment();
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1010
diff changeset
213 if (counter->reached_InvocationLimit()) {
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1010
diff changeset
214 CALL_VM_NOCHECK(
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1010
diff changeset
215 InterpreterRuntime::frequency_counter_overflow(thread, NULL));
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1010
diff changeset
216 if (HAS_PENDING_EXCEPTION)
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1010
diff changeset
217 goto unwind_and_return;
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1010
diff changeset
218 }
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1010
diff changeset
219 }
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1010
diff changeset
220
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
221 // Lock if necessary
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
222 BasicObjectLock *monitor;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
223 monitor = NULL;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
224 if (method->is_synchronized()) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
225 monitor = (BasicObjectLock*) istate->stack_base();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
226 oop lockee = monitor->obj();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
227 markOop disp = lockee->mark()->set_unlocked();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
228
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
229 monitor->lock()->set_displaced_header(disp);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
230 if (Atomic::cmpxchg_ptr(monitor, lockee->mark_addr(), disp) != disp) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
231 if (thread->is_lock_owned((address) disp->clear_lock_bits())) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
232 monitor->lock()->set_displaced_header(NULL);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
233 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
234 else {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
235 CALL_VM_NOCHECK(InterpreterRuntime::monitorenter(thread, monitor));
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
236 if (HAS_PENDING_EXCEPTION)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
237 goto unwind_and_return;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
238 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
239 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
240 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
241
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
242 // Get the signature handler
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
243 InterpreterRuntime::SignatureHandler *handler; {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
244 address handlerAddr = method->signature_handler();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
245 if (handlerAddr == NULL) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
246 CALL_VM_NOCHECK(InterpreterRuntime::prepare_native_call(thread, method));
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
247 if (HAS_PENDING_EXCEPTION)
1139
b6f06e395428 6908267: Zero fails to unlock synchronized native methods on exception
never
parents: 1078
diff changeset
248 goto unlock_unwind_and_return;
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
249
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
250 handlerAddr = method->signature_handler();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
251 assert(handlerAddr != NULL, "eh?");
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
252 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
253 if (handlerAddr == (address) InterpreterRuntime::slow_signature_handler) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
254 CALL_VM_NOCHECK(handlerAddr =
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
255 InterpreterRuntime::slow_signature_handler(thread, method, NULL,NULL));
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
256 if (HAS_PENDING_EXCEPTION)
1139
b6f06e395428 6908267: Zero fails to unlock synchronized native methods on exception
never
parents: 1078
diff changeset
257 goto unlock_unwind_and_return;
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
258 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
259 handler = \
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
260 InterpreterRuntime::SignatureHandler::from_handlerAddr(handlerAddr);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
261 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
262
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
263 // Get the native function entry point
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
264 address function;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
265 function = method->native_function();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
266 assert(function != NULL, "should be set if signature handler is");
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
267
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
268 // Build the argument list
1379
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
269 stack->overflow_check(handler->argument_count() * 2, THREAD);
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
270 if (HAS_PENDING_EXCEPTION)
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
271 goto unlock_unwind_and_return;
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
272
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
273 void **arguments;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
274 void *mirror; {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
275 arguments =
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
276 (void **) stack->alloc(handler->argument_count() * sizeof(void **));
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
277 void **dst = arguments;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
278
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
279 void *env = thread->jni_environment();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
280 *(dst++) = &env;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
281
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
282 if (method->is_static()) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
283 istate->set_oop_temp(
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 1972
diff changeset
284 method->constants()->pool_holder()->java_mirror());
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
285 mirror = istate->oop_temp_addr();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
286 *(dst++) = &mirror;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
287 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
288
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
289 intptr_t *src = locals;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
290 for (int i = dst - arguments; i < handler->argument_count(); i++) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
291 ffi_type *type = handler->argument_type(i);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
292 if (type == &ffi_type_pointer) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
293 if (*src) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
294 stack->push((intptr_t) src);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
295 *(dst++) = stack->sp();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
296 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
297 else {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
298 *(dst++) = src;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
299 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
300 src--;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
301 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
302 else if (type->size == 4) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
303 *(dst++) = src--;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
304 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
305 else if (type->size == 8) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
306 src--;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
307 *(dst++) = src--;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
308 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
309 else {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
310 ShouldNotReachHere();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
311 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
312 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
313 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
314
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
315 // Set up the Java frame anchor
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
316 thread->set_last_Java_frame();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
317
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
318 // Change the thread state to _thread_in_native
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
319 ThreadStateTransition::transition_from_java(thread, _thread_in_native);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
320
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
321 // Make the call
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
322 intptr_t result[4 - LogBytesPerWord];
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
323 ffi_call(handler->cif(), (void (*)()) function, result, arguments);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
324
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
325 // Change the thread state back to _thread_in_Java.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
326 // ThreadStateTransition::transition_from_native() cannot be used
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
327 // here because it does not check for asynchronous exceptions.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
328 // We have to manage the transition ourself.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
329 thread->set_thread_state(_thread_in_native_trans);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
330
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
331 // Make sure new state is visible in the GC thread
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
332 if (os::is_MP()) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
333 if (UseMembar) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
334 OrderAccess::fence();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
335 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
336 else {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
337 InterfaceSupport::serialize_memory(thread);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
338 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
339 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
340
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
341 // Handle safepoint operations, pending suspend requests,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
342 // and pending asynchronous exceptions.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
343 if (SafepointSynchronize::do_call_back() ||
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
344 thread->has_special_condition_for_native_trans()) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
345 JavaThread::check_special_condition_for_native_trans(thread);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
346 CHECK_UNHANDLED_OOPS_ONLY(thread->clear_unhandled_oops());
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
347 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
348
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
349 // Finally we can change the thread state to _thread_in_Java.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
350 thread->set_thread_state(_thread_in_Java);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
351 fixup_after_potential_safepoint();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
352
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
353 // Clear the frame anchor
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
354 thread->reset_last_Java_frame();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
355
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
356 // If the result was an oop then unbox it and store it in
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
357 // oop_temp where the garbage collector can see it before
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
358 // we release the handle it might be protected by.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
359 if (handler->result_type() == &ffi_type_pointer) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
360 if (result[0])
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
361 istate->set_oop_temp(*(oop *) result[0]);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
362 else
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
363 istate->set_oop_temp(NULL);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
364 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
365
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
366 // Reset handle block
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
367 thread->active_handles()->clear();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
368
1139
b6f06e395428 6908267: Zero fails to unlock synchronized native methods on exception
never
parents: 1078
diff changeset
369 unlock_unwind_and_return:
b6f06e395428 6908267: Zero fails to unlock synchronized native methods on exception
never
parents: 1078
diff changeset
370
b6f06e395428 6908267: Zero fails to unlock synchronized native methods on exception
never
parents: 1078
diff changeset
371 // Unlock if necessary
b6f06e395428 6908267: Zero fails to unlock synchronized native methods on exception
never
parents: 1078
diff changeset
372 if (monitor) {
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
373 BasicLock *lock = monitor->lock();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
374 markOop header = lock->displaced_header();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
375 oop rcvr = monitor->obj();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
376 monitor->set_obj(NULL);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
377
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
378 if (header != NULL) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
379 if (Atomic::cmpxchg_ptr(header, rcvr->mark_addr(), lock) != lock) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
380 monitor->set_obj(rcvr); {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
381 HandleMark hm(thread);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
382 CALL_VM_NOCHECK(InterpreterRuntime::monitorexit(thread, monitor));
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
383 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
384 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
385 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
386 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
387
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
388 unwind_and_return:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
389
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
390 // Unwind the current activation
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
391 thread->pop_zero_frame();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
392
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
393 // Pop our parameters
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
394 stack->set_sp(stack->sp() + method->size_of_parameters());
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
395
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
396 // Push our result
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
397 if (!HAS_PENDING_EXCEPTION) {
1256
c09ee209b65c 6926048: Improve Zero performance
kvn
parents: 1139
diff changeset
398 BasicType type = result_type_of(method);
c09ee209b65c 6926048: Improve Zero performance
kvn
parents: 1139
diff changeset
399 stack->set_sp(stack->sp() - type2size[type]);
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
400
1256
c09ee209b65c 6926048: Improve Zero performance
kvn
parents: 1139
diff changeset
401 switch (type) {
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
402 case T_VOID:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
403 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
404
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
405 case T_BOOLEAN:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
406 #ifndef VM_LITTLE_ENDIAN
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
407 result[0] <<= (BitsPerWord - BitsPerByte);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
408 #endif
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
409 SET_LOCALS_INT(*(jboolean *) result != 0, 0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
410 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
411
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
412 case T_CHAR:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
413 #ifndef VM_LITTLE_ENDIAN
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
414 result[0] <<= (BitsPerWord - BitsPerShort);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
415 #endif
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
416 SET_LOCALS_INT(*(jchar *) result, 0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
417 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
418
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
419 case T_BYTE:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
420 #ifndef VM_LITTLE_ENDIAN
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
421 result[0] <<= (BitsPerWord - BitsPerByte);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
422 #endif
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
423 SET_LOCALS_INT(*(jbyte *) result, 0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
424 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
425
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
426 case T_SHORT:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
427 #ifndef VM_LITTLE_ENDIAN
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
428 result[0] <<= (BitsPerWord - BitsPerShort);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
429 #endif
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
430 SET_LOCALS_INT(*(jshort *) result, 0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
431 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
432
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
433 case T_INT:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
434 #ifndef VM_LITTLE_ENDIAN
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
435 result[0] <<= (BitsPerWord - BitsPerInt);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
436 #endif
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
437 SET_LOCALS_INT(*(jint *) result, 0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
438 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
439
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
440 case T_LONG:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
441 SET_LOCALS_LONG(*(jlong *) result, 0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
442 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
443
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
444 case T_FLOAT:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
445 SET_LOCALS_FLOAT(*(jfloat *) result, 0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
446 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
447
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
448 case T_DOUBLE:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
449 SET_LOCALS_DOUBLE(*(jdouble *) result, 0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
450 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
451
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
452 case T_OBJECT:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
453 case T_ARRAY:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
454 SET_LOCALS_OBJECT(istate->oop_temp(), 0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
455 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
456
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
457 default:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
458 ShouldNotReachHere();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
459 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
460 }
1514
22af4ce8dba1 6951784: Zero deoptimizer changes
twisti
parents: 1505
diff changeset
461
22af4ce8dba1 6951784: Zero deoptimizer changes
twisti
parents: 1505
diff changeset
462 // No deoptimized frames on the stack
22af4ce8dba1 6951784: Zero deoptimizer changes
twisti
parents: 1505
diff changeset
463 return 0;
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
464 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
465
1514
22af4ce8dba1 6951784: Zero deoptimizer changes
twisti
parents: 1505
diff changeset
466 int CppInterpreter::accessor_entry(methodOop method, intptr_t UNUSED, TRAPS) {
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
467 JavaThread *thread = (JavaThread *) THREAD;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
468 ZeroStack *stack = thread->zero_stack();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
469 intptr_t *locals = stack->sp();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
470
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
471 // Drop into the slow path if we need a safepoint check
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
472 if (SafepointSynchronize::do_call_back()) {
1514
22af4ce8dba1 6951784: Zero deoptimizer changes
twisti
parents: 1505
diff changeset
473 return normal_entry(method, 0, THREAD);
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
474 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
475
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
476 // Load the object pointer and drop into the slow path
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
477 // if we have a NullPointerException
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
478 oop object = LOCALS_OBJECT(0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
479 if (object == NULL) {
1514
22af4ce8dba1 6951784: Zero deoptimizer changes
twisti
parents: 1505
diff changeset
480 return normal_entry(method, 0, THREAD);
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
481 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
482
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
483 // Read the field index from the bytecode, which looks like this:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
484 // 0: aload_0
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
485 // 1: getfield
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
486 // 2: index
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
487 // 3: index
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
488 // 4: ireturn/areturn
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
489 // NB this is not raw bytecode: index is in machine order
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
490 u1 *code = method->code_base();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
491 assert(code[0] == Bytecodes::_aload_0 &&
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
492 code[1] == Bytecodes::_getfield &&
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
493 (code[4] == Bytecodes::_ireturn ||
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
494 code[4] == Bytecodes::_areturn), "should do");
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
495 u2 index = Bytes::get_native_u2(&code[2]);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
496
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
497 // Get the entry from the constant pool cache, and drop into
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
498 // the slow path if it has not been resolved
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
499 constantPoolCacheOop cache = method->constants()->cache();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
500 ConstantPoolCacheEntry* entry = cache->entry_at(index);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
501 if (!entry->is_resolved(Bytecodes::_getfield)) {
1514
22af4ce8dba1 6951784: Zero deoptimizer changes
twisti
parents: 1505
diff changeset
502 return normal_entry(method, 0, THREAD);
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
503 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
504
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
505 // Get the result and push it onto the stack
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
506 switch (entry->flag_state()) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
507 case ltos:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
508 case dtos:
1514
22af4ce8dba1 6951784: Zero deoptimizer changes
twisti
parents: 1505
diff changeset
509 stack->overflow_check(1, CHECK_0);
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
510 stack->alloc(wordSize);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
511 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
512 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
513 if (entry->is_volatile()) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
514 switch (entry->flag_state()) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
515 case ctos:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
516 SET_LOCALS_INT(object->char_field_acquire(entry->f2()), 0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
517 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
518
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
519 case btos:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
520 SET_LOCALS_INT(object->byte_field_acquire(entry->f2()), 0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
521 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
522
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
523 case stos:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
524 SET_LOCALS_INT(object->short_field_acquire(entry->f2()), 0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
525 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
526
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
527 case itos:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
528 SET_LOCALS_INT(object->int_field_acquire(entry->f2()), 0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
529 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
530
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
531 case ltos:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
532 SET_LOCALS_LONG(object->long_field_acquire(entry->f2()), 0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
533 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
534
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
535 case ftos:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
536 SET_LOCALS_FLOAT(object->float_field_acquire(entry->f2()), 0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
537 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
538
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
539 case dtos:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
540 SET_LOCALS_DOUBLE(object->double_field_acquire(entry->f2()), 0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
541 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
542
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
543 case atos:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
544 SET_LOCALS_OBJECT(object->obj_field_acquire(entry->f2()), 0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
545 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
546
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
547 default:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
548 ShouldNotReachHere();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
549 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
550 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
551 else {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
552 switch (entry->flag_state()) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
553 case ctos:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
554 SET_LOCALS_INT(object->char_field(entry->f2()), 0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
555 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
556
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
557 case btos:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
558 SET_LOCALS_INT(object->byte_field(entry->f2()), 0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
559 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
560
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
561 case stos:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
562 SET_LOCALS_INT(object->short_field(entry->f2()), 0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
563 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
564
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
565 case itos:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
566 SET_LOCALS_INT(object->int_field(entry->f2()), 0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
567 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
568
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
569 case ltos:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
570 SET_LOCALS_LONG(object->long_field(entry->f2()), 0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
571 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
572
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
573 case ftos:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
574 SET_LOCALS_FLOAT(object->float_field(entry->f2()), 0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
575 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
576
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
577 case dtos:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
578 SET_LOCALS_DOUBLE(object->double_field(entry->f2()), 0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
579 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
580
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
581 case atos:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
582 SET_LOCALS_OBJECT(object->obj_field(entry->f2()), 0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
583 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
584
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
585 default:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
586 ShouldNotReachHere();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
587 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
588 }
1514
22af4ce8dba1 6951784: Zero deoptimizer changes
twisti
parents: 1505
diff changeset
589
22af4ce8dba1 6951784: Zero deoptimizer changes
twisti
parents: 1505
diff changeset
590 // No deoptimized frames on the stack
22af4ce8dba1 6951784: Zero deoptimizer changes
twisti
parents: 1505
diff changeset
591 return 0;
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
592 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
593
1514
22af4ce8dba1 6951784: Zero deoptimizer changes
twisti
parents: 1505
diff changeset
594 int CppInterpreter::empty_entry(methodOop method, intptr_t UNUSED, TRAPS) {
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
595 JavaThread *thread = (JavaThread *) THREAD;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
596 ZeroStack *stack = thread->zero_stack();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
597
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
598 // Drop into the slow path if we need a safepoint check
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
599 if (SafepointSynchronize::do_call_back()) {
1514
22af4ce8dba1 6951784: Zero deoptimizer changes
twisti
parents: 1505
diff changeset
600 return normal_entry(method, 0, THREAD);
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
601 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
602
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
603 // Pop our parameters
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
604 stack->set_sp(stack->sp() + method->size_of_parameters());
1514
22af4ce8dba1 6951784: Zero deoptimizer changes
twisti
parents: 1505
diff changeset
605
22af4ce8dba1 6951784: Zero deoptimizer changes
twisti
parents: 1505
diff changeset
606 // No deoptimized frames on the stack
22af4ce8dba1 6951784: Zero deoptimizer changes
twisti
parents: 1505
diff changeset
607 return 0;
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
608 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
609
1379
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
610 InterpreterFrame *InterpreterFrame::build(const methodOop method, TRAPS) {
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
611 JavaThread *thread = (JavaThread *) THREAD;
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
612 ZeroStack *stack = thread->zero_stack();
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
613
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
614 // Calculate the size of the frame we'll build, including
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
615 // any adjustments to the caller's frame that we'll make.
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
616 int extra_locals = 0;
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
617 int monitor_words = 0;
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
618 int stack_words = 0;
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
619
1379
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
620 if (!method->is_native()) {
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
621 extra_locals = method->max_locals() - method->size_of_parameters();
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
622 stack_words = method->max_stack();
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
623 }
1379
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
624 if (method->is_synchronized()) {
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
625 monitor_words = frame::interpreter_frame_monitor_size();
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
626 }
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
627 stack->overflow_check(
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
628 extra_locals + header_words + monitor_words + stack_words, CHECK_NULL);
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
629
1379
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
630 // Adjust the caller's stack frame to accomodate any additional
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
631 // local variables we have contiguously with our parameters.
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
632 for (int i = 0; i < extra_locals; i++)
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
633 stack->push(0);
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
634
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
635 intptr_t *locals;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
636 if (method->is_native())
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
637 locals = stack->sp() + (method->size_of_parameters() - 1);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
638 else
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
639 locals = stack->sp() + (method->max_locals() - 1);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
640
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
641 stack->push(0); // next_frame, filled in later
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
642 intptr_t *fp = stack->sp();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
643 assert(fp - stack->sp() == next_frame_off, "should be");
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
644
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
645 stack->push(INTERPRETER_FRAME);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
646 assert(fp - stack->sp() == frame_type_off, "should be");
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
647
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
648 interpreterState istate =
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
649 (interpreterState) stack->alloc(sizeof(BytecodeInterpreter));
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
650 assert(fp - stack->sp() == istate_off, "should be");
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
651
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
652 istate->set_locals(locals);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
653 istate->set_method(method);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
654 istate->set_self_link(istate);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
655 istate->set_prev_link(NULL);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
656 istate->set_thread(thread);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
657 istate->set_bcp(method->is_native() ? NULL : method->code_base());
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
658 istate->set_constants(method->constants()->cache());
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
659 istate->set_msg(BytecodeInterpreter::method_entry);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
660 istate->set_oop_temp(NULL);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
661 istate->set_mdx(NULL);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
662 istate->set_callee(NULL);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
663
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
664 istate->set_monitor_base((BasicObjectLock *) stack->sp());
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
665 if (method->is_synchronized()) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
666 BasicObjectLock *monitor =
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
667 (BasicObjectLock *) stack->alloc(monitor_words * wordSize);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
668 oop object;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
669 if (method->is_static())
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 1972
diff changeset
670 object = method->constants()->pool_holder()->java_mirror();
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
671 else
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
672 object = (oop) locals[0];
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
673 monitor->set_obj(object);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
674 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
675
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
676 istate->set_stack_base(stack->sp());
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
677 istate->set_stack(stack->sp() - 1);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
678 if (stack_words)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
679 stack->alloc(stack_words * wordSize);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
680 istate->set_stack_limit(stack->sp() - 1);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
681
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
682 return (InterpreterFrame *) fp;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
683 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
684
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
685 int AbstractInterpreter::BasicType_as_index(BasicType type) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
686 int i = 0;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
687 switch (type) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
688 case T_BOOLEAN: i = 0; break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
689 case T_CHAR : i = 1; break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
690 case T_BYTE : i = 2; break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
691 case T_SHORT : i = 3; break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
692 case T_INT : i = 4; break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
693 case T_LONG : i = 5; break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
694 case T_VOID : i = 6; break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
695 case T_FLOAT : i = 7; break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
696 case T_DOUBLE : i = 8; break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
697 case T_OBJECT : i = 9; break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
698 case T_ARRAY : i = 9; break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
699 default : ShouldNotReachHere();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
700 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
701 assert(0 <= i && i < AbstractInterpreter::number_of_result_handlers,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
702 "index out of bounds");
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
703 return i;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
704 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
705
1256
c09ee209b65c 6926048: Improve Zero performance
kvn
parents: 1139
diff changeset
706 BasicType CppInterpreter::result_type_of(methodOop method) {
c09ee209b65c 6926048: Improve Zero performance
kvn
parents: 1139
diff changeset
707 BasicType t;
c09ee209b65c 6926048: Improve Zero performance
kvn
parents: 1139
diff changeset
708 switch (method->result_index()) {
c09ee209b65c 6926048: Improve Zero performance
kvn
parents: 1139
diff changeset
709 case 0 : t = T_BOOLEAN; break;
c09ee209b65c 6926048: Improve Zero performance
kvn
parents: 1139
diff changeset
710 case 1 : t = T_CHAR; break;
c09ee209b65c 6926048: Improve Zero performance
kvn
parents: 1139
diff changeset
711 case 2 : t = T_BYTE; break;
c09ee209b65c 6926048: Improve Zero performance
kvn
parents: 1139
diff changeset
712 case 3 : t = T_SHORT; break;
c09ee209b65c 6926048: Improve Zero performance
kvn
parents: 1139
diff changeset
713 case 4 : t = T_INT; break;
c09ee209b65c 6926048: Improve Zero performance
kvn
parents: 1139
diff changeset
714 case 5 : t = T_LONG; break;
c09ee209b65c 6926048: Improve Zero performance
kvn
parents: 1139
diff changeset
715 case 6 : t = T_VOID; break;
c09ee209b65c 6926048: Improve Zero performance
kvn
parents: 1139
diff changeset
716 case 7 : t = T_FLOAT; break;
c09ee209b65c 6926048: Improve Zero performance
kvn
parents: 1139
diff changeset
717 case 8 : t = T_DOUBLE; break;
c09ee209b65c 6926048: Improve Zero performance
kvn
parents: 1139
diff changeset
718 case 9 : t = T_OBJECT; break;
c09ee209b65c 6926048: Improve Zero performance
kvn
parents: 1139
diff changeset
719 default: ShouldNotReachHere();
c09ee209b65c 6926048: Improve Zero performance
kvn
parents: 1139
diff changeset
720 }
c09ee209b65c 6926048: Improve Zero performance
kvn
parents: 1139
diff changeset
721 assert(AbstractInterpreter::BasicType_as_index(t) == method->result_index(),
c09ee209b65c 6926048: Improve Zero performance
kvn
parents: 1139
diff changeset
722 "out of step with AbstractInterpreter::BasicType_as_index");
c09ee209b65c 6926048: Improve Zero performance
kvn
parents: 1139
diff changeset
723 return t;
c09ee209b65c 6926048: Improve Zero performance
kvn
parents: 1139
diff changeset
724 }
c09ee209b65c 6926048: Improve Zero performance
kvn
parents: 1139
diff changeset
725
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
726 address InterpreterGenerator::generate_empty_entry() {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
727 if (!UseFastEmptyMethods)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
728 return NULL;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
729
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
730 return generate_entry((address) CppInterpreter::empty_entry);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
731 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
732
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
733 address InterpreterGenerator::generate_accessor_entry() {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
734 if (!UseFastAccessorMethods)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
735 return NULL;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
736
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
737 return generate_entry((address) CppInterpreter::accessor_entry);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
738 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
739
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
740 address InterpreterGenerator::generate_Reference_get_entry(void) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
741 #ifndef SERIALGC
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
742 if (UseG1GC) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
743 // We need to generate have a routine that generates code to:
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
744 // * load the value in the referent field
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
745 // * passes that value to the pre-barrier.
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
746 //
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
747 // In the case of G1 this will record the value of the
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
748 // referent in an SATB buffer if marking is active.
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
749 // This will cause concurrent marking to mark the referent
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
750 // field as live.
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
751 Unimplemented();
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
752 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
753 #endif // SERIALGC
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
754
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
755 // If G1 is not enabled then attempt to go through the accessor entry point
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
756 // Reference.get is an accessor
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
757 return generate_accessor_entry();
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
758 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
759
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
760 address InterpreterGenerator::generate_native_entry(bool synchronized) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
761 assert(synchronized == false, "should be");
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
762
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
763 return generate_entry((address) CppInterpreter::native_entry);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
764 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
765
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
766 address InterpreterGenerator::generate_normal_entry(bool synchronized) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
767 assert(synchronized == false, "should be");
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
768
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
769 return generate_entry((address) CppInterpreter::normal_entry);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
770 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
771
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
772 address AbstractInterpreterGenerator::generate_method_entry(
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
773 AbstractInterpreter::MethodKind kind) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
774 address entry_point = NULL;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
775
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
776 switch (kind) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
777 case Interpreter::zerolocals:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
778 case Interpreter::zerolocals_synchronized:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
779 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
780
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
781 case Interpreter::native:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
782 entry_point = ((InterpreterGenerator*) this)->generate_native_entry(false);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
783 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
784
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
785 case Interpreter::native_synchronized:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
786 entry_point = ((InterpreterGenerator*) this)->generate_native_entry(false);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
787 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
788
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
789 case Interpreter::empty:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
790 entry_point = ((InterpreterGenerator*) this)->generate_empty_entry();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
791 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
792
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
793 case Interpreter::accessor:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
794 entry_point = ((InterpreterGenerator*) this)->generate_accessor_entry();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
795 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
796
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
797 case Interpreter::abstract:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
798 entry_point = ((InterpreterGenerator*) this)->generate_abstract_entry();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
799 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
800
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
801 case Interpreter::method_handle:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
802 entry_point = ((InterpreterGenerator*) this)->generate_method_handle_entry();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
803 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
804
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
805 case Interpreter::java_lang_math_sin:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
806 case Interpreter::java_lang_math_cos:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
807 case Interpreter::java_lang_math_tan:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
808 case Interpreter::java_lang_math_abs:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
809 case Interpreter::java_lang_math_log:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
810 case Interpreter::java_lang_math_log10:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
811 case Interpreter::java_lang_math_sqrt:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
812 entry_point = ((InterpreterGenerator*) this)->generate_math_entry(kind);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
813 break;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
814
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
815 case Interpreter::java_lang_ref_reference_get:
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
816 entry_point = ((InterpreterGenerator*)this)->generate_Reference_get_entry();
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
817 break;
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
818
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
819 default:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
820 ShouldNotReachHere();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
821 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
822
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
823 if (entry_point == NULL)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
824 entry_point = ((InterpreterGenerator*) this)->generate_normal_entry(false);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
825
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
826 return entry_point;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
827 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
828
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
829 InterpreterGenerator::InterpreterGenerator(StubQueue* code)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
830 : CppInterpreterGenerator(code) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
831 generate_all();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
832 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
833
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
834 // Deoptimization helpers
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
835
1379
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
836 InterpreterFrame *InterpreterFrame::build(int size, TRAPS) {
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
837 ZeroStack *stack = ((JavaThread *) THREAD)->zero_stack();
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
838
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
839 int size_in_words = size >> LogBytesPerWord;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
840 assert(size_in_words * wordSize == size, "unaligned");
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
841 assert(size_in_words >= header_words, "too small");
1379
f9271ff9d324 6941224: Improved stack overflow handling for Zero
twisti
parents: 1345
diff changeset
842 stack->overflow_check(size_in_words, CHECK_NULL);
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
843
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
844 stack->push(0); // next_frame, filled in later
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
845 intptr_t *fp = stack->sp();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
846 assert(fp - stack->sp() == next_frame_off, "should be");
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
847
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
848 stack->push(INTERPRETER_FRAME);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
849 assert(fp - stack->sp() == frame_type_off, "should be");
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
850
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
851 interpreterState istate =
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
852 (interpreterState) stack->alloc(sizeof(BytecodeInterpreter));
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
853 assert(fp - stack->sp() == istate_off, "should be");
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
854 istate->set_self_link(NULL); // mark invalid
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
855
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
856 stack->alloc((size_in_words - header_words) * wordSize);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
857
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
858 return (InterpreterFrame *) fp;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
859 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
860
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
861 int AbstractInterpreter::layout_activation(methodOop method,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
862 int tempcount,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
863 int popframe_extra_args,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
864 int moncount,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
865 int callee_param_count,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
866 int callee_locals,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
867 frame* caller,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
868 frame* interpreter_frame,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
869 bool is_top_frame) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
870 assert(popframe_extra_args == 0, "what to do?");
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
871 assert(!is_top_frame || (!callee_locals && !callee_param_count),
1605
d179e225c164 6960550: Missing semicolon in Zero
twisti
parents: 1552
diff changeset
872 "top frame should have no caller");
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
873
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
874 // This code must exactly match what InterpreterFrame::build
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
875 // does (the full InterpreterFrame::build, that is, not the
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
876 // one that creates empty frames for the deoptimizer).
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
877 //
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
878 // If interpreter_frame is not NULL then it will be filled in.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
879 // It's size is determined by a previous call to this method,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
880 // so it should be correct.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
881 //
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
882 // Note that tempcount is the current size of the expression
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
883 // stack. For top most frames we will allocate a full sized
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
884 // expression stack and not the trimmed version that non-top
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
885 // frames have.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
886
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
887 int header_words = InterpreterFrame::header_words;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
888 int monitor_words = moncount * frame::interpreter_frame_monitor_size();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
889 int stack_words = is_top_frame ? method->max_stack() : tempcount;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
890 int callee_extra_locals = callee_locals - callee_param_count;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
891
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
892 if (interpreter_frame) {
1505
0c5b3cf3c1f5 6939182: Zero JNI handles fix
twisti
parents: 1379
diff changeset
893 intptr_t *locals = interpreter_frame->fp() + method->max_locals();
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
894 interpreterState istate = interpreter_frame->get_interpreterState();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
895 intptr_t *monitor_base = (intptr_t*) istate;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
896 intptr_t *stack_base = monitor_base - monitor_words;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
897 intptr_t *stack = stack_base - tempcount - 1;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
898
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
899 BytecodeInterpreter::layout_interpreterState(istate,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
900 caller,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
901 NULL,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
902 method,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
903 locals,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
904 stack,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
905 stack_base,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
906 monitor_base,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
907 NULL,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
908 is_top_frame);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
909 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
910 return header_words + monitor_words + stack_words + callee_extra_locals;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
911 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
912
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
913 void BytecodeInterpreter::layout_interpreterState(interpreterState istate,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
914 frame* caller,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
915 frame* current,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
916 methodOop method,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
917 intptr_t* locals,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
918 intptr_t* stack,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
919 intptr_t* stack_base,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
920 intptr_t* monitor_base,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
921 intptr_t* frame_bottom,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
922 bool is_top_frame) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
923 istate->set_locals(locals);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
924 istate->set_method(method);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
925 istate->set_self_link(istate);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
926 istate->set_prev_link(NULL);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
927 // thread will be set by a hacky repurposing of frame::patch_pc()
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
928 // bcp will be set by vframeArrayElement::unpack_on_stack()
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
929 istate->set_constants(method->constants()->cache());
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
930 istate->set_msg(BytecodeInterpreter::method_resume);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
931 istate->set_bcp_advance(0);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
932 istate->set_oop_temp(NULL);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
933 istate->set_mdx(NULL);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
934 if (caller->is_interpreted_frame()) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
935 interpreterState prev = caller->get_interpreterState();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
936 prev->set_callee(method);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
937 if (*prev->bcp() == Bytecodes::_invokeinterface)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
938 prev->set_bcp_advance(5);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
939 else
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
940 prev->set_bcp_advance(3);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
941 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
942 istate->set_callee(NULL);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
943 istate->set_monitor_base((BasicObjectLock *) monitor_base);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
944 istate->set_stack_base(stack_base);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
945 istate->set_stack(stack);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
946 istate->set_stack_limit(stack_base - method->max_stack() - 1);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
947 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
948
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
949 address CppInterpreter::return_entry(TosState state, int length) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
950 ShouldNotCallThis();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
951 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
952
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
953 address CppInterpreter::deopt_entry(TosState state, int length) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
954 return NULL;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
955 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
956
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
957 // Helper for (runtime) stack overflow checks
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
958
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
959 int AbstractInterpreter::size_top_interpreter_activation(methodOop method) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
960 return 0;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
961 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
962
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
963 // Helper for figuring out if frames are interpreter frames
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
964
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
965 bool CppInterpreter::contains(address pc) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
966 #ifdef PRODUCT
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
967 ShouldNotCallThis();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
968 #else
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
969 return false; // make frame::print_value_on work
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
970 #endif // !PRODUCT
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
971 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
972
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
973 // Result handlers and convertors
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
974
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
975 address CppInterpreterGenerator::generate_result_handler_for(
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
976 BasicType type) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
977 assembler()->advance(1);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
978 return ShouldNotCallThisStub();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
979 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
980
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
981 address CppInterpreterGenerator::generate_tosca_to_stack_converter(
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
982 BasicType type) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
983 assembler()->advance(1);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
984 return ShouldNotCallThisStub();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
985 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
986
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
987 address CppInterpreterGenerator::generate_stack_to_stack_converter(
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
988 BasicType type) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
989 assembler()->advance(1);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
990 return ShouldNotCallThisStub();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
991 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
992
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
993 address CppInterpreterGenerator::generate_stack_to_native_abi_converter(
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
994 BasicType type) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
995 assembler()->advance(1);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
996 return ShouldNotCallThisStub();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
997 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
998
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
999 #endif // CC_INTERP