1 /*
2 * Copyright (c) 1999, 2026, 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 "classfile/vmClasses.hpp"
26 #include "classfile/vmIntrinsics.hpp"
27 #include "compiler/compilationMemoryStatistic.hpp"
28 #include "compiler/compilerDefinitions.inline.hpp"
29 #include "jfr/support/jfrIntrinsics.hpp"
30 #include "opto/c2compiler.hpp"
31 #include "opto/compile.hpp"
32 #include "opto/optoreg.hpp"
33 #include "opto/output.hpp"
34 #include "opto/runtime.hpp"
35 #include "runtime/arguments.hpp"
36 #include "runtime/globals_extension.hpp"
37 #include "runtime/handles.inline.hpp"
38 #include "runtime/stubRoutines.hpp"
39 #include "utilities/macros.hpp"
40
41
42 // register information defined by ADLC
43 extern const char register_save_policy[];
44 extern const int register_save_type[];
45
46 const char* C2Compiler::retry_no_subsuming_loads() {
47 return "retry without subsuming loads";
48 }
49 const char* C2Compiler::retry_no_escape_analysis() {
50 return "retry without escape analysis";
51 }
52 const char* C2Compiler::retry_no_locks_coarsening() {
53 return "retry without locks coarsening";
54 }
55 const char* C2Compiler::retry_no_iterative_escape_analysis() {
56 return "retry without iterative escape analysis";
57 }
58 const char* C2Compiler::retry_no_reduce_allocation_merges() {
59 return "retry without reducing allocation merges";
60 }
61 const char* C2Compiler::retry_no_superword() {
62 return "retry without SuperWord";
63 }
64
65 void compiler_stubs_init(bool in_compiler_thread);
66
67 bool C2Compiler::init_c2_runtime() {
68
69 #ifdef ASSERT
70 if (!AlignVector && VerifyAlignVector) {
71 warning("VerifyAlignVector disabled because AlignVector is not enabled.");
72 FLAG_SET_CMDLINE(VerifyAlignVector, false);
73 }
74 #endif
75
76 // Check assumptions used while running ADLC
77 Compile::adlc_verification();
78 assert(REG_COUNT <= ConcreteRegisterImpl::number_of_registers, "incompatible register counts");
79
80 for (int i = 0; i < ConcreteRegisterImpl::number_of_registers ; i++ ) {
81 OptoReg::vm2opto[i] = OptoReg::Bad;
82 }
83
84 for( OptoReg::Name i=OptoReg::Name(0); i<OptoReg::Name(REG_COUNT); i = OptoReg::add(i,1) ) {
85 VMReg r = OptoReg::as_VMReg(i);
86 if (r->is_valid()) {
87 OptoReg::vm2opto[r->value()] = i;
88 }
89 }
90
91 DEBUG_ONLY( Node::init_NodeProperty(); )
92
93 compiler_stubs_init(true /* in_compiler_thread */); // generate compiler's intrinsics stubs
94
95 // If there was an error generating the blob then UseCompiler will
96 // have been unset and we need to skip the remaining initialization
97 if (!UseCompiler) {
98 return false;
99 }
100
101 Compile::pd_compiler2_init();
102
103 CompilerThread* thread = CompilerThread::current();
104
105 HandleMark handle_mark(thread);
106 return OptoRuntime::generate(thread->env());
107 }
108
109 void C2Compiler::initialize() {
110 assert(!CompilerConfig::is_c1_or_interpreter_only_no_jvmci(), "C2 compiler is launched, it's not c1/interpreter only mode");
111 // The first compiler thread that gets here will initialize the
112 // small amount of global state (and runtime stubs) that C2 needs.
113
114 // There is a race possible once at startup and then we're fine
115
116 // Note that this is being called from a compiler thread not the
117 // main startup thread.
118 if (should_perform_init()) {
119 bool successful = C2Compiler::init_c2_runtime();
120 int new_state = (successful) ? initialized : failed;
121 set_state(new_state);
122 }
123 }
124
125 void C2Compiler::compile_method(ciEnv* env, ciMethod* target, int entry_bci, bool install_code, DirectiveSet* directive) {
126 assert(is_initialized(), "Compiler thread must be initialized");
127
128 CompilationMemoryStatisticMark cmsm(directive);
129
130 bool subsume_loads = SubsumeLoads;
131 bool do_escape_analysis = DoEscapeAnalysis;
132 bool do_iterative_escape_analysis = DoEscapeAnalysis;
133 bool do_reduce_allocation_merges = ReduceAllocationMerges && EliminateAllocations;
134 // TODO 8328675 Re-enable
135 bool eliminate_boxing = EliminateAutoBox && !Arguments::is_valhalla_enabled();
136 bool do_locks_coarsening = EliminateLocks;
137 bool do_superword = UseSuperWord;
138
139 while (!env->failing()) {
140 ResourceMark rm;
141 // Attempt to compile while subsuming loads into machine instructions.
142 Options options(subsume_loads,
143 do_escape_analysis,
144 do_iterative_escape_analysis,
145 do_reduce_allocation_merges,
146 eliminate_boxing,
147 do_locks_coarsening,
148 do_superword,
149 install_code);
150 Compile C(env, target, entry_bci, options, directive);
151
152 // Check result and retry if appropriate.
153 if (C.failure_reason() != nullptr) {
154 if (C.failure_reason_is(retry_no_subsuming_loads())) {
155 assert(subsume_loads, "must make progress");
156 subsume_loads = false;
157 env->report_failure(C.failure_reason());
158 continue; // retry
159 }
160 if (C.failure_reason_is(retry_no_escape_analysis())) {
161 assert(do_escape_analysis, "must make progress");
162 do_escape_analysis = false;
163 env->report_failure(C.failure_reason());
164 continue; // retry
165 }
166 if (C.failure_reason_is(retry_no_iterative_escape_analysis())) {
167 assert(do_iterative_escape_analysis, "must make progress");
168 do_iterative_escape_analysis = false;
169 env->report_failure(C.failure_reason());
170 continue; // retry
171 }
172 if (C.failure_reason_is(retry_no_reduce_allocation_merges())) {
173 assert(do_reduce_allocation_merges, "must make progress");
174 do_reduce_allocation_merges = false;
175 env->report_failure(C.failure_reason());
176 continue; // retry
177 }
178 if (C.failure_reason_is(retry_no_locks_coarsening())) {
179 assert(do_locks_coarsening, "must make progress");
180 do_locks_coarsening = false;
181 env->report_failure(C.failure_reason());
182 continue; // retry
183 }
184 if (C.failure_reason_is(retry_no_superword())) {
185 assert(do_superword, "must make progress");
186 do_superword = false;
187 env->report_failure(C.failure_reason());
188 continue; // retry
189 }
190 if (C.has_boxed_value()) {
191 // Recompile without boxing elimination regardless failure reason.
192 assert(eliminate_boxing, "must make progress");
193 eliminate_boxing = false;
194 env->report_failure(C.failure_reason());
195 continue; // retry
196 }
197 // Pass any other failure reason up to the ciEnv.
198 // Note that serious, irreversible failures are already logged
199 // on the ciEnv via env->record_method_not_compilable().
200 env->record_failure(C.failure_reason());
201 }
202 if (StressRecompilation) {
203 if (subsume_loads) {
204 subsume_loads = false;
205 continue; // retry
206 }
207 if (do_escape_analysis) {
208 do_escape_analysis = false;
209 continue; // retry
210 }
211 if (do_locks_coarsening) {
212 do_locks_coarsening = false;
213 continue; // retry
214 }
215 }
216 // print inlining for last compilation only
217 C.dump_print_inlining();
218
219 // No retry; just break the loop.
220 break;
221 }
222 }
223
224 void C2Compiler::print_timers() {
225 Compile::print_timers();
226 }
227
228 bool C2Compiler::is_intrinsic_supported(const methodHandle& method) {
229 vmIntrinsics::ID id = method->intrinsic_id();
230 return C2Compiler::is_intrinsic_supported(id);
231 }
232
233 bool C2Compiler::is_intrinsic_supported(vmIntrinsics::ID id) {
234 assert(id != vmIntrinsics::_none, "must be a VM intrinsic");
235
236 if (id < vmIntrinsics::FIRST_ID || id > vmIntrinsics::LAST_COMPILER_INLINE) {
237 return false;
238 }
239
240 switch (id) {
241 case vmIntrinsics::_compressStringC:
242 case vmIntrinsics::_compressStringB:
243 if (!Matcher::match_rule_supported(Op_StrCompressedCopy)) return false;
244 break;
245 case vmIntrinsics::_inflateStringC:
246 case vmIntrinsics::_inflateStringB:
247 if (!Matcher::match_rule_supported(Op_StrInflatedCopy)) return false;
248 break;
249 case vmIntrinsics::_compareToL:
250 case vmIntrinsics::_compareToU:
251 case vmIntrinsics::_compareToLU:
252 case vmIntrinsics::_compareToUL:
253 if (!Matcher::match_rule_supported(Op_StrComp)) return false;
254 break;
255 case vmIntrinsics::_equalsL:
256 if (!Matcher::match_rule_supported(Op_StrEquals)) return false;
257 break;
258 case vmIntrinsics::_vectorizedHashCode:
259 if (!Matcher::match_rule_supported(Op_VectorizedHashCode)) return false;
260 break;
261 case vmIntrinsics::_equalsB:
262 case vmIntrinsics::_equalsC:
263 if (!Matcher::match_rule_supported(Op_AryEq)) return false;
264 break;
265 case vmIntrinsics::_copyMemory:
266 if (StubRoutines::unsafe_arraycopy() == nullptr) return false;
267 break;
268 case vmIntrinsics::_setMemory:
269 if (StubRoutines::unsafe_setmemory() == nullptr) return false;
270 break;
271 case vmIntrinsics::_electronicCodeBook_encryptAESCrypt:
272 if (StubRoutines::electronicCodeBook_encryptAESCrypt() == nullptr) return false;
273 break;
274 case vmIntrinsics::_electronicCodeBook_decryptAESCrypt:
275 if (StubRoutines::electronicCodeBook_decryptAESCrypt() == nullptr) return false;
276 break;
277 case vmIntrinsics::_galoisCounterMode_AESCrypt:
278 if (StubRoutines::galoisCounterMode_AESCrypt() == nullptr) return false;
279 break;
280 case vmIntrinsics::_bigIntegerRightShiftWorker:
281 if (StubRoutines::bigIntegerRightShift() == nullptr) return false;
282 break;
283 case vmIntrinsics::_bigIntegerLeftShiftWorker:
284 if (StubRoutines::bigIntegerLeftShift() == nullptr) return false;
285 break;
286 case vmIntrinsics::_encodeAsciiArray:
287 if (!Matcher::match_rule_supported(Op_EncodeISOArray) || !Matcher::supports_encode_ascii_array) return false;
288 break;
289 case vmIntrinsics::_encodeISOArray:
290 case vmIntrinsics::_encodeByteISOArray:
291 if (!Matcher::match_rule_supported(Op_EncodeISOArray)) return false;
292 break;
293 case vmIntrinsics::_countPositives:
294 if (!Matcher::match_rule_supported(Op_CountPositives)) return false;
295 break;
296 case vmIntrinsics::_bitCount_i:
297 if (!Matcher::match_rule_supported(Op_PopCountI)) return false;
298 break;
299 case vmIntrinsics::_bitCount_l:
300 if (!Matcher::match_rule_supported(Op_PopCountL)) return false;
301 break;
302 case vmIntrinsics::_compress_i:
303 case vmIntrinsics::_compress_l:
304 if (!Matcher::match_rule_supported(Op_CompressBits)) return false;
305 break;
306 case vmIntrinsics::_expand_i:
307 case vmIntrinsics::_expand_l:
308 if (!Matcher::match_rule_supported(Op_ExpandBits)) return false;
309 break;
310 case vmIntrinsics::_numberOfLeadingZeros_i:
311 if (!Matcher::match_rule_supported(Op_CountLeadingZerosI)) return false;
312 break;
313 case vmIntrinsics::_numberOfLeadingZeros_l:
314 if (!Matcher::match_rule_supported(Op_CountLeadingZerosL)) return false;
315 break;
316 case vmIntrinsics::_numberOfTrailingZeros_i:
317 if (!Matcher::match_rule_supported(Op_CountTrailingZerosI)) return false;
318 break;
319 case vmIntrinsics::_numberOfTrailingZeros_l:
320 if (!Matcher::match_rule_supported(Op_CountTrailingZerosL)) return false;
321 break;
322 case vmIntrinsics::_reverse_i:
323 if (!Matcher::match_rule_supported(Op_ReverseI)) return false;
324 break;
325 case vmIntrinsics::_reverse_l:
326 if (!Matcher::match_rule_supported(Op_ReverseL)) return false;
327 break;
328 case vmIntrinsics::_reverseBytes_c:
329 if (!Matcher::match_rule_supported(Op_ReverseBytesUS)) return false;
330 break;
331 case vmIntrinsics::_reverseBytes_s:
332 if (!Matcher::match_rule_supported(Op_ReverseBytesS)) return false;
333 break;
334 case vmIntrinsics::_reverseBytes_i:
335 if (!Matcher::match_rule_supported(Op_ReverseBytesI)) return false;
336 break;
337 case vmIntrinsics::_reverseBytes_l:
338 if (!Matcher::match_rule_supported(Op_ReverseBytesL)) return false;
339 break;
340 case vmIntrinsics::_compareUnsigned_i:
341 if (!Matcher::match_rule_supported(Op_CmpU3)) return false;
342 break;
343 case vmIntrinsics::_compareUnsigned_l:
344 if (!Matcher::match_rule_supported(Op_CmpUL3)) return false;
345 break;
346 case vmIntrinsics::_divideUnsigned_i:
347 if (!Matcher::match_rule_supported(Op_UDivI)) return false;
348 break;
349 case vmIntrinsics::_remainderUnsigned_i:
350 if (!Matcher::match_rule_supported(Op_UModI)) return false;
351 break;
352 case vmIntrinsics::_divideUnsigned_l:
353 if (!Matcher::match_rule_supported(Op_UDivL)) return false;
354 break;
355 case vmIntrinsics::_remainderUnsigned_l:
356 if (!Matcher::match_rule_supported(Op_UModL)) return false;
357 break;
358 case vmIntrinsics::_float16ToFloat:
359 if (!Matcher::match_rule_supported(Op_ConvHF2F)) return false;
360 break;
361 case vmIntrinsics::_floatToFloat16:
362 if (!Matcher::match_rule_supported(Op_ConvF2HF)) return false;
363 break;
364 case vmIntrinsics::_sqrt_float16:
365 if (!Matcher::match_rule_supported(Op_SqrtHF)) return false;
366 break;
367 case vmIntrinsics::_fma_float16:
368 if (!Matcher::match_rule_supported(Op_FmaHF)) return false;
369 break;
370
371 /* CompareAndSet, Object: */
372 case vmIntrinsics::_compareAndSetReference:
373 #ifdef _LP64
374 if ( UseCompressedOops && !Matcher::match_rule_supported(Op_CompareAndSwapN)) return false;
375 if (!UseCompressedOops && !Matcher::match_rule_supported(Op_CompareAndSwapP)) return false;
376 #else
377 if (!Matcher::match_rule_supported(Op_CompareAndSwapP)) return false;
378 #endif
379 break;
380 case vmIntrinsics::_weakCompareAndSetReferencePlain:
381 case vmIntrinsics::_weakCompareAndSetReferenceAcquire:
382 case vmIntrinsics::_weakCompareAndSetReferenceRelease:
383 case vmIntrinsics::_weakCompareAndSetReference:
384 #ifdef _LP64
385 if ( UseCompressedOops && !Matcher::match_rule_supported(Op_WeakCompareAndSwapN)) return false;
386 if (!UseCompressedOops && !Matcher::match_rule_supported(Op_WeakCompareAndSwapP)) return false;
387 #else
388 if (!Matcher::match_rule_supported(Op_WeakCompareAndSwapP)) return false;
389 #endif
390 break;
391 /* CompareAndSet, Long: */
392 case vmIntrinsics::_compareAndSetLong:
393 if (!Matcher::match_rule_supported(Op_CompareAndSwapL)) return false;
394 break;
395 case vmIntrinsics::_weakCompareAndSetLongPlain:
396 case vmIntrinsics::_weakCompareAndSetLongAcquire:
397 case vmIntrinsics::_weakCompareAndSetLongRelease:
398 case vmIntrinsics::_weakCompareAndSetLong:
399 if (!Matcher::match_rule_supported(Op_WeakCompareAndSwapL)) return false;
400 break;
401
402 /* CompareAndSet, Int: */
403 case vmIntrinsics::_compareAndSetInt:
404 if (!Matcher::match_rule_supported(Op_CompareAndSwapI)) return false;
405 break;
406 case vmIntrinsics::_weakCompareAndSetIntPlain:
407 case vmIntrinsics::_weakCompareAndSetIntAcquire:
408 case vmIntrinsics::_weakCompareAndSetIntRelease:
409 case vmIntrinsics::_weakCompareAndSetInt:
410 if (!Matcher::match_rule_supported(Op_WeakCompareAndSwapI)) return false;
411 break;
412
413 /* CompareAndSet, Byte: */
414 case vmIntrinsics::_compareAndSetByte:
415 if (!Matcher::match_rule_supported(Op_CompareAndSwapB)) return false;
416 break;
417 case vmIntrinsics::_weakCompareAndSetBytePlain:
418 case vmIntrinsics::_weakCompareAndSetByteAcquire:
419 case vmIntrinsics::_weakCompareAndSetByteRelease:
420 case vmIntrinsics::_weakCompareAndSetByte:
421 if (!Matcher::match_rule_supported(Op_WeakCompareAndSwapB)) return false;
422 break;
423
424 /* CompareAndSet, Short: */
425 case vmIntrinsics::_compareAndSetShort:
426 if (!Matcher::match_rule_supported(Op_CompareAndSwapS)) return false;
427 break;
428 case vmIntrinsics::_weakCompareAndSetShortPlain:
429 case vmIntrinsics::_weakCompareAndSetShortAcquire:
430 case vmIntrinsics::_weakCompareAndSetShortRelease:
431 case vmIntrinsics::_weakCompareAndSetShort:
432 if (!Matcher::match_rule_supported(Op_WeakCompareAndSwapS)) return false;
433 break;
434
435 /* CompareAndExchange, Object: */
436 case vmIntrinsics::_compareAndExchangeReference:
437 case vmIntrinsics::_compareAndExchangeReferenceAcquire:
438 case vmIntrinsics::_compareAndExchangeReferenceRelease:
439 #ifdef _LP64
440 if ( UseCompressedOops && !Matcher::match_rule_supported(Op_CompareAndExchangeN)) return false;
441 if (!UseCompressedOops && !Matcher::match_rule_supported(Op_CompareAndExchangeP)) return false;
442 #else
443 if (!Matcher::match_rule_supported(Op_CompareAndExchangeP)) return false;
444 #endif
445 break;
446
447 /* CompareAndExchange, Long: */
448 case vmIntrinsics::_compareAndExchangeLong:
449 case vmIntrinsics::_compareAndExchangeLongAcquire:
450 case vmIntrinsics::_compareAndExchangeLongRelease:
451 if (!Matcher::match_rule_supported(Op_CompareAndExchangeL)) return false;
452 break;
453
454 /* CompareAndExchange, Int: */
455 case vmIntrinsics::_compareAndExchangeInt:
456 case vmIntrinsics::_compareAndExchangeIntAcquire:
457 case vmIntrinsics::_compareAndExchangeIntRelease:
458 if (!Matcher::match_rule_supported(Op_CompareAndExchangeI)) return false;
459 break;
460
461 /* CompareAndExchange, Byte: */
462 case vmIntrinsics::_compareAndExchangeByte:
463 case vmIntrinsics::_compareAndExchangeByteAcquire:
464 case vmIntrinsics::_compareAndExchangeByteRelease:
465 if (!Matcher::match_rule_supported(Op_CompareAndExchangeB)) return false;
466 break;
467
468 /* CompareAndExchange, Short: */
469 case vmIntrinsics::_compareAndExchangeShort:
470 case vmIntrinsics::_compareAndExchangeShortAcquire:
471 case vmIntrinsics::_compareAndExchangeShortRelease:
472 if (!Matcher::match_rule_supported(Op_CompareAndExchangeS)) return false;
473 break;
474
475 case vmIntrinsics::_getAndAddByte:
476 if (!Matcher::match_rule_supported(Op_GetAndAddB)) return false;
477 break;
478 case vmIntrinsics::_getAndAddShort:
479 if (!Matcher::match_rule_supported(Op_GetAndAddS)) return false;
480 break;
481 case vmIntrinsics::_getAndAddInt:
482 if (!Matcher::match_rule_supported(Op_GetAndAddI)) return false;
483 break;
484 case vmIntrinsics::_getAndAddLong:
485 if (!Matcher::match_rule_supported(Op_GetAndAddL)) return false;
486 break;
487
488 case vmIntrinsics::_getAndSetByte:
489 if (!Matcher::match_rule_supported(Op_GetAndSetB)) return false;
490 break;
491 case vmIntrinsics::_getAndSetShort:
492 if (!Matcher::match_rule_supported(Op_GetAndSetS)) return false;
493 break;
494 case vmIntrinsics::_getAndSetInt:
495 if (!Matcher::match_rule_supported(Op_GetAndSetI)) return false;
496 break;
497 case vmIntrinsics::_getAndSetLong:
498 if (!Matcher::match_rule_supported(Op_GetAndSetL)) return false;
499 break;
500 case vmIntrinsics::_getAndSetReference:
501 #ifdef _LP64
502 if (!UseCompressedOops && !Matcher::match_rule_supported(Op_GetAndSetP)) return false;
503 if (UseCompressedOops && !Matcher::match_rule_supported(Op_GetAndSetN)) return false;
504 break;
505 #else
506 if (!Matcher::match_rule_supported(Op_GetAndSetP)) return false;
507 break;
508 #endif
509 case vmIntrinsics::_incrementExactI:
510 case vmIntrinsics::_addExactI:
511 if (!Matcher::match_rule_supported(Op_OverflowAddI)) return false;
512 break;
513 case vmIntrinsics::_incrementExactL:
514 case vmIntrinsics::_addExactL:
515 if (!Matcher::match_rule_supported(Op_OverflowAddL)) return false;
516 break;
517 case vmIntrinsics::_decrementExactI:
518 case vmIntrinsics::_subtractExactI:
519 if (!Matcher::match_rule_supported(Op_OverflowSubI)) return false;
520 break;
521 case vmIntrinsics::_decrementExactL:
522 case vmIntrinsics::_subtractExactL:
523 if (!Matcher::match_rule_supported(Op_OverflowSubL)) return false;
524 break;
525 case vmIntrinsics::_negateExactI:
526 if (!Matcher::match_rule_supported(Op_OverflowSubI)) return false;
527 break;
528 case vmIntrinsics::_negateExactL:
529 if (!Matcher::match_rule_supported(Op_OverflowSubL)) return false;
530 break;
531 case vmIntrinsics::_multiplyExactI:
532 if (!Matcher::match_rule_supported(Op_OverflowMulI)) return false;
533 break;
534 case vmIntrinsics::_multiplyExactL:
535 if (!Matcher::match_rule_supported(Op_OverflowMulL)) return false;
536 break;
537 case vmIntrinsics::_multiplyHigh:
538 if (!Matcher::match_rule_supported(Op_MulHiL)) return false;
539 break;
540 case vmIntrinsics::_unsignedMultiplyHigh:
541 if (!Matcher::match_rule_supported(Op_UMulHiL)) return false;
542 break;
543 case vmIntrinsics::_getCallerClass:
544 if (vmClasses::reflect_CallerSensitive_klass() == nullptr) return false;
545 break;
546 case vmIntrinsics::_onSpinWait:
547 if (!Matcher::match_rule_supported(Op_OnSpinWait)) return false;
548 break;
549 case vmIntrinsics::_fmaD:
550 if (!Matcher::match_rule_supported(Op_FmaD)) return false;
551 break;
552 case vmIntrinsics::_fmaF:
553 if (!Matcher::match_rule_supported(Op_FmaF)) return false;
554 break;
555 case vmIntrinsics::_isDigit:
556 if (!Matcher::match_rule_supported(Op_Digit)) return false;
557 break;
558 case vmIntrinsics::_isLowerCase:
559 if (!Matcher::match_rule_supported(Op_LowerCase)) return false;
560 break;
561 case vmIntrinsics::_isUpperCase:
562 if (!Matcher::match_rule_supported(Op_UpperCase)) return false;
563 break;
564 case vmIntrinsics::_isWhitespace:
565 if (!Matcher::match_rule_supported(Op_Whitespace)) return false;
566 break;
567 case vmIntrinsics::_maxF:
568 case vmIntrinsics::_maxF_strict:
569 if (!Matcher::match_rule_supported(Op_MaxF)) return false;
570 break;
571 case vmIntrinsics::_minF:
572 case vmIntrinsics::_minF_strict:
573 if (!Matcher::match_rule_supported(Op_MinF)) return false;
574 break;
575 case vmIntrinsics::_maxD:
576 case vmIntrinsics::_maxD_strict:
577 if (!Matcher::match_rule_supported(Op_MaxD)) return false;
578 break;
579 case vmIntrinsics::_minD:
580 case vmIntrinsics::_minD_strict:
581 if (!Matcher::match_rule_supported(Op_MinD)) return false;
582 break;
583 case vmIntrinsics::_writeback0:
584 if (!Matcher::match_rule_supported(Op_CacheWB)) return false;
585 break;
586 case vmIntrinsics::_writebackPreSync0:
587 if (!Matcher::match_rule_supported(Op_CacheWBPreSync)) return false;
588 break;
589 case vmIntrinsics::_writebackPostSync0:
590 if (!Matcher::match_rule_supported(Op_CacheWBPostSync)) return false;
591 break;
592 case vmIntrinsics::_rint:
593 case vmIntrinsics::_ceil:
594 case vmIntrinsics::_floor:
595 if (!Matcher::match_rule_supported(Op_RoundDoubleMode)) return false;
596 break;
597 case vmIntrinsics::_dcopySign:
598 if (!Matcher::match_rule_supported(Op_CopySignD)) return false;
599 break;
600 case vmIntrinsics::_fcopySign:
601 if (!Matcher::match_rule_supported(Op_CopySignF)) return false;
602 break;
603 case vmIntrinsics::_dsignum:
604 if (!Matcher::match_rule_supported(Op_SignumD)) return false;
605 break;
606 case vmIntrinsics::_fsignum:
607 if (!Matcher::match_rule_supported(Op_SignumF)) return false;
608 break;
609 case vmIntrinsics::_floatIsInfinite:
610 if (!Matcher::match_rule_supported(Op_IsInfiniteF)) return false;
611 break;
612 case vmIntrinsics::_floatIsFinite:
613 if (!Matcher::match_rule_supported(Op_IsFiniteF)) return false;
614 break;
615 case vmIntrinsics::_doubleIsInfinite:
616 if (!Matcher::match_rule_supported(Op_IsInfiniteD)) return false;
617 break;
618 case vmIntrinsics::_doubleIsFinite:
619 if (!Matcher::match_rule_supported(Op_IsFiniteD)) return false;
620 break;
621 case vmIntrinsics::_hashCode:
622 case vmIntrinsics::_identityHashCode:
623 case vmIntrinsics::_getClass:
624 case vmIntrinsics::_dsin:
625 case vmIntrinsics::_dcos:
626 case vmIntrinsics::_dtan:
627 case vmIntrinsics::_dsinh:
628 case vmIntrinsics::_dtanh:
629 case vmIntrinsics::_dcbrt:
630 case vmIntrinsics::_dabs:
631 case vmIntrinsics::_fabs:
632 case vmIntrinsics::_iabs:
633 case vmIntrinsics::_labs:
634 case vmIntrinsics::_datan2:
635 case vmIntrinsics::_dsqrt:
636 case vmIntrinsics::_dsqrt_strict:
637 case vmIntrinsics::_dexp:
638 case vmIntrinsics::_dlog:
639 case vmIntrinsics::_dlog10:
640 case vmIntrinsics::_dpow:
641 case vmIntrinsics::_roundD:
642 case vmIntrinsics::_roundF:
643 case vmIntrinsics::_min:
644 case vmIntrinsics::_max:
645 case vmIntrinsics::_min_strict:
646 case vmIntrinsics::_max_strict:
647 case vmIntrinsics::_maxL:
648 case vmIntrinsics::_minL:
649 case vmIntrinsics::_arraycopy:
650 case vmIntrinsics::_arraySort:
651 case vmIntrinsics::_arrayPartition:
652 case vmIntrinsics::_indexOfL:
653 case vmIntrinsics::_indexOfU:
654 case vmIntrinsics::_indexOfUL:
655 case vmIntrinsics::_indexOfIL:
656 case vmIntrinsics::_indexOfIU:
657 case vmIntrinsics::_indexOfIUL:
658 case vmIntrinsics::_indexOfU_char:
659 case vmIntrinsics::_indexOfL_char:
660 case vmIntrinsics::_toBytesStringU:
661 case vmIntrinsics::_getCharsStringU:
662 case vmIntrinsics::_getCharStringU:
663 case vmIntrinsics::_putCharStringU:
664 case vmIntrinsics::_getReference:
665 case vmIntrinsics::_getBoolean:
666 case vmIntrinsics::_getByte:
667 case vmIntrinsics::_getShort:
668 case vmIntrinsics::_getChar:
669 case vmIntrinsics::_getInt:
670 case vmIntrinsics::_getLong:
671 case vmIntrinsics::_getFloat:
672 case vmIntrinsics::_getDouble:
673 case vmIntrinsics::_getFlatValue:
674 case vmIntrinsics::_putReference:
675 case vmIntrinsics::_putBoolean:
676 case vmIntrinsics::_putByte:
677 case vmIntrinsics::_putShort:
678 case vmIntrinsics::_putChar:
679 case vmIntrinsics::_putInt:
680 case vmIntrinsics::_putLong:
681 case vmIntrinsics::_putFloat:
682 case vmIntrinsics::_putDouble:
683 case vmIntrinsics::_putFlatValue:
684 case vmIntrinsics::_getReferenceVolatile:
685 case vmIntrinsics::_getBooleanVolatile:
686 case vmIntrinsics::_getByteVolatile:
687 case vmIntrinsics::_getShortVolatile:
688 case vmIntrinsics::_getCharVolatile:
689 case vmIntrinsics::_getIntVolatile:
690 case vmIntrinsics::_getLongVolatile:
691 case vmIntrinsics::_getFloatVolatile:
692 case vmIntrinsics::_getDoubleVolatile:
693 case vmIntrinsics::_putReferenceVolatile:
694 case vmIntrinsics::_putBooleanVolatile:
695 case vmIntrinsics::_putByteVolatile:
696 case vmIntrinsics::_putShortVolatile:
697 case vmIntrinsics::_putCharVolatile:
698 case vmIntrinsics::_putIntVolatile:
699 case vmIntrinsics::_putLongVolatile:
700 case vmIntrinsics::_putFloatVolatile:
701 case vmIntrinsics::_putDoubleVolatile:
702 case vmIntrinsics::_getReferenceAcquire:
703 case vmIntrinsics::_getBooleanAcquire:
704 case vmIntrinsics::_getByteAcquire:
705 case vmIntrinsics::_getShortAcquire:
706 case vmIntrinsics::_getCharAcquire:
707 case vmIntrinsics::_getIntAcquire:
708 case vmIntrinsics::_getLongAcquire:
709 case vmIntrinsics::_getFloatAcquire:
710 case vmIntrinsics::_getDoubleAcquire:
711 case vmIntrinsics::_putReferenceRelease:
712 case vmIntrinsics::_putBooleanRelease:
713 case vmIntrinsics::_putByteRelease:
714 case vmIntrinsics::_putShortRelease:
715 case vmIntrinsics::_putCharRelease:
716 case vmIntrinsics::_putIntRelease:
717 case vmIntrinsics::_putLongRelease:
718 case vmIntrinsics::_putFloatRelease:
719 case vmIntrinsics::_putDoubleRelease:
720 case vmIntrinsics::_getReferenceOpaque:
721 case vmIntrinsics::_getBooleanOpaque:
722 case vmIntrinsics::_getByteOpaque:
723 case vmIntrinsics::_getShortOpaque:
724 case vmIntrinsics::_getCharOpaque:
725 case vmIntrinsics::_getIntOpaque:
726 case vmIntrinsics::_getLongOpaque:
727 case vmIntrinsics::_getFloatOpaque:
728 case vmIntrinsics::_getDoubleOpaque:
729 case vmIntrinsics::_putReferenceOpaque:
730 case vmIntrinsics::_putBooleanOpaque:
731 case vmIntrinsics::_putByteOpaque:
732 case vmIntrinsics::_putShortOpaque:
733 case vmIntrinsics::_putCharOpaque:
734 case vmIntrinsics::_putIntOpaque:
735 case vmIntrinsics::_putLongOpaque:
736 case vmIntrinsics::_putFloatOpaque:
737 case vmIntrinsics::_putDoubleOpaque:
738 case vmIntrinsics::_getShortUnaligned:
739 case vmIntrinsics::_getCharUnaligned:
740 case vmIntrinsics::_getIntUnaligned:
741 case vmIntrinsics::_getLongUnaligned:
742 case vmIntrinsics::_putShortUnaligned:
743 case vmIntrinsics::_putCharUnaligned:
744 case vmIntrinsics::_putIntUnaligned:
745 case vmIntrinsics::_putLongUnaligned:
746 case vmIntrinsics::_loadFence:
747 case vmIntrinsics::_storeFence:
748 case vmIntrinsics::_storeStoreFence:
749 case vmIntrinsics::_fullFence:
750 case vmIntrinsics::_arrayInstanceBaseOffset:
751 case vmIntrinsics::_arrayInstanceIndexScale:
752 case vmIntrinsics::_arrayLayout:
753 case vmIntrinsics::_getFieldMap:
754 case vmIntrinsics::_currentCarrierThread:
755 case vmIntrinsics::_currentThread:
756 case vmIntrinsics::_setCurrentThread:
757 case vmIntrinsics::_scopedValueCache:
758 case vmIntrinsics::_setScopedValueCache:
759 case vmIntrinsics::_Continuation_pin:
760 case vmIntrinsics::_Continuation_unpin:
761 #ifdef JFR_HAVE_INTRINSICS
762 case vmIntrinsics::_counterTime:
763 case vmIntrinsics::_getEventWriter:
764 case vmIntrinsics::_jvm_commit:
765 #endif
766 case vmIntrinsics::_currentTimeMillis:
767 case vmIntrinsics::_nanoTime:
768 case vmIntrinsics::_allocateInstance:
769 case vmIntrinsics::_allocateUninitializedArray:
770 case vmIntrinsics::_newArray:
771 case vmIntrinsics::_newNullRestrictedNonAtomicArray:
772 case vmIntrinsics::_newNullRestrictedAtomicArray:
773 case vmIntrinsics::_newNullableAtomicArray:
774 case vmIntrinsics::_isFlatArray:
775 case vmIntrinsics::_isNullRestrictedArray:
776 case vmIntrinsics::_isAtomicArray:
777 case vmIntrinsics::_getLength:
778 case vmIntrinsics::_copyOf:
779 case vmIntrinsics::_copyOfRange:
780 case vmIntrinsics::_clone:
781 case vmIntrinsics::_isAssignableFrom:
782 case vmIntrinsics::_isInstance:
783 case vmIntrinsics::_isHidden:
784 case vmIntrinsics::_getSuperclass:
785 case vmIntrinsics::_floatToRawIntBits:
786 case vmIntrinsics::_floatToIntBits:
787 case vmIntrinsics::_intBitsToFloat:
788 case vmIntrinsics::_doubleToRawLongBits:
789 case vmIntrinsics::_doubleToLongBits:
790 case vmIntrinsics::_longBitsToDouble:
791 case vmIntrinsics::_Reference_get0:
792 case vmIntrinsics::_Reference_refersTo0:
793 case vmIntrinsics::_PhantomReference_refersTo0:
794 case vmIntrinsics::_Reference_clear0:
795 case vmIntrinsics::_PhantomReference_clear0:
796 case vmIntrinsics::_Class_cast:
797 case vmIntrinsics::_aescrypt_encryptBlock:
798 case vmIntrinsics::_aescrypt_decryptBlock:
799 case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt:
800 case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt:
801 case vmIntrinsics::_counterMode_AESCrypt:
802 case vmIntrinsics::_md5_implCompress:
803 case vmIntrinsics::_sha_implCompress:
804 case vmIntrinsics::_sha2_implCompress:
805 case vmIntrinsics::_sha5_implCompress:
806 case vmIntrinsics::_sha3_implCompress:
807 case vmIntrinsics::_double_keccak:
808 case vmIntrinsics::_digestBase_implCompressMB:
809 case vmIntrinsics::_multiplyToLen:
810 case vmIntrinsics::_squareToLen:
811 case vmIntrinsics::_mulAdd:
812 case vmIntrinsics::_montgomeryMultiply:
813 case vmIntrinsics::_montgomerySquare:
814 case vmIntrinsics::_vectorizedMismatch:
815 case vmIntrinsics::_ghash_processBlocks:
816 case vmIntrinsics::_chacha20Block:
817 case vmIntrinsics::_kyberNtt:
818 case vmIntrinsics::_kyberInverseNtt:
819 case vmIntrinsics::_kyberNttMult:
820 case vmIntrinsics::_kyberAddPoly_2:
821 case vmIntrinsics::_kyberAddPoly_3:
822 case vmIntrinsics::_kyber12To16:
823 case vmIntrinsics::_kyberBarrettReduce:
824 case vmIntrinsics::_dilithiumAlmostNtt:
825 case vmIntrinsics::_dilithiumAlmostInverseNtt:
826 case vmIntrinsics::_dilithiumNttMult:
827 case vmIntrinsics::_dilithiumMontMulByConstant:
828 case vmIntrinsics::_dilithiumDecomposePoly:
829 case vmIntrinsics::_base64_encodeBlock:
830 case vmIntrinsics::_base64_decodeBlock:
831 case vmIntrinsics::_poly1305_processBlocks:
832 case vmIntrinsics::_intpoly_montgomeryMult_P256:
833 case vmIntrinsics::_intpoly_assign:
834 case vmIntrinsics::_updateCRC32:
835 case vmIntrinsics::_updateBytesCRC32:
836 case vmIntrinsics::_updateByteBufferCRC32:
837 case vmIntrinsics::_updateBytesCRC32C:
838 case vmIntrinsics::_updateDirectByteBufferCRC32C:
839 case vmIntrinsics::_updateBytesAdler32:
840 case vmIntrinsics::_updateByteBufferAdler32:
841 case vmIntrinsics::_profileBoolean:
842 case vmIntrinsics::_isCompileConstant:
843 case vmIntrinsics::_Preconditions_checkIndex:
844 case vmIntrinsics::_Preconditions_checkLongIndex:
845 case vmIntrinsics::_getObjectSize:
846 break;
847 case vmIntrinsics::_VectorCompressExpand:
848 case vmIntrinsics::_VectorUnaryOp:
849 case vmIntrinsics::_VectorBinaryOp:
850 case vmIntrinsics::_VectorTernaryOp:
851 case vmIntrinsics::_VectorFromBitsCoerced:
852 case vmIntrinsics::_VectorLoadOp:
853 case vmIntrinsics::_VectorLoadMaskedOp:
854 case vmIntrinsics::_VectorStoreOp:
855 case vmIntrinsics::_VectorStoreMaskedOp:
856 case vmIntrinsics::_VectorSelectFromTwoVectorOp:
857 case vmIntrinsics::_VectorGatherOp:
858 case vmIntrinsics::_VectorScatterOp:
859 case vmIntrinsics::_VectorReductionCoerced:
860 case vmIntrinsics::_VectorTest:
861 case vmIntrinsics::_VectorBlend:
862 case vmIntrinsics::_VectorRearrange:
863 case vmIntrinsics::_VectorSelectFrom:
864 case vmIntrinsics::_VectorCompare:
865 case vmIntrinsics::_VectorBroadcastInt:
866 case vmIntrinsics::_VectorConvert:
867 case vmIntrinsics::_VectorInsert:
868 case vmIntrinsics::_VectorExtract:
869 case vmIntrinsics::_VectorMaskOp:
870 case vmIntrinsics::_IndexVector:
871 case vmIntrinsics::_IndexPartiallyInUpperRange:
872 return EnableVectorSupport;
873 case vmIntrinsics::_VectorUnaryLibOp:
874 case vmIntrinsics::_VectorBinaryLibOp:
875 return EnableVectorSupport && Matcher::supports_vector_calling_convention();
876 case vmIntrinsics::_blackhole:
877 case vmIntrinsics::_vthreadEndFirstTransition:
878 case vmIntrinsics::_vthreadStartFinalTransition:
879 case vmIntrinsics::_vthreadStartTransition:
880 case vmIntrinsics::_vthreadEndTransition:
881 #if INCLUDE_JVMTI
882 case vmIntrinsics::_notifyJvmtiVThreadDisableSuspend:
883 #endif
884 break;
885
886 default:
887 return false;
888 }
889 return true;
890 }
891
892 int C2Compiler::initial_code_buffer_size(int const_size) {
893 // See Compile::init_scratch_buffer_blob
894 int locs_size = sizeof(relocInfo) * PhaseOutput::MAX_locs_size;
895 int slop = 2 * CodeSection::end_slop(); // space between sections
896 return PhaseOutput::MAX_inst_size + PhaseOutput::MAX_stubs_size + const_size + slop + locs_size;
897 }