Mercurial > hg > graal-compiler
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 |