src/share/vm/c1/c1_LIRGenerator.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File 8161720 Sdiff src/share/vm/c1

src/share/vm/c1/c1_LIRGenerator.cpp

Print this page




2393         LIR_Opr reference_type = new_register(T_INT);
2394         __ move(reference_type_addr, reference_type);
2395         __ cmp(lir_cond_equal, reference_type, LIR_OprFact::intConst(REF_NONE));
2396         __ branch(lir_cond_equal, T_INT, Lcont->label());
2397       }
2398       {
2399         // We have determined that src->_klass->_reference_type != REF_NONE
2400         // so register the value in the referent field with the pre-barrier.
2401         pre_barrier(LIR_OprFact::illegalOpr /* addr_opr */,
2402                     value  /* pre_val */,
2403                     false  /* do_load */,
2404                     false  /* patch */,
2405                     NULL   /* info */);
2406       }
2407       __ branch_destination(Lcont->label());
2408     }
2409   }
2410 #endif // INCLUDE_ALL_GCS
2411 
2412   if (x->is_volatile() && os::is_MP()) __ membar_acquire();









2413 }
2414 
2415 
2416 void LIRGenerator::do_UnsafePutObject(UnsafePutObject* x) {
2417   BasicType type = x->basic_type();
2418   LIRItem src(x->object(), this);
2419   LIRItem off(x->offset(), this);
2420   LIRItem data(x->value(), this);
2421 
2422   src.load_item();
2423   if (type == T_BOOLEAN || type == T_BYTE) {
2424     data.load_byte_item();
2425   } else {
2426     data.load_item();
2427   }
2428   off.load_item();
2429 
2430   set_no_result(x);
2431 
2432   if (x->is_volatile() && os::is_MP()) __ membar_release();




2393         LIR_Opr reference_type = new_register(T_INT);
2394         __ move(reference_type_addr, reference_type);
2395         __ cmp(lir_cond_equal, reference_type, LIR_OprFact::intConst(REF_NONE));
2396         __ branch(lir_cond_equal, T_INT, Lcont->label());
2397       }
2398       {
2399         // We have determined that src->_klass->_reference_type != REF_NONE
2400         // so register the value in the referent field with the pre-barrier.
2401         pre_barrier(LIR_OprFact::illegalOpr /* addr_opr */,
2402                     value  /* pre_val */,
2403                     false  /* do_load */,
2404                     false  /* patch */,
2405                     NULL   /* info */);
2406       }
2407       __ branch_destination(Lcont->label());
2408     }
2409   }
2410 #endif // INCLUDE_ALL_GCS
2411 
2412   if (x->is_volatile() && os::is_MP()) __ membar_acquire();
2413 
2414   /* Normalize boolean value returned by unsafe operation, i.e., value  != 0 ? value = true : value false. */
2415   if (type == T_BOOLEAN) {
2416     LabelObj* equalZeroLabel = new LabelObj();
2417     __ cmp(lir_cond_equal, value, 0);
2418     __ branch(lir_cond_equal, T_BOOLEAN, equalZeroLabel->label());
2419     __ move(LIR_OprFact::intConst(1), value);
2420     __ branch_destination(equalZeroLabel->label());
2421   }
2422 }
2423 
2424 
2425 void LIRGenerator::do_UnsafePutObject(UnsafePutObject* x) {
2426   BasicType type = x->basic_type();
2427   LIRItem src(x->object(), this);
2428   LIRItem off(x->offset(), this);
2429   LIRItem data(x->value(), this);
2430 
2431   src.load_item();
2432   if (type == T_BOOLEAN || type == T_BYTE) {
2433     data.load_byte_item();
2434   } else {
2435     data.load_item();
2436   }
2437   off.load_item();
2438 
2439   set_no_result(x);
2440 
2441   if (x->is_volatile() && os::is_MP()) __ membar_release();


src/share/vm/c1/c1_LIRGenerator.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File