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 }
|