400 return true;
401 break;
402 default:
403 return false;
404 }
405 }
406
407 int vmIntrinsics::predicates_needed(vmIntrinsics::ID id) {
408 assert(id != vmIntrinsics::_none, "must be a VM intrinsic");
409 switch (id) {
410 case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt:
411 case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt:
412 return 1;
413 case vmIntrinsics::_digestBase_implCompressMB:
414 return 3;
415 default:
416 return 0;
417 }
418 }
419
420 bool vmIntrinsics::is_disabled_by_flags(vmIntrinsics::ID id) {
421 assert(id != vmIntrinsics::_none, "must be a VM intrinsic");
422 switch (id) {
423 case vmIntrinsics::_isInstance:
424 case vmIntrinsics::_isAssignableFrom:
425 case vmIntrinsics::_getModifiers:
426 case vmIntrinsics::_isInterface:
427 case vmIntrinsics::_isArray:
428 case vmIntrinsics::_isPrimitive:
429 case vmIntrinsics::_getSuperclass:
430 case vmIntrinsics::_Class_cast:
431 case vmIntrinsics::_getLength:
432 case vmIntrinsics::_newArray:
433 if (!InlineClassNatives) return true;
434 break;
435 case vmIntrinsics::_currentThread:
436 case vmIntrinsics::_isInterrupted:
437 if (!InlineThreadNatives) return true;
438 break;
439 case vmIntrinsics::_floatToRawIntBits:
440 case vmIntrinsics::_intBitsToFloat:
441 case vmIntrinsics::_doubleToRawLongBits:
442 case vmIntrinsics::_longBitsToDouble:
443 case vmIntrinsics::_dabs:
444 case vmIntrinsics::_dsqrt:
445 case vmIntrinsics::_dsin:
446 case vmIntrinsics::_dcos:
447 case vmIntrinsics::_dtan:
448 case vmIntrinsics::_dlog:
449 case vmIntrinsics::_dexp:
450 case vmIntrinsics::_dpow:
451 case vmIntrinsics::_dlog10:
452 case vmIntrinsics::_datan2:
505 case vmIntrinsics::_getChar_raw:
506 case vmIntrinsics::_getInt_raw:
507 case vmIntrinsics::_getLong_raw:
508 case vmIntrinsics::_getFloat_raw:
509 case vmIntrinsics::_getDouble_raw:
510 case vmIntrinsics::_putByte_raw:
511 case vmIntrinsics::_putShort_raw:
512 case vmIntrinsics::_putChar_raw:
513 case vmIntrinsics::_putInt_raw:
514 case vmIntrinsics::_putLong_raw:
515 case vmIntrinsics::_putFloat_raw:
516 case vmIntrinsics::_putDouble_raw:
517 case vmIntrinsics::_putOrderedObject:
518 case vmIntrinsics::_putOrderedLong:
519 case vmIntrinsics::_putOrderedInt:
520 case vmIntrinsics::_getAndAddInt:
521 case vmIntrinsics::_getAndAddLong:
522 case vmIntrinsics::_getAndSetInt:
523 case vmIntrinsics::_getAndSetLong:
524 case vmIntrinsics::_getAndSetObject:
525 if (!InlineUnsafeOps) return true;
526 break;
527 case vmIntrinsics::_getShortUnaligned:
528 case vmIntrinsics::_getCharUnaligned:
529 case vmIntrinsics::_getIntUnaligned:
530 case vmIntrinsics::_getLongUnaligned:
531 case vmIntrinsics::_putShortUnaligned:
532 case vmIntrinsics::_putCharUnaligned:
533 case vmIntrinsics::_putIntUnaligned:
534 case vmIntrinsics::_putLongUnaligned:
535 case vmIntrinsics::_allocateInstance:
536 case vmIntrinsics::_getAddress_raw:
537 case vmIntrinsics::_putAddress_raw:
538 if (!InlineUnsafeOps || !UseUnalignedAccesses) return true;
539 break;
540 case vmIntrinsics::_hashCode:
541 if (!InlineObjectHash) return true;
542 break;
543 case vmIntrinsics::_aescrypt_encryptBlock:
544 case vmIntrinsics::_aescrypt_decryptBlock:
|
400 return true;
401 break;
402 default:
403 return false;
404 }
405 }
406
407 int vmIntrinsics::predicates_needed(vmIntrinsics::ID id) {
408 assert(id != vmIntrinsics::_none, "must be a VM intrinsic");
409 switch (id) {
410 case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt:
411 case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt:
412 return 1;
413 case vmIntrinsics::_digestBase_implCompressMB:
414 return 3;
415 default:
416 return 0;
417 }
418 }
419
420 bool vmIntrinsics::is_disabled_by_flags(methodHandle method, methodHandle compilation_context) {
421 vmIntrinsics::ID id = method->intrinsic_id();
422 assert(id != vmIntrinsics::_none, "must be a VM intrinsic");
423
424 // Check if the intrinsic corresponding to 'method' has been disabled on
425 // the command line by using the DisableIntrinsic flag (either globally
426 // or on a per-method level, see src/share/vm/compiler/abstractCompiler.hpp
427 // for details).
428 // Usually, the compilation context is the caller of the method 'method'.
429 // The only case when for a non-recursive method 'method' the compilation context
430 // is not the caller of the 'method' (but it is the method itself) is
431 // java.lang.ref.Referene::get.
432 // For java.lang.ref.Reference::get, the intrinsic version is used
433 // instead of the compiled version so that the value in the referent
434 // field can be registered by the G1 pre-barrier code. The intrinsified
435 // version of Reference::get also adds a memory barrier to prevent
436 // commoning reads from the referent field across safepoint since GC
437 // can change the referent field's value. See Compile::Compile()
438 // in src/share/vm/opto/compile.cpp or
439 // GraphBuilder::GraphBuilder() in src/share/vm/c1/c1_GraphBuilder.cpp
440 // for more details.
441 ccstr disable_intr = NULL;
442 if ((DisableIntrinsic[0] != '\0' && strstr(DisableIntrinsic, vmIntrinsics::name_at(id)) != NULL) ||
443 (!compilation_context.is_null() &&
444 CompilerOracle::has_option_value(compilation_context, "DisableIntrinsic", disable_intr) &&
445 strstr(disable_intr, vmIntrinsics::name_at(id)) != NULL)
446 ) {
447 return true;
448 }
449
450 // -XX:-InlineNatives disables nearly all intrinsics except the ones listed in
451 // the following switch statement.
452 if (!InlineNatives) {
453 switch (id) {
454 case vmIntrinsics::_indexOf:
455 case vmIntrinsics::_compareTo:
456 case vmIntrinsics::_equals:
457 case vmIntrinsics::_equalsC:
458 case vmIntrinsics::_getAndAddInt:
459 case vmIntrinsics::_getAndAddLong:
460 case vmIntrinsics::_getAndSetInt:
461 case vmIntrinsics::_getAndSetLong:
462 case vmIntrinsics::_getAndSetObject:
463 case vmIntrinsics::_loadFence:
464 case vmIntrinsics::_storeFence:
465 case vmIntrinsics::_fullFence:
466 case vmIntrinsics::_Reference_get:
467 break;
468 default:
469 return true;
470 }
471 }
472
473 switch (id) {
474 case vmIntrinsics::_isInstance:
475 case vmIntrinsics::_isAssignableFrom:
476 case vmIntrinsics::_getModifiers:
477 case vmIntrinsics::_isInterface:
478 case vmIntrinsics::_isArray:
479 case vmIntrinsics::_isPrimitive:
480 case vmIntrinsics::_getSuperclass:
481 case vmIntrinsics::_Class_cast:
482 case vmIntrinsics::_getLength:
483 case vmIntrinsics::_newArray:
484 case vmIntrinsics::_getClass:
485 if (!InlineClassNatives) return true;
486 break;
487 case vmIntrinsics::_currentThread:
488 case vmIntrinsics::_isInterrupted:
489 if (!InlineThreadNatives) return true;
490 break;
491 case vmIntrinsics::_floatToRawIntBits:
492 case vmIntrinsics::_intBitsToFloat:
493 case vmIntrinsics::_doubleToRawLongBits:
494 case vmIntrinsics::_longBitsToDouble:
495 case vmIntrinsics::_dabs:
496 case vmIntrinsics::_dsqrt:
497 case vmIntrinsics::_dsin:
498 case vmIntrinsics::_dcos:
499 case vmIntrinsics::_dtan:
500 case vmIntrinsics::_dlog:
501 case vmIntrinsics::_dexp:
502 case vmIntrinsics::_dpow:
503 case vmIntrinsics::_dlog10:
504 case vmIntrinsics::_datan2:
557 case vmIntrinsics::_getChar_raw:
558 case vmIntrinsics::_getInt_raw:
559 case vmIntrinsics::_getLong_raw:
560 case vmIntrinsics::_getFloat_raw:
561 case vmIntrinsics::_getDouble_raw:
562 case vmIntrinsics::_putByte_raw:
563 case vmIntrinsics::_putShort_raw:
564 case vmIntrinsics::_putChar_raw:
565 case vmIntrinsics::_putInt_raw:
566 case vmIntrinsics::_putLong_raw:
567 case vmIntrinsics::_putFloat_raw:
568 case vmIntrinsics::_putDouble_raw:
569 case vmIntrinsics::_putOrderedObject:
570 case vmIntrinsics::_putOrderedLong:
571 case vmIntrinsics::_putOrderedInt:
572 case vmIntrinsics::_getAndAddInt:
573 case vmIntrinsics::_getAndAddLong:
574 case vmIntrinsics::_getAndSetInt:
575 case vmIntrinsics::_getAndSetLong:
576 case vmIntrinsics::_getAndSetObject:
577 case vmIntrinsics::_loadFence:
578 case vmIntrinsics::_storeFence:
579 case vmIntrinsics::_fullFence:
580 case vmIntrinsics::_compareAndSwapObject:
581 case vmIntrinsics::_compareAndSwapLong:
582 case vmIntrinsics::_compareAndSwapInt:
583 if (!InlineUnsafeOps) return true;
584 break;
585 case vmIntrinsics::_getShortUnaligned:
586 case vmIntrinsics::_getCharUnaligned:
587 case vmIntrinsics::_getIntUnaligned:
588 case vmIntrinsics::_getLongUnaligned:
589 case vmIntrinsics::_putShortUnaligned:
590 case vmIntrinsics::_putCharUnaligned:
591 case vmIntrinsics::_putIntUnaligned:
592 case vmIntrinsics::_putLongUnaligned:
593 case vmIntrinsics::_allocateInstance:
594 case vmIntrinsics::_getAddress_raw:
595 case vmIntrinsics::_putAddress_raw:
596 if (!InlineUnsafeOps || !UseUnalignedAccesses) return true;
597 break;
598 case vmIntrinsics::_hashCode:
599 if (!InlineObjectHash) return true;
600 break;
601 case vmIntrinsics::_aescrypt_encryptBlock:
602 case vmIntrinsics::_aescrypt_decryptBlock:
|