annotate src/cpu/x86/vm/c1_Runtime1_x86.cpp @ 2007:5ddfcf4b079e

7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer Summary: C1 with profiling doesn't check whether the MDO has been really allocated, which can silently fail if the perm gen is full. The solution is to check if the allocation failed and bailout out of inlining or compilation. Reviewed-by: kvn, never
author iveresov
date Thu, 02 Dec 2010 17:21:12 -0800
parents ac637b7220d1
children 06f017f7daa7 b1a2afa37ec4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1368
diff changeset
2 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1368
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1368
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1368
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
26 #include "c1/c1_Defs.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
27 #include "c1/c1_MacroAssembler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
28 #include "c1/c1_Runtime1.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
29 #include "interpreter/interpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
30 #include "nativeInst_x86.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
31 #include "oops/compiledICHolderOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
32 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
33 #include "prims/jvmtiExport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
34 #include "register_x86.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
35 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
36 #include "runtime/signature.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
37 #include "runtime/vframeArray.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
38 #include "vmreg_x86.inline.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
39
a61af66fc99e Initial load
duke
parents:
diff changeset
40
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // Implementation of StubAssembler
a61af66fc99e Initial load
duke
parents:
diff changeset
42
a61af66fc99e Initial load
duke
parents:
diff changeset
43 int StubAssembler::call_RT(Register oop_result1, Register oop_result2, address entry, int args_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // setup registers
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
45 const Register thread = NOT_LP64(rdi) LP64_ONLY(r15_thread); // is callee-saved register (Visual C++ calling conventions)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
46 assert(!(oop_result1->is_valid() || oop_result2->is_valid()) || oop_result1 != oop_result2, "registers must be different");
a61af66fc99e Initial load
duke
parents:
diff changeset
47 assert(oop_result1 != thread && oop_result2 != thread, "registers must be different");
a61af66fc99e Initial load
duke
parents:
diff changeset
48 assert(args_size >= 0, "illegal args_size");
a61af66fc99e Initial load
duke
parents:
diff changeset
49
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
50 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
51 mov(c_rarg0, thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
52 set_num_rt_args(0); // Nothing on stack
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
53 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
54 set_num_rt_args(1 + args_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // push java thread (becomes first argument of C function)
a61af66fc99e Initial load
duke
parents:
diff changeset
57 get_thread(thread);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
58 push(thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
59 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
60
a61af66fc99e Initial load
duke
parents:
diff changeset
61 set_last_Java_frame(thread, noreg, rbp, NULL);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
62
0
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // do the call
a61af66fc99e Initial load
duke
parents:
diff changeset
64 call(RuntimeAddress(entry));
a61af66fc99e Initial load
duke
parents:
diff changeset
65 int call_offset = offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // verify callee-saved register
a61af66fc99e Initial load
duke
parents:
diff changeset
67 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
68 guarantee(thread != rax, "change this code");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
69 push(rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
70 { Label L;
a61af66fc99e Initial load
duke
parents:
diff changeset
71 get_thread(rax);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
72 cmpptr(thread, rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
73 jcc(Assembler::equal, L);
a61af66fc99e Initial load
duke
parents:
diff changeset
74 int3();
a61af66fc99e Initial load
duke
parents:
diff changeset
75 stop("StubAssembler::call_RT: rdi not callee saved?");
a61af66fc99e Initial load
duke
parents:
diff changeset
76 bind(L);
a61af66fc99e Initial load
duke
parents:
diff changeset
77 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
78 pop(rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
79 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
80 reset_last_Java_frame(thread, true, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // discard thread and arguments
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
83 NOT_LP64(addptr(rsp, num_rt_args()*BytesPerWord));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
84
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // check for pending exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
86 { Label L;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
87 cmpptr(Address(thread, Thread::pending_exception_offset()), (int32_t)NULL_WORD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
88 jcc(Assembler::equal, L);
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // exception pending => remove activation and forward to exception handler
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
90 movptr(rax, Address(thread, Thread::pending_exception_offset()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // make sure that the vm_results are cleared
a61af66fc99e Initial load
duke
parents:
diff changeset
92 if (oop_result1->is_valid()) {
512
db4caa99ef11 6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents: 380
diff changeset
93 movptr(Address(thread, JavaThread::vm_result_offset()), NULL_WORD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
94 }
a61af66fc99e Initial load
duke
parents:
diff changeset
95 if (oop_result2->is_valid()) {
512
db4caa99ef11 6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents: 380
diff changeset
96 movptr(Address(thread, JavaThread::vm_result_2_offset()), NULL_WORD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
97 }
a61af66fc99e Initial load
duke
parents:
diff changeset
98 if (frame_size() == no_frame_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
99 leave();
a61af66fc99e Initial load
duke
parents:
diff changeset
100 jump(RuntimeAddress(StubRoutines::forward_exception_entry()));
a61af66fc99e Initial load
duke
parents:
diff changeset
101 } else if (_stub_id == Runtime1::forward_exception_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
102 should_not_reach_here();
a61af66fc99e Initial load
duke
parents:
diff changeset
103 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
104 jump(RuntimeAddress(Runtime1::entry_for(Runtime1::forward_exception_id)));
a61af66fc99e Initial load
duke
parents:
diff changeset
105 }
a61af66fc99e Initial load
duke
parents:
diff changeset
106 bind(L);
a61af66fc99e Initial load
duke
parents:
diff changeset
107 }
a61af66fc99e Initial load
duke
parents:
diff changeset
108 // get oop results if there are any and reset the values in the thread
a61af66fc99e Initial load
duke
parents:
diff changeset
109 if (oop_result1->is_valid()) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
110 movptr(oop_result1, Address(thread, JavaThread::vm_result_offset()));
512
db4caa99ef11 6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents: 380
diff changeset
111 movptr(Address(thread, JavaThread::vm_result_offset()), NULL_WORD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
112 verify_oop(oop_result1);
a61af66fc99e Initial load
duke
parents:
diff changeset
113 }
a61af66fc99e Initial load
duke
parents:
diff changeset
114 if (oop_result2->is_valid()) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
115 movptr(oop_result2, Address(thread, JavaThread::vm_result_2_offset()));
512
db4caa99ef11 6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents: 380
diff changeset
116 movptr(Address(thread, JavaThread::vm_result_2_offset()), NULL_WORD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
117 verify_oop(oop_result2);
a61af66fc99e Initial load
duke
parents:
diff changeset
118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
119 return call_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
120 }
a61af66fc99e Initial load
duke
parents:
diff changeset
121
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 int StubAssembler::call_RT(Register oop_result1, Register oop_result2, address entry, Register arg1) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
124 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
125 mov(c_rarg1, arg1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
126 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
127 push(arg1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
128 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
129 return call_RT(oop_result1, oop_result2, entry, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
130 }
a61af66fc99e Initial load
duke
parents:
diff changeset
131
a61af66fc99e Initial load
duke
parents:
diff changeset
132
a61af66fc99e Initial load
duke
parents:
diff changeset
133 int StubAssembler::call_RT(Register oop_result1, Register oop_result2, address entry, Register arg1, Register arg2) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
134 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
135 if (c_rarg1 == arg2) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
136 if (c_rarg2 == arg1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
137 xchgq(arg1, arg2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
138 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
139 mov(c_rarg2, arg2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
140 mov(c_rarg1, arg1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
141 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
142 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
143 mov(c_rarg1, arg1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
144 mov(c_rarg2, arg2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
145 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
146 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
147 push(arg2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
148 push(arg1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
149 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
150 return call_RT(oop_result1, oop_result2, entry, 2);
a61af66fc99e Initial load
duke
parents:
diff changeset
151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 int StubAssembler::call_RT(Register oop_result1, Register oop_result2, address entry, Register arg1, Register arg2, Register arg3) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
155 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
156 // if there is any conflict use the stack
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
157 if (arg1 == c_rarg2 || arg1 == c_rarg3 ||
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
158 arg2 == c_rarg1 || arg1 == c_rarg3 ||
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
159 arg3 == c_rarg1 || arg1 == c_rarg2) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
160 push(arg3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
161 push(arg2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
162 push(arg1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
163 pop(c_rarg1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
164 pop(c_rarg2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
165 pop(c_rarg3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
166 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
167 mov(c_rarg1, arg1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
168 mov(c_rarg2, arg2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
169 mov(c_rarg3, arg3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
170 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
171 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
172 push(arg3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
173 push(arg2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
174 push(arg1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
175 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
176 return call_RT(oop_result1, oop_result2, entry, 3);
a61af66fc99e Initial load
duke
parents:
diff changeset
177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
178
a61af66fc99e Initial load
duke
parents:
diff changeset
179
a61af66fc99e Initial load
duke
parents:
diff changeset
180 // Implementation of StubFrame
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 class StubFrame: public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
183 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
184 StubAssembler* _sasm;
a61af66fc99e Initial load
duke
parents:
diff changeset
185
a61af66fc99e Initial load
duke
parents:
diff changeset
186 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
187 StubFrame(StubAssembler* sasm, const char* name, bool must_gc_arguments);
a61af66fc99e Initial load
duke
parents:
diff changeset
188 void load_argument(int offset_in_words, Register reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
189
a61af66fc99e Initial load
duke
parents:
diff changeset
190 ~StubFrame();
a61af66fc99e Initial load
duke
parents:
diff changeset
191 };
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 #define __ _sasm->
a61af66fc99e Initial load
duke
parents:
diff changeset
195
a61af66fc99e Initial load
duke
parents:
diff changeset
196 StubFrame::StubFrame(StubAssembler* sasm, const char* name, bool must_gc_arguments) {
a61af66fc99e Initial load
duke
parents:
diff changeset
197 _sasm = sasm;
a61af66fc99e Initial load
duke
parents:
diff changeset
198 __ set_info(name, must_gc_arguments);
a61af66fc99e Initial load
duke
parents:
diff changeset
199 __ enter();
a61af66fc99e Initial load
duke
parents:
diff changeset
200 }
a61af66fc99e Initial load
duke
parents:
diff changeset
201
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // load parameters that were stored with LIR_Assembler::store_parameter
a61af66fc99e Initial load
duke
parents:
diff changeset
203 // Note: offsets for store_parameter and load_argument must match
a61af66fc99e Initial load
duke
parents:
diff changeset
204 void StubFrame::load_argument(int offset_in_words, Register reg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // rbp, + 0: link
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // + 1: return address
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // + 2: argument with offset 0
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // + 3: argument with offset 1
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // + 4: ...
a61af66fc99e Initial load
duke
parents:
diff changeset
210
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
211 __ movptr(reg, Address(rbp, (offset_in_words + 2) * BytesPerWord));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
212 }
a61af66fc99e Initial load
duke
parents:
diff changeset
213
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215 StubFrame::~StubFrame() {
a61af66fc99e Initial load
duke
parents:
diff changeset
216 __ leave();
a61af66fc99e Initial load
duke
parents:
diff changeset
217 __ ret(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
218 }
a61af66fc99e Initial load
duke
parents:
diff changeset
219
a61af66fc99e Initial load
duke
parents:
diff changeset
220 #undef __
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // Implementation of Runtime1
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225 #define __ sasm->
a61af66fc99e Initial load
duke
parents:
diff changeset
226
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
227 const int float_regs_as_doubles_size_in_slots = pd_nof_fpu_regs_frame_map * 2;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
228 const int xmm_regs_as_doubles_size_in_slots = FrameMap::nof_xmm_regs * 2;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
229
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // Stack layout for saving/restoring all the registers needed during a runtime
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // call (this includes deoptimization)
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // Note: note that users of this frame may well have arguments to some runtime
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // while these values are on the stack. These positions neglect those arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // but the code in save_live_registers will take the argument count into
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // account.
a61af66fc99e Initial load
duke
parents:
diff changeset
236 //
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
237 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
238 #define SLOT2(x) x,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
239 #define SLOT_PER_WORD 2
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
240 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
241 #define SLOT2(x)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
242 #define SLOT_PER_WORD 1
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
243 #endif // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
244
0
a61af66fc99e Initial load
duke
parents:
diff changeset
245 enum reg_save_layout {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
246 // 64bit needs to keep stack 16 byte aligned. So we add some alignment dummies to make that
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
247 // happen and will assert if the stack size we create is misaligned
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
248 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
249 align_dummy_0, align_dummy_1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
250 #endif // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
251 dummy1, SLOT2(dummy1H) // 0, 4
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
252 dummy2, SLOT2(dummy2H) // 8, 12
0
a61af66fc99e Initial load
duke
parents:
diff changeset
253 // Two temps to be used as needed by users of save/restore callee registers
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
254 temp_2_off, SLOT2(temp_2H_off) // 16, 20
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
255 temp_1_off, SLOT2(temp_1H_off) // 24, 28
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
256 xmm_regs_as_doubles_off, // 32
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
257 float_regs_as_doubles_off = xmm_regs_as_doubles_off + xmm_regs_as_doubles_size_in_slots, // 160
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
258 fpu_state_off = float_regs_as_doubles_off + float_regs_as_doubles_size_in_slots, // 224
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
259 // fpu_state_end_off is exclusive
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
260 fpu_state_end_off = fpu_state_off + (FPUStateSizeInWords / SLOT_PER_WORD), // 352
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
261 marker = fpu_state_end_off, SLOT2(markerH) // 352, 356
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
262 extra_space_offset, // 360
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
263 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
264 r15_off = extra_space_offset, r15H_off, // 360, 364
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
265 r14_off, r14H_off, // 368, 372
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
266 r13_off, r13H_off, // 376, 380
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
267 r12_off, r12H_off, // 384, 388
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
268 r11_off, r11H_off, // 392, 396
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
269 r10_off, r10H_off, // 400, 404
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
270 r9_off, r9H_off, // 408, 412
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
271 r8_off, r8H_off, // 416, 420
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
272 rdi_off, rdiH_off, // 424, 428
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
273 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
274 rdi_off = extra_space_offset,
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
275 #endif // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
276 rsi_off, SLOT2(rsiH_off) // 432, 436
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
277 rbp_off, SLOT2(rbpH_off) // 440, 444
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
278 rsp_off, SLOT2(rspH_off) // 448, 452
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
279 rbx_off, SLOT2(rbxH_off) // 456, 460
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
280 rdx_off, SLOT2(rdxH_off) // 464, 468
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
281 rcx_off, SLOT2(rcxH_off) // 472, 476
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
282 rax_off, SLOT2(raxH_off) // 480, 484
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
283 saved_rbp_off, SLOT2(saved_rbpH_off) // 488, 492
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
284 return_off, SLOT2(returnH_off) // 496, 500
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
285 reg_save_frame_size, // As noted: neglects any parameters to runtime // 504
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
286
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
287 #ifdef _WIN64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
288 c_rarg0_off = rcx_off,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
289 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
290 c_rarg0_off = rdi_off,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
291 #endif // WIN64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
292
a61af66fc99e Initial load
duke
parents:
diff changeset
293 // equates
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // illegal instruction handler
a61af66fc99e Initial load
duke
parents:
diff changeset
296 continue_dest_off = temp_1_off,
a61af66fc99e Initial load
duke
parents:
diff changeset
297
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // deoptimization equates
a61af66fc99e Initial load
duke
parents:
diff changeset
299 fp0_off = float_regs_as_doubles_off, // slot for java float/double return value
a61af66fc99e Initial load
duke
parents:
diff changeset
300 xmm0_off = xmm_regs_as_doubles_off, // slot for java float/double return value
a61af66fc99e Initial load
duke
parents:
diff changeset
301 deopt_type = temp_2_off, // slot for type of deopt in progress
a61af66fc99e Initial load
duke
parents:
diff changeset
302 ret_type = temp_1_off // slot for return type
a61af66fc99e Initial load
duke
parents:
diff changeset
303 };
a61af66fc99e Initial load
duke
parents:
diff changeset
304
a61af66fc99e Initial load
duke
parents:
diff changeset
305
a61af66fc99e Initial load
duke
parents:
diff changeset
306
a61af66fc99e Initial load
duke
parents:
diff changeset
307 // Save off registers which might be killed by calls into the runtime.
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // Tries to smart of about FP registers. In particular we separate
a61af66fc99e Initial load
duke
parents:
diff changeset
309 // saving and describing the FPU registers for deoptimization since we
a61af66fc99e Initial load
duke
parents:
diff changeset
310 // have to save the FPU registers twice if we describe them and on P4
a61af66fc99e Initial load
duke
parents:
diff changeset
311 // saving FPU registers which don't contain anything appears
a61af66fc99e Initial load
duke
parents:
diff changeset
312 // expensive. The deopt blob is the only thing which needs to
a61af66fc99e Initial load
duke
parents:
diff changeset
313 // describe FPU registers. In all other cases it should be sufficient
a61af66fc99e Initial load
duke
parents:
diff changeset
314 // to simply save their current value.
a61af66fc99e Initial load
duke
parents:
diff changeset
315
a61af66fc99e Initial load
duke
parents:
diff changeset
316 static OopMap* generate_oop_map(StubAssembler* sasm, int num_rt_args,
a61af66fc99e Initial load
duke
parents:
diff changeset
317 bool save_fpu_registers = true) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
318
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
319 // In 64bit all the args are in regs so there are no additional stack slots
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
320 LP64_ONLY(num_rt_args = 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
321 LP64_ONLY(assert((reg_save_frame_size * VMRegImpl::stack_slot_size) % 16 == 0, "must be 16 byte aligned");)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
322 int frame_size_in_slots = reg_save_frame_size + num_rt_args; // args + thread
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
323 sasm->set_frame_size(frame_size_in_slots / VMRegImpl::slots_per_word );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
324
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // record saved value locations in an OopMap
a61af66fc99e Initial load
duke
parents:
diff changeset
326 // locations are offsets from sp after runtime call; num_rt_args is number of arguments in call, including thread
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
327 OopMap* map = new OopMap(frame_size_in_slots, 0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
328 map->set_callee_saved(VMRegImpl::stack2reg(rax_off + num_rt_args), rax->as_VMReg());
a61af66fc99e Initial load
duke
parents:
diff changeset
329 map->set_callee_saved(VMRegImpl::stack2reg(rcx_off + num_rt_args), rcx->as_VMReg());
a61af66fc99e Initial load
duke
parents:
diff changeset
330 map->set_callee_saved(VMRegImpl::stack2reg(rdx_off + num_rt_args), rdx->as_VMReg());
a61af66fc99e Initial load
duke
parents:
diff changeset
331 map->set_callee_saved(VMRegImpl::stack2reg(rbx_off + num_rt_args), rbx->as_VMReg());
a61af66fc99e Initial load
duke
parents:
diff changeset
332 map->set_callee_saved(VMRegImpl::stack2reg(rsi_off + num_rt_args), rsi->as_VMReg());
a61af66fc99e Initial load
duke
parents:
diff changeset
333 map->set_callee_saved(VMRegImpl::stack2reg(rdi_off + num_rt_args), rdi->as_VMReg());
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
334 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
335 map->set_callee_saved(VMRegImpl::stack2reg(r8_off + num_rt_args), r8->as_VMReg());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
336 map->set_callee_saved(VMRegImpl::stack2reg(r9_off + num_rt_args), r9->as_VMReg());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
337 map->set_callee_saved(VMRegImpl::stack2reg(r10_off + num_rt_args), r10->as_VMReg());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
338 map->set_callee_saved(VMRegImpl::stack2reg(r11_off + num_rt_args), r11->as_VMReg());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
339 map->set_callee_saved(VMRegImpl::stack2reg(r12_off + num_rt_args), r12->as_VMReg());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
340 map->set_callee_saved(VMRegImpl::stack2reg(r13_off + num_rt_args), r13->as_VMReg());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
341 map->set_callee_saved(VMRegImpl::stack2reg(r14_off + num_rt_args), r14->as_VMReg());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
342 map->set_callee_saved(VMRegImpl::stack2reg(r15_off + num_rt_args), r15->as_VMReg());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
343
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
344 // This is stupid but needed.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
345 map->set_callee_saved(VMRegImpl::stack2reg(raxH_off + num_rt_args), rax->as_VMReg()->next());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
346 map->set_callee_saved(VMRegImpl::stack2reg(rcxH_off + num_rt_args), rcx->as_VMReg()->next());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
347 map->set_callee_saved(VMRegImpl::stack2reg(rdxH_off + num_rt_args), rdx->as_VMReg()->next());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
348 map->set_callee_saved(VMRegImpl::stack2reg(rbxH_off + num_rt_args), rbx->as_VMReg()->next());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
349 map->set_callee_saved(VMRegImpl::stack2reg(rsiH_off + num_rt_args), rsi->as_VMReg()->next());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
350 map->set_callee_saved(VMRegImpl::stack2reg(rdiH_off + num_rt_args), rdi->as_VMReg()->next());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
351
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
352 map->set_callee_saved(VMRegImpl::stack2reg(r8H_off + num_rt_args), r8->as_VMReg()->next());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
353 map->set_callee_saved(VMRegImpl::stack2reg(r9H_off + num_rt_args), r9->as_VMReg()->next());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
354 map->set_callee_saved(VMRegImpl::stack2reg(r10H_off + num_rt_args), r10->as_VMReg()->next());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
355 map->set_callee_saved(VMRegImpl::stack2reg(r11H_off + num_rt_args), r11->as_VMReg()->next());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
356 map->set_callee_saved(VMRegImpl::stack2reg(r12H_off + num_rt_args), r12->as_VMReg()->next());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
357 map->set_callee_saved(VMRegImpl::stack2reg(r13H_off + num_rt_args), r13->as_VMReg()->next());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
358 map->set_callee_saved(VMRegImpl::stack2reg(r14H_off + num_rt_args), r14->as_VMReg()->next());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
359 map->set_callee_saved(VMRegImpl::stack2reg(r15H_off + num_rt_args), r15->as_VMReg()->next());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
360 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
361
a61af66fc99e Initial load
duke
parents:
diff changeset
362 if (save_fpu_registers) {
a61af66fc99e Initial load
duke
parents:
diff changeset
363 if (UseSSE < 2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
364 int fpu_off = float_regs_as_doubles_off;
a61af66fc99e Initial load
duke
parents:
diff changeset
365 for (int n = 0; n < FrameMap::nof_fpu_regs; n++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
366 VMReg fpu_name_0 = FrameMap::fpu_regname(n);
a61af66fc99e Initial load
duke
parents:
diff changeset
367 map->set_callee_saved(VMRegImpl::stack2reg(fpu_off + num_rt_args), fpu_name_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
368 // %%% This is really a waste but we'll keep things as they were for now
a61af66fc99e Initial load
duke
parents:
diff changeset
369 if (true) {
a61af66fc99e Initial load
duke
parents:
diff changeset
370 map->set_callee_saved(VMRegImpl::stack2reg(fpu_off + 1 + num_rt_args), fpu_name_0->next());
a61af66fc99e Initial load
duke
parents:
diff changeset
371 }
a61af66fc99e Initial load
duke
parents:
diff changeset
372 fpu_off += 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
373 }
a61af66fc99e Initial load
duke
parents:
diff changeset
374 assert(fpu_off == fpu_state_off, "incorrect number of fpu stack slots");
a61af66fc99e Initial load
duke
parents:
diff changeset
375 }
a61af66fc99e Initial load
duke
parents:
diff changeset
376
a61af66fc99e Initial load
duke
parents:
diff changeset
377 if (UseSSE >= 2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
378 int xmm_off = xmm_regs_as_doubles_off;
a61af66fc99e Initial load
duke
parents:
diff changeset
379 for (int n = 0; n < FrameMap::nof_xmm_regs; n++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
380 VMReg xmm_name_0 = as_XMMRegister(n)->as_VMReg();
a61af66fc99e Initial load
duke
parents:
diff changeset
381 map->set_callee_saved(VMRegImpl::stack2reg(xmm_off + num_rt_args), xmm_name_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
382 // %%% This is really a waste but we'll keep things as they were for now
a61af66fc99e Initial load
duke
parents:
diff changeset
383 if (true) {
a61af66fc99e Initial load
duke
parents:
diff changeset
384 map->set_callee_saved(VMRegImpl::stack2reg(xmm_off + 1 + num_rt_args), xmm_name_0->next());
a61af66fc99e Initial load
duke
parents:
diff changeset
385 }
a61af66fc99e Initial load
duke
parents:
diff changeset
386 xmm_off += 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
387 }
a61af66fc99e Initial load
duke
parents:
diff changeset
388 assert(xmm_off == float_regs_as_doubles_off, "incorrect number of xmm registers");
a61af66fc99e Initial load
duke
parents:
diff changeset
389
a61af66fc99e Initial load
duke
parents:
diff changeset
390 } else if (UseSSE == 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
391 int xmm_off = xmm_regs_as_doubles_off;
a61af66fc99e Initial load
duke
parents:
diff changeset
392 for (int n = 0; n < FrameMap::nof_xmm_regs; n++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
393 VMReg xmm_name_0 = as_XMMRegister(n)->as_VMReg();
a61af66fc99e Initial load
duke
parents:
diff changeset
394 map->set_callee_saved(VMRegImpl::stack2reg(xmm_off + num_rt_args), xmm_name_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
395 xmm_off += 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
396 }
a61af66fc99e Initial load
duke
parents:
diff changeset
397 assert(xmm_off == float_regs_as_doubles_off, "incorrect number of xmm registers");
a61af66fc99e Initial load
duke
parents:
diff changeset
398 }
a61af66fc99e Initial load
duke
parents:
diff changeset
399 }
a61af66fc99e Initial load
duke
parents:
diff changeset
400
a61af66fc99e Initial load
duke
parents:
diff changeset
401 return map;
a61af66fc99e Initial load
duke
parents:
diff changeset
402 }
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404 static OopMap* save_live_registers(StubAssembler* sasm, int num_rt_args,
a61af66fc99e Initial load
duke
parents:
diff changeset
405 bool save_fpu_registers = true) {
a61af66fc99e Initial load
duke
parents:
diff changeset
406 __ block_comment("save_live_registers");
a61af66fc99e Initial load
duke
parents:
diff changeset
407
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
408 // 64bit passes the args in regs to the c++ runtime
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
409 int frame_size_in_slots = reg_save_frame_size NOT_LP64(+ num_rt_args); // args + thread
0
a61af66fc99e Initial load
duke
parents:
diff changeset
410 // frame_size = round_to(frame_size, 4);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
411 sasm->set_frame_size(frame_size_in_slots / VMRegImpl::slots_per_word );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
412
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
413 __ pusha(); // integer registers
0
a61af66fc99e Initial load
duke
parents:
diff changeset
414
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // assert(float_regs_as_doubles_off % 2 == 0, "misaligned offset");
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // assert(xmm_regs_as_doubles_off % 2 == 0, "misaligned offset");
a61af66fc99e Initial load
duke
parents:
diff changeset
417
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
418 __ subptr(rsp, extra_space_offset * VMRegImpl::stack_slot_size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
419
a61af66fc99e Initial load
duke
parents:
diff changeset
420 #ifdef ASSERT
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
421 __ movptr(Address(rsp, marker * VMRegImpl::stack_slot_size), (int32_t)0xfeedbeef);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
422 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
423
a61af66fc99e Initial load
duke
parents:
diff changeset
424 if (save_fpu_registers) {
a61af66fc99e Initial load
duke
parents:
diff changeset
425 if (UseSSE < 2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
426 // save FPU stack
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
427 __ fnsave(Address(rsp, fpu_state_off * VMRegImpl::stack_slot_size));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
428 __ fwait();
a61af66fc99e Initial load
duke
parents:
diff changeset
429
a61af66fc99e Initial load
duke
parents:
diff changeset
430 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
431 Label ok;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
432 __ cmpw(Address(rsp, fpu_state_off * VMRegImpl::stack_slot_size), StubRoutines::fpu_cntrl_wrd_std());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
433 __ jccb(Assembler::equal, ok);
a61af66fc99e Initial load
duke
parents:
diff changeset
434 __ stop("corrupted control word detected");
a61af66fc99e Initial load
duke
parents:
diff changeset
435 __ bind(ok);
a61af66fc99e Initial load
duke
parents:
diff changeset
436 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
437
a61af66fc99e Initial load
duke
parents:
diff changeset
438 // Reset the control word to guard against exceptions being unmasked
a61af66fc99e Initial load
duke
parents:
diff changeset
439 // since fstp_d can cause FPU stack underflow exceptions. Write it
a61af66fc99e Initial load
duke
parents:
diff changeset
440 // into the on stack copy and then reload that to make sure that the
a61af66fc99e Initial load
duke
parents:
diff changeset
441 // current and future values are correct.
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
442 __ movw(Address(rsp, fpu_state_off * VMRegImpl::stack_slot_size), StubRoutines::fpu_cntrl_wrd_std());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
443 __ frstor(Address(rsp, fpu_state_off * VMRegImpl::stack_slot_size));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
444
a61af66fc99e Initial load
duke
parents:
diff changeset
445 // Save the FPU registers in de-opt-able form
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
446 __ fstp_d(Address(rsp, float_regs_as_doubles_off * VMRegImpl::stack_slot_size + 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
447 __ fstp_d(Address(rsp, float_regs_as_doubles_off * VMRegImpl::stack_slot_size + 8));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
448 __ fstp_d(Address(rsp, float_regs_as_doubles_off * VMRegImpl::stack_slot_size + 16));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
449 __ fstp_d(Address(rsp, float_regs_as_doubles_off * VMRegImpl::stack_slot_size + 24));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
450 __ fstp_d(Address(rsp, float_regs_as_doubles_off * VMRegImpl::stack_slot_size + 32));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
451 __ fstp_d(Address(rsp, float_regs_as_doubles_off * VMRegImpl::stack_slot_size + 40));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
452 __ fstp_d(Address(rsp, float_regs_as_doubles_off * VMRegImpl::stack_slot_size + 48));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
453 __ fstp_d(Address(rsp, float_regs_as_doubles_off * VMRegImpl::stack_slot_size + 56));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
454 }
a61af66fc99e Initial load
duke
parents:
diff changeset
455
a61af66fc99e Initial load
duke
parents:
diff changeset
456 if (UseSSE >= 2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // save XMM registers
a61af66fc99e Initial load
duke
parents:
diff changeset
458 // XMM registers can contain float or double values, but this is not known here,
a61af66fc99e Initial load
duke
parents:
diff changeset
459 // so always save them as doubles.
a61af66fc99e Initial load
duke
parents:
diff changeset
460 // note that float values are _not_ converted automatically, so for float values
a61af66fc99e Initial load
duke
parents:
diff changeset
461 // the second word contains only garbage data.
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
462 __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 0), xmm0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
463 __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 8), xmm1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
464 __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 16), xmm2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
465 __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 24), xmm3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
466 __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 32), xmm4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
467 __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 40), xmm5);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
468 __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 48), xmm6);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
469 __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 56), xmm7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
470 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
471 __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 64), xmm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
472 __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 72), xmm9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
473 __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 80), xmm10);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
474 __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 88), xmm11);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
475 __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 96), xmm12);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
476 __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 104), xmm13);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
477 __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 112), xmm14);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
478 __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 120), xmm15);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
479 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
480 } else if (UseSSE == 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
481 // save XMM registers as float because double not supported without SSE2
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
482 __ movflt(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 0), xmm0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
483 __ movflt(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 8), xmm1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
484 __ movflt(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 16), xmm2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
485 __ movflt(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 24), xmm3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
486 __ movflt(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 32), xmm4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
487 __ movflt(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 40), xmm5);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
488 __ movflt(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 48), xmm6);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
489 __ movflt(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 56), xmm7);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
490 }
a61af66fc99e Initial load
duke
parents:
diff changeset
491 }
a61af66fc99e Initial load
duke
parents:
diff changeset
492
a61af66fc99e Initial load
duke
parents:
diff changeset
493 // FPU stack must be empty now
a61af66fc99e Initial load
duke
parents:
diff changeset
494 __ verify_FPU(0, "save_live_registers");
a61af66fc99e Initial load
duke
parents:
diff changeset
495
a61af66fc99e Initial load
duke
parents:
diff changeset
496 return generate_oop_map(sasm, num_rt_args, save_fpu_registers);
a61af66fc99e Initial load
duke
parents:
diff changeset
497 }
a61af66fc99e Initial load
duke
parents:
diff changeset
498
a61af66fc99e Initial load
duke
parents:
diff changeset
499
a61af66fc99e Initial load
duke
parents:
diff changeset
500 static void restore_fpu(StubAssembler* sasm, bool restore_fpu_registers = true) {
a61af66fc99e Initial load
duke
parents:
diff changeset
501 if (restore_fpu_registers) {
a61af66fc99e Initial load
duke
parents:
diff changeset
502 if (UseSSE >= 2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
503 // restore XMM registers
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
504 __ movdbl(xmm0, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
505 __ movdbl(xmm1, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 8));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
506 __ movdbl(xmm2, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 16));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
507 __ movdbl(xmm3, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 24));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
508 __ movdbl(xmm4, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 32));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
509 __ movdbl(xmm5, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 40));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
510 __ movdbl(xmm6, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 48));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
511 __ movdbl(xmm7, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 56));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
512 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
513 __ movdbl(xmm8, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 64));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
514 __ movdbl(xmm9, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 72));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
515 __ movdbl(xmm10, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 80));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
516 __ movdbl(xmm11, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 88));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
517 __ movdbl(xmm12, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 96));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
518 __ movdbl(xmm13, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 104));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
519 __ movdbl(xmm14, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 112));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
520 __ movdbl(xmm15, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 120));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
521 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
522 } else if (UseSSE == 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
523 // restore XMM registers
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
524 __ movflt(xmm0, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
525 __ movflt(xmm1, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 8));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
526 __ movflt(xmm2, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 16));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
527 __ movflt(xmm3, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 24));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
528 __ movflt(xmm4, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 32));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
529 __ movflt(xmm5, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 40));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
530 __ movflt(xmm6, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 48));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
531 __ movflt(xmm7, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 56));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
532 }
a61af66fc99e Initial load
duke
parents:
diff changeset
533
a61af66fc99e Initial load
duke
parents:
diff changeset
534 if (UseSSE < 2) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
535 __ frstor(Address(rsp, fpu_state_off * VMRegImpl::stack_slot_size));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
536 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
537 // check that FPU stack is really empty
a61af66fc99e Initial load
duke
parents:
diff changeset
538 __ verify_FPU(0, "restore_live_registers");
a61af66fc99e Initial load
duke
parents:
diff changeset
539 }
a61af66fc99e Initial load
duke
parents:
diff changeset
540
a61af66fc99e Initial load
duke
parents:
diff changeset
541 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
542 // check that FPU stack is really empty
a61af66fc99e Initial load
duke
parents:
diff changeset
543 __ verify_FPU(0, "restore_live_registers");
a61af66fc99e Initial load
duke
parents:
diff changeset
544 }
a61af66fc99e Initial load
duke
parents:
diff changeset
545
a61af66fc99e Initial load
duke
parents:
diff changeset
546 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
547 {
a61af66fc99e Initial load
duke
parents:
diff changeset
548 Label ok;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
549 __ cmpptr(Address(rsp, marker * VMRegImpl::stack_slot_size), (int32_t)0xfeedbeef);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
550 __ jcc(Assembler::equal, ok);
a61af66fc99e Initial load
duke
parents:
diff changeset
551 __ stop("bad offsets in frame");
a61af66fc99e Initial load
duke
parents:
diff changeset
552 __ bind(ok);
a61af66fc99e Initial load
duke
parents:
diff changeset
553 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
554 #endif // ASSERT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
555
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
556 __ addptr(rsp, extra_space_offset * VMRegImpl::stack_slot_size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
557 }
a61af66fc99e Initial load
duke
parents:
diff changeset
558
a61af66fc99e Initial load
duke
parents:
diff changeset
559
a61af66fc99e Initial load
duke
parents:
diff changeset
560 static void restore_live_registers(StubAssembler* sasm, bool restore_fpu_registers = true) {
a61af66fc99e Initial load
duke
parents:
diff changeset
561 __ block_comment("restore_live_registers");
a61af66fc99e Initial load
duke
parents:
diff changeset
562
a61af66fc99e Initial load
duke
parents:
diff changeset
563 restore_fpu(sasm, restore_fpu_registers);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
564 __ popa();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
565 }
a61af66fc99e Initial load
duke
parents:
diff changeset
566
a61af66fc99e Initial load
duke
parents:
diff changeset
567
a61af66fc99e Initial load
duke
parents:
diff changeset
568 static void restore_live_registers_except_rax(StubAssembler* sasm, bool restore_fpu_registers = true) {
a61af66fc99e Initial load
duke
parents:
diff changeset
569 __ block_comment("restore_live_registers_except_rax");
a61af66fc99e Initial load
duke
parents:
diff changeset
570
a61af66fc99e Initial load
duke
parents:
diff changeset
571 restore_fpu(sasm, restore_fpu_registers);
a61af66fc99e Initial load
duke
parents:
diff changeset
572
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
573 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
574 __ movptr(r15, Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
575 __ movptr(r14, Address(rsp, wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
576 __ movptr(r13, Address(rsp, 2 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
577 __ movptr(r12, Address(rsp, 3 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
578 __ movptr(r11, Address(rsp, 4 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
579 __ movptr(r10, Address(rsp, 5 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
580 __ movptr(r9, Address(rsp, 6 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
581 __ movptr(r8, Address(rsp, 7 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
582 __ movptr(rdi, Address(rsp, 8 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
583 __ movptr(rsi, Address(rsp, 9 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
584 __ movptr(rbp, Address(rsp, 10 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
585 // skip rsp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
586 __ movptr(rbx, Address(rsp, 12 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
587 __ movptr(rdx, Address(rsp, 13 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
588 __ movptr(rcx, Address(rsp, 14 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
589
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
590 __ addptr(rsp, 16 * wordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
591 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
592
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
593 __ pop(rdi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
594 __ pop(rsi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
595 __ pop(rbp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
596 __ pop(rbx); // skip this value
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
597 __ pop(rbx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
598 __ pop(rdx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
599 __ pop(rcx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
600 __ addptr(rsp, BytesPerWord);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
601 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
602 }
a61af66fc99e Initial load
duke
parents:
diff changeset
603
a61af66fc99e Initial load
duke
parents:
diff changeset
604
a61af66fc99e Initial load
duke
parents:
diff changeset
605 void Runtime1::initialize_pd() {
a61af66fc99e Initial load
duke
parents:
diff changeset
606 // nothing to do
a61af66fc99e Initial load
duke
parents:
diff changeset
607 }
a61af66fc99e Initial load
duke
parents:
diff changeset
608
a61af66fc99e Initial load
duke
parents:
diff changeset
609
a61af66fc99e Initial load
duke
parents:
diff changeset
610 // target: the entry point of the method that creates and posts the exception oop
a61af66fc99e Initial load
duke
parents:
diff changeset
611 // has_argument: true if the exception needs an argument (passed on stack because registers must be preserved)
a61af66fc99e Initial load
duke
parents:
diff changeset
612
a61af66fc99e Initial load
duke
parents:
diff changeset
613 OopMapSet* Runtime1::generate_exception_throw(StubAssembler* sasm, address target, bool has_argument) {
a61af66fc99e Initial load
duke
parents:
diff changeset
614 // preserve all registers
a61af66fc99e Initial load
duke
parents:
diff changeset
615 int num_rt_args = has_argument ? 2 : 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
616 OopMap* oop_map = save_live_registers(sasm, num_rt_args);
a61af66fc99e Initial load
duke
parents:
diff changeset
617
a61af66fc99e Initial load
duke
parents:
diff changeset
618 // now all registers are saved and can be used freely
a61af66fc99e Initial load
duke
parents:
diff changeset
619 // verify that no old value is used accidentally
a61af66fc99e Initial load
duke
parents:
diff changeset
620 __ invalidate_registers(true, true, true, true, true, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
621
a61af66fc99e Initial load
duke
parents:
diff changeset
622 // registers used by this stub
a61af66fc99e Initial load
duke
parents:
diff changeset
623 const Register temp_reg = rbx;
a61af66fc99e Initial load
duke
parents:
diff changeset
624
a61af66fc99e Initial load
duke
parents:
diff changeset
625 // load argument for exception that is passed as an argument into the stub
a61af66fc99e Initial load
duke
parents:
diff changeset
626 if (has_argument) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
627 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
628 __ movptr(c_rarg1, Address(rbp, 2*BytesPerWord));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
629 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
630 __ movptr(temp_reg, Address(rbp, 2*BytesPerWord));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
631 __ push(temp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
632 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
633 }
a61af66fc99e Initial load
duke
parents:
diff changeset
634 int call_offset = __ call_RT(noreg, noreg, target, num_rt_args - 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
635
a61af66fc99e Initial load
duke
parents:
diff changeset
636 OopMapSet* oop_maps = new OopMapSet();
a61af66fc99e Initial load
duke
parents:
diff changeset
637 oop_maps->add_gc_map(call_offset, oop_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
638
a61af66fc99e Initial load
duke
parents:
diff changeset
639 __ stop("should not reach here");
a61af66fc99e Initial load
duke
parents:
diff changeset
640
a61af66fc99e Initial load
duke
parents:
diff changeset
641 return oop_maps;
a61af66fc99e Initial load
duke
parents:
diff changeset
642 }
a61af66fc99e Initial load
duke
parents:
diff changeset
643
a61af66fc99e Initial load
duke
parents:
diff changeset
644
a61af66fc99e Initial load
duke
parents:
diff changeset
645 void Runtime1::generate_handle_exception(StubAssembler *sasm, OopMapSet* oop_maps, OopMap* oop_map, bool save_fpu_registers) {
a61af66fc99e Initial load
duke
parents:
diff changeset
646 // incoming parameters
a61af66fc99e Initial load
duke
parents:
diff changeset
647 const Register exception_oop = rax;
a61af66fc99e Initial load
duke
parents:
diff changeset
648 const Register exception_pc = rdx;
a61af66fc99e Initial load
duke
parents:
diff changeset
649 // other registers used in this stub
a61af66fc99e Initial load
duke
parents:
diff changeset
650 const Register real_return_addr = rbx;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
651 const Register thread = NOT_LP64(rdi) LP64_ONLY(r15_thread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
652
a61af66fc99e Initial load
duke
parents:
diff changeset
653 __ block_comment("generate_handle_exception");
a61af66fc99e Initial load
duke
parents:
diff changeset
654
a61af66fc99e Initial load
duke
parents:
diff changeset
655 #ifdef TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
656 // C2 can leave the fpu stack dirty
a61af66fc99e Initial load
duke
parents:
diff changeset
657 if (UseSSE < 2 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
658 __ empty_FPU_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
659 }
a61af66fc99e Initial load
duke
parents:
diff changeset
660 #endif // TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
661
a61af66fc99e Initial load
duke
parents:
diff changeset
662 // verify that only rax, and rdx is valid at this time
a61af66fc99e Initial load
duke
parents:
diff changeset
663 __ invalidate_registers(false, true, true, false, true, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
664 // verify that rax, contains a valid exception
a61af66fc99e Initial load
duke
parents:
diff changeset
665 __ verify_not_null_oop(exception_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
666
a61af66fc99e Initial load
duke
parents:
diff changeset
667 // load address of JavaThread object for thread-local data
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
668 NOT_LP64(__ get_thread(thread);)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
669
a61af66fc99e Initial load
duke
parents:
diff changeset
670 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
671 // check that fields in JavaThread for exception oop and issuing pc are
a61af66fc99e Initial load
duke
parents:
diff changeset
672 // empty before writing to them
a61af66fc99e Initial load
duke
parents:
diff changeset
673 Label oop_empty;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
674 __ cmpptr(Address(thread, JavaThread::exception_oop_offset()), (int32_t) NULL_WORD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
675 __ jcc(Assembler::equal, oop_empty);
a61af66fc99e Initial load
duke
parents:
diff changeset
676 __ stop("exception oop already set");
a61af66fc99e Initial load
duke
parents:
diff changeset
677 __ bind(oop_empty);
a61af66fc99e Initial load
duke
parents:
diff changeset
678
a61af66fc99e Initial load
duke
parents:
diff changeset
679 Label pc_empty;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
680 __ cmpptr(Address(thread, JavaThread::exception_pc_offset()), 0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
681 __ jcc(Assembler::equal, pc_empty);
a61af66fc99e Initial load
duke
parents:
diff changeset
682 __ stop("exception pc already set");
a61af66fc99e Initial load
duke
parents:
diff changeset
683 __ bind(pc_empty);
a61af66fc99e Initial load
duke
parents:
diff changeset
684 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
685
a61af66fc99e Initial load
duke
parents:
diff changeset
686 // save exception oop and issuing pc into JavaThread
a61af66fc99e Initial load
duke
parents:
diff changeset
687 // (exception handler will load it from here)
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
688 __ movptr(Address(thread, JavaThread::exception_oop_offset()), exception_oop);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
689 __ movptr(Address(thread, JavaThread::exception_pc_offset()), exception_pc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
690
a61af66fc99e Initial load
duke
parents:
diff changeset
691 // save real return address (pc that called this stub)
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
692 __ movptr(real_return_addr, Address(rbp, 1*BytesPerWord));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
693 __ movptr(Address(rsp, temp_1_off * VMRegImpl::stack_slot_size), real_return_addr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
694
a61af66fc99e Initial load
duke
parents:
diff changeset
695 // patch throwing pc into return address (has bci & oop map)
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
696 __ movptr(Address(rbp, 1*BytesPerWord), exception_pc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
697
a61af66fc99e Initial load
duke
parents:
diff changeset
698 // compute the exception handler.
a61af66fc99e Initial load
duke
parents:
diff changeset
699 // the exception oop and the throwing pc are read from the fields in JavaThread
a61af66fc99e Initial load
duke
parents:
diff changeset
700 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, exception_handler_for_pc));
a61af66fc99e Initial load
duke
parents:
diff changeset
701 oop_maps->add_gc_map(call_offset, oop_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
702
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
703 // rax,: handler address
0
a61af66fc99e Initial load
duke
parents:
diff changeset
704 // will be the deopt blob if nmethod was deoptimized while we looked up
a61af66fc99e Initial load
duke
parents:
diff changeset
705 // handler regardless of whether handler existed in the nmethod.
a61af66fc99e Initial load
duke
parents:
diff changeset
706
a61af66fc99e Initial load
duke
parents:
diff changeset
707 // only rax, is valid at this time, all other registers have been destroyed by the runtime call
a61af66fc99e Initial load
duke
parents:
diff changeset
708 __ invalidate_registers(false, true, true, true, true, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
709
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
710 #ifdef ASSERT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
711 // Do we have an exception handler in the nmethod?
a61af66fc99e Initial load
duke
parents:
diff changeset
712 Label done;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
713 __ testptr(rax, rax);
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
714 __ jcc(Assembler::notZero, done);
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
715 __ stop("no handler found");
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
716 __ bind(done);
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
717 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
718
a61af66fc99e Initial load
duke
parents:
diff changeset
719 // exception handler found
a61af66fc99e Initial load
duke
parents:
diff changeset
720 // patch the return address -> the stub will directly return to the exception handler
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
721 __ movptr(Address(rbp, 1*BytesPerWord), rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
722
a61af66fc99e Initial load
duke
parents:
diff changeset
723 // restore registers
a61af66fc99e Initial load
duke
parents:
diff changeset
724 restore_live_registers(sasm, save_fpu_registers);
a61af66fc99e Initial load
duke
parents:
diff changeset
725
a61af66fc99e Initial load
duke
parents:
diff changeset
726 // return to exception handler
a61af66fc99e Initial load
duke
parents:
diff changeset
727 __ leave();
a61af66fc99e Initial load
duke
parents:
diff changeset
728 __ ret(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
729
a61af66fc99e Initial load
duke
parents:
diff changeset
730 }
a61af66fc99e Initial load
duke
parents:
diff changeset
731
a61af66fc99e Initial load
duke
parents:
diff changeset
732
a61af66fc99e Initial load
duke
parents:
diff changeset
733 void Runtime1::generate_unwind_exception(StubAssembler *sasm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
734 // incoming parameters
a61af66fc99e Initial load
duke
parents:
diff changeset
735 const Register exception_oop = rax;
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
736 // callee-saved copy of exception_oop during runtime call
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
737 const Register exception_oop_callee_saved = NOT_LP64(rsi) LP64_ONLY(r14);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
738 // other registers used in this stub
a61af66fc99e Initial load
duke
parents:
diff changeset
739 const Register exception_pc = rdx;
a61af66fc99e Initial load
duke
parents:
diff changeset
740 const Register handler_addr = rbx;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
741 const Register thread = NOT_LP64(rdi) LP64_ONLY(r15_thread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
742
a61af66fc99e Initial load
duke
parents:
diff changeset
743 // verify that only rax, is valid at this time
a61af66fc99e Initial load
duke
parents:
diff changeset
744 __ invalidate_registers(false, true, true, true, true, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
745
a61af66fc99e Initial load
duke
parents:
diff changeset
746 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
747 // check that fields in JavaThread for exception oop and issuing pc are empty
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
748 NOT_LP64(__ get_thread(thread);)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
749 Label oop_empty;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
750 __ cmpptr(Address(thread, JavaThread::exception_oop_offset()), 0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
751 __ jcc(Assembler::equal, oop_empty);
a61af66fc99e Initial load
duke
parents:
diff changeset
752 __ stop("exception oop must be empty");
a61af66fc99e Initial load
duke
parents:
diff changeset
753 __ bind(oop_empty);
a61af66fc99e Initial load
duke
parents:
diff changeset
754
a61af66fc99e Initial load
duke
parents:
diff changeset
755 Label pc_empty;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
756 __ cmpptr(Address(thread, JavaThread::exception_pc_offset()), 0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
757 __ jcc(Assembler::equal, pc_empty);
a61af66fc99e Initial load
duke
parents:
diff changeset
758 __ stop("exception pc must be empty");
a61af66fc99e Initial load
duke
parents:
diff changeset
759 __ bind(pc_empty);
a61af66fc99e Initial load
duke
parents:
diff changeset
760 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
761
a61af66fc99e Initial load
duke
parents:
diff changeset
762 // clear the FPU stack in case any FPU results are left behind
a61af66fc99e Initial load
duke
parents:
diff changeset
763 __ empty_FPU_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
764
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
765 // save exception_oop in callee-saved register to preserve it during runtime calls
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
766 __ verify_not_null_oop(exception_oop);
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
767 __ movptr(exception_oop_callee_saved, exception_oop);
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
768
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
769 NOT_LP64(__ get_thread(thread);)
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
770 // Get return address (is on top of stack after leave).
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
771 __ movptr(exception_pc, Address(rsp, 0));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
772
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
773 // search the exception handler address of the caller (using the return address)
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
774 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::exception_handler_for_return_address), thread, exception_pc);
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
775 // rax: exception handler address of the caller
0
a61af66fc99e Initial load
duke
parents:
diff changeset
776
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
777 // Only RAX and RSI are valid at this time, all other registers have been destroyed by the call.
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
778 __ invalidate_registers(false, true, true, true, false, true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
779
a61af66fc99e Initial load
duke
parents:
diff changeset
780 // move result of call into correct register
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
781 __ movptr(handler_addr, rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
782
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
783 // Restore exception oop to RAX (required convention of exception handler).
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
784 __ movptr(exception_oop, exception_oop_callee_saved);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
785
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
786 // verify that there is really a valid exception in rax
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
787 __ verify_not_null_oop(exception_oop);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
788
a61af66fc99e Initial load
duke
parents:
diff changeset
789 // get throwing pc (= return address).
a61af66fc99e Initial load
duke
parents:
diff changeset
790 // rdx has been destroyed by the call, so it must be set again
a61af66fc99e Initial load
duke
parents:
diff changeset
791 // the pop is also necessary to simulate the effect of a ret(0)
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
792 __ pop(exception_pc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
793
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
794 // Restore SP from BP if the exception PC is a MethodHandle call site.
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
795 NOT_LP64(__ get_thread(thread);)
1368
93767e6a2dfd 6941529: SharedRuntime::raw_exception_handler_for_return_address must reset thread MethodHandle flag
twisti
parents: 1295
diff changeset
796 __ cmpl(Address(thread, JavaThread::is_method_handle_return_offset()), 0);
1564
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1368
diff changeset
797 __ cmovptr(Assembler::notEqual, rsp, rbp_mh_SP_save);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
798
a61af66fc99e Initial load
duke
parents:
diff changeset
799 // continue at exception handler (return address removed)
a61af66fc99e Initial load
duke
parents:
diff changeset
800 // note: do *not* remove arguments when unwinding the
a61af66fc99e Initial load
duke
parents:
diff changeset
801 // activation since the caller assumes having
a61af66fc99e Initial load
duke
parents:
diff changeset
802 // all arguments on the stack when entering the
a61af66fc99e Initial load
duke
parents:
diff changeset
803 // runtime to determine the exception handler
a61af66fc99e Initial load
duke
parents:
diff changeset
804 // (GC happens at call site with arguments!)
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
805 // rax: exception oop
0
a61af66fc99e Initial load
duke
parents:
diff changeset
806 // rdx: throwing pc
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 647
diff changeset
807 // rbx: exception handler
0
a61af66fc99e Initial load
duke
parents:
diff changeset
808 __ jmp(handler_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
809 }
a61af66fc99e Initial load
duke
parents:
diff changeset
810
a61af66fc99e Initial load
duke
parents:
diff changeset
811
a61af66fc99e Initial load
duke
parents:
diff changeset
812 OopMapSet* Runtime1::generate_patching(StubAssembler* sasm, address target) {
a61af66fc99e Initial load
duke
parents:
diff changeset
813 // use the maximum number of runtime-arguments here because it is difficult to
a61af66fc99e Initial load
duke
parents:
diff changeset
814 // distinguish each RT-Call.
a61af66fc99e Initial load
duke
parents:
diff changeset
815 // Note: This number affects also the RT-Call in generate_handle_exception because
a61af66fc99e Initial load
duke
parents:
diff changeset
816 // the oop-map is shared for all calls.
a61af66fc99e Initial load
duke
parents:
diff changeset
817 const int num_rt_args = 2; // thread + dummy
a61af66fc99e Initial load
duke
parents:
diff changeset
818
a61af66fc99e Initial load
duke
parents:
diff changeset
819 DeoptimizationBlob* deopt_blob = SharedRuntime::deopt_blob();
a61af66fc99e Initial load
duke
parents:
diff changeset
820 assert(deopt_blob != NULL, "deoptimization blob must have been created");
a61af66fc99e Initial load
duke
parents:
diff changeset
821
a61af66fc99e Initial load
duke
parents:
diff changeset
822 OopMap* oop_map = save_live_registers(sasm, num_rt_args);
a61af66fc99e Initial load
duke
parents:
diff changeset
823
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
824 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
825 const Register thread = r15_thread;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
826 // No need to worry about dummy
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
827 __ mov(c_rarg0, thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
828 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
829 __ push(rax); // push dummy
0
a61af66fc99e Initial load
duke
parents:
diff changeset
830
a61af66fc99e Initial load
duke
parents:
diff changeset
831 const Register thread = rdi; // is callee-saved register (Visual C++ calling conventions)
a61af66fc99e Initial load
duke
parents:
diff changeset
832 // push java thread (becomes first argument of C function)
a61af66fc99e Initial load
duke
parents:
diff changeset
833 __ get_thread(thread);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
834 __ push(thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
835 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
836 __ set_last_Java_frame(thread, noreg, rbp, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
837 // do the call
a61af66fc99e Initial load
duke
parents:
diff changeset
838 __ call(RuntimeAddress(target));
a61af66fc99e Initial load
duke
parents:
diff changeset
839 OopMapSet* oop_maps = new OopMapSet();
a61af66fc99e Initial load
duke
parents:
diff changeset
840 oop_maps->add_gc_map(__ offset(), oop_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
841 // verify callee-saved register
a61af66fc99e Initial load
duke
parents:
diff changeset
842 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
843 guarantee(thread != rax, "change this code");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
844 __ push(rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
845 { Label L;
a61af66fc99e Initial load
duke
parents:
diff changeset
846 __ get_thread(rax);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
847 __ cmpptr(thread, rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
848 __ jcc(Assembler::equal, L);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
849 __ stop("StubAssembler::call_RT: rdi/r15 not callee saved?");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
850 __ bind(L);
a61af66fc99e Initial load
duke
parents:
diff changeset
851 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
852 __ pop(rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
853 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
854 __ reset_last_Java_frame(thread, true, false);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
855 #ifndef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
856 __ pop(rcx); // discard thread arg
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
857 __ pop(rcx); // discard dummy
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
858 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
859
a61af66fc99e Initial load
duke
parents:
diff changeset
860 // check for pending exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
861 { Label L;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
862 __ cmpptr(Address(thread, Thread::pending_exception_offset()), (int32_t)NULL_WORD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
863 __ jcc(Assembler::equal, L);
a61af66fc99e Initial load
duke
parents:
diff changeset
864 // exception pending => remove activation and forward to exception handler
a61af66fc99e Initial load
duke
parents:
diff changeset
865
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
866 __ testptr(rax, rax); // have we deoptimized?
0
a61af66fc99e Initial load
duke
parents:
diff changeset
867 __ jump_cc(Assembler::equal,
a61af66fc99e Initial load
duke
parents:
diff changeset
868 RuntimeAddress(Runtime1::entry_for(Runtime1::forward_exception_id)));
a61af66fc99e Initial load
duke
parents:
diff changeset
869
a61af66fc99e Initial load
duke
parents:
diff changeset
870 // the deopt blob expects exceptions in the special fields of
a61af66fc99e Initial load
duke
parents:
diff changeset
871 // JavaThread, so copy and clear pending exception.
a61af66fc99e Initial load
duke
parents:
diff changeset
872
a61af66fc99e Initial load
duke
parents:
diff changeset
873 // load and clear pending exception
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
874 __ movptr(rax, Address(thread, Thread::pending_exception_offset()));
512
db4caa99ef11 6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents: 380
diff changeset
875 __ movptr(Address(thread, Thread::pending_exception_offset()), NULL_WORD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
876
a61af66fc99e Initial load
duke
parents:
diff changeset
877 // check that there is really a valid exception
a61af66fc99e Initial load
duke
parents:
diff changeset
878 __ verify_not_null_oop(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
879
a61af66fc99e Initial load
duke
parents:
diff changeset
880 // load throwing pc: this is the return address of the stub
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
881 __ movptr(rdx, Address(rsp, return_off * VMRegImpl::stack_slot_size));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
882
a61af66fc99e Initial load
duke
parents:
diff changeset
883 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
884 // check that fields in JavaThread for exception oop and issuing pc are empty
a61af66fc99e Initial load
duke
parents:
diff changeset
885 Label oop_empty;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
886 __ cmpptr(Address(thread, JavaThread::exception_oop_offset()), (int32_t)NULL_WORD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
887 __ jcc(Assembler::equal, oop_empty);
a61af66fc99e Initial load
duke
parents:
diff changeset
888 __ stop("exception oop must be empty");
a61af66fc99e Initial load
duke
parents:
diff changeset
889 __ bind(oop_empty);
a61af66fc99e Initial load
duke
parents:
diff changeset
890
a61af66fc99e Initial load
duke
parents:
diff changeset
891 Label pc_empty;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
892 __ cmpptr(Address(thread, JavaThread::exception_pc_offset()), (int32_t)NULL_WORD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
893 __ jcc(Assembler::equal, pc_empty);
a61af66fc99e Initial load
duke
parents:
diff changeset
894 __ stop("exception pc must be empty");
a61af66fc99e Initial load
duke
parents:
diff changeset
895 __ bind(pc_empty);
a61af66fc99e Initial load
duke
parents:
diff changeset
896 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
897
a61af66fc99e Initial load
duke
parents:
diff changeset
898 // store exception oop and throwing pc to JavaThread
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
899 __ movptr(Address(thread, JavaThread::exception_oop_offset()), rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
900 __ movptr(Address(thread, JavaThread::exception_pc_offset()), rdx);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
901
a61af66fc99e Initial load
duke
parents:
diff changeset
902 restore_live_registers(sasm);
a61af66fc99e Initial load
duke
parents:
diff changeset
903
a61af66fc99e Initial load
duke
parents:
diff changeset
904 __ leave();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
905 __ addptr(rsp, BytesPerWord); // remove return address from stack
0
a61af66fc99e Initial load
duke
parents:
diff changeset
906
a61af66fc99e Initial load
duke
parents:
diff changeset
907 // Forward the exception directly to deopt blob. We can blow no
a61af66fc99e Initial load
duke
parents:
diff changeset
908 // registers and must leave throwing pc on the stack. A patch may
a61af66fc99e Initial load
duke
parents:
diff changeset
909 // have values live in registers so the entry point with the
a61af66fc99e Initial load
duke
parents:
diff changeset
910 // exception in tls.
a61af66fc99e Initial load
duke
parents:
diff changeset
911 __ jump(RuntimeAddress(deopt_blob->unpack_with_exception_in_tls()));
a61af66fc99e Initial load
duke
parents:
diff changeset
912
a61af66fc99e Initial load
duke
parents:
diff changeset
913 __ bind(L);
a61af66fc99e Initial load
duke
parents:
diff changeset
914 }
a61af66fc99e Initial load
duke
parents:
diff changeset
915
a61af66fc99e Initial load
duke
parents:
diff changeset
916
a61af66fc99e Initial load
duke
parents:
diff changeset
917 // Runtime will return true if the nmethod has been deoptimized during
a61af66fc99e Initial load
duke
parents:
diff changeset
918 // the patching process. In that case we must do a deopt reexecute instead.
a61af66fc99e Initial load
duke
parents:
diff changeset
919
a61af66fc99e Initial load
duke
parents:
diff changeset
920 Label reexecuteEntry, cont;
a61af66fc99e Initial load
duke
parents:
diff changeset
921
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
922 __ testptr(rax, rax); // have we deoptimized?
0
a61af66fc99e Initial load
duke
parents:
diff changeset
923 __ jcc(Assembler::equal, cont); // no
a61af66fc99e Initial load
duke
parents:
diff changeset
924
a61af66fc99e Initial load
duke
parents:
diff changeset
925 // Will reexecute. Proper return address is already on the stack we just restore
a61af66fc99e Initial load
duke
parents:
diff changeset
926 // registers, pop all of our frame but the return address and jump to the deopt blob
a61af66fc99e Initial load
duke
parents:
diff changeset
927 restore_live_registers(sasm);
a61af66fc99e Initial load
duke
parents:
diff changeset
928 __ leave();
a61af66fc99e Initial load
duke
parents:
diff changeset
929 __ jump(RuntimeAddress(deopt_blob->unpack_with_reexecution()));
a61af66fc99e Initial load
duke
parents:
diff changeset
930
a61af66fc99e Initial load
duke
parents:
diff changeset
931 __ bind(cont);
a61af66fc99e Initial load
duke
parents:
diff changeset
932 restore_live_registers(sasm);
a61af66fc99e Initial load
duke
parents:
diff changeset
933 __ leave();
a61af66fc99e Initial load
duke
parents:
diff changeset
934 __ ret(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
935
a61af66fc99e Initial load
duke
parents:
diff changeset
936 return oop_maps;
a61af66fc99e Initial load
duke
parents:
diff changeset
937
a61af66fc99e Initial load
duke
parents:
diff changeset
938 }
a61af66fc99e Initial load
duke
parents:
diff changeset
939
a61af66fc99e Initial load
duke
parents:
diff changeset
940
a61af66fc99e Initial load
duke
parents:
diff changeset
941 OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
942
a61af66fc99e Initial load
duke
parents:
diff changeset
943 // for better readability
a61af66fc99e Initial load
duke
parents:
diff changeset
944 const bool must_gc_arguments = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
945 const bool dont_gc_arguments = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
946
a61af66fc99e Initial load
duke
parents:
diff changeset
947 // default value; overwritten for some optimized stubs that are called from methods that do not use the fpu
a61af66fc99e Initial load
duke
parents:
diff changeset
948 bool save_fpu_registers = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
949
a61af66fc99e Initial load
duke
parents:
diff changeset
950 // stub code & info for the different stubs
a61af66fc99e Initial load
duke
parents:
diff changeset
951 OopMapSet* oop_maps = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
952 switch (id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
953 case forward_exception_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
954 {
a61af66fc99e Initial load
duke
parents:
diff changeset
955 // we're handling an exception in the context of a compiled
a61af66fc99e Initial load
duke
parents:
diff changeset
956 // frame. The registers have been saved in the standard
a61af66fc99e Initial load
duke
parents:
diff changeset
957 // places. Perform an exception lookup in the caller and
a61af66fc99e Initial load
duke
parents:
diff changeset
958 // dispatch to the handler if found. Otherwise unwind and
a61af66fc99e Initial load
duke
parents:
diff changeset
959 // dispatch to the callers exception handler.
a61af66fc99e Initial load
duke
parents:
diff changeset
960
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
961 const Register thread = NOT_LP64(rdi) LP64_ONLY(r15_thread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
962 const Register exception_oop = rax;
a61af66fc99e Initial load
duke
parents:
diff changeset
963 const Register exception_pc = rdx;
a61af66fc99e Initial load
duke
parents:
diff changeset
964
a61af66fc99e Initial load
duke
parents:
diff changeset
965 // load pending exception oop into rax,
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
966 __ movptr(exception_oop, Address(thread, Thread::pending_exception_offset()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
967 // clear pending exception
512
db4caa99ef11 6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents: 380
diff changeset
968 __ movptr(Address(thread, Thread::pending_exception_offset()), NULL_WORD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
969
a61af66fc99e Initial load
duke
parents:
diff changeset
970 // load issuing PC (the return address for this stub) into rdx
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
971 __ movptr(exception_pc, Address(rbp, 1*BytesPerWord));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
972
a61af66fc99e Initial load
duke
parents:
diff changeset
973 // make sure that the vm_results are cleared (may be unnecessary)
512
db4caa99ef11 6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents: 380
diff changeset
974 __ movptr(Address(thread, JavaThread::vm_result_offset()), NULL_WORD);
db4caa99ef11 6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents: 380
diff changeset
975 __ movptr(Address(thread, JavaThread::vm_result_2_offset()), NULL_WORD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
976
a61af66fc99e Initial load
duke
parents:
diff changeset
977 // verify that that there is really a valid exception in rax,
a61af66fc99e Initial load
duke
parents:
diff changeset
978 __ verify_not_null_oop(exception_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
979
a61af66fc99e Initial load
duke
parents:
diff changeset
980
a61af66fc99e Initial load
duke
parents:
diff changeset
981 oop_maps = new OopMapSet();
a61af66fc99e Initial load
duke
parents:
diff changeset
982 OopMap* oop_map = generate_oop_map(sasm, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
983 generate_handle_exception(sasm, oop_maps, oop_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
984 __ stop("should not reach here");
a61af66fc99e Initial load
duke
parents:
diff changeset
985 }
a61af66fc99e Initial load
duke
parents:
diff changeset
986 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
987
a61af66fc99e Initial load
duke
parents:
diff changeset
988 case new_instance_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
989 case fast_new_instance_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
990 case fast_new_instance_init_check_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
991 {
a61af66fc99e Initial load
duke
parents:
diff changeset
992 Register klass = rdx; // Incoming
a61af66fc99e Initial load
duke
parents:
diff changeset
993 Register obj = rax; // Result
a61af66fc99e Initial load
duke
parents:
diff changeset
994
a61af66fc99e Initial load
duke
parents:
diff changeset
995 if (id == new_instance_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
996 __ set_info("new_instance", dont_gc_arguments);
a61af66fc99e Initial load
duke
parents:
diff changeset
997 } else if (id == fast_new_instance_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
998 __ set_info("fast new_instance", dont_gc_arguments);
a61af66fc99e Initial load
duke
parents:
diff changeset
999 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 assert(id == fast_new_instance_init_check_id, "bad StubID");
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 __ set_info("fast new_instance init check", dont_gc_arguments);
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1003
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 if ((id == fast_new_instance_id || id == fast_new_instance_init_check_id) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 UseTLAB && FastTLABRefill) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 Label slow_path;
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 Register obj_size = rcx;
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 Register t1 = rbx;
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 Register t2 = rsi;
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 assert_different_registers(klass, obj, obj_size, t1, t2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1011
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1012 __ push(rdi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1013 __ push(rbx);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1014
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 if (id == fast_new_instance_init_check_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 // make sure the klass is initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 __ cmpl(Address(klass, instanceKlass::init_state_offset_in_bytes() + sizeof(oopDesc)), instanceKlass::fully_initialized);
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 __ jcc(Assembler::notEqual, slow_path);
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1020
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 // assert object can be fast path allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 Label ok, not_ok;
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 __ movl(obj_size, Address(klass, Klass::layout_helper_offset_in_bytes() + sizeof(oopDesc)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 __ cmpl(obj_size, 0); // make sure it's an instance (LH > 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 __ jcc(Assembler::lessEqual, not_ok);
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 __ testl(obj_size, Klass::_lh_instance_slow_path_bit);
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 __ jcc(Assembler::zero, ok);
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 __ bind(not_ok);
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 __ stop("assert(can be fast path allocated)");
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 __ should_not_reach_here();
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 __ bind(ok);
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1036
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 // if we got here then the TLAB allocation failed, so try
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 // refilling the TLAB or allocating directly from eden.
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 Label retry_tlab, try_eden;
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 __ tlab_refill(retry_tlab, try_eden, slow_path); // does not destroy rdx (klass)
a61af66fc99e Initial load
duke
parents:
diff changeset
1041
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 __ bind(retry_tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
1043
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1044 // get the instance size (size is postive so movl is fine for 64bit)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 __ movl(obj_size, Address(klass, klassOopDesc::header_size() * HeapWordSize + Klass::layout_helper_offset_in_bytes()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 __ tlab_allocate(obj, obj_size, 0, t1, t2, slow_path);
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 __ initialize_object(obj, klass, obj_size, 0, t1, t2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 __ verify_oop(obj);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1049 __ pop(rbx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1050 __ pop(rdi);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 __ ret(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1052
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 __ bind(try_eden);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1054 // get the instance size (size is postive so movl is fine for 64bit)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 __ movl(obj_size, Address(klass, klassOopDesc::header_size() * HeapWordSize + Klass::layout_helper_offset_in_bytes()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 __ eden_allocate(obj, obj_size, 0, t1, slow_path);
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 __ initialize_object(obj, klass, obj_size, 0, t1, t2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 __ verify_oop(obj);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1059 __ pop(rbx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1060 __ pop(rdi);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 __ ret(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1062
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 __ bind(slow_path);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1064 __ pop(rbx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1065 __ pop(rdi);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1067
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 __ enter();
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 OopMap* map = save_live_registers(sasm, 2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 int call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_instance), klass);
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 oop_maps = new OopMapSet();
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 oop_maps->add_gc_map(call_offset, map);
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 restore_live_registers_except_rax(sasm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 __ verify_oop(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 __ leave();
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 __ ret(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1077
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 // rax,: new instance
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1080
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1082
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 case counter_overflow_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1085 Register bci = rax, method = rbx;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 __ enter();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1087 OopMap* map = save_live_registers(sasm, 3);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 // Retrieve bci
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 __ movl(bci, Address(rbp, 2*BytesPerWord));
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1090 // And a pointer to the methodOop
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1091 __ movptr(method, Address(rbp, 3*BytesPerWord));
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1092 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, counter_overflow), bci, method);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 oop_maps = new OopMapSet();
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 oop_maps->add_gc_map(call_offset, map);
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 restore_live_registers(sasm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 __ leave();
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 __ ret(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1100
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 case new_type_array_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 case new_object_array_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 Register length = rbx; // Incoming
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 Register klass = rdx; // Incoming
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 Register obj = rax; // Result
a61af66fc99e Initial load
duke
parents:
diff changeset
1107
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 if (id == new_type_array_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 __ set_info("new_type_array", dont_gc_arguments);
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 __ set_info("new_object_array", dont_gc_arguments);
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1113
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 // assert object type is really an array of the proper kind
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 Label ok;
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 Register t0 = obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 __ movl(t0, Address(klass, Klass::layout_helper_offset_in_bytes() + sizeof(oopDesc)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 __ sarl(t0, Klass::_lh_array_tag_shift);
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 int tag = ((id == new_type_array_id)
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 ? Klass::_lh_array_tag_type_value
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 : Klass::_lh_array_tag_obj_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 __ cmpl(t0, tag);
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 __ jcc(Assembler::equal, ok);
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 __ stop("assert(is an array klass)");
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 __ should_not_reach_here();
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 __ bind(ok);
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1131
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 if (UseTLAB && FastTLABRefill) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 Register arr_size = rsi;
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 Register t1 = rcx; // must be rcx for use as shift count
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 Register t2 = rdi;
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 Label slow_path;
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 assert_different_registers(length, klass, obj, arr_size, t1, t2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1138
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 // check that array length is small enough for fast path.
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 __ cmpl(length, C1_MacroAssembler::max_array_allocation_length);
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 __ jcc(Assembler::above, slow_path);
a61af66fc99e Initial load
duke
parents:
diff changeset
1142
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 // if we got here then the TLAB allocation failed, so try
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 // refilling the TLAB or allocating directly from eden.
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 Label retry_tlab, try_eden;
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 __ tlab_refill(retry_tlab, try_eden, slow_path); // preserves rbx, & rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
1147
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 __ bind(retry_tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
1149
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 // get the allocation size: round_up(hdr + length << (layout_helper & 0x1F))
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1151 // since size is postive movl does right thing on 64bit
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 __ movl(t1, Address(klass, klassOopDesc::header_size() * HeapWordSize + Klass::layout_helper_offset_in_bytes()));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1153 // since size is postive movl does right thing on 64bit
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 __ movl(arr_size, length);
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 assert(t1 == rcx, "fixed register usage");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1156 __ shlptr(arr_size /* by t1=rcx, mod 32 */);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1157 __ shrptr(t1, Klass::_lh_header_size_shift);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1158 __ andptr(t1, Klass::_lh_header_size_mask);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1159 __ addptr(arr_size, t1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1160 __ addptr(arr_size, MinObjAlignmentInBytesMask); // align up
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1161 __ andptr(arr_size, ~MinObjAlignmentInBytesMask);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1162
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 __ tlab_allocate(obj, arr_size, 0, t1, t2, slow_path); // preserves arr_size
a61af66fc99e Initial load
duke
parents:
diff changeset
1164
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 __ initialize_header(obj, klass, length, t1, t2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 __ movb(t1, Address(klass, klassOopDesc::header_size() * HeapWordSize + Klass::layout_helper_offset_in_bytes() + (Klass::_lh_header_size_shift / BitsPerByte)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 assert(Klass::_lh_header_size_shift % BitsPerByte == 0, "bytewise");
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 assert(Klass::_lh_header_size_mask <= 0xFF, "bytewise");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1169 __ andptr(t1, Klass::_lh_header_size_mask);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1170 __ subptr(arr_size, t1); // body length
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1171 __ addptr(t1, obj); // body start
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 __ initialize_body(t1, arr_size, 0, t2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 __ verify_oop(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 __ ret(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1175
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 __ bind(try_eden);
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 // get the allocation size: round_up(hdr + length << (layout_helper & 0x1F))
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1178 // since size is postive movl does right thing on 64bit
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 __ movl(t1, Address(klass, klassOopDesc::header_size() * HeapWordSize + Klass::layout_helper_offset_in_bytes()));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1180 // since size is postive movl does right thing on 64bit
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 __ movl(arr_size, length);
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 assert(t1 == rcx, "fixed register usage");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1183 __ shlptr(arr_size /* by t1=rcx, mod 32 */);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1184 __ shrptr(t1, Klass::_lh_header_size_shift);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1185 __ andptr(t1, Klass::_lh_header_size_mask);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1186 __ addptr(arr_size, t1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1187 __ addptr(arr_size, MinObjAlignmentInBytesMask); // align up
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1188 __ andptr(arr_size, ~MinObjAlignmentInBytesMask);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1189
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 __ eden_allocate(obj, arr_size, 0, t1, slow_path); // preserves arr_size
a61af66fc99e Initial load
duke
parents:
diff changeset
1191
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 __ initialize_header(obj, klass, length, t1, t2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 __ movb(t1, Address(klass, klassOopDesc::header_size() * HeapWordSize + Klass::layout_helper_offset_in_bytes() + (Klass::_lh_header_size_shift / BitsPerByte)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 assert(Klass::_lh_header_size_shift % BitsPerByte == 0, "bytewise");
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 assert(Klass::_lh_header_size_mask <= 0xFF, "bytewise");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1196 __ andptr(t1, Klass::_lh_header_size_mask);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1197 __ subptr(arr_size, t1); // body length
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1198 __ addptr(t1, obj); // body start
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 __ initialize_body(t1, arr_size, 0, t2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 __ verify_oop(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 __ ret(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1202
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 __ bind(slow_path);
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1205
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 __ enter();
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 OopMap* map = save_live_registers(sasm, 3);
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 int call_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 if (id == new_type_array_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_type_array), klass, length);
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_object_array), klass, length);
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1214
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 oop_maps = new OopMapSet();
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 oop_maps->add_gc_map(call_offset, map);
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 restore_live_registers_except_rax(sasm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1218
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 __ verify_oop(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 __ leave();
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 __ ret(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1222
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 // rax,: new array
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1226
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 case new_multi_array_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 { StubFrame f(sasm, "new_multi_array", dont_gc_arguments);
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 // rax,: klass
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 // rbx,: rank
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 // rcx: address of 1st dimension
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 OopMap* map = save_live_registers(sasm, 4);
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 int call_offset = __ call_RT(rax, noreg, CAST_FROM_FN_PTR(address, new_multi_array), rax, rbx, rcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1234
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 oop_maps = new OopMapSet();
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 oop_maps->add_gc_map(call_offset, map);
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 restore_live_registers_except_rax(sasm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1238
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 // rax,: new multi array
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 __ verify_oop(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1243
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 case register_finalizer_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 __ set_info("register_finalizer", dont_gc_arguments);
a61af66fc99e Initial load
duke
parents:
diff changeset
1247
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1248 // This is called via call_runtime so the arguments
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1249 // will be place in C abi locations
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1250
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1251 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1252 __ verify_oop(c_rarg0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1253 __ mov(rax, c_rarg0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1254 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 // The object is passed on the stack and we haven't pushed a
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 // frame yet so it's one work away from top of stack.
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1257 __ movptr(rax, Address(rsp, 1 * BytesPerWord));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 __ verify_oop(rax);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1259 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1260
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 // load the klass and check the has finalizer flag
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 Label register_finalizer;
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 Register t = rsi;
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1264 __ load_klass(t, rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 __ movl(t, Address(t, Klass::access_flags_offset_in_bytes() + sizeof(oopDesc)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 __ testl(t, JVM_ACC_HAS_FINALIZER);
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 __ jcc(Assembler::notZero, register_finalizer);
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 __ ret(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1269
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 __ bind(register_finalizer);
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 __ enter();
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 OopMap* oop_map = save_live_registers(sasm, 2 /*num_rt_args */);
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 int call_offset = __ call_RT(noreg, noreg,
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 CAST_FROM_FN_PTR(address, SharedRuntime::register_finalizer), rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 oop_maps = new OopMapSet();
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 oop_maps->add_gc_map(call_offset, oop_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
1277
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 // Now restore all the live registers
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 restore_live_registers(sasm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1280
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 __ leave();
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 __ ret(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1285
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 case throw_range_check_failed_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 { StubFrame f(sasm, "range_check_failed", dont_gc_arguments);
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_range_check_exception), true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1291
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 case throw_index_exception_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 { StubFrame f(sasm, "index_range_check_failed", dont_gc_arguments);
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_index_exception), true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1297
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 case throw_div0_exception_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 { StubFrame f(sasm, "throw_div0_exception", dont_gc_arguments);
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_div0_exception), false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1303
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 case throw_null_pointer_exception_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 { StubFrame f(sasm, "throw_null_pointer_exception", dont_gc_arguments);
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_null_pointer_exception), false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1309
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 case handle_exception_nofpu_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 save_fpu_registers = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 case handle_exception_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 { StubFrame f(sasm, "handle_exception", dont_gc_arguments);
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 oop_maps = new OopMapSet();
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 OopMap* oop_map = save_live_registers(sasm, 1, save_fpu_registers);
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 generate_handle_exception(sasm, oop_maps, oop_map, save_fpu_registers);
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1320
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 case unwind_exception_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 { __ set_info("unwind_exception", dont_gc_arguments);
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 // note: no stubframe since we are about to leave the current
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 // activation and we are calling a leaf VM function only.
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 generate_unwind_exception(sasm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1328
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 case throw_array_store_exception_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 { StubFrame f(sasm, "throw_array_store_exception", dont_gc_arguments);
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 // tos + 0: link
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 // + 1: return address
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_array_store_exception), false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1336
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 case throw_class_cast_exception_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 { StubFrame f(sasm, "throw_class_cast_exception", dont_gc_arguments);
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_class_cast_exception), true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1342
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 case throw_incompatible_class_change_error_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 { StubFrame f(sasm, "throw_incompatible_class_cast_exception", dont_gc_arguments);
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_incompatible_class_change_error), false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1346 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1348
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 case slow_subtype_check_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 {
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 533
diff changeset
1351 // Typical calling sequence:
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 533
diff changeset
1352 // __ push(klass_RInfo); // object klass or other subclass
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 533
diff changeset
1353 // __ push(sup_k_RInfo); // array element klass or other superclass
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 533
diff changeset
1354 // __ call(slow_subtype_check);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 533
diff changeset
1355 // Note that the subclass is pushed first, and is therefore deepest.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 533
diff changeset
1356 // Previous versions of this code reversed the names 'sub' and 'super'.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 533
diff changeset
1357 // This was operationally harmless but made the code unreadable.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 enum layout {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1359 rax_off, SLOT2(raxH_off)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1360 rcx_off, SLOT2(rcxH_off)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1361 rsi_off, SLOT2(rsiH_off)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1362 rdi_off, SLOT2(rdiH_off)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1363 // saved_rbp_off, SLOT2(saved_rbpH_off)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1364 return_off, SLOT2(returnH_off)
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 533
diff changeset
1365 sup_k_off, SLOT2(sup_kH_off)
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 533
diff changeset
1366 klass_off, SLOT2(superH_off)
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 533
diff changeset
1367 framesize,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 533
diff changeset
1368 result_off = klass_off // deepest argument is also the return value
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1370
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 __ set_info("slow_subtype_check", dont_gc_arguments);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1372 __ push(rdi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1373 __ push(rsi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1374 __ push(rcx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1375 __ push(rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1376
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1377 // This is called by pushing args and not with C abi
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 533
diff changeset
1378 __ movptr(rsi, Address(rsp, (klass_off) * VMRegImpl::stack_slot_size)); // subclass
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 533
diff changeset
1379 __ movptr(rax, Address(rsp, (sup_k_off) * VMRegImpl::stack_slot_size)); // superclass
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1380
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 Label miss;
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 533
diff changeset
1382 __ check_klass_subtype_slow_path(rsi, rax, rcx, rdi, NULL, &miss);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 533
diff changeset
1383
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 533
diff changeset
1384 // fallthrough on success:
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 533
diff changeset
1385 __ movptr(Address(rsp, (result_off) * VMRegImpl::stack_slot_size), 1); // result
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1386 __ pop(rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1387 __ pop(rcx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1388 __ pop(rsi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1389 __ pop(rdi);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 __ ret(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1391
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 __ bind(miss);
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 533
diff changeset
1393 __ movptr(Address(rsp, (result_off) * VMRegImpl::stack_slot_size), NULL_WORD); // result
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1394 __ pop(rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1395 __ pop(rcx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1396 __ pop(rsi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1397 __ pop(rdi);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 __ ret(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1401
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 case monitorenter_nofpu_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 save_fpu_registers = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 case monitorenter_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 StubFrame f(sasm, "monitorenter", dont_gc_arguments);
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 OopMap* map = save_live_registers(sasm, 3, save_fpu_registers);
a61af66fc99e Initial load
duke
parents:
diff changeset
1409
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1410 // Called with store_parameter and not C abi
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1411
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 f.load_argument(1, rax); // rax,: object
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 f.load_argument(0, rbx); // rbx,: lock address
a61af66fc99e Initial load
duke
parents:
diff changeset
1414
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, monitorenter), rax, rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1416
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 oop_maps = new OopMapSet();
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 oop_maps->add_gc_map(call_offset, map);
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 restore_live_registers(sasm, save_fpu_registers);
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1422
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 case monitorexit_nofpu_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 save_fpu_registers = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 case monitorexit_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 StubFrame f(sasm, "monitorexit", dont_gc_arguments);
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 OopMap* map = save_live_registers(sasm, 2, save_fpu_registers);
a61af66fc99e Initial load
duke
parents:
diff changeset
1430
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1431 // Called with store_parameter and not C abi
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1432
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 f.load_argument(0, rax); // rax,: lock address
a61af66fc99e Initial load
duke
parents:
diff changeset
1434
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 // note: really a leaf routine but must setup last java sp
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 // => use call_RT for now (speed can be improved by
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 // doing last java sp setup manually)
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, monitorexit), rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1439
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 oop_maps = new OopMapSet();
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 oop_maps->add_gc_map(call_offset, map);
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 restore_live_registers(sasm, save_fpu_registers);
a61af66fc99e Initial load
duke
parents:
diff changeset
1443
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1446
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 case access_field_patching_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 { StubFrame f(sasm, "access_field_patching", dont_gc_arguments);
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 // we should set up register map
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, access_field_patching));
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1453
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 case load_klass_patching_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 { StubFrame f(sasm, "load_klass_patching", dont_gc_arguments);
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 // we should set up register map
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, move_klass_patching));
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1460
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 case jvmti_exception_throw_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 { // rax,: exception oop
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 StubFrame f(sasm, "jvmti_exception_throw", dont_gc_arguments);
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 // Preserve all registers across this potentially blocking call
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 const int num_rt_args = 2; // thread, exception oop
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 OopMap* map = save_live_registers(sasm, num_rt_args);
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, Runtime1::post_jvmti_exception_throw), rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 oop_maps = new OopMapSet();
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 oop_maps->add_gc_map(call_offset, map);
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 restore_live_registers(sasm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1473
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 case dtrace_object_alloc_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 { // rax,: object
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 StubFrame f(sasm, "dtrace_object_alloc", dont_gc_arguments);
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 // we can't gc here so skip the oopmap but make sure that all
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 // the live registers get saved.
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 save_live_registers(sasm, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1480
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1481 __ NOT_LP64(push(rax)) LP64_ONLY(mov(c_rarg0, rax));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc)));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1483 NOT_LP64(__ pop(rax));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1484
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 restore_live_registers(sasm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1488
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 case fpu2long_stub_id:
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 // rax, and rdx are destroyed, but should be free since the result is returned there
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 // preserve rsi,ecx
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1493 __ push(rsi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1494 __ push(rcx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1495 LP64_ONLY(__ push(rdx);)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1496
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 // check for NaN
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 Label return0, do_return, return_min_jlong, do_convert;
a61af66fc99e Initial load
duke
parents:
diff changeset
1499
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1500 Address value_high_word(rsp, wordSize + 4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1501 Address value_low_word(rsp, wordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1502 Address result_high_word(rsp, 3*wordSize + 4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1503 Address result_low_word(rsp, 3*wordSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1504
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1505 __ subptr(rsp, 32); // more than enough on 32bit
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 __ fst_d(value_low_word);
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 __ movl(rax, value_high_word);
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 __ andl(rax, 0x7ff00000);
a61af66fc99e Initial load
duke
parents:
diff changeset
1509 __ cmpl(rax, 0x7ff00000);
a61af66fc99e Initial load
duke
parents:
diff changeset
1510 __ jcc(Assembler::notEqual, do_convert);
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 __ movl(rax, value_high_word);
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 __ andl(rax, 0xfffff);
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 __ orl(rax, value_low_word);
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 __ jcc(Assembler::notZero, return0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1515
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 __ bind(do_convert);
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 __ fnstcw(Address(rsp, 0));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1518 __ movzwl(rax, Address(rsp, 0));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1519 __ orl(rax, 0xc00);
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 __ movw(Address(rsp, 2), rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 __ fldcw(Address(rsp, 2));
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 __ fwait();
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 __ fistp_d(result_low_word);
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 __ fldcw(Address(rsp, 0));
a61af66fc99e Initial load
duke
parents:
diff changeset
1525 __ fwait();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1526 // This gets the entire long in rax on 64bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1527 __ movptr(rax, result_low_word);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1528 // testing of high bits
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1529 __ movl(rdx, result_high_word);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1530 __ mov(rcx, rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 // What the heck is the point of the next instruction???
a61af66fc99e Initial load
duke
parents:
diff changeset
1532 __ xorl(rcx, 0x0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 __ movl(rsi, 0x80000000);
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 __ xorl(rsi, rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 __ orl(rcx, rsi);
a61af66fc99e Initial load
duke
parents:
diff changeset
1536 __ jcc(Assembler::notEqual, do_return);
a61af66fc99e Initial load
duke
parents:
diff changeset
1537 __ fldz();
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 __ fcomp_d(value_low_word);
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 __ fnstsw_ax();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1540 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1541 __ testl(rax, 0x4100); // ZF & CF == 0
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1542 __ jcc(Assembler::equal, return_min_jlong);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1543 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 __ sahf();
a61af66fc99e Initial load
duke
parents:
diff changeset
1545 __ jcc(Assembler::above, return_min_jlong);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1546 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 // return max_jlong
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1548 #ifndef _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 __ movl(rdx, 0x7fffffff);
a61af66fc99e Initial load
duke
parents:
diff changeset
1550 __ movl(rax, 0xffffffff);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1551 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1552 __ mov64(rax, CONST64(0x7fffffffffffffff));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1553 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1554 __ jmp(do_return);
a61af66fc99e Initial load
duke
parents:
diff changeset
1555
a61af66fc99e Initial load
duke
parents:
diff changeset
1556 __ bind(return_min_jlong);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1557 #ifndef _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 __ movl(rdx, 0x80000000);
a61af66fc99e Initial load
duke
parents:
diff changeset
1559 __ xorl(rax, rax);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1560 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1561 __ mov64(rax, CONST64(0x8000000000000000));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1562 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 __ jmp(do_return);
a61af66fc99e Initial load
duke
parents:
diff changeset
1564
a61af66fc99e Initial load
duke
parents:
diff changeset
1565 __ bind(return0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1566 __ fpop();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1567 #ifndef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1568 __ xorptr(rdx,rdx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1569 __ xorptr(rax,rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1570 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1571 __ xorptr(rax, rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1572 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1573
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 __ bind(do_return);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1575 __ addptr(rsp, 32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1576 LP64_ONLY(__ pop(rdx);)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1577 __ pop(rcx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1578 __ pop(rsi);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 __ ret(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1580 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1581 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1582
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1583 #ifndef SERIALGC
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1584 case g1_pre_barrier_slow_id:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1585 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1586 StubFrame f(sasm, "g1_pre_barrier", dont_gc_arguments);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1587 // arg0 : previous value of memory
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1588
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1589 BarrierSet* bs = Universe::heap()->barrier_set();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1590 if (bs->kind() != BarrierSet::G1SATBCTLogging) {
362
apetrusenko
parents: 304 342
diff changeset
1591 __ movptr(rax, (int)id);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1592 __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), rax);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1593 __ should_not_reach_here();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1594 break;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1595 }
362
apetrusenko
parents: 304 342
diff changeset
1596 __ push(rax);
apetrusenko
parents: 304 342
diff changeset
1597 __ push(rdx);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1598
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1599 const Register pre_val = rax;
362
apetrusenko
parents: 304 342
diff changeset
1600 const Register thread = NOT_LP64(rax) LP64_ONLY(r15_thread);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1601 const Register tmp = rdx;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1602
362
apetrusenko
parents: 304 342
diff changeset
1603 NOT_LP64(__ get_thread(thread);)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1604
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1605 Address in_progress(thread, in_bytes(JavaThread::satb_mark_queue_offset() +
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1606 PtrQueue::byte_offset_of_active()));
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1607
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1608 Address queue_index(thread, in_bytes(JavaThread::satb_mark_queue_offset() +
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1609 PtrQueue::byte_offset_of_index()));
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1610 Address buffer(thread, in_bytes(JavaThread::satb_mark_queue_offset() +
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1611 PtrQueue::byte_offset_of_buf()));
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1612
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1613
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1614 Label done;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1615 Label runtime;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1616
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1617 // Can we store original value in the thread's buffer?
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1618
362
apetrusenko
parents: 304 342
diff changeset
1619 #ifdef _LP64
1572
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1620 __ movslq(tmp, queue_index);
362
apetrusenko
parents: 304 342
diff changeset
1621 __ cmpq(tmp, 0);
apetrusenko
parents: 304 342
diff changeset
1622 #else
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1623 __ cmpl(queue_index, 0);
362
apetrusenko
parents: 304 342
diff changeset
1624 #endif
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1625 __ jcc(Assembler::equal, runtime);
362
apetrusenko
parents: 304 342
diff changeset
1626 #ifdef _LP64
apetrusenko
parents: 304 342
diff changeset
1627 __ subq(tmp, wordSize);
apetrusenko
parents: 304 342
diff changeset
1628 __ movl(queue_index, tmp);
apetrusenko
parents: 304 342
diff changeset
1629 __ addq(tmp, buffer);
apetrusenko
parents: 304 342
diff changeset
1630 #else
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1631 __ subl(queue_index, wordSize);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1632 __ movl(tmp, buffer);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1633 __ addl(tmp, queue_index);
362
apetrusenko
parents: 304 342
diff changeset
1634 #endif
apetrusenko
parents: 304 342
diff changeset
1635
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1636 // prev_val (rax)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1637 f.load_argument(0, pre_val);
362
apetrusenko
parents: 304 342
diff changeset
1638 __ movptr(Address(tmp, 0), pre_val);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1639 __ jmp(done);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1640
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1641 __ bind(runtime);
1572
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1642 __ push(rcx);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1643 #ifdef _LP64
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1644 __ push(r8);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1645 __ push(r9);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1646 __ push(r10);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1647 __ push(r11);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1648 # ifndef _WIN64
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1649 __ push(rdi);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1650 __ push(rsi);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1651 # endif
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1652 #endif
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1653 // load the pre-value
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1654 f.load_argument(0, rcx);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1655 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_pre), rcx, thread);
1572
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1656 #ifdef _LP64
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1657 # ifndef _WIN64
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1658 __ pop(rsi);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1659 __ pop(rdi);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1660 # endif
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1661 __ pop(r11);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1662 __ pop(r10);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1663 __ pop(r9);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1664 __ pop(r8);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1665 #endif
362
apetrusenko
parents: 304 342
diff changeset
1666 __ pop(rcx);
1572
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1667 __ bind(done);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1668
362
apetrusenko
parents: 304 342
diff changeset
1669 __ pop(rdx);
apetrusenko
parents: 304 342
diff changeset
1670 __ pop(rax);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1671 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1672 break;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1673
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1674 case g1_post_barrier_slow_id:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1675 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1676 StubFrame f(sasm, "g1_post_barrier", dont_gc_arguments);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1677
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1678
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1679 // arg0: store_address
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1680 Address store_addr(rbp, 2*BytesPerWord);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1681
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1682 BarrierSet* bs = Universe::heap()->barrier_set();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1683 CardTableModRefBS* ct = (CardTableModRefBS*)bs;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1684 Label done;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1685 Label runtime;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1686
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1687 // At this point we know new_value is non-NULL and the new_value crosses regsion.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1688 // Must check to see if card is already dirty
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1689
362
apetrusenko
parents: 304 342
diff changeset
1690 const Register thread = NOT_LP64(rax) LP64_ONLY(r15_thread);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1691
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1692 Address queue_index(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1693 PtrQueue::byte_offset_of_index()));
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1694 Address buffer(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1695 PtrQueue::byte_offset_of_buf()));
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1696
362
apetrusenko
parents: 304 342
diff changeset
1697 __ push(rax);
1572
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1698 __ push(rcx);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1699
362
apetrusenko
parents: 304 342
diff changeset
1700 NOT_LP64(__ get_thread(thread);)
apetrusenko
parents: 304 342
diff changeset
1701 ExternalAddress cardtable((address)ct->byte_map_base);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1702 assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1703
1572
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1704 const Register card_addr = rcx;
362
apetrusenko
parents: 304 342
diff changeset
1705 #ifdef _LP64
apetrusenko
parents: 304 342
diff changeset
1706 const Register tmp = rscratch1;
apetrusenko
parents: 304 342
diff changeset
1707 f.load_argument(0, card_addr);
apetrusenko
parents: 304 342
diff changeset
1708 __ shrq(card_addr, CardTableModRefBS::card_shift);
apetrusenko
parents: 304 342
diff changeset
1709 __ lea(tmp, cardtable);
apetrusenko
parents: 304 342
diff changeset
1710 // get the address of the card
apetrusenko
parents: 304 342
diff changeset
1711 __ addq(card_addr, tmp);
apetrusenko
parents: 304 342
diff changeset
1712 #else
1572
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1713 const Register card_index = rcx;
362
apetrusenko
parents: 304 342
diff changeset
1714 f.load_argument(0, card_index);
apetrusenko
parents: 304 342
diff changeset
1715 __ shrl(card_index, CardTableModRefBS::card_shift);
apetrusenko
parents: 304 342
diff changeset
1716
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1717 Address index(noreg, card_index, Address::times_1);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1718 __ leal(card_addr, __ as_Address(ArrayAddress(cardtable, index)));
362
apetrusenko
parents: 304 342
diff changeset
1719 #endif
apetrusenko
parents: 304 342
diff changeset
1720
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1721 __ cmpb(Address(card_addr, 0), 0);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1722 __ jcc(Assembler::equal, done);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1723
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1724 // storing region crossing non-NULL, card is clean.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1725 // dirty card and log.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1726
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1727 __ movb(Address(card_addr, 0), 0);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1728
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1729 __ cmpl(queue_index, 0);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1730 __ jcc(Assembler::equal, runtime);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1731 __ subl(queue_index, wordSize);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1732
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1733 const Register buffer_addr = rbx;
362
apetrusenko
parents: 304 342
diff changeset
1734 __ push(rbx);
apetrusenko
parents: 304 342
diff changeset
1735
apetrusenko
parents: 304 342
diff changeset
1736 __ movptr(buffer_addr, buffer);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1737
362
apetrusenko
parents: 304 342
diff changeset
1738 #ifdef _LP64
apetrusenko
parents: 304 342
diff changeset
1739 __ movslq(rscratch1, queue_index);
apetrusenko
parents: 304 342
diff changeset
1740 __ addptr(buffer_addr, rscratch1);
apetrusenko
parents: 304 342
diff changeset
1741 #else
apetrusenko
parents: 304 342
diff changeset
1742 __ addptr(buffer_addr, queue_index);
apetrusenko
parents: 304 342
diff changeset
1743 #endif
apetrusenko
parents: 304 342
diff changeset
1744 __ movptr(Address(buffer_addr, 0), card_addr);
apetrusenko
parents: 304 342
diff changeset
1745
apetrusenko
parents: 304 342
diff changeset
1746 __ pop(rbx);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1747 __ jmp(done);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1748
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1749 __ bind(runtime);
1572
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1750 __ push(rdx);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1751 #ifdef _LP64
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1752 __ push(r8);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1753 __ push(r9);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1754 __ push(r10);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1755 __ push(r11);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1756 # ifndef _WIN64
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1757 __ push(rdi);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1758 __ push(rsi);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1759 # endif
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1760 #endif
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1761 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_post), card_addr, thread);
1572
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1762 #ifdef _LP64
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1763 # ifndef _WIN64
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1764 __ pop(rsi);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1765 __ pop(rdi);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1766 # endif
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1767 __ pop(r11);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1768 __ pop(r10);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1769 __ pop(r9);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1770 __ pop(r8);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1771 #endif
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1772 __ pop(rdx);
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1773 __ bind(done);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1774
1572
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
1775 __ pop(rcx);
362
apetrusenko
parents: 304 342
diff changeset
1776 __ pop(rax);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1777
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1778 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1779 break;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1780 #endif // !SERIALGC
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
1781
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1782 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
1783 { StubFrame f(sasm, "unimplemented entry", dont_gc_arguments);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
1784 __ movptr(rax, (int)id);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1785 __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1786 __ should_not_reach_here();
a61af66fc99e Initial load
duke
parents:
diff changeset
1787 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1788 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1789 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1790 return oop_maps;
a61af66fc99e Initial load
duke
parents:
diff changeset
1791 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1792
a61af66fc99e Initial load
duke
parents:
diff changeset
1793 #undef __
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1794
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1795 const char *Runtime1::pd_name_for_address(address entry) {
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1796 return "<unknown function>";
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1797 }