309 // visitor functions |
309 // visitor functions |
310 //---------------------------------------------------------------------- |
310 //---------------------------------------------------------------------- |
311 |
311 |
312 |
312 |
313 void LIRGenerator::do_StoreIndexed(StoreIndexed* x) { |
313 void LIRGenerator::do_StoreIndexed(StoreIndexed* x) { |
314 assert(x->is_root(),""); |
314 assert(x->is_pinned(),""); |
315 bool needs_range_check = true; |
315 bool needs_range_check = true; |
316 bool use_length = x->length() != NULL; |
316 bool use_length = x->length() != NULL; |
317 bool obj_store = x->elt_type() == T_ARRAY || x->elt_type() == T_OBJECT; |
317 bool obj_store = x->elt_type() == T_ARRAY || x->elt_type() == T_OBJECT; |
318 bool needs_store_check = obj_store && (x->value()->as_Constant() == NULL || |
318 bool needs_store_check = obj_store && (x->value()->as_Constant() == NULL || |
319 !get_jobject_constant(x->value())->is_null_object()); |
319 !get_jobject_constant(x->value())->is_null_object()); |
396 LIR_Opr scratch = FrameMap::G3_opr; |
396 LIR_Opr scratch = FrameMap::G3_opr; |
397 LIR_Opr hdr = FrameMap::G4_opr; |
397 LIR_Opr hdr = FrameMap::G4_opr; |
398 |
398 |
399 CodeEmitInfo* info_for_exception = NULL; |
399 CodeEmitInfo* info_for_exception = NULL; |
400 if (x->needs_null_check()) { |
400 if (x->needs_null_check()) { |
401 info_for_exception = state_for(x, x->lock_stack_before()); |
401 info_for_exception = state_for(x); |
402 } |
402 } |
403 |
403 |
404 // this CodeEmitInfo must not have the xhandlers because here the |
404 // this CodeEmitInfo must not have the xhandlers because here the |
405 // object is already locked (xhandlers expects object to be unlocked) |
405 // object is already locked (xhandlers expects object to be unlocked) |
406 CodeEmitInfo* info = state_for(x, x->state(), true); |
406 CodeEmitInfo* info = state_for(x, x->state(), true); |
407 monitor_enter(obj.result(), lock, hdr, scratch, x->monitor_no(), info_for_exception, info); |
407 monitor_enter(obj.result(), lock, hdr, scratch, x->monitor_no(), info_for_exception, info); |
408 } |
408 } |
409 |
409 |
410 |
410 |
411 void LIRGenerator::do_MonitorExit(MonitorExit* x) { |
411 void LIRGenerator::do_MonitorExit(MonitorExit* x) { |
412 assert(x->is_root(),""); |
412 assert(x->is_pinned(),""); |
413 LIRItem obj(x->obj(), this); |
413 LIRItem obj(x->obj(), this); |
414 obj.dont_load_item(); |
414 obj.dont_load_item(); |
415 |
415 |
416 set_no_result(x); |
416 set_no_result(x); |
417 LIR_Opr lock = FrameMap::G1_opr; |
417 LIR_Opr lock = FrameMap::G1_opr; |
869 |
869 |
870 void LIRGenerator::do_NewInstance(NewInstance* x) { |
870 void LIRGenerator::do_NewInstance(NewInstance* x) { |
871 // This instruction can be deoptimized in the slow path : use |
871 // This instruction can be deoptimized in the slow path : use |
872 // O0 as result register. |
872 // O0 as result register. |
873 const LIR_Opr reg = result_register_for(x->type()); |
873 const LIR_Opr reg = result_register_for(x->type()); |
874 |
874 #ifndef PRODUCT |
875 if (PrintNotLoaded && !x->klass()->is_loaded()) { |
875 if (PrintNotLoaded && !x->klass()->is_loaded()) { |
876 tty->print_cr(" ###class not loaded at new bci %d", x->bci()); |
876 tty->print_cr(" ###class not loaded at new bci %d", x->printable_bci()); |
877 } |
877 } |
|
878 #endif |
878 CodeEmitInfo* info = state_for(x, x->state()); |
879 CodeEmitInfo* info = state_for(x, x->state()); |
879 LIR_Opr tmp1 = FrameMap::G1_oop_opr; |
880 LIR_Opr tmp1 = FrameMap::G1_oop_opr; |
880 LIR_Opr tmp2 = FrameMap::G3_oop_opr; |
881 LIR_Opr tmp2 = FrameMap::G3_oop_opr; |
881 LIR_Opr tmp3 = FrameMap::G4_oop_opr; |
882 LIR_Opr tmp3 = FrameMap::G4_oop_opr; |
882 LIR_Opr tmp4 = FrameMap::O1_oop_opr; |
883 LIR_Opr tmp4 = FrameMap::O1_oop_opr; |
1016 patching_info = state_for(x, x->state_before()); |
1017 patching_info = state_for(x, x->state_before()); |
1017 } |
1018 } |
1018 obj.load_item(); |
1019 obj.load_item(); |
1019 LIR_Opr out_reg = rlock_result(x); |
1020 LIR_Opr out_reg = rlock_result(x); |
1020 CodeStub* stub; |
1021 CodeStub* stub; |
1021 CodeEmitInfo* info_for_exception = state_for(x, x->state()->copy_locks()); |
1022 CodeEmitInfo* info_for_exception = state_for(x); |
1022 |
1023 |
1023 if (x->is_incompatible_class_change_check()) { |
1024 if (x->is_incompatible_class_change_check()) { |
1024 assert(patching_info == NULL, "can't patch this"); |
1025 assert(patching_info == NULL, "can't patch this"); |
1025 stub = new SimpleExceptionStub(Runtime1::throw_incompatible_class_change_error_id, LIR_OprFact::illegalOpr, info_for_exception); |
1026 stub = new SimpleExceptionStub(Runtime1::throw_incompatible_class_change_error_id, LIR_OprFact::illegalOpr, info_for_exception); |
1026 } else { |
1027 } else { |