3038 3039 LIRItem left(x->x(), this); 3040 LIRItem right(x->y(), this); 3041 left.load_item(); 3042 if (can_inline_as_constant(right.value())) { 3043 right.dont_load_item(); 3044 } else { 3045 right.load_item(); 3046 } 3047 3048 LIRItem t_val(x->tval(), this); 3049 LIRItem f_val(x->fval(), this); 3050 t_val.dont_load_item(); 3051 f_val.dont_load_item(); 3052 LIR_Opr reg = rlock_result(x); 3053 3054 __ cmp(lir_cond(x->cond()), left.result(), right.result()); 3055 __ cmove(lir_cond(x->cond()), t_val.result(), f_val.result(), reg, as_BasicType(x->x()->type())); 3056 } 3057 3058 void LIRGenerator::do_RuntimeCall(address routine, int expected_arguments, Intrinsic* x) { 3059 assert(x->number_of_arguments() == expected_arguments, "wrong type"); 3060 LIR_Opr reg = result_register_for(x->type()); 3061 __ call_runtime_leaf(routine, getThreadTemp(), 3062 reg, new LIR_OprList()); 3063 LIR_Opr result = rlock_result(x); 3064 __ move(reg, result); 3065 } 3066 3067 #ifdef TRACE_HAVE_INTRINSICS 3068 void LIRGenerator::do_ThreadIDIntrinsic(Intrinsic* x) { 3069 LIR_Opr thread = getThreadPointer(); 3070 LIR_Opr osthread = new_pointer_register(); 3071 __ move(new LIR_Address(thread, in_bytes(JavaThread::osthread_offset()), osthread->type()), osthread); 3072 size_t thread_id_size = OSThread::thread_id_size(); 3073 if (thread_id_size == (size_t) BytesPerLong) { 3074 LIR_Opr id = new_register(T_LONG); 3075 __ move(new LIR_Address(osthread, in_bytes(OSThread::thread_id_offset()), T_LONG), id); 3076 __ convert(Bytecodes::_l2i, id, rlock_result(x)); 3077 } else if (thread_id_size == (size_t) BytesPerInt) { 3094 ByteSize offset = TRACE_ID_OFFSET; 3095 LIR_Address* trace_id_addr = new LIR_Address(klass, in_bytes(offset), T_LONG); 3096 __ move(trace_id_addr, id); 3097 __ logical_or(id, LIR_OprFact::longConst(0x01l), id); 3098 __ store(id, trace_id_addr); 3099 __ logical_and(id, LIR_OprFact::longConst(~0x3l), id); 3100 __ move(id, rlock_result(x)); 3101 } 3102 #endif 3103 3104 void LIRGenerator::do_Intrinsic(Intrinsic* x) { 3105 switch (x->id()) { 3106 case vmIntrinsics::_intBitsToFloat : 3107 case vmIntrinsics::_doubleToRawLongBits : 3108 case vmIntrinsics::_longBitsToDouble : 3109 case vmIntrinsics::_floatToRawIntBits : { 3110 do_FPIntrinsics(x); 3111 break; 3112 } 3113 3114 #ifdef TRACE_HAVE_INTRINSICS 3115 case vmIntrinsics::_threadID: do_ThreadIDIntrinsic(x); break; 3116 case vmIntrinsics::_classID: do_ClassIDIntrinsic(x); break; 3117 case vmIntrinsics::_counterTime: 3118 do_RuntimeCall(CAST_FROM_FN_PTR(address, TRACE_TIME_METHOD), 0, x); 3119 break; 3120 #endif 3121 3122 case vmIntrinsics::_currentTimeMillis: 3123 do_RuntimeCall(CAST_FROM_FN_PTR(address, os::javaTimeMillis), 0, x); 3124 break; 3125 3126 case vmIntrinsics::_nanoTime: 3127 do_RuntimeCall(CAST_FROM_FN_PTR(address, os::javaTimeNanos), 0, x); 3128 break; 3129 3130 case vmIntrinsics::_Object_init: do_RegisterFinalizer(x); break; 3131 case vmIntrinsics::_isInstance: do_isInstance(x); break; 3132 case vmIntrinsics::_getClass: do_getClass(x); break; 3133 case vmIntrinsics::_currentThread: do_currentThread(x); break; 3134 3135 case vmIntrinsics::_dlog: // fall through 3136 case vmIntrinsics::_dlog10: // fall through 3137 case vmIntrinsics::_dabs: // fall through 3138 case vmIntrinsics::_dsqrt: // fall through | 3038 3039 LIRItem left(x->x(), this); 3040 LIRItem right(x->y(), this); 3041 left.load_item(); 3042 if (can_inline_as_constant(right.value())) { 3043 right.dont_load_item(); 3044 } else { 3045 right.load_item(); 3046 } 3047 3048 LIRItem t_val(x->tval(), this); 3049 LIRItem f_val(x->fval(), this); 3050 t_val.dont_load_item(); 3051 f_val.dont_load_item(); 3052 LIR_Opr reg = rlock_result(x); 3053 3054 __ cmp(lir_cond(x->cond()), left.result(), right.result()); 3055 __ cmove(lir_cond(x->cond()), t_val.result(), f_val.result(), reg, as_BasicType(x->x()->type())); 3056 } 3057 3058 #ifdef JFR_HAVE_INTRINSICS 3059 void LIRGenerator::do_ClassIDIntrinsic(Intrinsic* x) { 3060 CodeEmitInfo* info = state_for(x); 3061 CodeEmitInfo* info2 = new CodeEmitInfo(info); // Clone for the second null check 3062 3063 assert(info != NULL, "must have info"); 3064 LIRItem arg(x->argument_at(0), this); 3065 3066 arg.load_item(); 3067 LIR_Opr klass = new_register(T_METADATA); 3068 __ move(new LIR_Address(arg.result(), java_lang_Class::klass_offset_in_bytes(), T_ADDRESS), klass, info); 3069 LIR_Opr id = new_register(T_LONG); 3070 ByteSize offset = KLASS_TRACE_ID_OFFSET; 3071 LIR_Address* trace_id_addr = new LIR_Address(klass, in_bytes(offset), T_LONG); 3072 3073 __ move(trace_id_addr, id); 3074 __ logical_or(id, LIR_OprFact::longConst(0x01l), id); 3075 __ store(id, trace_id_addr); 3076 3077 #ifdef TRACE_ID_META_BITS 3078 __ logical_and(id, LIR_OprFact::longConst(~TRACE_ID_META_BITS), id); 3079 #endif 3080 #ifdef TRACE_ID_SHIFT 3081 __ unsigned_shift_right(id, TRACE_ID_SHIFT, id); 3082 #endif 3083 3084 __ move(id, rlock_result(x)); 3085 } 3086 3087 void LIRGenerator::do_getEventWriter(Intrinsic* x) { 3088 LabelObj* L_end = new LabelObj(); 3089 3090 LIR_Address* jobj_addr = new LIR_Address(getThreadPointer(), 3091 in_bytes(THREAD_LOCAL_WRITER_OFFSET_JFR), 3092 T_OBJECT); 3093 LIR_Opr result = rlock_result(x); 3094 __ move_wide(jobj_addr, result); 3095 __ cmp(lir_cond_equal, result, LIR_OprFact::oopConst(NULL)); 3096 __ branch(lir_cond_equal, T_OBJECT, L_end->label()); 3097 __ move_wide(new LIR_Address(result, T_OBJECT), result); 3098 3099 __ branch_destination(L_end->label()); 3100 } 3101 #endif 3102 3103 void LIRGenerator::do_RuntimeCall(address routine, int expected_arguments, Intrinsic* x) { 3104 assert(x->number_of_arguments() == expected_arguments, "wrong type"); 3105 LIR_Opr reg = result_register_for(x->type()); 3106 __ call_runtime_leaf(routine, getThreadTemp(), 3107 reg, new LIR_OprList()); 3108 LIR_Opr result = rlock_result(x); 3109 __ move(reg, result); 3110 } 3111 3112 #ifdef TRACE_HAVE_INTRINSICS 3113 void LIRGenerator::do_ThreadIDIntrinsic(Intrinsic* x) { 3114 LIR_Opr thread = getThreadPointer(); 3115 LIR_Opr osthread = new_pointer_register(); 3116 __ move(new LIR_Address(thread, in_bytes(JavaThread::osthread_offset()), osthread->type()), osthread); 3117 size_t thread_id_size = OSThread::thread_id_size(); 3118 if (thread_id_size == (size_t) BytesPerLong) { 3119 LIR_Opr id = new_register(T_LONG); 3120 __ move(new LIR_Address(osthread, in_bytes(OSThread::thread_id_offset()), T_LONG), id); 3121 __ convert(Bytecodes::_l2i, id, rlock_result(x)); 3122 } else if (thread_id_size == (size_t) BytesPerInt) { 3139 ByteSize offset = TRACE_ID_OFFSET; 3140 LIR_Address* trace_id_addr = new LIR_Address(klass, in_bytes(offset), T_LONG); 3141 __ move(trace_id_addr, id); 3142 __ logical_or(id, LIR_OprFact::longConst(0x01l), id); 3143 __ store(id, trace_id_addr); 3144 __ logical_and(id, LIR_OprFact::longConst(~0x3l), id); 3145 __ move(id, rlock_result(x)); 3146 } 3147 #endif 3148 3149 void LIRGenerator::do_Intrinsic(Intrinsic* x) { 3150 switch (x->id()) { 3151 case vmIntrinsics::_intBitsToFloat : 3152 case vmIntrinsics::_doubleToRawLongBits : 3153 case vmIntrinsics::_longBitsToDouble : 3154 case vmIntrinsics::_floatToRawIntBits : { 3155 do_FPIntrinsics(x); 3156 break; 3157 } 3158 3159 #ifdef JFR_HAVE_INTRINSICS 3160 case vmIntrinsics::_getClassId: 3161 do_ClassIDIntrinsic(x); 3162 break; 3163 case vmIntrinsics::_getEventWriter: 3164 do_getEventWriter(x); 3165 break; 3166 case vmIntrinsics::_counterTime: 3167 do_RuntimeCall(CAST_FROM_FN_PTR(address, JFR_TIME_FUNCTION), 0, x); 3168 break; 3169 #endif 3170 3171 case vmIntrinsics::_currentTimeMillis: 3172 do_RuntimeCall(CAST_FROM_FN_PTR(address, os::javaTimeMillis), 0, x); 3173 break; 3174 3175 case vmIntrinsics::_nanoTime: 3176 do_RuntimeCall(CAST_FROM_FN_PTR(address, os::javaTimeNanos), 0, x); 3177 break; 3178 3179 case vmIntrinsics::_Object_init: do_RegisterFinalizer(x); break; 3180 case vmIntrinsics::_isInstance: do_isInstance(x); break; 3181 case vmIntrinsics::_getClass: do_getClass(x); break; 3182 case vmIntrinsics::_currentThread: do_currentThread(x); break; 3183 3184 case vmIntrinsics::_dlog: // fall through 3185 case vmIntrinsics::_dlog10: // fall through 3186 case vmIntrinsics::_dabs: // fall through 3187 case vmIntrinsics::_dsqrt: // fall through |