< prev index next >

src/hotspot/share/c1/c1_LIRGenerator.cpp

Print this page
rev 49619 : JEP 328 : Flight Recorder open source preview


3109   LIR_Opr klass = new_register(T_METADATA);
3110   __ move(new LIR_Address(arg.result(), java_lang_Class::klass_offset_in_bytes(), T_ADDRESS), klass, info);
3111   LIR_Opr id = new_register(T_LONG);
3112   ByteSize offset = TRACE_KLASS_TRACE_ID_OFFSET;
3113   LIR_Address* trace_id_addr = new LIR_Address(klass, in_bytes(offset), T_LONG);
3114 
3115   __ move(trace_id_addr, id);
3116   __ logical_or(id, LIR_OprFact::longConst(0x01l), id);
3117   __ store(id, trace_id_addr);
3118 
3119 #ifdef TRACE_ID_META_BITS
3120   __ logical_and(id, LIR_OprFact::longConst(~TRACE_ID_META_BITS), id);
3121 #endif
3122 #ifdef TRACE_ID_CLASS_SHIFT
3123   __ unsigned_shift_right(id, TRACE_ID_CLASS_SHIFT, id);
3124 #endif
3125 
3126   __ move(id, rlock_result(x));
3127 }
3128 
3129 void LIRGenerator::do_getBufferWriter(Intrinsic* x) {
3130   LabelObj* L_end = new LabelObj();
3131 
3132   LIR_Address* jobj_addr = new LIR_Address(getThreadPointer(),
3133                                            in_bytes(TRACE_THREAD_DATA_WRITER_OFFSET),
3134                                            T_OBJECT);
3135   LIR_Opr result = rlock_result(x);
3136   __ move_wide(jobj_addr, result);
3137   __ cmp(lir_cond_equal, result, LIR_OprFact::oopConst(NULL));
3138   __ branch(lir_cond_equal, T_OBJECT, L_end->label());
3139   __ move_wide(new LIR_Address(result, T_OBJECT), result);
3140 
3141   __ branch_destination(L_end->label());
3142 }
3143 
3144 #endif
3145 
3146 
3147 void LIRGenerator::do_RuntimeCall(address routine, Intrinsic* x) {
3148   assert(x->number_of_arguments() == 0, "wrong type");
3149   // Enforce computation of _reserved_argument_area_size which is required on some platforms.


3155   LIR_Opr result = rlock_result(x);
3156   __ move(reg, result);
3157 }
3158 
3159 
3160 
3161 void LIRGenerator::do_Intrinsic(Intrinsic* x) {
3162   switch (x->id()) {
3163   case vmIntrinsics::_intBitsToFloat      :
3164   case vmIntrinsics::_doubleToRawLongBits :
3165   case vmIntrinsics::_longBitsToDouble    :
3166   case vmIntrinsics::_floatToRawIntBits   : {
3167     do_FPIntrinsics(x);
3168     break;
3169   }
3170 
3171 #ifdef TRACE_HAVE_INTRINSICS
3172   case vmIntrinsics::_getClassId:
3173     do_ClassIDIntrinsic(x);
3174     break;
3175   case vmIntrinsics::_getBufferWriter:
3176     do_getBufferWriter(x);
3177     break;
3178   case vmIntrinsics::_counterTime:
3179     do_RuntimeCall(CAST_FROM_FN_PTR(address, TRACE_TIME_METHOD), x);
3180     break;
3181 #endif
3182 
3183   case vmIntrinsics::_currentTimeMillis:
3184     do_RuntimeCall(CAST_FROM_FN_PTR(address, os::javaTimeMillis), x);
3185     break;
3186 
3187   case vmIntrinsics::_nanoTime:
3188     do_RuntimeCall(CAST_FROM_FN_PTR(address, os::javaTimeNanos), x);
3189     break;
3190 
3191   case vmIntrinsics::_Object_init:    do_RegisterFinalizer(x); break;
3192   case vmIntrinsics::_isInstance:     do_isInstance(x);    break;
3193   case vmIntrinsics::_isPrimitive:    do_isPrimitive(x);   break;
3194   case vmIntrinsics::_getClass:       do_getClass(x);      break;
3195   case vmIntrinsics::_currentThread:  do_currentThread(x); break;
3196 




3109   LIR_Opr klass = new_register(T_METADATA);
3110   __ move(new LIR_Address(arg.result(), java_lang_Class::klass_offset_in_bytes(), T_ADDRESS), klass, info);
3111   LIR_Opr id = new_register(T_LONG);
3112   ByteSize offset = TRACE_KLASS_TRACE_ID_OFFSET;
3113   LIR_Address* trace_id_addr = new LIR_Address(klass, in_bytes(offset), T_LONG);
3114 
3115   __ move(trace_id_addr, id);
3116   __ logical_or(id, LIR_OprFact::longConst(0x01l), id);
3117   __ store(id, trace_id_addr);
3118 
3119 #ifdef TRACE_ID_META_BITS
3120   __ logical_and(id, LIR_OprFact::longConst(~TRACE_ID_META_BITS), id);
3121 #endif
3122 #ifdef TRACE_ID_CLASS_SHIFT
3123   __ unsigned_shift_right(id, TRACE_ID_CLASS_SHIFT, id);
3124 #endif
3125 
3126   __ move(id, rlock_result(x));
3127 }
3128 
3129 void LIRGenerator::do_getEventWriter(Intrinsic* x) {
3130   LabelObj* L_end = new LabelObj();
3131 
3132   LIR_Address* jobj_addr = new LIR_Address(getThreadPointer(),
3133                                            in_bytes(TRACE_THREAD_DATA_WRITER_OFFSET),
3134                                            T_OBJECT);
3135   LIR_Opr result = rlock_result(x);
3136   __ move_wide(jobj_addr, result);
3137   __ cmp(lir_cond_equal, result, LIR_OprFact::oopConst(NULL));
3138   __ branch(lir_cond_equal, T_OBJECT, L_end->label());
3139   __ move_wide(new LIR_Address(result, T_OBJECT), result);
3140 
3141   __ branch_destination(L_end->label());
3142 }
3143 
3144 #endif
3145 
3146 
3147 void LIRGenerator::do_RuntimeCall(address routine, Intrinsic* x) {
3148   assert(x->number_of_arguments() == 0, "wrong type");
3149   // Enforce computation of _reserved_argument_area_size which is required on some platforms.


3155   LIR_Opr result = rlock_result(x);
3156   __ move(reg, result);
3157 }
3158 
3159 
3160 
3161 void LIRGenerator::do_Intrinsic(Intrinsic* x) {
3162   switch (x->id()) {
3163   case vmIntrinsics::_intBitsToFloat      :
3164   case vmIntrinsics::_doubleToRawLongBits :
3165   case vmIntrinsics::_longBitsToDouble    :
3166   case vmIntrinsics::_floatToRawIntBits   : {
3167     do_FPIntrinsics(x);
3168     break;
3169   }
3170 
3171 #ifdef TRACE_HAVE_INTRINSICS
3172   case vmIntrinsics::_getClassId:
3173     do_ClassIDIntrinsic(x);
3174     break;
3175   case vmIntrinsics::_getEventWriter:
3176     do_getEventWriter(x);
3177     break;
3178   case vmIntrinsics::_counterTime:
3179     do_RuntimeCall(CAST_FROM_FN_PTR(address, TRACE_TIME_METHOD), x);
3180     break;
3181 #endif
3182 
3183   case vmIntrinsics::_currentTimeMillis:
3184     do_RuntimeCall(CAST_FROM_FN_PTR(address, os::javaTimeMillis), x);
3185     break;
3186 
3187   case vmIntrinsics::_nanoTime:
3188     do_RuntimeCall(CAST_FROM_FN_PTR(address, os::javaTimeNanos), x);
3189     break;
3190 
3191   case vmIntrinsics::_Object_init:    do_RegisterFinalizer(x); break;
3192   case vmIntrinsics::_isInstance:     do_isInstance(x);    break;
3193   case vmIntrinsics::_isPrimitive:    do_isPrimitive(x);   break;
3194   case vmIntrinsics::_getClass:       do_getClass(x);      break;
3195   case vmIntrinsics::_currentThread:  do_currentThread(x); break;
3196 


< prev index next >