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(); |