< prev index next >

src/hotspot/share/c1/c1_LIRGenerator.cpp

Print this page

1238 
1239   LIRItem rcvr(x->argument_at(0), this);
1240   rcvr.load_item();
1241   LIR_Opr temp = new_register(T_ADDRESS);
1242   LIR_Opr result = rlock_result(x);
1243 
1244   // need to perform the null check on the rcvr
1245   CodeEmitInfo* info = nullptr;
1246   if (x->needs_null_check()) {
1247     info = state_for(x);
1248   }
1249 
1250   LIR_Opr klass = new_register(T_METADATA);
1251   load_klass(rcvr.result(), klass, info);
1252   __ move_wide(new LIR_Address(klass, in_bytes(Klass::java_mirror_offset()), T_ADDRESS), temp);
1253   // mirror = ((OopHandle)mirror)->resolve();
1254   access_load(IN_NATIVE, T_OBJECT,
1255               LIR_OprFact::address(new LIR_Address(temp, T_OBJECT)), result);
1256 }
1257 





















1258 void LIRGenerator::do_getObjectSize(Intrinsic* x) {
1259   assert(x->number_of_arguments() == 3, "wrong type");




1260   LIR_Opr result_reg = rlock_result(x);
1261 
1262   LIRItem value(x->argument_at(2), this);
1263   value.load_item();
1264 
1265   LIR_Opr klass = new_register(T_METADATA);
1266   load_klass(value.result(), klass, nullptr);
1267   LIR_Opr layout = new_register(T_INT);
1268   __ move(new LIR_Address(klass, in_bytes(Klass::layout_helper_offset()), T_INT), layout);
1269 
1270   LabelObj* L_done = new LabelObj();
1271   LabelObj* L_array = new LabelObj();
1272 
1273   __ cmp(lir_cond_lessEqual, layout, 0);
1274   __ branch(lir_cond_lessEqual, L_array->label());
1275 
1276   // Instance case: the layout helper gives us instance size almost directly,
1277   // but we need to mask out the _lh_instance_slow_path_bit.
1278 
1279   assert((int) Klass::_lh_instance_slow_path_bit < BytesPerLong, "clear bit");
1280 
1281   LIR_Opr mask = load_immediate(~(jint) right_n_bits(LogBytesPerLong), T_INT);
1282   __ logical_and(layout, mask, layout);

2822   case vmIntrinsics::_counterTime:
2823     do_RuntimeCall(CAST_FROM_FN_PTR(address, JfrTime::time_function()), x);
2824     break;
2825 #endif
2826 
2827   case vmIntrinsics::_currentTimeMillis:
2828     do_RuntimeCall(CAST_FROM_FN_PTR(address, os::javaTimeMillis), x);
2829     break;
2830 
2831   case vmIntrinsics::_nanoTime:
2832     do_RuntimeCall(CAST_FROM_FN_PTR(address, os::javaTimeNanos), x);
2833     break;
2834 
2835   case vmIntrinsics::_Object_init:    do_RegisterFinalizer(x); break;
2836   case vmIntrinsics::_isInstance:     do_isInstance(x);    break;
2837   case vmIntrinsics::_getClass:       do_getClass(x);      break;
2838   case vmIntrinsics::_getObjectSize:  do_getObjectSize(x); break;
2839   case vmIntrinsics::_currentCarrierThread: do_currentCarrierThread(x); break;
2840   case vmIntrinsics::_currentThread:  do_vthread(x);       break;
2841   case vmIntrinsics::_scopedValueCache: do_scopedValueCache(x); break;


2842 
2843   case vmIntrinsics::_dlog:           // fall through
2844   case vmIntrinsics::_dlog10:         // fall through
2845   case vmIntrinsics::_dabs:           // fall through
2846   case vmIntrinsics::_dsqrt:          // fall through
2847   case vmIntrinsics::_dsqrt_strict:   // fall through
2848   case vmIntrinsics::_dtan:           // fall through
2849   case vmIntrinsics::_dsinh:          // fall through
2850   case vmIntrinsics::_dtanh:          // fall through
2851   case vmIntrinsics::_dsin :          // fall through
2852   case vmIntrinsics::_dcos :          // fall through
2853   case vmIntrinsics::_dcbrt :         // fall through
2854   case vmIntrinsics::_dexp :          // fall through
2855   case vmIntrinsics::_dpow :          do_MathIntrinsic(x); break;
2856   case vmIntrinsics::_arraycopy:      do_ArrayCopy(x);     break;
2857 
2858   case vmIntrinsics::_fmaD:           do_FmaIntrinsic(x); break;
2859   case vmIntrinsics::_fmaF:           do_FmaIntrinsic(x); break;
2860 
2861   // Use java.lang.Math intrinsics code since it works for these intrinsics too.

1238 
1239   LIRItem rcvr(x->argument_at(0), this);
1240   rcvr.load_item();
1241   LIR_Opr temp = new_register(T_ADDRESS);
1242   LIR_Opr result = rlock_result(x);
1243 
1244   // need to perform the null check on the rcvr
1245   CodeEmitInfo* info = nullptr;
1246   if (x->needs_null_check()) {
1247     info = state_for(x);
1248   }
1249 
1250   LIR_Opr klass = new_register(T_METADATA);
1251   load_klass(rcvr.result(), klass, info);
1252   __ move_wide(new LIR_Address(klass, in_bytes(Klass::java_mirror_offset()), T_ADDRESS), temp);
1253   // mirror = ((OopHandle)mirror)->resolve();
1254   access_load(IN_NATIVE, T_OBJECT,
1255               LIR_OprFact::address(new LIR_Address(temp, T_OBJECT)), result);
1256 }
1257 
1258 void LIRGenerator::do_addressOf(Intrinsic* x) {
1259   assert(x->number_of_arguments() == 1, "wrong type");
1260   LIR_Opr reg = rlock_result(x);
1261 
1262   LIRItem value(x->argument_at(0), this);
1263   value.load_item();
1264 
1265 #ifdef _LP64
1266   __ move(value.result(), reg, nullptr);
1267 #else
1268   LIR_Opr res = new_register(T_INT);
1269   __ move(value.result(), res, nullptr);
1270   __ convert(Bytecodes::_i2l, res, reg);
1271 #endif
1272 }
1273 
1274 void LIRGenerator::do_sizeOf(Intrinsic* x) {
1275   assert(x->number_of_arguments() == 1, "wrong type");
1276   do_sizeOf_impl(x, 0);
1277 }
1278 
1279 void LIRGenerator::do_getObjectSize(Intrinsic* x) {
1280   assert(x->number_of_arguments() == 3, "wrong type");
1281   do_sizeOf_impl(x, 2);
1282 }
1283 
1284 void LIRGenerator::do_sizeOf_impl(Intrinsic* x, int arg_idx) {
1285   LIR_Opr result_reg = rlock_result(x);
1286 
1287   LIRItem value(x->argument_at(arg_idx), this);
1288   value.load_item();
1289 
1290   LIR_Opr klass = new_register(T_METADATA);
1291   load_klass(value.result(), klass, nullptr);
1292   LIR_Opr layout = new_register(T_INT);
1293   __ move(new LIR_Address(klass, in_bytes(Klass::layout_helper_offset()), T_INT), layout);
1294 
1295   LabelObj* L_done = new LabelObj();
1296   LabelObj* L_array = new LabelObj();
1297 
1298   __ cmp(lir_cond_lessEqual, layout, 0);
1299   __ branch(lir_cond_lessEqual, L_array->label());
1300 
1301   // Instance case: the layout helper gives us instance size almost directly,
1302   // but we need to mask out the _lh_instance_slow_path_bit.
1303 
1304   assert((int) Klass::_lh_instance_slow_path_bit < BytesPerLong, "clear bit");
1305 
1306   LIR_Opr mask = load_immediate(~(jint) right_n_bits(LogBytesPerLong), T_INT);
1307   __ logical_and(layout, mask, layout);

2847   case vmIntrinsics::_counterTime:
2848     do_RuntimeCall(CAST_FROM_FN_PTR(address, JfrTime::time_function()), x);
2849     break;
2850 #endif
2851 
2852   case vmIntrinsics::_currentTimeMillis:
2853     do_RuntimeCall(CAST_FROM_FN_PTR(address, os::javaTimeMillis), x);
2854     break;
2855 
2856   case vmIntrinsics::_nanoTime:
2857     do_RuntimeCall(CAST_FROM_FN_PTR(address, os::javaTimeNanos), x);
2858     break;
2859 
2860   case vmIntrinsics::_Object_init:    do_RegisterFinalizer(x); break;
2861   case vmIntrinsics::_isInstance:     do_isInstance(x);    break;
2862   case vmIntrinsics::_getClass:       do_getClass(x);      break;
2863   case vmIntrinsics::_getObjectSize:  do_getObjectSize(x); break;
2864   case vmIntrinsics::_currentCarrierThread: do_currentCarrierThread(x); break;
2865   case vmIntrinsics::_currentThread:  do_vthread(x);       break;
2866   case vmIntrinsics::_scopedValueCache: do_scopedValueCache(x); break;
2867   case vmIntrinsics::_shipilev_magic_sizeOf:         do_sizeOf(x);        break;
2868   case vmIntrinsics::_shipilev_magic_addressOf:      do_addressOf(x);     break;
2869 
2870   case vmIntrinsics::_dlog:           // fall through
2871   case vmIntrinsics::_dlog10:         // fall through
2872   case vmIntrinsics::_dabs:           // fall through
2873   case vmIntrinsics::_dsqrt:          // fall through
2874   case vmIntrinsics::_dsqrt_strict:   // fall through
2875   case vmIntrinsics::_dtan:           // fall through
2876   case vmIntrinsics::_dsinh:          // fall through
2877   case vmIntrinsics::_dtanh:          // fall through
2878   case vmIntrinsics::_dsin :          // fall through
2879   case vmIntrinsics::_dcos :          // fall through
2880   case vmIntrinsics::_dcbrt :         // fall through
2881   case vmIntrinsics::_dexp :          // fall through
2882   case vmIntrinsics::_dpow :          do_MathIntrinsic(x); break;
2883   case vmIntrinsics::_arraycopy:      do_ArrayCopy(x);     break;
2884 
2885   case vmIntrinsics::_fmaD:           do_FmaIntrinsic(x); break;
2886   case vmIntrinsics::_fmaF:           do_FmaIntrinsic(x); break;
2887 
2888   // Use java.lang.Math intrinsics code since it works for these intrinsics too.
< prev index next >