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