src/share/vm/opto/library_call.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File 8130832-review Cdiff src/share/vm/opto/library_call.cpp

src/share/vm/opto/library_call.cpp

Print this page
rev 8688 : 1234567: Invalid bug number
Summary: This is a local commit to reduce jprt submit time.
Reviewed-by: kvn

*** 302,347 **** bool inline_profileBoolean(); bool inline_isCompileConstant(); }; ! ! //---------------------------make_vm_intrinsic---------------------------- ! CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) { ! vmIntrinsics::ID id = m->intrinsic_id(); assert(id != vmIntrinsics::_none, "must be a VM intrinsic"); ! ! ccstr disable_intr = NULL; ! ! if ((DisableIntrinsic[0] != '\0' ! && strstr(DisableIntrinsic, vmIntrinsics::name_at(id)) != NULL) || ! (method_has_option_value("DisableIntrinsic", disable_intr) ! && strstr(disable_intr, vmIntrinsics::name_at(id)) != NULL)) { ! // disabled by a user request on the command line: ! // example: -XX:DisableIntrinsic=_hashCode,_getClass ! return NULL; } ! if (!m->is_loaded()) { ! // do not attempt to inline unloaded methods ! return NULL; } ! // Only a few intrinsics implement a virtual dispatch. ! // They are expensive calls which are also frequently overridden. if (is_virtual) { switch (id) { case vmIntrinsics::_hashCode: case vmIntrinsics::_clone: - // OK, Object.hashCode and Object.clone intrinsics come in both flavors break; default: ! return NULL; } } ! // -XX:-InlineNatives disables nearly all intrinsics: if (!InlineNatives) { switch (id) { case vmIntrinsics::_indexOf: case vmIntrinsics::_compareTo: case vmIntrinsics::_equals: --- 302,381 ---- bool inline_profileBoolean(); bool inline_isCompileConstant(); }; ! bool Compile::intrinsic_does_virtual_dispatch_for(vmIntrinsics::ID id) { assert(id != vmIntrinsics::_none, "must be a VM intrinsic"); ! switch(id) { ! case vmIntrinsics::_hashCode: ! case vmIntrinsics::_clone: ! return true; ! break; ! default: ! return false; } + } + int Compile::intrinsic_predicates_needed_for(vmIntrinsics::ID id) { + assert(id != vmIntrinsics::_none, "must be a VM intrinsic"); + switch (id) { + case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt: + case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt: + return 1; + case vmIntrinsics::_digestBase_implCompressMB: + return 3; + default: + return 0; + } + } ! bool Compile::is_intrinsic_available_for(Method* method, Method* compilation_context, bool is_virtual) { ! vmIntrinsics::ID id = method->intrinsic_id(); ! if (id < vmIntrinsics::FIRST_ID || id >= vmIntrinsics::LAST_COMPILER_INLINE) { ! return false; ! } ! ! // Check if the intrinsic corresponding to 'method' has been disabled on ! // the command line by using the DisableIntrinsic flag (either globally ! // or on a per-method level, see src/share/vm/compiler/abstractCompiler.hpp ! // for details). ! // Usually, the compilation context is the caller of the method 'method'. ! // The only case when for a non-recursive method 'method' the compilation context ! // is not the caller of the 'method' (but it is the method itself) is ! // java.lang.ref.Referene::get. ! // For java.lang.ref.Reference::get, the intrinsic version is used ! // instead of the C2-compiled version so that the value in the referent ! // field can be registered by the G1 pre-barrier code. The intrinsified ! // version of Reference::get also adds a memory barrier to prevent ! // commoning reads from the referent field across safepoint since GC ! // can change the referent field's value. See Compile::Compile() ! // in src/share/vm/opto/compile.cpp for more details. ! ccstr disable_intr = NULL; ! if ((DisableIntrinsic[0] != '\0' && strstr(DisableIntrinsic, vmIntrinsics::name_at(id)) != NULL) || ! (compilation_context != NULL && ! CompilerOracle::has_option_value(compilation_context, "DisableIntrinsic", disable_intr) && ! strstr(disable_intr, vmIntrinsics::name_at(id)) != NULL) ! ) { ! return false; } ! // Only Object.hashCode and Object.clone intrinsics implement also a virtual ! // dispatch because calling both methods is expensive but both methods are ! // frequently overridden. All other intrinsics implement only a non-virtual ! // dispatch. if (is_virtual) { switch (id) { case vmIntrinsics::_hashCode: case vmIntrinsics::_clone: break; default: ! return false; } } ! // -XX:-InlineNatives disables nearly all intrinsics except the ones listed in ! // the following switch statement. if (!InlineNatives) { switch (id) { case vmIntrinsics::_indexOf: case vmIntrinsics::_compareTo: case vmIntrinsics::_equals:
*** 352,635 **** case vmIntrinsics::_getAndSetLong: case vmIntrinsics::_getAndSetObject: case vmIntrinsics::_loadFence: case vmIntrinsics::_storeFence: case vmIntrinsics::_fullFence: - break; // InlineNatives does not control String.compareTo case vmIntrinsics::_Reference_get: ! break; // InlineNatives does not control Reference.get default: ! return NULL; } } - int predicates = 0; - bool does_virtual_dispatch = false; - switch (id) { case vmIntrinsics::_compareTo: ! if (!SpecialStringCompareTo) return NULL; ! if (!Matcher::match_rule_supported(Op_StrComp)) return NULL; break; case vmIntrinsics::_indexOf: ! if (!SpecialStringIndexOf) return NULL; break; case vmIntrinsics::_equals: ! if (!SpecialStringEquals) return NULL; ! if (!Matcher::match_rule_supported(Op_StrEquals)) return NULL; break; case vmIntrinsics::_equalsC: ! if (!SpecialArraysEquals) return NULL; ! if (!Matcher::match_rule_supported(Op_AryEq)) return NULL; break; case vmIntrinsics::_arraycopy: ! if (!InlineArrayCopy) return NULL; break; case vmIntrinsics::_copyMemory: ! if (StubRoutines::unsafe_arraycopy() == NULL) return NULL; ! if (!InlineArrayCopy) return NULL; break; case vmIntrinsics::_hashCode: ! if (!InlineObjectHash) return NULL; ! does_virtual_dispatch = true; break; case vmIntrinsics::_clone: - does_virtual_dispatch = true; case vmIntrinsics::_copyOf: case vmIntrinsics::_copyOfRange: ! if (!InlineObjectCopy) return NULL; ! // These also use the arraycopy intrinsic mechanism: ! if (!InlineArrayCopy) return NULL; break; case vmIntrinsics::_encodeISOArray: ! if (!SpecialEncodeISOArray) return NULL; ! if (!Matcher::match_rule_supported(Op_EncodeISOArray)) return NULL; break; case vmIntrinsics::_checkIndex: // We do not intrinsify this. The optimizer does fine with it. ! return NULL; ! case vmIntrinsics::_getCallerClass: ! if (!InlineReflectionGetCallerClass) return NULL; ! if (SystemDictionary::reflect_CallerSensitive_klass() == NULL) return NULL; break; - case vmIntrinsics::_bitCount_i: ! if (!Matcher::match_rule_supported(Op_PopCountI)) return NULL; break; - case vmIntrinsics::_bitCount_l: ! if (!Matcher::match_rule_supported(Op_PopCountL)) return NULL; break; - case vmIntrinsics::_numberOfLeadingZeros_i: ! if (!Matcher::match_rule_supported(Op_CountLeadingZerosI)) return NULL; break; - case vmIntrinsics::_numberOfLeadingZeros_l: ! if (!Matcher::match_rule_supported(Op_CountLeadingZerosL)) return NULL; break; - case vmIntrinsics::_numberOfTrailingZeros_i: ! if (!Matcher::match_rule_supported(Op_CountTrailingZerosI)) return NULL; break; - case vmIntrinsics::_numberOfTrailingZeros_l: ! if (!Matcher::match_rule_supported(Op_CountTrailingZerosL)) return NULL; break; - case vmIntrinsics::_reverseBytes_c: ! if (!Matcher::match_rule_supported(Op_ReverseBytesUS)) return NULL; break; case vmIntrinsics::_reverseBytes_s: ! if (!Matcher::match_rule_supported(Op_ReverseBytesS)) return NULL; break; case vmIntrinsics::_reverseBytes_i: ! if (!Matcher::match_rule_supported(Op_ReverseBytesI)) return NULL; break; case vmIntrinsics::_reverseBytes_l: ! if (!Matcher::match_rule_supported(Op_ReverseBytesL)) return NULL; break; - - case vmIntrinsics::_Reference_get: - // Use the intrinsic version of Reference.get() so that the value in - // the referent field can be registered by the G1 pre-barrier code. - // Also add memory barrier to prevent commoning reads from this field - // across safepoint since GC can change it value. - break; - case vmIntrinsics::_compareAndSwapObject: #ifdef _LP64 ! if (!UseCompressedOops && !Matcher::match_rule_supported(Op_CompareAndSwapP)) return NULL; #endif ! break; ! case vmIntrinsics::_compareAndSwapLong: ! if (!Matcher::match_rule_supported(Op_CompareAndSwapL)) return NULL; break; - case vmIntrinsics::_getAndAddInt: ! if (!Matcher::match_rule_supported(Op_GetAndAddI)) return NULL; break; - case vmIntrinsics::_getAndAddLong: ! if (!Matcher::match_rule_supported(Op_GetAndAddL)) return NULL; break; - case vmIntrinsics::_getAndSetInt: ! if (!Matcher::match_rule_supported(Op_GetAndSetI)) return NULL; break; - case vmIntrinsics::_getAndSetLong: ! if (!Matcher::match_rule_supported(Op_GetAndSetL)) return NULL; break; - case vmIntrinsics::_getAndSetObject: #ifdef _LP64 ! if (!UseCompressedOops && !Matcher::match_rule_supported(Op_GetAndSetP)) return NULL; ! if (UseCompressedOops && !Matcher::match_rule_supported(Op_GetAndSetN)) return NULL; break; #else ! if (!Matcher::match_rule_supported(Op_GetAndSetP)) return NULL; break; #endif - case vmIntrinsics::_aescrypt_encryptBlock: case vmIntrinsics::_aescrypt_decryptBlock: ! if (!UseAESIntrinsics) return NULL; break; - case vmIntrinsics::_multiplyToLen: ! if (!UseMultiplyToLenIntrinsic) return NULL; break; - case vmIntrinsics::_squareToLen: ! if (!UseSquareToLenIntrinsic) return NULL; break; - case vmIntrinsics::_mulAdd: ! if (!UseMulAddIntrinsic) return NULL; break; - case vmIntrinsics::_montgomeryMultiply: ! if (!UseMontgomeryMultiplyIntrinsic) return NULL; break; case vmIntrinsics::_montgomerySquare: ! if (!UseMontgomerySquareIntrinsic) return NULL; break; - case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt: case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt: ! if (!UseAESIntrinsics) return NULL; ! // these two require the predicated logic ! predicates = 1; break; - case vmIntrinsics::_sha_implCompress: ! if (!UseSHA1Intrinsics) return NULL; break; - case vmIntrinsics::_sha2_implCompress: ! if (!UseSHA256Intrinsics) return NULL; break; - case vmIntrinsics::_sha5_implCompress: ! if (!UseSHA512Intrinsics) return NULL; break; - case vmIntrinsics::_digestBase_implCompressMB: ! if (!(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics)) return NULL; ! predicates = 3; break; - case vmIntrinsics::_ghash_processBlocks: ! if (!UseGHASHIntrinsics) return NULL; break; - case vmIntrinsics::_updateCRC32: case vmIntrinsics::_updateBytesCRC32: case vmIntrinsics::_updateByteBufferCRC32: ! if (!UseCRC32Intrinsics) return NULL; break; - case vmIntrinsics::_updateBytesCRC32C: case vmIntrinsics::_updateDirectByteBufferCRC32C: ! if (!UseCRC32CIntrinsics) return NULL; break; - case vmIntrinsics::_incrementExactI: case vmIntrinsics::_addExactI: ! if (!Matcher::match_rule_supported(Op_OverflowAddI) || !UseMathExactIntrinsics) return NULL; break; case vmIntrinsics::_incrementExactL: case vmIntrinsics::_addExactL: ! if (!Matcher::match_rule_supported(Op_OverflowAddL) || !UseMathExactIntrinsics) return NULL; break; case vmIntrinsics::_decrementExactI: case vmIntrinsics::_subtractExactI: ! if (!Matcher::match_rule_supported(Op_OverflowSubI) || !UseMathExactIntrinsics) return NULL; break; case vmIntrinsics::_decrementExactL: case vmIntrinsics::_subtractExactL: - if (!Matcher::match_rule_supported(Op_OverflowSubL) || !UseMathExactIntrinsics) return NULL; - break; - case vmIntrinsics::_negateExactI: - if (!Matcher::match_rule_supported(Op_OverflowSubI) || !UseMathExactIntrinsics) return NULL; - break; case vmIntrinsics::_negateExactL: ! if (!Matcher::match_rule_supported(Op_OverflowSubL) || !UseMathExactIntrinsics) return NULL; break; case vmIntrinsics::_multiplyExactI: ! if (!Matcher::match_rule_supported(Op_OverflowMulI) || !UseMathExactIntrinsics) return NULL; break; case vmIntrinsics::_multiplyExactL: ! if (!Matcher::match_rule_supported(Op_OverflowMulL) || !UseMathExactIntrinsics) return NULL; break; - case vmIntrinsics::_getShortUnaligned: case vmIntrinsics::_getCharUnaligned: case vmIntrinsics::_getIntUnaligned: case vmIntrinsics::_getLongUnaligned: case vmIntrinsics::_putShortUnaligned: case vmIntrinsics::_putCharUnaligned: case vmIntrinsics::_putIntUnaligned: case vmIntrinsics::_putLongUnaligned: ! if (!UseUnalignedAccesses) return NULL; break; - default: - assert(id <= vmIntrinsics::LAST_COMPILER_INLINE, "caller responsibility"); - assert(id != vmIntrinsics::_Object_init && id != vmIntrinsics::_invoke, "enum out of order?"); break; } // -XX:-InlineClassNatives disables natives from the Class class. // The flag applies to all reflective calls, notably Array.newArray // (visible to Java programmers as Array.newInstance). ! if (m->holder()->name() == ciSymbol::java_lang_Class() || ! m->holder()->name() == ciSymbol::java_lang_reflect_Array()) { ! if (!InlineClassNatives) return NULL; } // -XX:-InlineThreadNatives disables natives from the Thread class. ! if (m->holder()->name() == ciSymbol::java_lang_Thread()) { ! if (!InlineThreadNatives) return NULL; } // -XX:-InlineMathNatives disables natives from the Math,Float and Double classes. ! if (m->holder()->name() == ciSymbol::java_lang_Math() || ! m->holder()->name() == ciSymbol::java_lang_Float() || ! m->holder()->name() == ciSymbol::java_lang_Double()) { ! if (!InlineMathNatives) return NULL; } // -XX:-InlineUnsafeOps disables natives from the Unsafe class. ! if (m->holder()->name() == ciSymbol::sun_misc_Unsafe()) { ! if (!InlineUnsafeOps) return NULL; } ! return new LibraryIntrinsic(m, is_virtual, predicates, does_virtual_dispatch, (vmIntrinsics::ID) id); } //----------------------register_library_intrinsics----------------------- // Initialize this file's data structures, for each Compile instance. void Compile::register_library_intrinsics() { --- 386,652 ---- case vmIntrinsics::_getAndSetLong: case vmIntrinsics::_getAndSetObject: case vmIntrinsics::_loadFence: case vmIntrinsics::_storeFence: case vmIntrinsics::_fullFence: case vmIntrinsics::_Reference_get: ! break; default: ! return false; } } switch (id) { case vmIntrinsics::_compareTo: ! if (!SpecialStringCompareTo) return false; ! if (!Matcher::match_rule_supported(Op_StrComp)) return false; break; case vmIntrinsics::_indexOf: ! if (!SpecialStringIndexOf) return false; break; case vmIntrinsics::_equals: ! if (!SpecialStringEquals) return false; ! if (!Matcher::match_rule_supported(Op_StrEquals)) return false; break; case vmIntrinsics::_equalsC: ! if (!SpecialArraysEquals) return false; ! if (!Matcher::match_rule_supported(Op_AryEq)) return false; break; case vmIntrinsics::_arraycopy: ! if (!InlineArrayCopy) return false; break; case vmIntrinsics::_copyMemory: ! if (!InlineArrayCopy) return false; ! if (StubRoutines::unsafe_arraycopy() == NULL) return false; break; case vmIntrinsics::_hashCode: ! if (!InlineObjectHash) return false; break; case vmIntrinsics::_clone: case vmIntrinsics::_copyOf: case vmIntrinsics::_copyOfRange: ! // These intrinsics use both the objectcopy and the arraycopy ! // intrinsic mechanism. ! if (!InlineObjectCopy || !InlineArrayCopy) return false; break; case vmIntrinsics::_encodeISOArray: ! if (!SpecialEncodeISOArray) return false; ! if (!Matcher::match_rule_supported(Op_EncodeISOArray)) return false; break; case vmIntrinsics::_checkIndex: // We do not intrinsify this. The optimizer does fine with it. ! return false; case vmIntrinsics::_getCallerClass: ! if (!InlineReflectionGetCallerClass || ! SystemDictionary::reflect_CallerSensitive_klass() == NULL) { ! return false; ! } break; case vmIntrinsics::_bitCount_i: ! if (!Matcher::match_rule_supported(Op_PopCountI)) return false; break; case vmIntrinsics::_bitCount_l: ! if (!Matcher::match_rule_supported(Op_PopCountL)) return false; break; case vmIntrinsics::_numberOfLeadingZeros_i: ! if (!Matcher::match_rule_supported(Op_CountLeadingZerosI)) return false; break; case vmIntrinsics::_numberOfLeadingZeros_l: ! if (!Matcher::match_rule_supported(Op_CountLeadingZerosL)) return false; break; case vmIntrinsics::_numberOfTrailingZeros_i: ! if (!Matcher::match_rule_supported(Op_CountTrailingZerosI)) return false; break; case vmIntrinsics::_numberOfTrailingZeros_l: ! if (!Matcher::match_rule_supported(Op_CountTrailingZerosL)) return false; break; case vmIntrinsics::_reverseBytes_c: ! if (!Matcher::match_rule_supported(Op_ReverseBytesUS)) return false; break; case vmIntrinsics::_reverseBytes_s: ! if (!Matcher::match_rule_supported(Op_ReverseBytesS)) return false; break; case vmIntrinsics::_reverseBytes_i: ! if (!Matcher::match_rule_supported(Op_ReverseBytesI)) return false; break; case vmIntrinsics::_reverseBytes_l: ! if (!Matcher::match_rule_supported(Op_ReverseBytesL)) return false; break; case vmIntrinsics::_compareAndSwapObject: #ifdef _LP64 ! if (!UseCompressedOops && !Matcher::match_rule_supported(Op_CompareAndSwapP)) return false; #endif ! break; case vmIntrinsics::_compareAndSwapLong: ! if (!Matcher::match_rule_supported(Op_CompareAndSwapL)) return false; break; case vmIntrinsics::_getAndAddInt: ! if (!Matcher::match_rule_supported(Op_GetAndAddI)) return false; break; case vmIntrinsics::_getAndAddLong: ! if (!Matcher::match_rule_supported(Op_GetAndAddL)) return false; break; case vmIntrinsics::_getAndSetInt: ! if (!Matcher::match_rule_supported(Op_GetAndSetI)) return false; break; case vmIntrinsics::_getAndSetLong: ! if (!Matcher::match_rule_supported(Op_GetAndSetL)) return false; break; case vmIntrinsics::_getAndSetObject: #ifdef _LP64 ! if (!UseCompressedOops && !Matcher::match_rule_supported(Op_GetAndSetP)) return false; ! if (UseCompressedOops && !Matcher::match_rule_supported(Op_GetAndSetN)) return false; break; #else ! if (!Matcher::match_rule_supported(Op_GetAndSetP)) return false; break; #endif case vmIntrinsics::_aescrypt_encryptBlock: case vmIntrinsics::_aescrypt_decryptBlock: ! if (!UseAESIntrinsics) return false; break; case vmIntrinsics::_multiplyToLen: ! if (!UseMultiplyToLenIntrinsic) return false; break; case vmIntrinsics::_squareToLen: ! if (!UseSquareToLenIntrinsic) return false; break; case vmIntrinsics::_mulAdd: ! if (!UseMulAddIntrinsic) return false; break; case vmIntrinsics::_montgomeryMultiply: ! if (!UseMontgomeryMultiplyIntrinsic) return false; break; case vmIntrinsics::_montgomerySquare: ! if (!UseMontgomerySquareIntrinsic) return false; break; case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt: case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt: ! if (!UseAESIntrinsics) return false; break; case vmIntrinsics::_sha_implCompress: ! if (!UseSHA1Intrinsics) return false; break; case vmIntrinsics::_sha2_implCompress: ! if (!UseSHA256Intrinsics) return false; break; case vmIntrinsics::_sha5_implCompress: ! if (!UseSHA512Intrinsics) return false; break; case vmIntrinsics::_digestBase_implCompressMB: ! if (!(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics)) return false; break; case vmIntrinsics::_ghash_processBlocks: ! if (!UseGHASHIntrinsics) return false; break; case vmIntrinsics::_updateCRC32: case vmIntrinsics::_updateBytesCRC32: case vmIntrinsics::_updateByteBufferCRC32: ! if (!UseCRC32Intrinsics) return false; break; case vmIntrinsics::_updateBytesCRC32C: case vmIntrinsics::_updateDirectByteBufferCRC32C: ! if (!UseCRC32CIntrinsics) return false; break; case vmIntrinsics::_incrementExactI: case vmIntrinsics::_addExactI: ! if (!UseMathExactIntrinsics || !Matcher::match_rule_supported(Op_OverflowAddI)) return false; break; case vmIntrinsics::_incrementExactL: case vmIntrinsics::_addExactL: ! if (!UseMathExactIntrinsics || !Matcher::match_rule_supported(Op_OverflowAddL)) return false; break; case vmIntrinsics::_decrementExactI: case vmIntrinsics::_subtractExactI: ! case vmIntrinsics::_negateExactI: ! if (!UseMathExactIntrinsics || !Matcher::match_rule_supported(Op_OverflowSubI)) return false; break; case vmIntrinsics::_decrementExactL: case vmIntrinsics::_subtractExactL: case vmIntrinsics::_negateExactL: ! if (!UseMathExactIntrinsics || !Matcher::match_rule_supported(Op_OverflowSubL)) return false; break; case vmIntrinsics::_multiplyExactI: ! if (!UseMathExactIntrinsics || !Matcher::match_rule_supported(Op_OverflowMulI)) return false; break; case vmIntrinsics::_multiplyExactL: ! if (!Matcher::match_rule_supported(Op_OverflowMulL) || !UseMathExactIntrinsics) return false; break; case vmIntrinsics::_getShortUnaligned: case vmIntrinsics::_getCharUnaligned: case vmIntrinsics::_getIntUnaligned: case vmIntrinsics::_getLongUnaligned: case vmIntrinsics::_putShortUnaligned: case vmIntrinsics::_putCharUnaligned: case vmIntrinsics::_putIntUnaligned: case vmIntrinsics::_putLongUnaligned: ! if (!UseUnalignedAccesses) return false; break; default: break; } + Symbol* method_holder = method->method_holder()->name(); // -XX:-InlineClassNatives disables natives from the Class class. // The flag applies to all reflective calls, notably Array.newArray // (visible to Java programmers as Array.newInstance). ! if (method_holder == vmSymbols::java_lang_Class() || ! method_holder == vmSymbols::java_lang_reflect_Array()) { ! if (!InlineClassNatives) return false; } // -XX:-InlineThreadNatives disables natives from the Thread class. ! if (method_holder == vmSymbols::java_lang_Thread()) { ! if (!InlineThreadNatives) return false; } // -XX:-InlineMathNatives disables natives from the Math,Float and Double classes. ! if (method_holder == vmSymbols::java_lang_Math() || ! method_holder == vmSymbols::java_lang_Float() || ! method_holder == vmSymbols::java_lang_Double()) { ! if (!InlineMathNatives) return false; } // -XX:-InlineUnsafeOps disables natives from the Unsafe class. ! if (method_holder == vmSymbols::sun_misc_Unsafe()) { ! if (!InlineUnsafeOps) return false; ! } ! ! return true; ! } ! ! //---------------------------make_vm_intrinsic---------------------------- ! CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) { ! vmIntrinsics::ID id = m->intrinsic_id(); ! assert(id != vmIntrinsics::_none, "must be a VM intrinsic"); ! ! if (!m->is_loaded()) { ! // Do not attempt to inline unloaded methods. ! return NULL; } ! bool is_available = false; ! { ! // For calling is_intrinsic_available we need to transition to ! // the '_thread_in_vm' stat because is_intrinsic_available_for() ! // accesses VM-internal data. ! VM_ENTRY_MARK; ! methodHandle mh(THREAD, m->get_Method()); ! methodHandle ct(THREAD, method()->get_Method()); ! is_available = is_intrinsic_available_for(mh(), ct(), is_virtual); ! } ! ! if (is_available) { ! assert(id <= vmIntrinsics::LAST_COMPILER_INLINE, "caller responsibility"); ! assert(id != vmIntrinsics::_Object_init && id != vmIntrinsics::_invoke, "enum out of order?"); ! return new LibraryIntrinsic(m, is_virtual, ! intrinsic_predicates_needed_for(id), ! intrinsic_does_virtual_dispatch_for(id), ! (vmIntrinsics::ID) id); ! } else { ! return NULL; ! } } //----------------------register_library_intrinsics----------------------- // Initialize this file's data structures, for each Compile instance. void Compile::register_library_intrinsics() {
src/share/vm/opto/library_call.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File