< prev index next >

src/hotspot/share/c1/c1_LIRGenerator.cpp

Print this page

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 
< prev index next >