< prev index next >
src/share/vm/opto/library_call.cpp
Print this page
*** 25,34 ****
--- 25,35 ----
#include "precompiled.hpp"
#include "classfile/systemDictionary.hpp"
#include "classfile/vmSymbols.hpp"
#include "compiler/compileBroker.hpp"
#include "compiler/compileLog.hpp"
+ #include "jfr/support/jfrIntrinsics.hpp"
#include "oops/objArrayKlass.hpp"
#include "opto/addnode.hpp"
#include "opto/callGenerator.hpp"
#include "opto/cfgnode.hpp"
#include "opto/connode.hpp"
*** 38,48 ****
#include "opto/parse.hpp"
#include "opto/runtime.hpp"
#include "opto/subnode.hpp"
#include "prims/nativeLookup.hpp"
#include "runtime/sharedRuntime.hpp"
! #include "trace/traceMacros.hpp"
class LibraryIntrinsic : public InlineCallGenerator {
// Extend the set of intrinsics known to the runtime:
public:
private:
--- 39,49 ----
#include "opto/parse.hpp"
#include "opto/runtime.hpp"
#include "opto/subnode.hpp"
#include "prims/nativeLookup.hpp"
#include "runtime/sharedRuntime.hpp"
! #include "utilities/macros.hpp"
class LibraryIntrinsic : public InlineCallGenerator {
// Extend the set of intrinsics known to the runtime:
public:
private:
*** 234,246 ****
bool inline_unsafe_prefetch(bool is_native_ptr, bool is_store, bool is_static);
static bool klass_needs_init_guard(Node* kls);
bool inline_unsafe_allocate();
bool inline_unsafe_copyMemory();
bool inline_native_currentThread();
! #ifdef TRACE_HAVE_INTRINSICS
bool inline_native_classID();
! bool inline_native_threadID();
#endif
bool inline_native_time_funcs(address method, const char* funcName);
bool inline_native_isInterrupted();
bool inline_native_Class_query(vmIntrinsics::ID id);
bool inline_native_subtype_check();
--- 235,247 ----
bool inline_unsafe_prefetch(bool is_native_ptr, bool is_store, bool is_static);
static bool klass_needs_init_guard(Node* kls);
bool inline_unsafe_allocate();
bool inline_unsafe_copyMemory();
bool inline_native_currentThread();
! #ifdef JFR_HAVE_INTRINSICS
bool inline_native_classID();
! bool inline_native_getEventWriter();
#endif
bool inline_native_time_funcs(address method, const char* funcName);
bool inline_native_isInterrupted();
bool inline_native_Class_query(vmIntrinsics::ID id);
bool inline_native_subtype_check();
*** 877,890 ****
case vmIntrinsics::_fullFence: return inline_unsafe_fence(intrinsic_id());
case vmIntrinsics::_currentThread: return inline_native_currentThread();
case vmIntrinsics::_isInterrupted: return inline_native_isInterrupted();
! #ifdef TRACE_HAVE_INTRINSICS
! case vmIntrinsics::_classID: return inline_native_classID();
! case vmIntrinsics::_threadID: return inline_native_threadID();
! case vmIntrinsics::_counterTime: return inline_native_time_funcs(CAST_FROM_FN_PTR(address, TRACE_TIME_METHOD), "counterTime");
#endif
case vmIntrinsics::_currentTimeMillis: return inline_native_time_funcs(CAST_FROM_FN_PTR(address, os::javaTimeMillis), "currentTimeMillis");
case vmIntrinsics::_nanoTime: return inline_native_time_funcs(CAST_FROM_FN_PTR(address, os::javaTimeNanos), "nanoTime");
case vmIntrinsics::_allocateInstance: return inline_unsafe_allocate();
case vmIntrinsics::_copyMemory: return inline_unsafe_copyMemory();
--- 878,891 ----
case vmIntrinsics::_fullFence: return inline_unsafe_fence(intrinsic_id());
case vmIntrinsics::_currentThread: return inline_native_currentThread();
case vmIntrinsics::_isInterrupted: return inline_native_isInterrupted();
! #ifdef JFR_HAVE_INTRINSICS
! case vmIntrinsics::_counterTime: return inline_native_time_funcs(CAST_FROM_FN_PTR(address, JFR_TIME_FUNCTION), "counterTime");
! case vmIntrinsics::_getClassId: return inline_native_classID();
! case vmIntrinsics::_getEventWriter: return inline_native_getEventWriter();
#endif
case vmIntrinsics::_currentTimeMillis: return inline_native_time_funcs(CAST_FROM_FN_PTR(address, os::javaTimeMillis), "currentTimeMillis");
case vmIntrinsics::_nanoTime: return inline_native_time_funcs(CAST_FROM_FN_PTR(address, os::javaTimeNanos), "nanoTime");
case vmIntrinsics::_allocateInstance: return inline_unsafe_allocate();
case vmIntrinsics::_copyMemory: return inline_unsafe_copyMemory();
*** 3263,3317 ****
Node* obj = new_instance(kls, test);
set_result(obj);
return true;
}
! #ifdef TRACE_HAVE_INTRINSICS
/*
* oop -> myklass
* myklass->trace_id |= USED
* return myklass->trace_id & ~0x3
*/
bool LibraryCallKit::inline_native_classID() {
! null_check_receiver(); // null-check, then ignore
! Node* cls = null_check(argument(1), T_OBJECT);
Node* kls = load_klass_from_mirror(cls, false, NULL, 0);
kls = null_check(kls, T_OBJECT);
! ByteSize offset = TRACE_ID_OFFSET;
Node* insp = basic_plus_adr(kls, in_bytes(offset));
Node* tvalue = make_load(NULL, insp, TypeLong::LONG, T_LONG, MemNode::unordered);
! Node* bits = longcon(~0x03l); // ignore bit 0 & 1
! Node* andl = _gvn.transform(new (C) AndLNode(tvalue, bits));
Node* clsused = longcon(0x01l); // set the class bit
Node* orl = _gvn.transform(new (C) OrLNode(tvalue, clsused));
-
const TypePtr *adr_type = _gvn.type(insp)->isa_ptr();
store_to_memory(control(), insp, orl, T_LONG, adr_type, MemNode::unordered);
! set_result(andl);
return true;
}
! bool LibraryCallKit::inline_native_threadID() {
! Node* tls_ptr = NULL;
! Node* cur_thr = generate_current_thread(tls_ptr);
! Node* p = basic_plus_adr(top()/*!oop*/, tls_ptr, in_bytes(JavaThread::osthread_offset()));
! Node* osthread = make_load(NULL, p, TypeRawPtr::NOTNULL, T_ADDRESS, MemNode::unordered);
! p = basic_plus_adr(top()/*!oop*/, osthread, in_bytes(OSThread::thread_id_offset()));
!
! Node* threadid = NULL;
! size_t thread_id_size = OSThread::thread_id_size();
! if (thread_id_size == (size_t) BytesPerLong) {
! threadid = ConvL2I(make_load(control(), p, TypeLong::LONG, T_LONG, MemNode::unordered));
! } else if (thread_id_size == (size_t) BytesPerInt) {
! threadid = make_load(control(), p, TypeInt::INT, T_INT, MemNode::unordered);
! } else {
! ShouldNotReachHere();
! }
! set_result(threadid);
return true;
}
! #endif
//------------------------inline_native_time_funcs--------------
// inline code for System.currentTimeMillis() and System.nanoTime()
// these have the same type and signature
bool LibraryCallKit::inline_native_time_funcs(address funcAddr, const char* funcName) {
--- 3264,3343 ----
Node* obj = new_instance(kls, test);
set_result(obj);
return true;
}
! #ifdef JFR_HAVE_INTRINSICS
/*
* oop -> myklass
* myklass->trace_id |= USED
* return myklass->trace_id & ~0x3
*/
bool LibraryCallKit::inline_native_classID() {
! Node* cls = null_check(argument(0), T_OBJECT);
Node* kls = load_klass_from_mirror(cls, false, NULL, 0);
kls = null_check(kls, T_OBJECT);
!
! ByteSize offset = KLASS_TRACE_ID_OFFSET;
Node* insp = basic_plus_adr(kls, in_bytes(offset));
Node* tvalue = make_load(NULL, insp, TypeLong::LONG, T_LONG, MemNode::unordered);
!
Node* clsused = longcon(0x01l); // set the class bit
Node* orl = _gvn.transform(new (C) OrLNode(tvalue, clsused));
const TypePtr *adr_type = _gvn.type(insp)->isa_ptr();
store_to_memory(control(), insp, orl, T_LONG, adr_type, MemNode::unordered);
!
! #ifdef TRACE_ID_META_BITS
! Node* mbits = longcon(~TRACE_ID_META_BITS);
! tvalue = _gvn.transform(new (C) AndLNode(tvalue, mbits));
! #endif
! #ifdef TRACE_ID_SHIFT
! Node* cbits = intcon(TRACE_ID_SHIFT);
! tvalue = _gvn.transform(new (C) URShiftLNode(tvalue, cbits));
! #endif
!
! set_result(tvalue);
return true;
}
! bool LibraryCallKit::inline_native_getEventWriter() {
! Node* tls_ptr = _gvn.transform(new (C) ThreadLocalNode());
!
! Node* jobj_ptr = basic_plus_adr(top(), tls_ptr,
! in_bytes(THREAD_LOCAL_WRITER_OFFSET_JFR)
! );
!
! Node* jobj = make_load(control(), jobj_ptr, TypeRawPtr::BOTTOM, T_ADDRESS, MemNode::unordered);
!
! Node* jobj_cmp_null = _gvn.transform( new (C) CmpPNode(jobj, null()) );
! Node* test_jobj_eq_null = _gvn.transform( new (C) BoolNode(jobj_cmp_null, BoolTest::eq) );
!
! IfNode* iff_jobj_null =
! create_and_map_if(control(), test_jobj_eq_null, PROB_MIN, COUNT_UNKNOWN);
!
! enum { _normal_path = 1,
! _null_path = 2,
! PATH_LIMIT };
!
! RegionNode* result_rgn = new (C) RegionNode(PATH_LIMIT);
! PhiNode* result_val = new (C) PhiNode(result_rgn, TypePtr::BOTTOM);
!
! Node* jobj_is_null = _gvn.transform(new (C) IfTrueNode(iff_jobj_null));
! result_rgn->init_req(_null_path, jobj_is_null);
! result_val->init_req(_null_path, null());
!
! Node* jobj_is_not_null = _gvn.transform(new (C) IfFalseNode(iff_jobj_null));
! result_rgn->init_req(_normal_path, jobj_is_not_null);
!
! Node* res = make_load(jobj_is_not_null, jobj, TypeInstPtr::NOTNULL, T_OBJECT, MemNode::unordered);
! result_val->init_req(_normal_path, res);
!
! set_result(result_rgn, result_val);
!
return true;
}
! #endif // JFR_HAVE_INTRINSICS
//------------------------inline_native_time_funcs--------------
// inline code for System.currentTimeMillis() and System.nanoTime()
// these have the same type and signature
bool LibraryCallKit::inline_native_time_funcs(address funcAddr, const char* funcName) {
< prev index next >