3012 |
3012 |
3013 // Pick up the initial fp we should save |
3013 // Pick up the initial fp we should save |
3014 // restore rbp before stack bang because if stack overflow is thrown it needs to be pushed (and preserved) |
3014 // restore rbp before stack bang because if stack overflow is thrown it needs to be pushed (and preserved) |
3015 __ movptr(rbp, Address(rdi, Deoptimization::UnrollBlock::initial_info_offset_in_bytes())); |
3015 __ movptr(rbp, Address(rdi, Deoptimization::UnrollBlock::initial_info_offset_in_bytes())); |
3016 |
3016 |
3017 // Stack bang to make sure there's enough room for these interpreter frames. |
3017 #ifdef ASSERT |
|
3018 // Compilers generate code that bang the stack by as much as the |
|
3019 // interpreter would need. So this stack banging should never |
|
3020 // trigger a fault. Verify that it does not on non product builds. |
3018 if (UseStackBanging) { |
3021 if (UseStackBanging) { |
3019 __ movl(rbx, Address(rdi ,Deoptimization::UnrollBlock::total_frame_sizes_offset_in_bytes())); |
3022 __ movl(rbx, Address(rdi ,Deoptimization::UnrollBlock::total_frame_sizes_offset_in_bytes())); |
3020 __ bang_stack_size(rbx, rcx); |
3023 __ bang_stack_size(rbx, rcx); |
3021 } |
3024 } |
|
3025 #endif |
3022 |
3026 |
3023 // Load array of frame pcs into ECX |
3027 // Load array of frame pcs into ECX |
3024 __ movptr(rcx,Address(rdi,Deoptimization::UnrollBlock::frame_pcs_offset_in_bytes())); |
3028 __ movptr(rcx,Address(rdi,Deoptimization::UnrollBlock::frame_pcs_offset_in_bytes())); |
3025 |
3029 |
3026 __ pop(rsi); // trash the old pc |
3030 __ pop(rsi); // trash the old pc |
3238 |
3242 |
3239 // Pick up the initial fp we should save |
3243 // Pick up the initial fp we should save |
3240 // restore rbp before stack bang because if stack overflow is thrown it needs to be pushed (and preserved) |
3244 // restore rbp before stack bang because if stack overflow is thrown it needs to be pushed (and preserved) |
3241 __ movptr(rbp, Address(rdi, Deoptimization::UnrollBlock::initial_info_offset_in_bytes())); |
3245 __ movptr(rbp, Address(rdi, Deoptimization::UnrollBlock::initial_info_offset_in_bytes())); |
3242 |
3246 |
3243 // Stack bang to make sure there's enough room for these interpreter frames. |
3247 #ifdef ASSERT |
|
3248 // Compilers generate code that bang the stack by as much as the |
|
3249 // interpreter would need. So this stack banging should never |
|
3250 // trigger a fault. Verify that it does not on non product builds. |
3244 if (UseStackBanging) { |
3251 if (UseStackBanging) { |
3245 __ movl(rbx, Address(rdi ,Deoptimization::UnrollBlock::total_frame_sizes_offset_in_bytes())); |
3252 __ movl(rbx, Address(rdi ,Deoptimization::UnrollBlock::total_frame_sizes_offset_in_bytes())); |
3246 __ bang_stack_size(rbx, rcx); |
3253 __ bang_stack_size(rbx, rcx); |
3247 } |
3254 } |
3248 |
3255 #endif |
3249 |
3256 |
3250 // Load array of frame pcs into ECX |
3257 // Load array of frame pcs into ECX |
3251 __ movl(rcx,Address(rdi,Deoptimization::UnrollBlock::frame_pcs_offset_in_bytes())); |
3258 __ movl(rcx,Address(rdi,Deoptimization::UnrollBlock::frame_pcs_offset_in_bytes())); |
3252 |
3259 |
3253 __ pop(rsi); // trash the pc |
3260 __ pop(rsi); // trash the pc |