| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #if V8_TARGET_ARCH_ARM64 | 7 #if V8_TARGET_ARCH_ARM64 |
| 8 | 8 |
| 9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
| 10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
| (...skipping 5248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5259 if (FLAG_log_timer_events) { | 5259 if (FLAG_log_timer_events) { |
| 5260 FrameScope frame(masm, StackFrame::MANUAL); | 5260 FrameScope frame(masm, StackFrame::MANUAL); |
| 5261 __ PushSafepointRegisters(); | 5261 __ PushSafepointRegisters(); |
| 5262 __ Mov(x0, ExternalReference::isolate_address(isolate)); | 5262 __ Mov(x0, ExternalReference::isolate_address(isolate)); |
| 5263 __ CallCFunction(ExternalReference::log_leave_external_function(isolate), | 5263 __ CallCFunction(ExternalReference::log_leave_external_function(isolate), |
| 5264 1); | 5264 1); |
| 5265 __ PopSafepointRegisters(); | 5265 __ PopSafepointRegisters(); |
| 5266 } | 5266 } |
| 5267 | 5267 |
| 5268 Label promote_scheduled_exception; | 5268 Label promote_scheduled_exception; |
| 5269 Label exception_handled; | |
| 5270 Label delete_allocated_handles; | 5269 Label delete_allocated_handles; |
| 5271 Label leave_exit_frame; | 5270 Label leave_exit_frame; |
| 5272 Label return_value_loaded; | 5271 Label return_value_loaded; |
| 5273 | 5272 |
| 5274 // Load value from ReturnValue. | 5273 // Load value from ReturnValue. |
| 5275 __ Ldr(x0, return_value_operand); | 5274 __ Ldr(x0, return_value_operand); |
| 5276 __ Bind(&return_value_loaded); | 5275 __ Bind(&return_value_loaded); |
| 5277 // No more valid handles (the result handle was the last one). Restore | 5276 // No more valid handles (the result handle was the last one). Restore |
| 5278 // previous handle scope. | 5277 // previous handle scope. |
| 5279 __ Str(next_address_reg, MemOperand(handle_scope_base, kNextOffset)); | 5278 __ Str(next_address_reg, MemOperand(handle_scope_base, kNextOffset)); |
| 5280 if (__ emit_debug_code()) { | 5279 if (__ emit_debug_code()) { |
| 5281 __ Ldr(w1, MemOperand(handle_scope_base, kLevelOffset)); | 5280 __ Ldr(w1, MemOperand(handle_scope_base, kLevelOffset)); |
| 5282 __ Cmp(w1, level_reg); | 5281 __ Cmp(w1, level_reg); |
| 5283 __ Check(eq, kUnexpectedLevelAfterReturnFromApiCall); | 5282 __ Check(eq, kUnexpectedLevelAfterReturnFromApiCall); |
| 5284 } | 5283 } |
| 5285 __ Sub(level_reg, level_reg, 1); | 5284 __ Sub(level_reg, level_reg, 1); |
| 5286 __ Str(level_reg, MemOperand(handle_scope_base, kLevelOffset)); | 5285 __ Str(level_reg, MemOperand(handle_scope_base, kLevelOffset)); |
| 5287 __ Ldr(x1, MemOperand(handle_scope_base, kLimitOffset)); | 5286 __ Ldr(x1, MemOperand(handle_scope_base, kLimitOffset)); |
| 5288 __ Cmp(limit_reg, x1); | 5287 __ Cmp(limit_reg, x1); |
| 5289 __ B(ne, &delete_allocated_handles); | 5288 __ B(ne, &delete_allocated_handles); |
| 5290 | 5289 |
| 5290 // Leave the API exit frame. |
| 5291 __ Bind(&leave_exit_frame); | 5291 __ Bind(&leave_exit_frame); |
| 5292 // Restore callee-saved registers. | 5292 // Restore callee-saved registers. |
| 5293 __ Peek(x19, (spill_offset + 0) * kXRegSize); | 5293 __ Peek(x19, (spill_offset + 0) * kXRegSize); |
| 5294 __ Peek(x20, (spill_offset + 1) * kXRegSize); | 5294 __ Peek(x20, (spill_offset + 1) * kXRegSize); |
| 5295 __ Peek(x21, (spill_offset + 2) * kXRegSize); | 5295 __ Peek(x21, (spill_offset + 2) * kXRegSize); |
| 5296 __ Peek(x22, (spill_offset + 3) * kXRegSize); | 5296 __ Peek(x22, (spill_offset + 3) * kXRegSize); |
| 5297 | 5297 |
| 5298 // Check if the function scheduled an exception. | |
| 5299 __ Mov(x5, ExternalReference::scheduled_exception_address(isolate)); | |
| 5300 __ Ldr(x5, MemOperand(x5)); | |
| 5301 __ JumpIfNotRoot(x5, Heap::kTheHoleValueRootIndex, | |
| 5302 &promote_scheduled_exception); | |
| 5303 __ Bind(&exception_handled); | |
| 5304 | |
| 5305 bool restore_context = context_restore_operand != NULL; | 5298 bool restore_context = context_restore_operand != NULL; |
| 5306 if (restore_context) { | 5299 if (restore_context) { |
| 5307 __ Ldr(cp, *context_restore_operand); | 5300 __ Ldr(cp, *context_restore_operand); |
| 5308 } | 5301 } |
| 5309 | 5302 |
| 5310 if (stack_space_operand != NULL) { | 5303 if (stack_space_operand != NULL) { |
| 5311 __ Ldr(w2, *stack_space_operand); | 5304 __ Ldr(w2, *stack_space_operand); |
| 5312 } | 5305 } |
| 5313 | 5306 |
| 5314 __ LeaveExitFrame(false, x1, !restore_context); | 5307 __ LeaveExitFrame(false, x1, !restore_context); |
| 5308 |
| 5309 // Check if the function scheduled an exception. |
| 5310 __ Mov(x5, ExternalReference::scheduled_exception_address(isolate)); |
| 5311 __ Ldr(x5, MemOperand(x5)); |
| 5312 __ JumpIfNotRoot(x5, Heap::kTheHoleValueRootIndex, |
| 5313 &promote_scheduled_exception); |
| 5314 |
| 5315 if (stack_space_operand != NULL) { | 5315 if (stack_space_operand != NULL) { |
| 5316 __ Drop(x2, 1); | 5316 __ Drop(x2, 1); |
| 5317 } else { | 5317 } else { |
| 5318 __ Drop(stack_space); | 5318 __ Drop(stack_space); |
| 5319 } | 5319 } |
| 5320 __ Ret(); | 5320 __ Ret(); |
| 5321 | 5321 |
| 5322 // Re-throw by promoting a scheduled exception. |
| 5322 __ Bind(&promote_scheduled_exception); | 5323 __ Bind(&promote_scheduled_exception); |
| 5323 { | 5324 __ TailCallRuntime(Runtime::kPromoteScheduledException, 0, 1); |
| 5324 FrameScope frame(masm, StackFrame::INTERNAL); | |
| 5325 __ CallExternalReference( | |
| 5326 ExternalReference(Runtime::kPromoteScheduledException, isolate), 0); | |
| 5327 } | |
| 5328 __ B(&exception_handled); | |
| 5329 | 5325 |
| 5330 // HandleScope limit has changed. Delete allocated extensions. | 5326 // HandleScope limit has changed. Delete allocated extensions. |
| 5331 __ Bind(&delete_allocated_handles); | 5327 __ Bind(&delete_allocated_handles); |
| 5332 __ Str(limit_reg, MemOperand(handle_scope_base, kLimitOffset)); | 5328 __ Str(limit_reg, MemOperand(handle_scope_base, kLimitOffset)); |
| 5333 // Save the return value in a callee-save register. | 5329 // Save the return value in a callee-save register. |
| 5334 Register saved_result = x19; | 5330 Register saved_result = x19; |
| 5335 __ Mov(saved_result, x0); | 5331 __ Mov(saved_result, x0); |
| 5336 __ Mov(x0, ExternalReference::isolate_address(isolate)); | 5332 __ Mov(x0, ExternalReference::isolate_address(isolate)); |
| 5337 __ CallCFunction(ExternalReference::delete_handle_scope_extensions(isolate), | 5333 __ CallCFunction(ExternalReference::delete_handle_scope_extensions(isolate), |
| 5338 1); | 5334 1); |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5518 kStackUnwindSpace, NULL, spill_offset, | 5514 kStackUnwindSpace, NULL, spill_offset, |
| 5519 MemOperand(fp, 6 * kPointerSize), NULL); | 5515 MemOperand(fp, 6 * kPointerSize), NULL); |
| 5520 } | 5516 } |
| 5521 | 5517 |
| 5522 | 5518 |
| 5523 #undef __ | 5519 #undef __ |
| 5524 | 5520 |
| 5525 } } // namespace v8::internal | 5521 } } // namespace v8::internal |
| 5526 | 5522 |
| 5527 #endif // V8_TARGET_ARCH_ARM64 | 5523 #endif // V8_TARGET_ARCH_ARM64 |
| OLD | NEW |