40 #include "runtime/sharedRuntime.hpp" |
40 #include "runtime/sharedRuntime.hpp" |
41 #include "runtime/stubRoutines.hpp" |
41 #include "runtime/stubRoutines.hpp" |
42 #include "runtime/vm_version.hpp" |
42 #include "runtime/vm_version.hpp" |
43 #include "utilities/bitMap.inline.hpp" |
43 #include "utilities/bitMap.inline.hpp" |
44 #include "utilities/macros.hpp" |
44 #include "utilities/macros.hpp" |
45 #ifdef TRACE_HAVE_INTRINSICS |
|
46 #include "trace/traceMacros.hpp" |
|
47 #endif |
|
48 |
45 |
49 #ifdef ASSERT |
46 #ifdef ASSERT |
50 #define __ gen()->lir(__FILE__, __LINE__)-> |
47 #define __ gen()->lir(__FILE__, __LINE__)-> |
51 #else |
48 #else |
52 #define __ gen()->lir()-> |
49 #define __ gen()->lir()-> |
2914 |
2911 |
2915 __ cmp(lir_cond(x->cond()), left.result(), right.result()); |
2912 __ cmp(lir_cond(x->cond()), left.result(), right.result()); |
2916 __ cmove(lir_cond(x->cond()), t_val.result(), f_val.result(), reg, as_BasicType(x->x()->type())); |
2913 __ cmove(lir_cond(x->cond()), t_val.result(), f_val.result(), reg, as_BasicType(x->x()->type())); |
2917 } |
2914 } |
2918 |
2915 |
2919 #ifdef TRACE_HAVE_INTRINSICS |
2916 #ifdef JFR_HAVE_INTRINSICS |
2920 void LIRGenerator::do_ClassIDIntrinsic(Intrinsic* x) { |
2917 void LIRGenerator::do_ClassIDIntrinsic(Intrinsic* x) { |
2921 CodeEmitInfo* info = state_for(x); |
2918 CodeEmitInfo* info = state_for(x); |
2922 CodeEmitInfo* info2 = new CodeEmitInfo(info); // Clone for the second null check |
2919 CodeEmitInfo* info2 = new CodeEmitInfo(info); // Clone for the second null check |
2923 |
2920 |
2924 assert(info != NULL, "must have info"); |
2921 assert(info != NULL, "must have info"); |
2926 |
2923 |
2927 arg.load_item(); |
2924 arg.load_item(); |
2928 LIR_Opr klass = new_register(T_METADATA); |
2925 LIR_Opr klass = new_register(T_METADATA); |
2929 __ move(new LIR_Address(arg.result(), java_lang_Class::klass_offset_in_bytes(), T_ADDRESS), klass, info); |
2926 __ move(new LIR_Address(arg.result(), java_lang_Class::klass_offset_in_bytes(), T_ADDRESS), klass, info); |
2930 LIR_Opr id = new_register(T_LONG); |
2927 LIR_Opr id = new_register(T_LONG); |
2931 ByteSize offset = TRACE_KLASS_TRACE_ID_OFFSET; |
2928 ByteSize offset = KLASS_TRACE_ID_OFFSET; |
2932 LIR_Address* trace_id_addr = new LIR_Address(klass, in_bytes(offset), T_LONG); |
2929 LIR_Address* trace_id_addr = new LIR_Address(klass, in_bytes(offset), T_LONG); |
2933 |
2930 |
2934 __ move(trace_id_addr, id); |
2931 __ move(trace_id_addr, id); |
2935 __ logical_or(id, LIR_OprFact::longConst(0x01l), id); |
2932 __ logical_or(id, LIR_OprFact::longConst(0x01l), id); |
2936 __ store(id, trace_id_addr); |
2933 __ store(id, trace_id_addr); |
2937 |
2934 |
2938 #ifdef TRACE_ID_META_BITS |
2935 #ifdef TRACE_ID_META_BITS |
2939 __ logical_and(id, LIR_OprFact::longConst(~TRACE_ID_META_BITS), id); |
2936 __ logical_and(id, LIR_OprFact::longConst(~TRACE_ID_META_BITS), id); |
2940 #endif |
2937 #endif |
2941 #ifdef TRACE_ID_CLASS_SHIFT |
2938 #ifdef TRACE_ID_SHIFT |
2942 __ unsigned_shift_right(id, TRACE_ID_CLASS_SHIFT, id); |
2939 __ unsigned_shift_right(id, TRACE_ID_SHIFT, id); |
2943 #endif |
2940 #endif |
2944 |
2941 |
2945 __ move(id, rlock_result(x)); |
2942 __ move(id, rlock_result(x)); |
2946 } |
2943 } |
2947 |
2944 |
2948 void LIRGenerator::do_getBufferWriter(Intrinsic* x) { |
2945 void LIRGenerator::do_getEventWriter(Intrinsic* x) { |
2949 LabelObj* L_end = new LabelObj(); |
2946 LabelObj* L_end = new LabelObj(); |
2950 |
2947 |
2951 LIR_Address* jobj_addr = new LIR_Address(getThreadPointer(), |
2948 LIR_Address* jobj_addr = new LIR_Address(getThreadPointer(), |
2952 in_bytes(TRACE_THREAD_DATA_WRITER_OFFSET), |
2949 in_bytes(THREAD_LOCAL_WRITER_OFFSET_JFR), |
2953 T_OBJECT); |
2950 T_OBJECT); |
2954 LIR_Opr result = rlock_result(x); |
2951 LIR_Opr result = rlock_result(x); |
2955 __ move_wide(jobj_addr, result); |
2952 __ move_wide(jobj_addr, result); |
2956 __ cmp(lir_cond_equal, result, LIR_OprFact::oopConst(NULL)); |
2953 __ cmp(lir_cond_equal, result, LIR_OprFact::oopConst(NULL)); |
2957 __ branch(lir_cond_equal, T_OBJECT, L_end->label()); |
2954 __ branch(lir_cond_equal, T_OBJECT, L_end->label()); |
2985 case vmIntrinsics::_floatToRawIntBits : { |
2982 case vmIntrinsics::_floatToRawIntBits : { |
2986 do_FPIntrinsics(x); |
2983 do_FPIntrinsics(x); |
2987 break; |
2984 break; |
2988 } |
2985 } |
2989 |
2986 |
2990 #ifdef TRACE_HAVE_INTRINSICS |
2987 #ifdef JFR_HAVE_INTRINSICS |
2991 case vmIntrinsics::_getClassId: |
2988 case vmIntrinsics::_getClassId: |
2992 do_ClassIDIntrinsic(x); |
2989 do_ClassIDIntrinsic(x); |
2993 break; |
2990 break; |
2994 case vmIntrinsics::_getBufferWriter: |
2991 case vmIntrinsics::_getEventWriter: |
2995 do_getBufferWriter(x); |
2992 do_getEventWriter(x); |
2996 break; |
2993 break; |
2997 case vmIntrinsics::_counterTime: |
2994 case vmIntrinsics::_counterTime: |
2998 do_RuntimeCall(CAST_FROM_FN_PTR(address, TRACE_TIME_METHOD), x); |
2995 do_RuntimeCall(CAST_FROM_FN_PTR(address, JFR_TIME_FUNCTION), x); |
2999 break; |
2996 break; |
3000 #endif |
2997 #endif |
3001 |
2998 |
3002 case vmIntrinsics::_currentTimeMillis: |
2999 case vmIntrinsics::_currentTimeMillis: |
3003 do_RuntimeCall(CAST_FROM_FN_PTR(address, os::javaTimeMillis), x); |
3000 do_RuntimeCall(CAST_FROM_FN_PTR(address, os::javaTimeMillis), x); |