531 case vmIntrinsics::_subtractExactI: 532 if (!Matcher::match_rule_supported(Op_OverflowSubI) || !UseMathExactIntrinsics) return NULL; 533 break; 534 case vmIntrinsics::_decrementExactL: 535 case vmIntrinsics::_subtractExactL: 536 if (!Matcher::match_rule_supported(Op_OverflowSubL) || !UseMathExactIntrinsics) return NULL; 537 break; 538 case vmIntrinsics::_negateExactI: 539 if (!Matcher::match_rule_supported(Op_OverflowSubI) || !UseMathExactIntrinsics) return NULL; 540 break; 541 case vmIntrinsics::_negateExactL: 542 if (!Matcher::match_rule_supported(Op_OverflowSubL) || !UseMathExactIntrinsics) return NULL; 543 break; 544 case vmIntrinsics::_multiplyExactI: 545 if (!Matcher::match_rule_supported(Op_OverflowMulI) || !UseMathExactIntrinsics) return NULL; 546 break; 547 case vmIntrinsics::_multiplyExactL: 548 if (!Matcher::match_rule_supported(Op_OverflowMulL) || !UseMathExactIntrinsics) return NULL; 549 break; 550 551 default: 552 assert(id <= vmIntrinsics::LAST_COMPILER_INLINE, "caller responsibility"); 553 assert(id != vmIntrinsics::_Object_init && id != vmIntrinsics::_invoke, "enum out of order?"); 554 break; 555 } 556 557 // -XX:-InlineClassNatives disables natives from the Class class. 558 // The flag applies to all reflective calls, notably Array.newArray 559 // (visible to Java programmers as Array.newInstance). 560 if (m->holder()->name() == ciSymbol::java_lang_Class() || 561 m->holder()->name() == ciSymbol::java_lang_reflect_Array()) { 562 if (!InlineClassNatives) return NULL; 563 } 564 565 // -XX:-InlineThreadNatives disables natives from the Thread class. 566 if (m->holder()->name() == ciSymbol::java_lang_Thread()) { 567 if (!InlineThreadNatives) return NULL; 568 } 569 570 // -XX:-InlineMathNatives disables natives from the Math,Float and Double classes. 780 781 case vmIntrinsics::_getObjectVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_OBJECT, is_volatile); 782 case vmIntrinsics::_getBooleanVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_BOOLEAN, is_volatile); 783 case vmIntrinsics::_getByteVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_BYTE, is_volatile); 784 case vmIntrinsics::_getShortVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_SHORT, is_volatile); 785 case vmIntrinsics::_getCharVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_CHAR, is_volatile); 786 case vmIntrinsics::_getIntVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_INT, is_volatile); 787 case vmIntrinsics::_getLongVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_LONG, is_volatile); 788 case vmIntrinsics::_getFloatVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_FLOAT, is_volatile); 789 case vmIntrinsics::_getDoubleVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_DOUBLE, is_volatile); 790 791 case vmIntrinsics::_putObjectVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_OBJECT, is_volatile); 792 case vmIntrinsics::_putBooleanVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_BOOLEAN, is_volatile); 793 case vmIntrinsics::_putByteVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_BYTE, is_volatile); 794 case vmIntrinsics::_putShortVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_SHORT, is_volatile); 795 case vmIntrinsics::_putCharVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_CHAR, is_volatile); 796 case vmIntrinsics::_putIntVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_INT, is_volatile); 797 case vmIntrinsics::_putLongVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_LONG, is_volatile); 798 case vmIntrinsics::_putFloatVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_FLOAT, is_volatile); 799 case vmIntrinsics::_putDoubleVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_DOUBLE, is_volatile); 800 801 case vmIntrinsics::_compareAndSwapObject: return inline_unsafe_load_store(T_OBJECT, LS_cmpxchg); 802 case vmIntrinsics::_compareAndSwapInt: return inline_unsafe_load_store(T_INT, LS_cmpxchg); 803 case vmIntrinsics::_compareAndSwapLong: return inline_unsafe_load_store(T_LONG, LS_cmpxchg); 804 805 case vmIntrinsics::_putOrderedObject: return inline_unsafe_ordered_store(T_OBJECT); 806 case vmIntrinsics::_putOrderedInt: return inline_unsafe_ordered_store(T_INT); 807 case vmIntrinsics::_putOrderedLong: return inline_unsafe_ordered_store(T_LONG); 808 809 case vmIntrinsics::_getAndAddInt: return inline_unsafe_load_store(T_INT, LS_xadd); 810 case vmIntrinsics::_getAndAddLong: return inline_unsafe_load_store(T_LONG, LS_xadd); 811 case vmIntrinsics::_getAndSetInt: return inline_unsafe_load_store(T_INT, LS_xchg); 812 case vmIntrinsics::_getAndSetLong: return inline_unsafe_load_store(T_LONG, LS_xchg); 813 case vmIntrinsics::_getAndSetObject: return inline_unsafe_load_store(T_OBJECT, LS_xchg); 814 815 case vmIntrinsics::_loadFence: 816 case vmIntrinsics::_storeFence: 817 case vmIntrinsics::_fullFence: return inline_unsafe_fence(intrinsic_id()); 818 819 case vmIntrinsics::_currentThread: return inline_native_currentThread(); | 531 case vmIntrinsics::_subtractExactI: 532 if (!Matcher::match_rule_supported(Op_OverflowSubI) || !UseMathExactIntrinsics) return NULL; 533 break; 534 case vmIntrinsics::_decrementExactL: 535 case vmIntrinsics::_subtractExactL: 536 if (!Matcher::match_rule_supported(Op_OverflowSubL) || !UseMathExactIntrinsics) return NULL; 537 break; 538 case vmIntrinsics::_negateExactI: 539 if (!Matcher::match_rule_supported(Op_OverflowSubI) || !UseMathExactIntrinsics) return NULL; 540 break; 541 case vmIntrinsics::_negateExactL: 542 if (!Matcher::match_rule_supported(Op_OverflowSubL) || !UseMathExactIntrinsics) return NULL; 543 break; 544 case vmIntrinsics::_multiplyExactI: 545 if (!Matcher::match_rule_supported(Op_OverflowMulI) || !UseMathExactIntrinsics) return NULL; 546 break; 547 case vmIntrinsics::_multiplyExactL: 548 if (!Matcher::match_rule_supported(Op_OverflowMulL) || !UseMathExactIntrinsics) return NULL; 549 break; 550 551 case vmIntrinsics::_getShortUnaligned: 552 case vmIntrinsics::_getCharUnaligned: 553 case vmIntrinsics::_getIntUnaligned: 554 case vmIntrinsics::_getLongUnaligned: 555 case vmIntrinsics::_putShortUnaligned: 556 case vmIntrinsics::_putCharUnaligned: 557 case vmIntrinsics::_putIntUnaligned: 558 case vmIntrinsics::_putLongUnaligned: 559 if (!UseUnalignedAccesses) return NULL; 560 break; 561 562 default: 563 assert(id <= vmIntrinsics::LAST_COMPILER_INLINE, "caller responsibility"); 564 assert(id != vmIntrinsics::_Object_init && id != vmIntrinsics::_invoke, "enum out of order?"); 565 break; 566 } 567 568 // -XX:-InlineClassNatives disables natives from the Class class. 569 // The flag applies to all reflective calls, notably Array.newArray 570 // (visible to Java programmers as Array.newInstance). 571 if (m->holder()->name() == ciSymbol::java_lang_Class() || 572 m->holder()->name() == ciSymbol::java_lang_reflect_Array()) { 573 if (!InlineClassNatives) return NULL; 574 } 575 576 // -XX:-InlineThreadNatives disables natives from the Thread class. 577 if (m->holder()->name() == ciSymbol::java_lang_Thread()) { 578 if (!InlineThreadNatives) return NULL; 579 } 580 581 // -XX:-InlineMathNatives disables natives from the Math,Float and Double classes. 791 792 case vmIntrinsics::_getObjectVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_OBJECT, is_volatile); 793 case vmIntrinsics::_getBooleanVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_BOOLEAN, is_volatile); 794 case vmIntrinsics::_getByteVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_BYTE, is_volatile); 795 case vmIntrinsics::_getShortVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_SHORT, is_volatile); 796 case vmIntrinsics::_getCharVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_CHAR, is_volatile); 797 case vmIntrinsics::_getIntVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_INT, is_volatile); 798 case vmIntrinsics::_getLongVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_LONG, is_volatile); 799 case vmIntrinsics::_getFloatVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_FLOAT, is_volatile); 800 case vmIntrinsics::_getDoubleVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_DOUBLE, is_volatile); 801 802 case vmIntrinsics::_putObjectVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_OBJECT, is_volatile); 803 case vmIntrinsics::_putBooleanVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_BOOLEAN, is_volatile); 804 case vmIntrinsics::_putByteVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_BYTE, is_volatile); 805 case vmIntrinsics::_putShortVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_SHORT, is_volatile); 806 case vmIntrinsics::_putCharVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_CHAR, is_volatile); 807 case vmIntrinsics::_putIntVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_INT, is_volatile); 808 case vmIntrinsics::_putLongVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_LONG, is_volatile); 809 case vmIntrinsics::_putFloatVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_FLOAT, is_volatile); 810 case vmIntrinsics::_putDoubleVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_DOUBLE, is_volatile); 811 812 case vmIntrinsics::_getShortUnaligned: return inline_unsafe_access(!is_native_ptr, !is_store, T_SHORT, !is_volatile); 813 case vmIntrinsics::_getCharUnaligned: return inline_unsafe_access(!is_native_ptr, !is_store, T_CHAR, !is_volatile); 814 case vmIntrinsics::_getIntUnaligned: return inline_unsafe_access(!is_native_ptr, !is_store, T_INT, !is_volatile); 815 case vmIntrinsics::_getLongUnaligned: return inline_unsafe_access(!is_native_ptr, !is_store, T_LONG, !is_volatile); 816 817 case vmIntrinsics::_putShortUnaligned: return inline_unsafe_access(!is_native_ptr, is_store, T_SHORT, !is_volatile); 818 case vmIntrinsics::_putCharUnaligned: return inline_unsafe_access(!is_native_ptr, is_store, T_CHAR, !is_volatile); 819 case vmIntrinsics::_putIntUnaligned: return inline_unsafe_access(!is_native_ptr, is_store, T_INT, !is_volatile); 820 case vmIntrinsics::_putLongUnaligned: return inline_unsafe_access(!is_native_ptr, is_store, T_LONG, !is_volatile); 821 822 case vmIntrinsics::_compareAndSwapObject: return inline_unsafe_load_store(T_OBJECT, LS_cmpxchg); 823 case vmIntrinsics::_compareAndSwapInt: return inline_unsafe_load_store(T_INT, LS_cmpxchg); 824 case vmIntrinsics::_compareAndSwapLong: return inline_unsafe_load_store(T_LONG, LS_cmpxchg); 825 826 case vmIntrinsics::_putOrderedObject: return inline_unsafe_ordered_store(T_OBJECT); 827 case vmIntrinsics::_putOrderedInt: return inline_unsafe_ordered_store(T_INT); 828 case vmIntrinsics::_putOrderedLong: return inline_unsafe_ordered_store(T_LONG); 829 830 case vmIntrinsics::_getAndAddInt: return inline_unsafe_load_store(T_INT, LS_xadd); 831 case vmIntrinsics::_getAndAddLong: return inline_unsafe_load_store(T_LONG, LS_xadd); 832 case vmIntrinsics::_getAndSetInt: return inline_unsafe_load_store(T_INT, LS_xchg); 833 case vmIntrinsics::_getAndSetLong: return inline_unsafe_load_store(T_LONG, LS_xchg); 834 case vmIntrinsics::_getAndSetObject: return inline_unsafe_load_store(T_OBJECT, LS_xchg); 835 836 case vmIntrinsics::_loadFence: 837 case vmIntrinsics::_storeFence: 838 case vmIntrinsics::_fullFence: return inline_unsafe_fence(intrinsic_id()); 839 840 case vmIntrinsics::_currentThread: return inline_native_currentThread(); |