Mercurial > hg > truffle
comparison src/cpu/x86/vm/c1_LIRGenerator_x86.cpp @ 1819:f02a8bbe6ed4
6986046: C1 valuestack cleanup
Summary: fixes an historical oddity in C1 with inlining where all of the expression stacks are kept in the topmost ValueStack instead of being in their respective ValueStacks.
Reviewed-by: never
Contributed-by: Christian Wimmer <cwimmer@uci.edu>
author | roland |
---|---|
date | Tue, 29 Dec 2009 19:08:54 +0100 |
parents | 3a294e483abc |
children | c393f046f4c5 |
comparison
equal
deleted
inserted
replaced
1817:c40600e85311 | 1819:f02a8bbe6ed4 |
---|---|
105 if (type == T_SHORT || type == T_CHAR) { | 105 if (type == T_SHORT || type == T_CHAR) { |
106 // there is no immediate move of word values in asembler_i486.?pp | 106 // there is no immediate move of word values in asembler_i486.?pp |
107 return false; | 107 return false; |
108 } | 108 } |
109 Constant* c = v->as_Constant(); | 109 Constant* c = v->as_Constant(); |
110 if (c && c->state() == NULL) { | 110 if (c && c->state_before() == NULL) { |
111 // constants of any type can be stored directly, except for | 111 // constants of any type can be stored directly, except for |
112 // unloaded object constants. | 112 // unloaded object constants. |
113 return true; | 113 return true; |
114 } | 114 } |
115 return false; | 115 return false; |
248 // visitor functions | 248 // visitor functions |
249 //---------------------------------------------------------------------- | 249 //---------------------------------------------------------------------- |
250 | 250 |
251 | 251 |
252 void LIRGenerator::do_StoreIndexed(StoreIndexed* x) { | 252 void LIRGenerator::do_StoreIndexed(StoreIndexed* x) { |
253 assert(x->is_root(),""); | 253 assert(x->is_pinned(),""); |
254 bool needs_range_check = true; | 254 bool needs_range_check = true; |
255 bool use_length = x->length() != NULL; | 255 bool use_length = x->length() != NULL; |
256 bool obj_store = x->elt_type() == T_ARRAY || x->elt_type() == T_OBJECT; | 256 bool obj_store = x->elt_type() == T_ARRAY || x->elt_type() == T_OBJECT; |
257 bool needs_store_check = obj_store && (x->value()->as_Constant() == NULL || | 257 bool needs_store_check = obj_store && (x->value()->as_Constant() == NULL || |
258 !get_jobject_constant(x->value())->is_null_object()); | 258 !get_jobject_constant(x->value())->is_null_object()); |
323 } | 323 } |
324 } | 324 } |
325 | 325 |
326 | 326 |
327 void LIRGenerator::do_MonitorEnter(MonitorEnter* x) { | 327 void LIRGenerator::do_MonitorEnter(MonitorEnter* x) { |
328 assert(x->is_root(),""); | 328 assert(x->is_pinned(),""); |
329 LIRItem obj(x->obj(), this); | 329 LIRItem obj(x->obj(), this); |
330 obj.load_item(); | 330 obj.load_item(); |
331 | 331 |
332 set_no_result(x); | 332 set_no_result(x); |
333 | 333 |
339 scratch = new_register(T_INT); | 339 scratch = new_register(T_INT); |
340 } | 340 } |
341 | 341 |
342 CodeEmitInfo* info_for_exception = NULL; | 342 CodeEmitInfo* info_for_exception = NULL; |
343 if (x->needs_null_check()) { | 343 if (x->needs_null_check()) { |
344 info_for_exception = state_for(x, x->lock_stack_before()); | 344 info_for_exception = state_for(x); |
345 } | 345 } |
346 // this CodeEmitInfo must not have the xhandlers because here the | 346 // this CodeEmitInfo must not have the xhandlers because here the |
347 // object is already locked (xhandlers expect object to be unlocked) | 347 // object is already locked (xhandlers expect object to be unlocked) |
348 CodeEmitInfo* info = state_for(x, x->state(), true); | 348 CodeEmitInfo* info = state_for(x, x->state(), true); |
349 monitor_enter(obj.result(), lock, syncTempOpr(), scratch, | 349 monitor_enter(obj.result(), lock, syncTempOpr(), scratch, |
350 x->monitor_no(), info_for_exception, info); | 350 x->monitor_no(), info_for_exception, info); |
351 } | 351 } |
352 | 352 |
353 | 353 |
354 void LIRGenerator::do_MonitorExit(MonitorExit* x) { | 354 void LIRGenerator::do_MonitorExit(MonitorExit* x) { |
355 assert(x->is_root(),""); | 355 assert(x->is_pinned(),""); |
356 | 356 |
357 LIRItem obj(x->obj(), this); | 357 LIRItem obj(x->obj(), this); |
358 obj.dont_load_item(); | 358 obj.dont_load_item(); |
359 | 359 |
360 LIR_Opr lock = new_register(T_INT); | 360 LIR_Opr lock = new_register(T_INT); |
982 set_result(x, result); | 982 set_result(x, result); |
983 } | 983 } |
984 | 984 |
985 | 985 |
986 void LIRGenerator::do_NewInstance(NewInstance* x) { | 986 void LIRGenerator::do_NewInstance(NewInstance* x) { |
987 #ifndef PRODUCT | |
987 if (PrintNotLoaded && !x->klass()->is_loaded()) { | 988 if (PrintNotLoaded && !x->klass()->is_loaded()) { |
988 tty->print_cr(" ###class not loaded at new bci %d", x->bci()); | 989 tty->print_cr(" ###class not loaded at new bci %d", x->printable_bci()); |
989 } | 990 } |
991 #endif | |
990 CodeEmitInfo* info = state_for(x, x->state()); | 992 CodeEmitInfo* info = state_for(x, x->state()); |
991 LIR_Opr reg = result_register_for(x->type()); | 993 LIR_Opr reg = result_register_for(x->type()); |
992 LIR_Opr klass_reg = new_register(objectType); | 994 LIR_Opr klass_reg = new_register(objectType); |
993 new_instance(reg, x->klass(), | 995 new_instance(reg, x->klass(), |
994 FrameMap::rcx_oop_opr, | 996 FrameMap::rcx_oop_opr, |
1125 patching_info = state_for(x, x->state_before()); | 1127 patching_info = state_for(x, x->state_before()); |
1126 } | 1128 } |
1127 obj.load_item(); | 1129 obj.load_item(); |
1128 | 1130 |
1129 // info for exceptions | 1131 // info for exceptions |
1130 CodeEmitInfo* info_for_exception = state_for(x, x->state()->copy_locks()); | 1132 CodeEmitInfo* info_for_exception = state_for(x); |
1131 | 1133 |
1132 CodeStub* stub; | 1134 CodeStub* stub; |
1133 if (x->is_incompatible_class_change_check()) { | 1135 if (x->is_incompatible_class_change_check()) { |
1134 assert(patching_info == NULL, "can't patch this"); | 1136 assert(patching_info == NULL, "can't patch this"); |
1135 stub = new SimpleExceptionStub(Runtime1::throw_incompatible_class_change_error_id, LIR_OprFact::illegalOpr, info_for_exception); | 1137 stub = new SimpleExceptionStub(Runtime1::throw_incompatible_class_change_error_id, LIR_OprFact::illegalOpr, info_for_exception); |