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