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