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; 628 case vmIntrinsics::_updateBytesAdler32: 629 case vmIntrinsics::_updateByteBufferAdler32: 630 if (!UseAdler32Intrinsics) return true; 631 break; 632 case vmIntrinsics::_copyMemory: 633 if (!InlineArrayCopy || !InlineUnsafeOps) return true; 634 break; 635 #ifdef COMPILER1 636 case vmIntrinsics::_checkIndex: 637 if (!InlineNIOCheckIndex) return true; 638 break; 639 #endif // COMPILER1 640 #ifdef COMPILER2 641 case vmIntrinsics::_clone: 642 case vmIntrinsics::_copyOf: 643 case vmIntrinsics::_copyOfRange: 644 // These intrinsics use both the objectcopy and the arraycopy 645 // intrinsic mechanism. 646 if (!InlineObjectCopy || !InlineArrayCopy) return true; 647 break; 648 case vmIntrinsics::_compareTo: 649 if (!SpecialStringCompareTo) return true; 650 break; 651 case vmIntrinsics::_indexOf: 652 if (!SpecialStringIndexOf) return true; 653 break; 654 case vmIntrinsics::_equals: 655 if (!SpecialStringEquals) return true; 656 break; 657 case vmIntrinsics::_equalsC: 658 if (!SpecialArraysEquals) return true; 659 break; 660 case vmIntrinsics::_encodeISOArray: 661 if (!SpecialEncodeISOArray) return true; 662 break; 663 case vmIntrinsics::_getCallerClass: 664 if (!InlineReflectionGetCallerClass) return true; 665 break; 666 case vmIntrinsics::_multiplyToLen: 667 if (!UseMultiplyToLenIntrinsic) return true; 668 break; 669 case vmIntrinsics::_squareToLen: 670 if (!UseSquareToLenIntrinsic) return true; 671 break; 672 case vmIntrinsics::_mulAdd: 673 if (!UseMulAddIntrinsic) return true; 674 break; 675 case vmIntrinsics::_montgomeryMultiply: 676 if (!UseMontgomeryMultiplyIntrinsic) return true; 677 break; 678 case vmIntrinsics::_montgomerySquare: 679 if (!UseMontgomerySquareIntrinsic) return true; 680 break; 681 case vmIntrinsics::_addExactI: 682 case vmIntrinsics::_addExactL: 683 case vmIntrinsics::_decrementExactI: 684 case vmIntrinsics::_decrementExactL: 685 case vmIntrinsics::_incrementExactI: 686 case vmIntrinsics::_incrementExactL: 687 case vmIntrinsics::_multiplyExactI: 688 case vmIntrinsics::_multiplyExactL: 689 case vmIntrinsics::_negateExactI: 690 case vmIntrinsics::_negateExactL: 691 case vmIntrinsics::_subtractExactI: 692 case vmIntrinsics::_subtractExactL: 693 if (!UseMathExactIntrinsics || !InlineMathNatives) return true; 694 break; 695 #endif // COMPILER2 696 default: 697 return false; 698 } 699 700 return false; 701 } 702 703 #define VM_INTRINSIC_INITIALIZE(id, klass, name, sig, flags) #id "\0" 704 static const char* vm_intrinsic_name_bodies = 705 VM_INTRINSICS_DO(VM_INTRINSIC_INITIALIZE, 706 VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_ALIAS_IGNORE); 707 708 static const char* vm_intrinsic_name_table[vmIntrinsics::ID_LIMIT]; 709 710 const char* vmIntrinsics::name_at(vmIntrinsics::ID id) { 711 const char** nt = &vm_intrinsic_name_table[0]; 712 if (nt[_none] == NULL) { 713 char* string = (char*) &vm_intrinsic_name_bodies[0]; | 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::_indexOfL: 455 case vmIntrinsics::_indexOfU: 456 case vmIntrinsics::_indexOfUL: 457 case vmIntrinsics::_indexOfIL: 458 case vmIntrinsics::_indexOfIU: 459 case vmIntrinsics::_indexOfIUL: 460 case vmIntrinsics::_indexOfU_char: 461 case vmIntrinsics::_compareToL: 462 case vmIntrinsics::_compareToU: 463 case vmIntrinsics::_compareToLU: 464 case vmIntrinsics::_compareToUL: 465 case vmIntrinsics::_equalsL: 466 case vmIntrinsics::_equalsU: 467 case vmIntrinsics::_equalsC: 468 case vmIntrinsics::_getCharStringU: 469 case vmIntrinsics::_putCharStringU: 470 case vmIntrinsics::_compressStringC: 471 case vmIntrinsics::_compressStringB: 472 case vmIntrinsics::_inflateStringC: 473 case vmIntrinsics::_inflateStringB: 474 case vmIntrinsics::_getAndAddInt: 475 case vmIntrinsics::_getAndAddLong: 476 case vmIntrinsics::_getAndSetInt: 477 case vmIntrinsics::_getAndSetLong: 478 case vmIntrinsics::_getAndSetObject: 479 case vmIntrinsics::_loadFence: 480 case vmIntrinsics::_storeFence: 481 case vmIntrinsics::_fullFence: 482 case vmIntrinsics::_hasNegatives: 483 case vmIntrinsics::_Reference_get: 484 break; 485 default: 486 return true; 487 } 488 } 489 490 switch (id) { 491 case vmIntrinsics::_isInstance: 492 case vmIntrinsics::_isAssignableFrom: 493 case vmIntrinsics::_getModifiers: 494 case vmIntrinsics::_isInterface: 495 case vmIntrinsics::_isArray: 496 case vmIntrinsics::_isPrimitive: 497 case vmIntrinsics::_getSuperclass: 498 case vmIntrinsics::_Class_cast: 499 case vmIntrinsics::_getLength: 500 case vmIntrinsics::_newArray: 501 case vmIntrinsics::_getClass: 502 if (!InlineClassNatives) return true; 645 case vmIntrinsics::_updateBytesAdler32: 646 case vmIntrinsics::_updateByteBufferAdler32: 647 if (!UseAdler32Intrinsics) return true; 648 break; 649 case vmIntrinsics::_copyMemory: 650 if (!InlineArrayCopy || !InlineUnsafeOps) return true; 651 break; 652 #ifdef COMPILER1 653 case vmIntrinsics::_checkIndex: 654 if (!InlineNIOCheckIndex) return true; 655 break; 656 #endif // COMPILER1 657 #ifdef COMPILER2 658 case vmIntrinsics::_clone: 659 case vmIntrinsics::_copyOf: 660 case vmIntrinsics::_copyOfRange: 661 // These intrinsics use both the objectcopy and the arraycopy 662 // intrinsic mechanism. 663 if (!InlineObjectCopy || !InlineArrayCopy) return true; 664 break; 665 case vmIntrinsics::_compareToL: 666 case vmIntrinsics::_compareToU: 667 case vmIntrinsics::_compareToLU: 668 case vmIntrinsics::_compareToUL: 669 if (!SpecialStringCompareTo) return true; 670 break; 671 case vmIntrinsics::_indexOfL: 672 case vmIntrinsics::_indexOfU: 673 case vmIntrinsics::_indexOfUL: 674 case vmIntrinsics::_indexOfIL: 675 case vmIntrinsics::_indexOfIU: 676 case vmIntrinsics::_indexOfIUL: 677 case vmIntrinsics::_indexOfU_char: 678 if (!SpecialStringIndexOf) return true; 679 break; 680 case vmIntrinsics::_equalsL: 681 case vmIntrinsics::_equalsU: 682 if (!SpecialStringEquals) return true; 683 break; 684 case vmIntrinsics::_equalsB: 685 case vmIntrinsics::_equalsC: 686 if (!SpecialArraysEquals) return true; 687 break; 688 case vmIntrinsics::_encodeISOArray: 689 case vmIntrinsics::_encodeByteISOArray: 690 if (!SpecialEncodeISOArray) return true; 691 break; 692 case vmIntrinsics::_getCallerClass: 693 if (!InlineReflectionGetCallerClass) return true; 694 break; 695 case vmIntrinsics::_multiplyToLen: 696 if (!UseMultiplyToLenIntrinsic) return true; 697 break; 698 case vmIntrinsics::_squareToLen: 699 if (!UseSquareToLenIntrinsic) return true; 700 break; 701 case vmIntrinsics::_mulAdd: 702 if (!UseMulAddIntrinsic) return true; 703 break; 704 case vmIntrinsics::_montgomeryMultiply: 705 if (!UseMontgomeryMultiplyIntrinsic) return true; 706 break; 707 case vmIntrinsics::_montgomerySquare: 708 if (!UseMontgomerySquareIntrinsic) return true; 709 break; 710 case vmIntrinsics::_addExactI: 711 case vmIntrinsics::_addExactL: 712 case vmIntrinsics::_decrementExactI: 713 case vmIntrinsics::_decrementExactL: 714 case vmIntrinsics::_incrementExactI: 715 case vmIntrinsics::_incrementExactL: 716 case vmIntrinsics::_multiplyExactI: 717 case vmIntrinsics::_multiplyExactL: 718 case vmIntrinsics::_negateExactI: 719 case vmIntrinsics::_negateExactL: 720 case vmIntrinsics::_subtractExactI: 721 case vmIntrinsics::_subtractExactL: 722 if (!UseMathExactIntrinsics || !InlineMathNatives) return true; 723 break; 724 case vmIntrinsics::_getCharStringU: 725 case vmIntrinsics::_putCharStringU: 726 // Until JDK-8138651 is fixed, we have to rely on a special flag to 727 // disable these intrinsics for experiments. 728 if (!StringCharIntrinsics) return true; 729 break; 730 #endif // COMPILER2 731 default: 732 return false; 733 } 734 735 return false; 736 } 737 738 #define VM_INTRINSIC_INITIALIZE(id, klass, name, sig, flags) #id "\0" 739 static const char* vm_intrinsic_name_bodies = 740 VM_INTRINSICS_DO(VM_INTRINSIC_INITIALIZE, 741 VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_ALIAS_IGNORE); 742 743 static const char* vm_intrinsic_name_table[vmIntrinsics::ID_LIMIT]; 744 745 const char* vmIntrinsics::name_at(vmIntrinsics::ID id) { 746 const char** nt = &vm_intrinsic_name_table[0]; 747 if (nt[_none] == NULL) { 748 char* string = (char*) &vm_intrinsic_name_bodies[0]; |