1 /* |
1 /* |
2 * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
82 } |
82 } |
83 #endif // !PRODUCT |
83 #endif // !PRODUCT |
84 |
84 |
85 { CodeletMark cm(_masm, "return entry points"); |
85 { CodeletMark cm(_masm, "return entry points"); |
86 const int index_size = sizeof(u2); |
86 const int index_size = sizeof(u2); |
87 for (int i = 0; i < Interpreter::number_of_return_entries; i++) { |
87 Interpreter::_return_entry[0] = EntryPoint(); |
|
88 for (int i = 1; i < Interpreter::number_of_return_entries; i++) { |
|
89 address return_itos = generate_return_entry_for(itos, i, index_size); |
88 Interpreter::_return_entry[i] = |
90 Interpreter::_return_entry[i] = |
89 EntryPoint( |
91 EntryPoint( |
90 generate_return_entry_for(itos, i, index_size), |
92 return_itos, |
91 generate_return_entry_for(itos, i, index_size), |
93 return_itos, |
92 generate_return_entry_for(itos, i, index_size), |
94 return_itos, |
93 generate_return_entry_for(itos, i, index_size), |
95 return_itos, |
94 generate_return_entry_for(atos, i, index_size), |
96 generate_return_entry_for(atos, i, index_size), |
95 generate_return_entry_for(itos, i, index_size), |
97 return_itos, |
96 generate_return_entry_for(ltos, i, index_size), |
98 generate_return_entry_for(ltos, i, index_size), |
97 generate_return_entry_for(ftos, i, index_size), |
99 generate_return_entry_for(ftos, i, index_size), |
98 generate_return_entry_for(dtos, i, index_size), |
100 generate_return_entry_for(dtos, i, index_size), |
99 generate_return_entry_for(vtos, i, index_size) |
101 generate_return_entry_for(vtos, i, index_size) |
100 ); |
102 ); |
130 generate_earlyret_entry_for(ltos), |
132 generate_earlyret_entry_for(ltos), |
131 generate_earlyret_entry_for(ftos), |
133 generate_earlyret_entry_for(ftos), |
132 generate_earlyret_entry_for(dtos), |
134 generate_earlyret_entry_for(dtos), |
133 generate_earlyret_entry_for(vtos) |
135 generate_earlyret_entry_for(vtos) |
134 ); |
136 ); |
135 } |
|
136 |
|
137 { CodeletMark cm(_masm, "deoptimization entry points"); |
|
138 for (int i = 0; i < Interpreter::number_of_deopt_entries; i++) { |
|
139 Interpreter::_deopt_entry[i] = |
|
140 EntryPoint( |
|
141 generate_deopt_entry_for(itos, i), |
|
142 generate_deopt_entry_for(itos, i), |
|
143 generate_deopt_entry_for(itos, i), |
|
144 generate_deopt_entry_for(itos, i), |
|
145 generate_deopt_entry_for(atos, i), |
|
146 generate_deopt_entry_for(itos, i), |
|
147 generate_deopt_entry_for(ltos, i), |
|
148 generate_deopt_entry_for(ftos, i), |
|
149 generate_deopt_entry_for(dtos, i), |
|
150 generate_deopt_entry_for(vtos, i) |
|
151 ); |
|
152 } |
|
153 } |
137 } |
154 |
138 |
155 { CodeletMark cm(_masm, "result handlers for native calls"); |
139 { CodeletMark cm(_masm, "result handlers for native calls"); |
156 // The various result converter stublets. |
140 // The various result converter stublets. |
157 int is_generated[Interpreter::number_of_result_handlers]; |
141 int is_generated[Interpreter::number_of_result_handlers]; |
248 set_entry_points_for_all_bytes(); |
232 set_entry_points_for_all_bytes(); |
249 |
233 |
250 // installation of code in other places in the runtime |
234 // installation of code in other places in the runtime |
251 // (ExcutableCodeManager calls not needed to copy the entries) |
235 // (ExcutableCodeManager calls not needed to copy the entries) |
252 set_safepoints_for_all_bytes(); |
236 set_safepoints_for_all_bytes(); |
|
237 |
|
238 { CodeletMark cm(_masm, "deoptimization entry points"); |
|
239 Interpreter::_deopt_entry[0] = EntryPoint(); |
|
240 Interpreter::_deopt_entry[0].set_entry(vtos, generate_deopt_entry_for(vtos, 0)); |
|
241 for (int i = 1; i < Interpreter::number_of_deopt_entries; i++) { |
|
242 address deopt_itos = generate_deopt_entry_for(itos, i); |
|
243 Interpreter::_deopt_entry[i] = |
|
244 EntryPoint( |
|
245 deopt_itos, /* btos */ |
|
246 deopt_itos, /* ztos */ |
|
247 deopt_itos, /* ctos */ |
|
248 deopt_itos, /* stos */ |
|
249 generate_deopt_entry_for(atos, i), |
|
250 deopt_itos, /* itos */ |
|
251 generate_deopt_entry_for(ltos, i), |
|
252 generate_deopt_entry_for(ftos, i), |
|
253 generate_deopt_entry_for(dtos, i), |
|
254 generate_deopt_entry_for(vtos, i) |
|
255 ); |
|
256 } |
|
257 address return_continuation = Interpreter::_normal_table.entry(Bytecodes::_return).entry(vtos); |
|
258 vmassert(return_continuation != NULL, "return entry not generated yet"); |
|
259 Interpreter::_deopt_reexecute_return_entry = generate_deopt_entry_for(vtos, 0, return_continuation); |
|
260 } |
|
261 |
253 } |
262 } |
254 |
263 |
255 //------------------------------------------------------------------------------------------------------------------------ |
264 //------------------------------------------------------------------------------------------------------------------------ |
256 |
265 |
257 address TemplateInterpreterGenerator::generate_error_exit(const char* msg) { |
266 address TemplateInterpreterGenerator::generate_error_exit(const char* msg) { |