| 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 | 
|---|
| 37 | extern const char register_save_policy[]; | 
|---|
| 38 | extern const int  register_save_type[]; | 
|---|
| 39 |  | 
|---|
| 40 | const char* C2Compiler::retry_no_subsuming_loads() { | 
|---|
| 41 | return "retry without subsuming loads"; | 
|---|
| 42 | } | 
|---|
| 43 | const char* C2Compiler::retry_no_escape_analysis() { | 
|---|
| 44 | return "retry without escape analysis"; | 
|---|
| 45 | } | 
|---|
| 46 | const char* C2Compiler::retry_class_loading_during_parsing() { | 
|---|
| 47 | return "retry class loading during parsing"; | 
|---|
| 48 | } | 
|---|
| 49 | bool 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 |  | 
|---|
| 86 | void 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 |  | 
|---|
| 101 | void 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 |  | 
|---|
| 161 | void C2Compiler::print_timers() { | 
|---|
| 162 | Compile::print_timers(); | 
|---|
| 163 | } | 
|---|
| 164 |  | 
|---|
| 165 | bool 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 |  | 
|---|
| 635 | int 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 |  | 
|---|