1 /*
2 * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
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
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "jfr/support/jfrIntrinsics.hpp"
27 #include "opto/c2compiler.hpp"
28 #include "opto/compile.hpp"
29 #include "opto/optoreg.hpp"
30 #include "opto/output.hpp"
31 #include "opto/runtime.hpp"
32 #include "utilities/macros.hpp"
33
34
35 // register information defined by ADLC
36 extern const char register_save_policy[];
37 extern const int register_save_type[];
38
retry_no_subsuming_loads()39 const char* C2Compiler::retry_no_subsuming_loads() {
40 return "retry without subsuming loads";
41 }
retry_no_escape_analysis()42 const char* C2Compiler::retry_no_escape_analysis() {
43 return "retry without escape analysis";
44 }
retry_no_locks_coarsening()45 const char* C2Compiler::retry_no_locks_coarsening() {
46 return "retry without locks coarsening";
47 }
retry_class_loading_during_parsing()48 const char* C2Compiler::retry_class_loading_during_parsing() {
49 return "retry class loading during parsing";
50 }
init_c2_runtime()51 bool C2Compiler::init_c2_runtime() {
52
53 // Check assumptions used while running ADLC
54 Compile::adlc_verification();
55 assert(REG_COUNT <= ConcreteRegisterImpl::number_of_registers, "incompatible register counts");
56
57 for (int i = 0; i < ConcreteRegisterImpl::number_of_registers ; i++ ) {
58 OptoReg::vm2opto[i] = OptoReg::Bad;
59 }
60
61 for( OptoReg::Name i=OptoReg::Name(0); i<OptoReg::Name(REG_COUNT); i = OptoReg::add(i,1) ) {
62 VMReg r = OptoReg::as_VMReg(i);
63 if (r->is_valid()) {
64 OptoReg::vm2opto[r->value()] = i;
65 }
66 }
67
68 // Check that runtime and architecture description agree on callee-saved-floats
69 bool callee_saved_floats = false;
70 for( OptoReg::Name i=OptoReg::Name(0); i<OptoReg::Name(_last_Mach_Reg); i = OptoReg::add(i,1) ) {
71 // Is there a callee-saved float or double?
72 if( register_save_policy[i] == 'E' /* callee-saved */ &&
73 (register_save_type[i] == Op_RegF || register_save_type[i] == Op_RegD) ) {
74 callee_saved_floats = true;
75 }
76 }
77
78 DEBUG_ONLY( Node::init_NodeProperty(); )
79
80 Compile::pd_compiler2_init();
81
82 CompilerThread* thread = CompilerThread::current();
83
84 HandleMark handle_mark(thread);
85 return OptoRuntime::generate(thread->env());
86 }
87
initialize()88 void C2Compiler::initialize() {
89 // The first compiler thread that gets here will initialize the
90 // small amount of global state (and runtime stubs) that C2 needs.
91
92 // There is a race possible once at startup and then we're fine
93
94 // Note that this is being called from a compiler thread not the
95 // main startup thread.
96 if (should_perform_init()) {
97 bool successful = C2Compiler::init_c2_runtime();
98 int new_state = (successful) ? initialized : failed;
99 set_state(new_state);
100 }
101 }
102
compile_method(ciEnv * env,ciMethod * target,int entry_bci,DirectiveSet * directive)103 void C2Compiler::compile_method(ciEnv* env, ciMethod* target, int entry_bci, DirectiveSet* directive) {
104 assert(is_initialized(), "Compiler thread must be initialized");
105
106 bool subsume_loads = SubsumeLoads;
107 bool do_escape_analysis = DoEscapeAnalysis && !env->should_retain_local_variables()
108 && !env->jvmti_can_get_owned_monitor_info();
109 bool eliminate_boxing = EliminateAutoBox;
110 bool do_locks_coarsening = EliminateLocks;
111
112 while (!env->failing()) {
113 // Attempt to compile while subsuming loads into machine instructions.
114 Compile C(env, this, target, entry_bci, subsume_loads, do_escape_analysis, eliminate_boxing, do_locks_coarsening, directive);
115
116 // Check result and retry if appropriate.
117 if (C.failure_reason() != NULL) {
118 if (C.failure_reason_is(retry_class_loading_during_parsing())) {
119 env->report_failure(C.failure_reason());
120 continue; // retry
121 }
122 if (C.failure_reason_is(retry_no_subsuming_loads())) {
123 assert(subsume_loads, "must make progress");
124 subsume_loads = false;
125 env->report_failure(C.failure_reason());
126 continue; // retry
127 }
128 if (C.failure_reason_is(retry_no_escape_analysis())) {
129 assert(do_escape_analysis, "must make progress");
130 do_escape_analysis = false;
131 env->report_failure(C.failure_reason());
132 continue; // retry
133 }
134 if (C.failure_reason_is(retry_no_locks_coarsening())) {
135 assert(do_locks_coarsening, "must make progress");
136 do_locks_coarsening = false;
137 env->report_failure(C.failure_reason());
138 continue; // retry
139 }
140 if (C.has_boxed_value()) {
141 // Recompile without boxing elimination regardless failure reason.
142 assert(eliminate_boxing, "must make progress");
143 eliminate_boxing = false;
144 env->report_failure(C.failure_reason());
145 continue; // retry
146 }
147 // Pass any other failure reason up to the ciEnv.
148 // Note that serious, irreversible failures are already logged
149 // on the ciEnv via env->record_method_not_compilable().
150 env->record_failure(C.failure_reason());
151 }
152 if (StressRecompilation) {
153 if (subsume_loads) {
154 subsume_loads = false;
155 continue; // retry
156 }
157 if (do_escape_analysis) {
158 do_escape_analysis = false;
159 continue; // retry
160 }
161 if (do_locks_coarsening) {
162 do_locks_coarsening = false;
163 continue; // retry
164 }
165 }
166
167 // print inlining for last compilation only
168 C.dump_print_inlining();
169
170 // No retry; just break the loop.
171 break;
172 }
173 }
174
print_timers()175 void C2Compiler::print_timers() {
176 Compile::print_timers();
177 }
178
is_intrinsic_supported(const methodHandle & method,bool is_virtual)179 bool C2Compiler::is_intrinsic_supported(const methodHandle& method, bool is_virtual) {
180 vmIntrinsics::ID id = method->intrinsic_id();
181 assert(id != vmIntrinsics::_none, "must be a VM intrinsic");
182
183 if (id < vmIntrinsics::FIRST_ID || id > vmIntrinsics::LAST_COMPILER_INLINE) {
184 return false;
185 }
186
187 // Only Object.hashCode and Object.clone intrinsics implement also a virtual
188 // dispatch because calling both methods is expensive but both methods are
189 // frequently overridden. All other intrinsics implement only a non-virtual
190 // dispatch.
191 if (is_virtual) {
192 switch (id) {
193 case vmIntrinsics::_hashCode:
194 case vmIntrinsics::_clone:
195 break;
196 default:
197 return false;
198 }
199 }
200
201 switch (id) {
202 case vmIntrinsics::_compressStringC:
203 case vmIntrinsics::_compressStringB:
204 if (!Matcher::match_rule_supported(Op_StrCompressedCopy)) return false;
205 break;
206 case vmIntrinsics::_inflateStringC:
207 case vmIntrinsics::_inflateStringB:
208 if (!Matcher::match_rule_supported(Op_StrInflatedCopy)) return false;
209 break;
210 case vmIntrinsics::_compareToL:
211 case vmIntrinsics::_compareToU:
212 case vmIntrinsics::_compareToLU:
213 case vmIntrinsics::_compareToUL:
214 if (!Matcher::match_rule_supported(Op_StrComp)) return false;
215 break;
216 case vmIntrinsics::_equalsL:
217 case vmIntrinsics::_equalsU:
218 if (!Matcher::match_rule_supported(Op_StrEquals)) return false;
219 break;
220 case vmIntrinsics::_equalsB:
221 case vmIntrinsics::_equalsC:
222 if (!Matcher::match_rule_supported(Op_AryEq)) return false;
223 break;
224 case vmIntrinsics::_copyMemory:
225 if (StubRoutines::unsafe_arraycopy() == NULL) return false;
226 break;
227 case vmIntrinsics::_encodeISOArray:
228 case vmIntrinsics::_encodeByteISOArray:
229 if (!Matcher::match_rule_supported(Op_EncodeISOArray)) return false;
230 break;
231 case vmIntrinsics::_hasNegatives:
232 if (!Matcher::match_rule_supported(Op_HasNegatives)) return false;
233 break;
234 case vmIntrinsics::_bitCount_i:
235 if (!Matcher::match_rule_supported(Op_PopCountI)) return false;
236 break;
237 case vmIntrinsics::_bitCount_l:
238 if (!Matcher::match_rule_supported(Op_PopCountL)) return false;
239 break;
240 case vmIntrinsics::_numberOfLeadingZeros_i:
241 if (!Matcher::match_rule_supported(Op_CountLeadingZerosI)) return false;
242 break;
243 case vmIntrinsics::_numberOfLeadingZeros_l:
244 if (!Matcher::match_rule_supported(Op_CountLeadingZerosL)) return false;
245 break;
246 case vmIntrinsics::_numberOfTrailingZeros_i:
247 if (!Matcher::match_rule_supported(Op_CountTrailingZerosI)) return false;
248 break;
249 case vmIntrinsics::_numberOfTrailingZeros_l:
250 if (!Matcher::match_rule_supported(Op_CountTrailingZerosL)) return false;
251 break;
252 case vmIntrinsics::_reverseBytes_c:
253 if (!Matcher::match_rule_supported(Op_ReverseBytesUS)) return false;
254 break;
255 case vmIntrinsics::_reverseBytes_s:
256 if (!Matcher::match_rule_supported(Op_ReverseBytesS)) return false;
257 break;
258 case vmIntrinsics::_reverseBytes_i:
259 if (!Matcher::match_rule_supported(Op_ReverseBytesI)) return false;
260 break;
261 case vmIntrinsics::_reverseBytes_l:
262 if (!Matcher::match_rule_supported(Op_ReverseBytesL)) return false;
263 break;
264
265 /* CompareAndSet, Object: */
266 case vmIntrinsics::_compareAndSetObject:
267 #ifdef _LP64
268 if ( UseCompressedOops && !Matcher::match_rule_supported(Op_CompareAndSwapN)) return false;
269 if (!UseCompressedOops && !Matcher::match_rule_supported(Op_CompareAndSwapP)) return false;
270 #else
271 if (!Matcher::match_rule_supported(Op_CompareAndSwapP)) return false;
272 #endif
273 break;
274 case vmIntrinsics::_weakCompareAndSetObjectPlain:
275 case vmIntrinsics::_weakCompareAndSetObjectAcquire:
276 case vmIntrinsics::_weakCompareAndSetObjectRelease:
277 case vmIntrinsics::_weakCompareAndSetObject:
278 #ifdef _LP64
279 if ( UseCompressedOops && !Matcher::match_rule_supported(Op_WeakCompareAndSwapN)) return false;
280 if (!UseCompressedOops && !Matcher::match_rule_supported(Op_WeakCompareAndSwapP)) return false;
281 #else
282 if (!Matcher::match_rule_supported(Op_WeakCompareAndSwapP)) return false;
283 #endif
284 break;
285 /* CompareAndSet, Long: */
286 case vmIntrinsics::_compareAndSetLong:
287 if (!Matcher::match_rule_supported(Op_CompareAndSwapL)) return false;
288 break;
289 case vmIntrinsics::_weakCompareAndSetLongPlain:
290 case vmIntrinsics::_weakCompareAndSetLongAcquire:
291 case vmIntrinsics::_weakCompareAndSetLongRelease:
292 case vmIntrinsics::_weakCompareAndSetLong:
293 if (!Matcher::match_rule_supported(Op_WeakCompareAndSwapL)) return false;
294 break;
295
296 /* CompareAndSet, Int: */
297 case vmIntrinsics::_compareAndSetInt:
298 if (!Matcher::match_rule_supported(Op_CompareAndSwapI)) return false;
299 break;
300 case vmIntrinsics::_weakCompareAndSetIntPlain:
301 case vmIntrinsics::_weakCompareAndSetIntAcquire:
302 case vmIntrinsics::_weakCompareAndSetIntRelease:
303 case vmIntrinsics::_weakCompareAndSetInt:
304 if (!Matcher::match_rule_supported(Op_WeakCompareAndSwapI)) return false;
305 break;
306
307 /* CompareAndSet, Byte: */
308 case vmIntrinsics::_compareAndSetByte:
309 if (!Matcher::match_rule_supported(Op_CompareAndSwapB)) return false;
310 break;
311 case vmIntrinsics::_weakCompareAndSetBytePlain:
312 case vmIntrinsics::_weakCompareAndSetByteAcquire:
313 case vmIntrinsics::_weakCompareAndSetByteRelease:
314 case vmIntrinsics::_weakCompareAndSetByte:
315 if (!Matcher::match_rule_supported(Op_WeakCompareAndSwapB)) return false;
316 break;
317
318 /* CompareAndSet, Short: */
319 case vmIntrinsics::_compareAndSetShort:
320 if (!Matcher::match_rule_supported(Op_CompareAndSwapS)) return false;
321 break;
322 case vmIntrinsics::_weakCompareAndSetShortPlain:
323 case vmIntrinsics::_weakCompareAndSetShortAcquire:
324 case vmIntrinsics::_weakCompareAndSetShortRelease:
325 case vmIntrinsics::_weakCompareAndSetShort:
326 if (!Matcher::match_rule_supported(Op_WeakCompareAndSwapS)) return false;
327 break;
328
329 /* CompareAndExchange, Object: */
330 case vmIntrinsics::_compareAndExchangeObject:
331 case vmIntrinsics::_compareAndExchangeObjectAcquire:
332 case vmIntrinsics::_compareAndExchangeObjectRelease:
333 #ifdef _LP64
334 if ( UseCompressedOops && !Matcher::match_rule_supported(Op_CompareAndExchangeN)) return false;
335 if (!UseCompressedOops && !Matcher::match_rule_supported(Op_CompareAndExchangeP)) return false;
336 #else
337 if (!Matcher::match_rule_supported(Op_CompareAndExchangeP)) return false;
338 #endif
339 break;
340
341 /* CompareAndExchange, Long: */
342 case vmIntrinsics::_compareAndExchangeLong:
343 case vmIntrinsics::_compareAndExchangeLongAcquire:
344 case vmIntrinsics::_compareAndExchangeLongRelease:
345 if (!Matcher::match_rule_supported(Op_CompareAndExchangeL)) return false;
346 break;
347
348 /* CompareAndExchange, Int: */
349 case vmIntrinsics::_compareAndExchangeInt:
350 case vmIntrinsics::_compareAndExchangeIntAcquire:
351 case vmIntrinsics::_compareAndExchangeIntRelease:
352 if (!Matcher::match_rule_supported(Op_CompareAndExchangeI)) return false;
353 break;
354
355 /* CompareAndExchange, Byte: */
356 case vmIntrinsics::_compareAndExchangeByte:
357 case vmIntrinsics::_compareAndExchangeByteAcquire:
358 case vmIntrinsics::_compareAndExchangeByteRelease:
359 if (!Matcher::match_rule_supported(Op_CompareAndExchangeB)) return false;
360 break;
361
362 /* CompareAndExchange, Short: */
363 case vmIntrinsics::_compareAndExchangeShort:
364 case vmIntrinsics::_compareAndExchangeShortAcquire:
365 case vmIntrinsics::_compareAndExchangeShortRelease:
366 if (!Matcher::match_rule_supported(Op_CompareAndExchangeS)) return false;
367 break;
368
369 case vmIntrinsics::_getAndAddByte:
370 if (!Matcher::match_rule_supported(Op_GetAndAddB)) return false;
371 break;
372 case vmIntrinsics::_getAndAddShort:
373 if (!Matcher::match_rule_supported(Op_GetAndAddS)) return false;
374 break;
375 case vmIntrinsics::_getAndAddInt:
376 if (!Matcher::match_rule_supported(Op_GetAndAddI)) return false;
377 break;
378 case vmIntrinsics::_getAndAddLong:
379 if (!Matcher::match_rule_supported(Op_GetAndAddL)) return false;
380 break;
381
382 case vmIntrinsics::_getAndSetByte:
383 if (!Matcher::match_rule_supported(Op_GetAndSetB)) return false;
384 break;
385 case vmIntrinsics::_getAndSetShort:
386 if (!Matcher::match_rule_supported(Op_GetAndSetS)) return false;
387 break;
388 case vmIntrinsics::_getAndSetInt:
389 if (!Matcher::match_rule_supported(Op_GetAndSetI)) return false;
390 break;
391 case vmIntrinsics::_getAndSetLong:
392 if (!Matcher::match_rule_supported(Op_GetAndSetL)) return false;
393 break;
394 case vmIntrinsics::_getAndSetObject:
395 #ifdef _LP64
396 if (!UseCompressedOops && !Matcher::match_rule_supported(Op_GetAndSetP)) return false;
397 if (UseCompressedOops && !Matcher::match_rule_supported(Op_GetAndSetN)) return false;
398 break;
399 #else
400 if (!Matcher::match_rule_supported(Op_GetAndSetP)) return false;
401 break;
402 #endif
403 case vmIntrinsics::_incrementExactI:
404 case vmIntrinsics::_addExactI:
405 if (!Matcher::match_rule_supported(Op_OverflowAddI)) return false;
406 break;
407 case vmIntrinsics::_incrementExactL:
408 case vmIntrinsics::_addExactL:
409 if (!Matcher::match_rule_supported(Op_OverflowAddL)) return false;
410 break;
411 case vmIntrinsics::_decrementExactI:
412 case vmIntrinsics::_subtractExactI:
413 if (!Matcher::match_rule_supported(Op_OverflowSubI)) return false;
414 break;
415 case vmIntrinsics::_decrementExactL:
416 case vmIntrinsics::_subtractExactL:
417 if (!Matcher::match_rule_supported(Op_OverflowSubL)) return false;
418 break;
419 case vmIntrinsics::_negateExactI:
420 if (!Matcher::match_rule_supported(Op_OverflowSubI)) return false;
421 break;
422 case vmIntrinsics::_negateExactL:
423 if (!Matcher::match_rule_supported(Op_OverflowSubL)) return false;
424 break;
425 case vmIntrinsics::_multiplyExactI:
426 if (!Matcher::match_rule_supported(Op_OverflowMulI)) return false;
427 break;
428 case vmIntrinsics::_multiplyExactL:
429 if (!Matcher::match_rule_supported(Op_OverflowMulL)) return false;
430 break;
431 case vmIntrinsics::_multiplyHigh:
432 if (!Matcher::match_rule_supported(Op_MulHiL)) return false;
433 break;
434 case vmIntrinsics::_getCallerClass:
435 if (SystemDictionary::reflect_CallerSensitive_klass() == NULL) return false;
436 break;
437 case vmIntrinsics::_onSpinWait:
438 if (!Matcher::match_rule_supported(Op_OnSpinWait)) return false;
439 break;
440 case vmIntrinsics::_fmaD:
441 if (!UseFMA || !Matcher::match_rule_supported(Op_FmaD)) return false;
442 break;
443 case vmIntrinsics::_fmaF:
444 if (!UseFMA || !Matcher::match_rule_supported(Op_FmaF)) return false;
445 break;
446 case vmIntrinsics::_isDigit:
447 if (!Matcher::match_rule_supported(Op_Digit)) return false;
448 break;
449 case vmIntrinsics::_isLowerCase:
450 if (!Matcher::match_rule_supported(Op_LowerCase)) return false;
451 break;
452 case vmIntrinsics::_isUpperCase:
453 if (!Matcher::match_rule_supported(Op_UpperCase)) return false;
454 break;
455 case vmIntrinsics::_isWhitespace:
456 if (!Matcher::match_rule_supported(Op_Whitespace)) return false;
457 break;
458 case vmIntrinsics::_maxF:
459 if (!Matcher::match_rule_supported(Op_MaxF)) return false;
460 break;
461 case vmIntrinsics::_minF:
462 if (!Matcher::match_rule_supported(Op_MinF)) return false;
463 break;
464 case vmIntrinsics::_maxD:
465 if (!Matcher::match_rule_supported(Op_MaxD)) return false;
466 break;
467 case vmIntrinsics::_minD:
468 if (!Matcher::match_rule_supported(Op_MinD)) return false;
469 break;
470 case vmIntrinsics::_dcopySign:
471 if (!Matcher::match_rule_supported(Op_CopySignD)) return false;
472 break;
473 case vmIntrinsics::_fcopySign:
474 if (!Matcher::match_rule_supported(Op_CopySignF)) return false;
475 break;
476 case vmIntrinsics::_dsignum:
477 if (!Matcher::match_rule_supported(Op_SignumD)) return false;
478 break;
479 case vmIntrinsics::_fsignum:
480 if (!Matcher::match_rule_supported(Op_SignumF)) return false;
481 break;
482 case vmIntrinsics::_rint:
483 case vmIntrinsics::_ceil:
484 case vmIntrinsics::_floor:
485 if (!Matcher::match_rule_supported(Op_RoundDoubleMode)) return false;
486 break;
487 case vmIntrinsics::_hashCode:
488 case vmIntrinsics::_identityHashCode:
489 case vmIntrinsics::_getClass:
490 case vmIntrinsics::_dsin:
491 case vmIntrinsics::_dcos:
492 case vmIntrinsics::_dtan:
493 case vmIntrinsics::_dabs:
494 case vmIntrinsics::_fabs:
495 case vmIntrinsics::_iabs:
496 case vmIntrinsics::_labs:
497 case vmIntrinsics::_datan2:
498 case vmIntrinsics::_dsqrt:
499 case vmIntrinsics::_dexp:
500 case vmIntrinsics::_dlog:
501 case vmIntrinsics::_dlog10:
502 case vmIntrinsics::_dpow:
503 case vmIntrinsics::_min:
504 case vmIntrinsics::_max:
505 case vmIntrinsics::_arraycopy:
506 case vmIntrinsics::_indexOfL:
507 case vmIntrinsics::_indexOfU:
508 case vmIntrinsics::_indexOfUL:
509 case vmIntrinsics::_indexOfIL:
510 case vmIntrinsics::_indexOfIU:
511 case vmIntrinsics::_indexOfIUL:
512 case vmIntrinsics::_indexOfU_char:
513 case vmIntrinsics::_toBytesStringU:
514 case vmIntrinsics::_getCharsStringU:
515 case vmIntrinsics::_getCharStringU:
516 case vmIntrinsics::_putCharStringU:
517 case vmIntrinsics::_getObject:
518 case vmIntrinsics::_getBoolean:
519 case vmIntrinsics::_getByte:
520 case vmIntrinsics::_getShort:
521 case vmIntrinsics::_getChar:
522 case vmIntrinsics::_getInt:
523 case vmIntrinsics::_getLong:
524 case vmIntrinsics::_getFloat:
525 case vmIntrinsics::_getDouble:
526 case vmIntrinsics::_putObject:
527 case vmIntrinsics::_putBoolean:
528 case vmIntrinsics::_putByte:
529 case vmIntrinsics::_putShort:
530 case vmIntrinsics::_putChar:
531 case vmIntrinsics::_putInt:
532 case vmIntrinsics::_putLong:
533 case vmIntrinsics::_putFloat:
534 case vmIntrinsics::_putDouble:
535 case vmIntrinsics::_getObjectVolatile:
536 case vmIntrinsics::_getBooleanVolatile:
537 case vmIntrinsics::_getByteVolatile:
538 case vmIntrinsics::_getShortVolatile:
539 case vmIntrinsics::_getCharVolatile:
540 case vmIntrinsics::_getIntVolatile:
541 case vmIntrinsics::_getLongVolatile:
542 case vmIntrinsics::_getFloatVolatile:
543 case vmIntrinsics::_getDoubleVolatile:
544 case vmIntrinsics::_putObjectVolatile:
545 case vmIntrinsics::_putBooleanVolatile:
546 case vmIntrinsics::_putByteVolatile:
547 case vmIntrinsics::_putShortVolatile:
548 case vmIntrinsics::_putCharVolatile:
549 case vmIntrinsics::_putIntVolatile:
550 case vmIntrinsics::_putLongVolatile:
551 case vmIntrinsics::_putFloatVolatile:
552 case vmIntrinsics::_putDoubleVolatile:
553 case vmIntrinsics::_getObjectAcquire:
554 case vmIntrinsics::_getBooleanAcquire:
555 case vmIntrinsics::_getByteAcquire:
556 case vmIntrinsics::_getShortAcquire:
557 case vmIntrinsics::_getCharAcquire:
558 case vmIntrinsics::_getIntAcquire:
559 case vmIntrinsics::_getLongAcquire:
560 case vmIntrinsics::_getFloatAcquire:
561 case vmIntrinsics::_getDoubleAcquire:
562 case vmIntrinsics::_putObjectRelease:
563 case vmIntrinsics::_putBooleanRelease:
564 case vmIntrinsics::_putByteRelease:
565 case vmIntrinsics::_putShortRelease:
566 case vmIntrinsics::_putCharRelease:
567 case vmIntrinsics::_putIntRelease:
568 case vmIntrinsics::_putLongRelease:
569 case vmIntrinsics::_putFloatRelease:
570 case vmIntrinsics::_putDoubleRelease:
571 case vmIntrinsics::_getObjectOpaque:
572 case vmIntrinsics::_getBooleanOpaque:
573 case vmIntrinsics::_getByteOpaque:
574 case vmIntrinsics::_getShortOpaque:
575 case vmIntrinsics::_getCharOpaque:
576 case vmIntrinsics::_getIntOpaque:
577 case vmIntrinsics::_getLongOpaque:
578 case vmIntrinsics::_getFloatOpaque:
579 case vmIntrinsics::_getDoubleOpaque:
580 case vmIntrinsics::_putObjectOpaque:
581 case vmIntrinsics::_putBooleanOpaque:
582 case vmIntrinsics::_putByteOpaque:
583 case vmIntrinsics::_putShortOpaque:
584 case vmIntrinsics::_putCharOpaque:
585 case vmIntrinsics::_putIntOpaque:
586 case vmIntrinsics::_putLongOpaque:
587 case vmIntrinsics::_putFloatOpaque:
588 case vmIntrinsics::_putDoubleOpaque:
589 case vmIntrinsics::_getShortUnaligned:
590 case vmIntrinsics::_getCharUnaligned:
591 case vmIntrinsics::_getIntUnaligned:
592 case vmIntrinsics::_getLongUnaligned:
593 case vmIntrinsics::_putShortUnaligned:
594 case vmIntrinsics::_putCharUnaligned:
595 case vmIntrinsics::_putIntUnaligned:
596 case vmIntrinsics::_putLongUnaligned:
597 case vmIntrinsics::_loadFence:
598 case vmIntrinsics::_storeFence:
599 case vmIntrinsics::_fullFence:
600 case vmIntrinsics::_currentThread:
601 case vmIntrinsics::_isInterrupted:
602 #ifdef JFR_HAVE_INTRINSICS
603 case vmIntrinsics::_counterTime:
604 case vmIntrinsics::_getClassId:
605 case vmIntrinsics::_getEventWriter:
606 #endif
607 case vmIntrinsics::_currentTimeMillis:
608 case vmIntrinsics::_nanoTime:
609 case vmIntrinsics::_allocateInstance:
610 case vmIntrinsics::_allocateUninitializedArray:
611 case vmIntrinsics::_newArray:
612 case vmIntrinsics::_getLength:
613 case vmIntrinsics::_copyOf:
614 case vmIntrinsics::_copyOfRange:
615 case vmIntrinsics::_clone:
616 case vmIntrinsics::_isAssignableFrom:
617 case vmIntrinsics::_isInstance:
618 case vmIntrinsics::_getModifiers:
619 case vmIntrinsics::_isInterface:
620 case vmIntrinsics::_isArray:
621 case vmIntrinsics::_isPrimitive:
622 case vmIntrinsics::_getSuperclass:
623 case vmIntrinsics::_getClassAccessFlags:
624 case vmIntrinsics::_floatToRawIntBits:
625 case vmIntrinsics::_floatToIntBits:
626 case vmIntrinsics::_intBitsToFloat:
627 case vmIntrinsics::_doubleToRawLongBits:
628 case vmIntrinsics::_doubleToLongBits:
629 case vmIntrinsics::_longBitsToDouble:
630 case vmIntrinsics::_Reference_get:
631 case vmIntrinsics::_Class_cast:
632 case vmIntrinsics::_aescrypt_encryptBlock:
633 case vmIntrinsics::_aescrypt_decryptBlock:
634 case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt:
635 case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt:
636 case vmIntrinsics::_electronicCodeBook_encryptAESCrypt:
637 case vmIntrinsics::_electronicCodeBook_decryptAESCrypt:
638 case vmIntrinsics::_counterMode_AESCrypt:
639 case vmIntrinsics::_sha_implCompress:
640 case vmIntrinsics::_sha2_implCompress:
641 case vmIntrinsics::_sha5_implCompress:
642 case vmIntrinsics::_digestBase_implCompressMB:
643 case vmIntrinsics::_multiplyToLen:
644 case vmIntrinsics::_squareToLen:
645 case vmIntrinsics::_mulAdd:
646 case vmIntrinsics::_montgomeryMultiply:
647 case vmIntrinsics::_montgomerySquare:
648 case vmIntrinsics::_vectorizedMismatch:
649 case vmIntrinsics::_ghash_processBlocks:
650 case vmIntrinsics::_base64_encodeBlock:
651 case vmIntrinsics::_updateCRC32:
652 case vmIntrinsics::_updateBytesCRC32:
653 case vmIntrinsics::_updateByteBufferCRC32:
654 case vmIntrinsics::_updateBytesCRC32C:
655 case vmIntrinsics::_updateDirectByteBufferCRC32C:
656 case vmIntrinsics::_updateBytesAdler32:
657 case vmIntrinsics::_updateByteBufferAdler32:
658 case vmIntrinsics::_profileBoolean:
659 case vmIntrinsics::_isCompileConstant:
660 case vmIntrinsics::_Preconditions_checkIndex:
661 break;
662 default:
663 return false;
664 }
665 return true;
666 }
667
initial_code_buffer_size(int const_size)668 int C2Compiler::initial_code_buffer_size(int const_size) {
669 // See Compile::init_scratch_buffer_blob
670 int locs_size = sizeof(relocInfo) * Compile::MAX_locs_size;
671 int slop = 2 * CodeSection::end_slop(); // space between sections
672 return Compile::MAX_inst_size + Compile::MAX_stubs_size + const_size + slop + locs_size;
673 }
674