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
|