< prev index next >

src/hotspot/share/gc/shared/c1/barrierSetC1.cpp

Print this page

317       if (offset->type() == T_INT) {
318         referent_off = LIR_OprFact::intConst(java_lang_ref_Reference::referent_offset());
319       } else {
320         assert(offset->type() == T_LONG, "what else?");
321         referent_off = gen->new_register(T_LONG);
322         __ move(LIR_OprFact::longConst(java_lang_ref_Reference::referent_offset()), referent_off);
323       }
324       __ cmp(lir_cond_notEqual, offset, referent_off);
325       __ branch(lir_cond_notEqual, cont->label());
326     }
327     if (gen_source_check) {
328       // offset is a const and equals referent offset
329       // if (source == null) -> continue
330       __ cmp(lir_cond_equal, base_reg, LIR_OprFact::oopConst(NULL));
331       __ branch(lir_cond_equal, cont->label());
332     }
333     LIR_Opr src_klass = gen->new_register(T_METADATA);
334     if (gen_type_check) {
335       // We have determined that offset == referent_offset && src != null.
336       // if (src->_klass->_reference_type == REF_NONE) -> continue
337       __ move(new LIR_Address(base_reg, oopDesc::klass_offset_in_bytes(), T_ADDRESS), src_klass);
338       LIR_Address* reference_type_addr = new LIR_Address(src_klass, in_bytes(InstanceKlass::reference_type_offset()), T_BYTE);
339       LIR_Opr reference_type = gen->new_register(T_INT);
340       __ move(reference_type_addr, reference_type);
341       __ cmp(lir_cond_equal, reference_type, LIR_OprFact::intConst(REF_NONE));
342       __ branch(lir_cond_equal, cont->label());
343     }
344   }
345 }

317       if (offset->type() == T_INT) {
318         referent_off = LIR_OprFact::intConst(java_lang_ref_Reference::referent_offset());
319       } else {
320         assert(offset->type() == T_LONG, "what else?");
321         referent_off = gen->new_register(T_LONG);
322         __ move(LIR_OprFact::longConst(java_lang_ref_Reference::referent_offset()), referent_off);
323       }
324       __ cmp(lir_cond_notEqual, offset, referent_off);
325       __ branch(lir_cond_notEqual, cont->label());
326     }
327     if (gen_source_check) {
328       // offset is a const and equals referent offset
329       // if (source == null) -> continue
330       __ cmp(lir_cond_equal, base_reg, LIR_OprFact::oopConst(NULL));
331       __ branch(lir_cond_equal, cont->label());
332     }
333     LIR_Opr src_klass = gen->new_register(T_METADATA);
334     if (gen_type_check) {
335       // We have determined that offset == referent_offset && src != null.
336       // if (src->_klass->_reference_type == REF_NONE) -> continue
337       gen->load_klass(base_reg, src_klass, NULL);
338       LIR_Address* reference_type_addr = new LIR_Address(src_klass, in_bytes(InstanceKlass::reference_type_offset()), T_BYTE);
339       LIR_Opr reference_type = gen->new_register(T_INT);
340       __ move(reference_type_addr, reference_type);
341       __ cmp(lir_cond_equal, reference_type, LIR_OprFact::intConst(REF_NONE));
342       __ branch(lir_cond_equal, cont->label());
343     }
344   }
345 }
< prev index next >