src/hotspot/share/c1/c1_LIRGenerator.cpp
changeset 50113 caf115bb98ad
parent 50094 2f79462aab9b
child 50153 9010b580d8a9
equal deleted inserted replaced
50112:7a2a740815b7 50113:caf115bb98ad
    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);