< prev index next >
src/share/vm/c1/c1_LIRGenerator.cpp
Print this page
*** 3053,3062 ****
--- 3053,3107 ----
__ cmp(lir_cond(x->cond()), left.result(), right.result());
__ cmove(lir_cond(x->cond()), t_val.result(), f_val.result(), reg, as_BasicType(x->x()->type()));
}
+ #ifdef JFR_HAVE_INTRINSICS
+ void LIRGenerator::do_ClassIDIntrinsic(Intrinsic* x) {
+ CodeEmitInfo* info = state_for(x);
+ CodeEmitInfo* info2 = new CodeEmitInfo(info); // Clone for the second null check
+
+ assert(info != NULL, "must have info");
+ LIRItem arg(x->argument_at(0), this);
+
+ arg.load_item();
+ LIR_Opr klass = new_register(T_METADATA);
+ __ move(new LIR_Address(arg.result(), java_lang_Class::klass_offset_in_bytes(), T_ADDRESS), klass, info);
+ LIR_Opr id = new_register(T_LONG);
+ ByteSize offset = KLASS_TRACE_ID_OFFSET;
+ LIR_Address* trace_id_addr = new LIR_Address(klass, in_bytes(offset), T_LONG);
+
+ __ move(trace_id_addr, id);
+ __ logical_or(id, LIR_OprFact::longConst(0x01l), id);
+ __ store(id, trace_id_addr);
+
+ #ifdef TRACE_ID_META_BITS
+ __ logical_and(id, LIR_OprFact::longConst(~TRACE_ID_META_BITS), id);
+ #endif
+ #ifdef TRACE_ID_SHIFT
+ __ unsigned_shift_right(id, TRACE_ID_SHIFT, id);
+ #endif
+
+ __ move(id, rlock_result(x));
+ }
+
+ void LIRGenerator::do_getEventWriter(Intrinsic* x) {
+ LabelObj* L_end = new LabelObj();
+
+ LIR_Address* jobj_addr = new LIR_Address(getThreadPointer(),
+ in_bytes(THREAD_LOCAL_WRITER_OFFSET_JFR),
+ T_OBJECT);
+ LIR_Opr result = rlock_result(x);
+ __ move_wide(jobj_addr, result);
+ __ cmp(lir_cond_equal, result, LIR_OprFact::oopConst(NULL));
+ __ branch(lir_cond_equal, T_OBJECT, L_end->label());
+ __ move_wide(new LIR_Address(result, T_OBJECT), result);
+
+ __ branch_destination(L_end->label());
+ }
+ #endif
+
void LIRGenerator::do_RuntimeCall(address routine, int expected_arguments, Intrinsic* x) {
assert(x->number_of_arguments() == expected_arguments, "wrong type");
LIR_Opr reg = result_register_for(x->type());
__ call_runtime_leaf(routine, getThreadTemp(),
reg, new LIR_OprList());
*** 3109,3123 ****
case vmIntrinsics::_floatToRawIntBits : {
do_FPIntrinsics(x);
break;
}
! #ifdef TRACE_HAVE_INTRINSICS
! case vmIntrinsics::_threadID: do_ThreadIDIntrinsic(x); break;
! case vmIntrinsics::_classID: do_ClassIDIntrinsic(x); break;
case vmIntrinsics::_counterTime:
! do_RuntimeCall(CAST_FROM_FN_PTR(address, TRACE_TIME_METHOD), 0, x);
break;
#endif
case vmIntrinsics::_currentTimeMillis:
do_RuntimeCall(CAST_FROM_FN_PTR(address, os::javaTimeMillis), 0, x);
--- 3154,3172 ----
case vmIntrinsics::_floatToRawIntBits : {
do_FPIntrinsics(x);
break;
}
! #ifdef JFR_HAVE_INTRINSICS
! case vmIntrinsics::_getClassId:
! do_ClassIDIntrinsic(x);
! break;
! case vmIntrinsics::_getEventWriter:
! do_getEventWriter(x);
! break;
case vmIntrinsics::_counterTime:
! do_RuntimeCall(CAST_FROM_FN_PTR(address, JFR_TIME_FUNCTION), 0, x);
break;
#endif
case vmIntrinsics::_currentTimeMillis:
do_RuntimeCall(CAST_FROM_FN_PTR(address, os::javaTimeMillis), 0, x);
< prev index next >