comparison src/cpu/sparc/vm/sharedRuntime_sparc.cpp @ 1037:0a46d0c5dccb

6891750: deopt blob kills values in O5 Reviewed-by: kvn, twisti
author never
date Thu, 15 Oct 2009 11:47:13 -0700
parents 1ce3281a8e93
children cf0685d550f1
comparison
equal deleted inserted replaced
1016:d40f03b57795 1037:0a46d0c5dccb
3211 FloatRegister Freturn0 = F0; 3211 FloatRegister Freturn0 = F0;
3212 Register Greturn1 = G1; 3212 Register Greturn1 = G1;
3213 Register Oreturn0 = O0; 3213 Register Oreturn0 = O0;
3214 Register Oreturn1 = O1; 3214 Register Oreturn1 = O1;
3215 Register O2UnrollBlock = O2; 3215 Register O2UnrollBlock = O2;
3216 Register O3tmp = O3; 3216 Register L0deopt_mode = L0;
3217 Register I5exception_tmp = I5; 3217 Register G4deopt_mode = G4_scratch;
3218 Register G4exception_tmp = G4_scratch;
3219 int frame_size_words; 3218 int frame_size_words;
3220 Address saved_Freturn0_addr(FP, -sizeof(double) + STACK_BIAS); 3219 Address saved_Freturn0_addr(FP, -sizeof(double) + STACK_BIAS);
3221 #if !defined(_LP64) && defined(COMPILER2) 3220 #if !defined(_LP64) && defined(COMPILER2)
3222 Address saved_Greturn1_addr(FP, -sizeof(double) -sizeof(jlong) + STACK_BIAS); 3221 Address saved_Greturn1_addr(FP, -sizeof(double) -sizeof(jlong) + STACK_BIAS);
3223 #endif 3222 #endif
3263 // replaced the original call (or safepoint polling location) so the deoptimizing 3262 // replaced the original call (or safepoint polling location) so the deoptimizing
3264 // pc is now in O7. Return values are still in the expected places 3263 // pc is now in O7. Return values are still in the expected places
3265 3264
3266 map = RegisterSaver::save_live_registers(masm, 0, &frame_size_words); 3265 map = RegisterSaver::save_live_registers(masm, 0, &frame_size_words);
3267 __ ba(false, cont); 3266 __ ba(false, cont);
3268 __ delayed()->mov(Deoptimization::Unpack_deopt, I5exception_tmp); 3267 __ delayed()->mov(Deoptimization::Unpack_deopt, L0deopt_mode);
3269 3268
3270 int exception_offset = __ offset() - start; 3269 int exception_offset = __ offset() - start;
3271 3270
3272 // restore G2, the trampoline destroyed it 3271 // restore G2, the trampoline destroyed it
3273 __ get_thread(); 3272 __ get_thread();
3314 __ bind(no_pending_exception); 3313 __ bind(no_pending_exception);
3315 } 3314 }
3316 #endif 3315 #endif
3317 3316
3318 __ ba(false, cont); 3317 __ ba(false, cont);
3319 __ delayed()->mov(Deoptimization::Unpack_exception, I5exception_tmp);; 3318 __ delayed()->mov(Deoptimization::Unpack_exception, L0deopt_mode);;
3320 3319
3321 // 3320 //
3322 // Reexecute entry, similar to c2 uncommon trap 3321 // Reexecute entry, similar to c2 uncommon trap
3323 // 3322 //
3324 int reexecute_offset = __ offset() - start; 3323 int reexecute_offset = __ offset() - start;
3325 3324
3326 // No need to update oop_map as each call to save_live_registers will produce identical oopmap 3325 // No need to update oop_map as each call to save_live_registers will produce identical oopmap
3327 (void) RegisterSaver::save_live_registers(masm, 0, &frame_size_words); 3326 (void) RegisterSaver::save_live_registers(masm, 0, &frame_size_words);
3328 3327
3329 __ mov(Deoptimization::Unpack_reexecute, I5exception_tmp); 3328 __ mov(Deoptimization::Unpack_reexecute, L0deopt_mode);
3330 3329
3331 __ bind(cont); 3330 __ bind(cont);
3332 3331
3333 __ set_last_Java_frame(SP, noreg); 3332 __ set_last_Java_frame(SP, noreg);
3334 3333
3347 __ reset_last_Java_frame(); 3346 __ reset_last_Java_frame();
3348 3347
3349 // NOTE: we know that only O0/O1 will be reloaded by restore_result_registers 3348 // NOTE: we know that only O0/O1 will be reloaded by restore_result_registers
3350 // so this move will survive 3349 // so this move will survive
3351 3350
3352 __ mov(I5exception_tmp, G4exception_tmp); 3351 __ mov(L0deopt_mode, G4deopt_mode);
3353 3352
3354 __ mov(O0, O2UnrollBlock->after_save()); 3353 __ mov(O0, O2UnrollBlock->after_save());
3355 3354
3356 RegisterSaver::restore_result_registers(masm); 3355 RegisterSaver::restore_result_registers(masm);
3357 3356
3358 Label noException; 3357 Label noException;
3359 __ cmp(G4exception_tmp, Deoptimization::Unpack_exception); // Was exception pending? 3358 __ cmp(G4deopt_mode, Deoptimization::Unpack_exception); // Was exception pending?
3360 __ br(Assembler::notEqual, false, Assembler::pt, noException); 3359 __ br(Assembler::notEqual, false, Assembler::pt, noException);
3361 __ delayed()->nop(); 3360 __ delayed()->nop();
3362 3361
3363 // Move the pending exception from exception_oop to Oexception so 3362 // Move the pending exception from exception_oop to Oexception so
3364 // the pending exception will be picked up the interpreter. 3363 // the pending exception will be picked up the interpreter.
3388 // 32-bit 1-register longs return longs in G1 3387 // 32-bit 1-register longs return longs in G1
3389 __ stx(Greturn1, saved_Greturn1_addr); 3388 __ stx(Greturn1, saved_Greturn1_addr);
3390 } 3389 }
3391 #endif 3390 #endif
3392 __ set_last_Java_frame(SP, noreg); 3391 __ set_last_Java_frame(SP, noreg);
3393 __ call_VM_leaf(L7_thread_cache, CAST_FROM_FN_PTR(address, Deoptimization::unpack_frames), G2_thread, G4exception_tmp); 3392 __ call_VM_leaf(L7_thread_cache, CAST_FROM_FN_PTR(address, Deoptimization::unpack_frames), G2_thread, G4deopt_mode);
3394 #else 3393 #else
3395 // LP64 uses g4 in set_last_Java_frame 3394 // LP64 uses g4 in set_last_Java_frame
3396 __ mov(G4exception_tmp, O1); 3395 __ mov(G4deopt_mode, O1);
3397 __ set_last_Java_frame(SP, G0); 3396 __ set_last_Java_frame(SP, G0);
3398 __ call_VM_leaf(L7_thread_cache, CAST_FROM_FN_PTR(address, Deoptimization::unpack_frames), G2_thread, O1); 3397 __ call_VM_leaf(L7_thread_cache, CAST_FROM_FN_PTR(address, Deoptimization::unpack_frames), G2_thread, O1);
3399 #endif 3398 #endif
3400 __ reset_last_Java_frame(); 3399 __ reset_last_Java_frame();
3401 __ ldf(FloatRegisterImpl::D, saved_Freturn0_addr, Freturn0); 3400 __ ldf(FloatRegisterImpl::D, saved_Freturn0_addr, Freturn0);
3444 // Measured 8/7/03 at 1028 in 32bit debug build (VerifyThread) 3443 // Measured 8/7/03 at 1028 in 32bit debug build (VerifyThread)
3445 CodeBuffer buffer("uncommon_trap_blob", 2000+pad, 512); 3444 CodeBuffer buffer("uncommon_trap_blob", 2000+pad, 512);
3446 #endif 3445 #endif
3447 MacroAssembler* masm = new MacroAssembler(&buffer); 3446 MacroAssembler* masm = new MacroAssembler(&buffer);
3448 Register O2UnrollBlock = O2; 3447 Register O2UnrollBlock = O2;
3449 Register O3tmp = O3;
3450 Register O2klass_index = O2; 3448 Register O2klass_index = O2;
3451 3449
3452 // 3450 //
3453 // This is the entry point for all traps the compiler takes when it thinks 3451 // This is the entry point for all traps the compiler takes when it thinks
3454 // it cannot handle further execution of compilation code. The frame is 3452 // it cannot handle further execution of compilation code. The frame is