117 bind(L); |
117 bind(L); |
118 } |
118 } |
119 super_pop(V0); |
119 super_pop(V0); |
120 #endif |
120 #endif |
121 // discard thread and arguments |
121 // discard thread and arguments |
122 ld_ptr(SP, thread, in_bytes(JavaThread::last_Java_sp_offset())); //by yyq |
122 ld_ptr(SP, thread, in_bytes(JavaThread::last_Java_sp_offset())); |
123 reset_last_Java_frame(thread, true); |
123 reset_last_Java_frame(thread, true); |
124 // check for pending exceptions |
124 // check for pending exceptions |
125 { |
125 { |
126 Label L; |
126 Label L; |
127 ld_ptr(AT, thread, in_bytes(Thread::pending_exception_offset())); |
127 ld_ptr(AT, thread, in_bytes(Thread::pending_exception_offset())); |
327 // have to save the FPU registers twice if we describe them and on P4 |
327 // have to save the FPU registers twice if we describe them and on P4 |
328 // saving FPU registers which don't contain anything appears |
328 // saving FPU registers which don't contain anything appears |
329 // expensive. The deopt blob is the only thing which needs to |
329 // expensive. The deopt blob is the only thing which needs to |
330 // describe FPU registers. In all other cases it should be sufficient |
330 // describe FPU registers. In all other cases it should be sufficient |
331 // to simply save their current value. |
331 // to simply save their current value. |
332 //FIXME, I have no idea which register should be saved . @jerome |
|
333 static OopMap* generate_oop_map(StubAssembler* sasm, int num_rt_args, |
332 static OopMap* generate_oop_map(StubAssembler* sasm, int num_rt_args, |
334 bool save_fpu_registers = true, bool describe_fpu_registers = false) { |
333 bool save_fpu_registers = true, bool describe_fpu_registers = false) { |
335 |
334 |
336 LP64_ONLY(num_rt_args = 0); |
335 LP64_ONLY(num_rt_args = 0); |
337 LP64_ONLY(assert((reg_save_frame_size * VMRegImpl::stack_slot_size) % 16 == 0, "must be 16 byte aligned");) |
336 LP64_ONLY(assert((reg_save_frame_size * VMRegImpl::stack_slot_size) % 16 == 0, "must be 16 byte aligned");) |
411 map->set_callee_saved(VMRegImpl::stack2reg(A3H_off + num_rt_args), A3->as_VMReg()->next()); |
410 map->set_callee_saved(VMRegImpl::stack2reg(A3H_off + num_rt_args), A3->as_VMReg()->next()); |
412 #endif |
411 #endif |
413 return map; |
412 return map; |
414 } |
413 } |
415 |
414 |
416 //FIXME, Is it enough to save this registers by yyq |
|
417 static OopMap* save_live_registers(StubAssembler* sasm, int num_rt_args, |
415 static OopMap* save_live_registers(StubAssembler* sasm, int num_rt_args, |
418 bool save_fpu_registers = true, |
416 bool save_fpu_registers = true, |
419 bool describe_fpu_registers = false) { |
417 bool describe_fpu_registers = false) { |
420 //const int reg_save_frame_size = return_off + 1 + num_rt_args; |
418 //const int reg_save_frame_size = return_off + 1 + num_rt_args; |
421 __ block_comment("save_live_registers"); |
419 __ block_comment("save_live_registers"); |