< prev index next >

src/share/vm/c1/c1_LIRGenerator.cpp

Print this page




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


< prev index next >