310
311 //---------------------------make_vm_intrinsic----------------------------
312 CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) {
313 vmIntrinsics::ID id = m->intrinsic_id();
314 assert(id != vmIntrinsics::_none, "must be a VM intrinsic");
315
316 if (!m->is_loaded()) {
317 // Do not attempt to inline unloaded methods.
318 return NULL;
319 }
320
321 C2Compiler* compiler = (C2Compiler*)CompileBroker::compiler(CompLevel_full_optimization);
322 bool is_available = false;
323
324 {
325 // For calling is_intrinsic_supported and is_intrinsic_disabled_by_flag
326 // the compiler must transition to '_thread_in_vm' state because both
327 // methods access VM-internal data.
328 VM_ENTRY_MARK;
329 methodHandle mh(THREAD, m->get_Method());
330 methodHandle ct(THREAD, method()->get_Method());
331 is_available = compiler->is_intrinsic_supported(mh, is_virtual) &&
332 !vmIntrinsics::is_disabled_by_flags(mh, ct);
333 }
334
335 if (is_available) {
336 assert(id <= vmIntrinsics::LAST_COMPILER_INLINE, "caller responsibility");
337 assert(id != vmIntrinsics::_Object_init && id != vmIntrinsics::_invoke, "enum out of order?");
338 return new LibraryIntrinsic(m, is_virtual,
339 vmIntrinsics::predicates_needed(id),
340 vmIntrinsics::does_virtual_dispatch(id),
341 (vmIntrinsics::ID) id);
342 } else {
343 return NULL;
344 }
345 }
346
347 //----------------------register_library_intrinsics-----------------------
348 // Initialize this file's data structures, for each Compile instance.
349 void Compile::register_library_intrinsics() {
350 // Nothing to do here.
351 }
352
|
310
311 //---------------------------make_vm_intrinsic----------------------------
312 CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) {
313 vmIntrinsics::ID id = m->intrinsic_id();
314 assert(id != vmIntrinsics::_none, "must be a VM intrinsic");
315
316 if (!m->is_loaded()) {
317 // Do not attempt to inline unloaded methods.
318 return NULL;
319 }
320
321 C2Compiler* compiler = (C2Compiler*)CompileBroker::compiler(CompLevel_full_optimization);
322 bool is_available = false;
323
324 {
325 // For calling is_intrinsic_supported and is_intrinsic_disabled_by_flag
326 // the compiler must transition to '_thread_in_vm' state because both
327 // methods access VM-internal data.
328 VM_ENTRY_MARK;
329 methodHandle mh(THREAD, m->get_Method());
330 is_available = compiler->is_intrinsic_supported(mh, is_virtual) &&
331 C->env()->dirset()->is_intrinsic_disabled(mh) &&
332 !vmIntrinsics::is_disabled_by_flags(mh);
333
334 }
335
336 if (is_available) {
337 assert(id <= vmIntrinsics::LAST_COMPILER_INLINE, "caller responsibility");
338 assert(id != vmIntrinsics::_Object_init && id != vmIntrinsics::_invoke, "enum out of order?");
339 return new LibraryIntrinsic(m, is_virtual,
340 vmIntrinsics::predicates_needed(id),
341 vmIntrinsics::does_virtual_dispatch(id),
342 (vmIntrinsics::ID) id);
343 } else {
344 return NULL;
345 }
346 }
347
348 //----------------------register_library_intrinsics-----------------------
349 // Initialize this file's data structures, for each Compile instance.
350 void Compile::register_library_intrinsics() {
351 // Nothing to do here.
352 }
353
|