Mercurial > hg > truffle
comparison src/share/vm/opto/library_call.cpp @ 6006:0105f367a14c
7160570: Intrinsification support for tracing framework
Reviewed-by: sla, never
author | rbackman |
---|---|
date | Tue, 06 Mar 2012 12:36:59 +0100 |
parents | 61b82be3b1ff |
children | 8f972594effc |
comparison
equal
deleted
inserted
replaced
6005:c263e0e9f14b | 6006:0105f367a14c |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
173 bool inline_unsafe_access(bool is_native_ptr, bool is_store, BasicType type, bool is_volatile); | 173 bool inline_unsafe_access(bool is_native_ptr, bool is_store, BasicType type, bool is_volatile); |
174 bool inline_unsafe_prefetch(bool is_native_ptr, bool is_store, bool is_static); | 174 bool inline_unsafe_prefetch(bool is_native_ptr, bool is_store, bool is_static); |
175 bool inline_unsafe_allocate(); | 175 bool inline_unsafe_allocate(); |
176 bool inline_unsafe_copyMemory(); | 176 bool inline_unsafe_copyMemory(); |
177 bool inline_native_currentThread(); | 177 bool inline_native_currentThread(); |
178 bool inline_native_time_funcs(bool isNano); | 178 #ifdef TRACE_HAVE_INTRINSICS |
179 bool inline_native_classID(); | |
180 bool inline_native_threadID(); | |
181 #endif | |
182 bool inline_native_time_funcs(address method, const char* funcName); | |
179 bool inline_native_isInterrupted(); | 183 bool inline_native_isInterrupted(); |
180 bool inline_native_Class_query(vmIntrinsics::ID id); | 184 bool inline_native_Class_query(vmIntrinsics::ID id); |
181 bool inline_native_subtype_check(); | 185 bool inline_native_subtype_check(); |
182 | 186 |
183 bool inline_native_newArray(); | 187 bool inline_native_newArray(); |
636 case vmIntrinsics::_currentThread: | 640 case vmIntrinsics::_currentThread: |
637 return inline_native_currentThread(); | 641 return inline_native_currentThread(); |
638 case vmIntrinsics::_isInterrupted: | 642 case vmIntrinsics::_isInterrupted: |
639 return inline_native_isInterrupted(); | 643 return inline_native_isInterrupted(); |
640 | 644 |
645 #ifdef TRACE_HAVE_INTRINSICS | |
646 case vmIntrinsics::_classID: | |
647 return inline_native_classID(); | |
648 case vmIntrinsics::_threadID: | |
649 return inline_native_threadID(); | |
650 case vmIntrinsics::_counterTime: | |
651 return inline_native_time_funcs(CAST_FROM_FN_PTR(address, TRACE_TIME_METHOD), "counterTime"); | |
652 #endif | |
641 case vmIntrinsics::_currentTimeMillis: | 653 case vmIntrinsics::_currentTimeMillis: |
642 return inline_native_time_funcs(false); | 654 return inline_native_time_funcs(CAST_FROM_FN_PTR(address, os::javaTimeMillis), "currentTimeMillis"); |
643 case vmIntrinsics::_nanoTime: | 655 case vmIntrinsics::_nanoTime: |
644 return inline_native_time_funcs(true); | 656 return inline_native_time_funcs(CAST_FROM_FN_PTR(address, os::javaTimeNanos), "nanoTime"); |
645 case vmIntrinsics::_allocateInstance: | 657 case vmIntrinsics::_allocateInstance: |
646 return inline_unsafe_allocate(); | 658 return inline_unsafe_allocate(); |
647 case vmIntrinsics::_copyMemory: | 659 case vmIntrinsics::_copyMemory: |
648 return inline_unsafe_copyMemory(); | 660 return inline_unsafe_copyMemory(); |
649 case vmIntrinsics::_newArray: | 661 case vmIntrinsics::_newArray: |
2838 push(obj); | 2850 push(obj); |
2839 | 2851 |
2840 return true; | 2852 return true; |
2841 } | 2853 } |
2842 | 2854 |
2855 #ifdef TRACE_HAVE_INTRINSICS | |
2856 /* | |
2857 * oop -> myklass | |
2858 * myklass->trace_id |= USED | |
2859 * return myklass->trace_id & ~0x3 | |
2860 */ | |
2861 bool LibraryCallKit::inline_native_classID() { | |
2862 int nargs = 1 + 1; | |
2863 null_check_receiver(callee()); // check then ignore argument(0) | |
2864 _sp += nargs; | |
2865 Node* cls = do_null_check(argument(1), T_OBJECT); | |
2866 _sp -= nargs; | |
2867 Node* kls = load_klass_from_mirror(cls, false, nargs, NULL, 0); | |
2868 _sp += nargs; | |
2869 kls = do_null_check(kls, T_OBJECT); | |
2870 _sp -= nargs; | |
2871 ByteSize offset = TRACE_ID_OFFSET; | |
2872 Node* insp = basic_plus_adr(kls, in_bytes(offset)); | |
2873 Node* tvalue = make_load(NULL, insp, TypeLong::LONG, T_LONG); | |
2874 Node* bits = longcon(~0x03l); // ignore bit 0 & 1 | |
2875 Node* andl = _gvn.transform(new (C, 3) AndLNode(tvalue, bits)); | |
2876 Node* clsused = longcon(0x01l); // set the class bit | |
2877 Node* orl = _gvn.transform(new (C, 3) OrLNode(tvalue, clsused)); | |
2878 | |
2879 const TypePtr *adr_type = _gvn.type(insp)->isa_ptr(); | |
2880 store_to_memory(control(), insp, orl, T_LONG, adr_type); | |
2881 push_pair(andl); | |
2882 return true; | |
2883 } | |
2884 | |
2885 bool LibraryCallKit::inline_native_threadID() { | |
2886 Node* tls_ptr = NULL; | |
2887 Node* cur_thr = generate_current_thread(tls_ptr); | |
2888 Node* p = basic_plus_adr(top()/*!oop*/, tls_ptr, in_bytes(JavaThread::osthread_offset())); | |
2889 Node* osthread = make_load(NULL, p, TypeRawPtr::NOTNULL, T_ADDRESS); | |
2890 p = basic_plus_adr(top()/*!oop*/, osthread, in_bytes(OSThread::thread_id_offset())); | |
2891 | |
2892 Node* threadid = NULL; | |
2893 size_t thread_id_size = OSThread::thread_id_size(); | |
2894 if (thread_id_size == (size_t) BytesPerLong) { | |
2895 threadid = ConvL2I(make_load(control(), p, TypeLong::LONG, T_LONG)); | |
2896 push(threadid); | |
2897 } else if (thread_id_size == (size_t) BytesPerInt) { | |
2898 threadid = make_load(control(), p, TypeInt::INT, T_INT); | |
2899 push(threadid); | |
2900 } else { | |
2901 ShouldNotReachHere(); | |
2902 } | |
2903 return true; | |
2904 } | |
2905 #endif | |
2906 | |
2843 //------------------------inline_native_time_funcs-------------- | 2907 //------------------------inline_native_time_funcs-------------- |
2844 // inline code for System.currentTimeMillis() and System.nanoTime() | 2908 // inline code for System.currentTimeMillis() and System.nanoTime() |
2845 // these have the same type and signature | 2909 // these have the same type and signature |
2846 bool LibraryCallKit::inline_native_time_funcs(bool isNano) { | 2910 bool LibraryCallKit::inline_native_time_funcs(address funcAddr, const char* funcName) { |
2847 address funcAddr = isNano ? CAST_FROM_FN_PTR(address, os::javaTimeNanos) : | 2911 const TypeFunc *tf = OptoRuntime::void_long_Type(); |
2848 CAST_FROM_FN_PTR(address, os::javaTimeMillis); | |
2849 const char * funcName = isNano ? "nanoTime" : "currentTimeMillis"; | |
2850 const TypeFunc *tf = OptoRuntime::current_time_millis_Type(); | |
2851 const TypePtr* no_memory_effects = NULL; | 2912 const TypePtr* no_memory_effects = NULL; |
2852 Node* time = make_runtime_call(RC_LEAF, tf, funcAddr, funcName, no_memory_effects); | 2913 Node* time = make_runtime_call(RC_LEAF, tf, funcAddr, funcName, no_memory_effects); |
2853 Node* value = _gvn.transform(new (C, 1) ProjNode(time, TypeFunc::Parms+0)); | 2914 Node* value = _gvn.transform(new (C, 1) ProjNode(time, TypeFunc::Parms+0)); |
2854 #ifdef ASSERT | 2915 #ifdef ASSERT |
2855 Node* value_top = _gvn.transform(new (C, 1) ProjNode(time, TypeFunc::Parms + 1)); | 2916 Node* value_top = _gvn.transform(new (C, 1) ProjNode(time, TypeFunc::Parms + 1)); |