< prev index next >
src/hotspot/cpu/s390/c1_LIRGenerator_s390.cpp
Print this page
rev 47588 : 8190285: s390: Some java boolean checks are not correct
Reviewed-by:
*** 275,285 ****
if (use_length && needs_range_check) {
length.set_instruction(x->length());
length.load_item();
}
! if (needs_store_check) {
value.load_item();
} else {
value.load_for_store(x->elt_type());
}
--- 275,285 ----
if (use_length && needs_range_check) {
length.set_instruction(x->length());
length.load_item();
}
! if (needs_store_check || x->check_boolean()) {
value.load_item();
} else {
value.load_for_store(x->elt_type());
}
*** 325,339 ****
if (obj_store) {
// Needs GC write barriers.
pre_barrier(LIR_OprFact::address(array_addr), LIR_OprFact::illegalOpr /* pre_val */,
true /* do_load */, false /* patch */, NULL);
! __ move(value.result(), array_addr, null_check_info);
! // Seems to be a precise.
post_barrier(LIR_OprFact::address(array_addr), value.result());
- } else {
- __ move(value.result(), array_addr, null_check_info);
}
}
void LIRGenerator::do_MonitorEnter(MonitorEnter* x) {
assert(x->is_pinned(),"");
--- 325,342 ----
if (obj_store) {
// Needs GC write barriers.
pre_barrier(LIR_OprFact::address(array_addr), LIR_OprFact::illegalOpr /* pre_val */,
true /* do_load */, false /* patch */, NULL);
! }
!
! LIR_Opr result = maybe_mask_boolean(x, array.result(), value.result(), null_check_info);
! __ move(result, array_addr, null_check_info);
!
! if (obj_store) {
! // Precise card mark
post_barrier(LIR_OprFact::address(array_addr), value.result());
}
}
void LIRGenerator::do_MonitorEnter(MonitorEnter* x) {
assert(x->is_pinned(),"");
< prev index next >