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.
|