annotate src/cpu/x86/vm/c1_Runtime1_x86.cpp @ 17716:cdb71841f4bc

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