1307 // object here is correct as long as it returns the same modifiers we would expect
1308 // from the primitive class itself. See spec for Class.getModifiers that provides
1309 // the typed array klasses with similar modifiers as their component types.
1310
1311 Klass* univ_klass_obj = Universe::byteArrayKlassObj();
1312 assert(univ_klass_obj->modifier_flags() == (JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC), "Sanity");
1313 LIR_Opr prim_klass = LIR_OprFact::metadataConst(univ_klass_obj);
1314
1315 LIR_Opr recv_klass = new_register(T_METADATA);
1316 __ move(new LIR_Address(receiver.result(), java_lang_Class::klass_offset(), T_ADDRESS), recv_klass, info);
1317
1318 // Check if this is a Java mirror of primitive type, and select the appropriate klass.
1319 LIR_Opr klass = new_register(T_METADATA);
1320 __ cmp(lir_cond_equal, recv_klass, LIR_OprFact::metadataConst(0));
1321 __ cmove(lir_cond_equal, prim_klass, recv_klass, klass, T_ADDRESS);
1322
1323 // Get the answer.
1324 __ move(new LIR_Address(klass, in_bytes(Klass::modifier_flags_offset()), T_INT), result);
1325 }
1326
1327 void LIRGenerator::do_getObjectSize(Intrinsic* x) {
1328 assert(x->number_of_arguments() == 3, "wrong type");
1329 LIR_Opr result_reg = rlock_result(x);
1330
1331 LIRItem value(x->argument_at(2), this);
1332 value.load_item();
1333
1334 LIR_Opr klass = new_register(T_METADATA);
1335 load_klass(value.result(), klass, nullptr);
1336 LIR_Opr layout = new_register(T_INT);
1337 __ move(new LIR_Address(klass, in_bytes(Klass::layout_helper_offset()), T_INT), layout);
1338
1339 LabelObj* L_done = new LabelObj();
1340 LabelObj* L_array = new LabelObj();
1341
1342 __ cmp(lir_cond_lessEqual, layout, 0);
1343 __ branch(lir_cond_lessEqual, L_array->label());
1344
1345 // Instance case: the layout helper gives us instance size almost directly,
1346 // but we need to mask out the _lh_instance_slow_path_bit.
1347
1348 assert((int) Klass::_lh_instance_slow_path_bit < BytesPerLong, "clear bit");
1349
1350 LIR_Opr mask = load_immediate(~(jint) right_n_bits(LogBytesPerLong), T_INT);
1351 __ logical_and(layout, mask, layout);
2935 break;
2936 #endif
2937
2938 case vmIntrinsics::_currentTimeMillis:
2939 do_RuntimeCall(CAST_FROM_FN_PTR(address, os::javaTimeMillis), x);
2940 break;
2941
2942 case vmIntrinsics::_nanoTime:
2943 do_RuntimeCall(CAST_FROM_FN_PTR(address, os::javaTimeNanos), x);
2944 break;
2945
2946 case vmIntrinsics::_Object_init: do_RegisterFinalizer(x); break;
2947 case vmIntrinsics::_isInstance: do_isInstance(x); break;
2948 case vmIntrinsics::_isPrimitive: do_isPrimitive(x); break;
2949 case vmIntrinsics::_getModifiers: do_getModifiers(x); break;
2950 case vmIntrinsics::_getClass: do_getClass(x); break;
2951 case vmIntrinsics::_getObjectSize: do_getObjectSize(x); break;
2952 case vmIntrinsics::_currentCarrierThread: do_currentCarrierThread(x); break;
2953 case vmIntrinsics::_currentThread: do_vthread(x); break;
2954 case vmIntrinsics::_scopedValueCache: do_scopedValueCache(x); break;
2955
2956 case vmIntrinsics::_dlog: // fall through
2957 case vmIntrinsics::_dlog10: // fall through
2958 case vmIntrinsics::_dabs: // fall through
2959 case vmIntrinsics::_dsqrt: // fall through
2960 case vmIntrinsics::_dsqrt_strict: // fall through
2961 case vmIntrinsics::_dtan: // fall through
2962 case vmIntrinsics::_dsin : // fall through
2963 case vmIntrinsics::_dcos : // fall through
2964 case vmIntrinsics::_dexp : // fall through
2965 case vmIntrinsics::_dpow : do_MathIntrinsic(x); break;
2966 case vmIntrinsics::_arraycopy: do_ArrayCopy(x); break;
2967
2968 case vmIntrinsics::_fmaD: do_FmaIntrinsic(x); break;
2969 case vmIntrinsics::_fmaF: do_FmaIntrinsic(x); break;
2970
2971 // Use java.lang.Math intrinsics code since it works for these intrinsics too.
2972 case vmIntrinsics::_floatToFloat16: // fall through
2973 case vmIntrinsics::_float16ToFloat: do_MathIntrinsic(x); break;
2974
|
1307 // object here is correct as long as it returns the same modifiers we would expect
1308 // from the primitive class itself. See spec for Class.getModifiers that provides
1309 // the typed array klasses with similar modifiers as their component types.
1310
1311 Klass* univ_klass_obj = Universe::byteArrayKlassObj();
1312 assert(univ_klass_obj->modifier_flags() == (JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC), "Sanity");
1313 LIR_Opr prim_klass = LIR_OprFact::metadataConst(univ_klass_obj);
1314
1315 LIR_Opr recv_klass = new_register(T_METADATA);
1316 __ move(new LIR_Address(receiver.result(), java_lang_Class::klass_offset(), T_ADDRESS), recv_klass, info);
1317
1318 // Check if this is a Java mirror of primitive type, and select the appropriate klass.
1319 LIR_Opr klass = new_register(T_METADATA);
1320 __ cmp(lir_cond_equal, recv_klass, LIR_OprFact::metadataConst(0));
1321 __ cmove(lir_cond_equal, prim_klass, recv_klass, klass, T_ADDRESS);
1322
1323 // Get the answer.
1324 __ move(new LIR_Address(klass, in_bytes(Klass::modifier_flags_offset()), T_INT), result);
1325 }
1326
1327 void LIRGenerator::do_addressOf(Intrinsic* x) {
1328 assert(x->number_of_arguments() == 1, "wrong type");
1329 LIR_Opr reg = rlock_result(x);
1330
1331 LIRItem value(x->argument_at(0), this);
1332 value.load_item();
1333
1334 #ifdef _LP64
1335 __ move(value.result(), reg, NULL);
1336 #else
1337 LIR_Opr res = new_register(T_INT);
1338 __ move(value.result(), res, NULL);
1339 __ convert(Bytecodes::_i2l, res, reg);
1340 #endif
1341 }
1342
1343 void LIRGenerator::do_sizeOf(Intrinsic* x) {
1344 assert(x->number_of_arguments() == 1, "wrong type");
1345 do_sizeOf_impl(x, 0);
1346 }
1347
1348 void LIRGenerator::do_getObjectSize(Intrinsic* x) {
1349 assert(x->number_of_arguments() == 3, "wrong type");
1350 do_sizeOf_impl(x, 2);
1351 }
1352
1353 void LIRGenerator::do_sizeOf_impl(Intrinsic* x, int arg_idx) {
1354 LIR_Opr result_reg = rlock_result(x);
1355
1356 LIRItem value(x->argument_at(arg_idx), this);
1357 value.load_item();
1358
1359 LIR_Opr klass = new_register(T_METADATA);
1360 load_klass(value.result(), klass, nullptr);
1361 LIR_Opr layout = new_register(T_INT);
1362 __ move(new LIR_Address(klass, in_bytes(Klass::layout_helper_offset()), T_INT), layout);
1363
1364 LabelObj* L_done = new LabelObj();
1365 LabelObj* L_array = new LabelObj();
1366
1367 __ cmp(lir_cond_lessEqual, layout, 0);
1368 __ branch(lir_cond_lessEqual, L_array->label());
1369
1370 // Instance case: the layout helper gives us instance size almost directly,
1371 // but we need to mask out the _lh_instance_slow_path_bit.
1372
1373 assert((int) Klass::_lh_instance_slow_path_bit < BytesPerLong, "clear bit");
1374
1375 LIR_Opr mask = load_immediate(~(jint) right_n_bits(LogBytesPerLong), T_INT);
1376 __ logical_and(layout, mask, layout);
2960 break;
2961 #endif
2962
2963 case vmIntrinsics::_currentTimeMillis:
2964 do_RuntimeCall(CAST_FROM_FN_PTR(address, os::javaTimeMillis), x);
2965 break;
2966
2967 case vmIntrinsics::_nanoTime:
2968 do_RuntimeCall(CAST_FROM_FN_PTR(address, os::javaTimeNanos), x);
2969 break;
2970
2971 case vmIntrinsics::_Object_init: do_RegisterFinalizer(x); break;
2972 case vmIntrinsics::_isInstance: do_isInstance(x); break;
2973 case vmIntrinsics::_isPrimitive: do_isPrimitive(x); break;
2974 case vmIntrinsics::_getModifiers: do_getModifiers(x); break;
2975 case vmIntrinsics::_getClass: do_getClass(x); break;
2976 case vmIntrinsics::_getObjectSize: do_getObjectSize(x); break;
2977 case vmIntrinsics::_currentCarrierThread: do_currentCarrierThread(x); break;
2978 case vmIntrinsics::_currentThread: do_vthread(x); break;
2979 case vmIntrinsics::_scopedValueCache: do_scopedValueCache(x); break;
2980 case vmIntrinsics::_shipilev_magic_sizeOf: do_sizeOf(x); break;
2981 case vmIntrinsics::_shipilev_magic_addressOf: do_addressOf(x); break;
2982
2983 case vmIntrinsics::_dlog: // fall through
2984 case vmIntrinsics::_dlog10: // fall through
2985 case vmIntrinsics::_dabs: // fall through
2986 case vmIntrinsics::_dsqrt: // fall through
2987 case vmIntrinsics::_dsqrt_strict: // fall through
2988 case vmIntrinsics::_dtan: // fall through
2989 case vmIntrinsics::_dsin : // fall through
2990 case vmIntrinsics::_dcos : // fall through
2991 case vmIntrinsics::_dexp : // fall through
2992 case vmIntrinsics::_dpow : do_MathIntrinsic(x); break;
2993 case vmIntrinsics::_arraycopy: do_ArrayCopy(x); break;
2994
2995 case vmIntrinsics::_fmaD: do_FmaIntrinsic(x); break;
2996 case vmIntrinsics::_fmaF: do_FmaIntrinsic(x); break;
2997
2998 // Use java.lang.Math intrinsics code since it works for these intrinsics too.
2999 case vmIntrinsics::_floatToFloat16: // fall through
3000 case vmIntrinsics::_float16ToFloat: do_MathIntrinsic(x); break;
3001
|