OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 3330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3341 __ testb(scratch, Immediate(kIsSymbolMask)); | 3341 __ testb(scratch, Immediate(kIsSymbolMask)); |
3342 __ j(zero, label); | 3342 __ j(zero, label); |
3343 } | 3343 } |
3344 | 3344 |
3345 | 3345 |
3346 void StackCheckStub::Generate(MacroAssembler* masm) { | 3346 void StackCheckStub::Generate(MacroAssembler* masm) { |
3347 __ TailCallRuntime(Runtime::kStackGuard, 0, 1); | 3347 __ TailCallRuntime(Runtime::kStackGuard, 0, 1); |
3348 } | 3348 } |
3349 | 3349 |
3350 | 3350 |
3351 void CallFunctionStub::FinishCode(Handle<Code> code) { | 3351 void CallFunctionStub::FinishCode(Code* code) { |
3352 code->set_has_function_cache(false); | 3352 code->set_has_function_cache(false); |
3353 } | 3353 } |
3354 | 3354 |
3355 | 3355 |
3356 void CallFunctionStub::Clear(Heap* heap, Address address) { | 3356 void CallFunctionStub::Clear(Heap* heap, Address address) { |
3357 UNREACHABLE(); | 3357 UNREACHABLE(); |
3358 } | 3358 } |
3359 | 3359 |
3360 | 3360 |
3361 Object* CallFunctionStub::GetCachedValue(Address address) { | 3361 Object* CallFunctionStub::GetCachedValue(Address address) { |
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3697 | 3697 |
3698 __ bind(&throw_termination_exception); | 3698 __ bind(&throw_termination_exception); |
3699 GenerateThrowUncatchable(masm, TERMINATION); | 3699 GenerateThrowUncatchable(masm, TERMINATION); |
3700 | 3700 |
3701 __ bind(&throw_normal_exception); | 3701 __ bind(&throw_normal_exception); |
3702 GenerateThrowTOS(masm); | 3702 GenerateThrowTOS(masm); |
3703 } | 3703 } |
3704 | 3704 |
3705 | 3705 |
3706 void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { | 3706 void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { |
3707 Label invoke, handler_entry, exit; | 3707 Label invoke, exit; |
3708 Label not_outermost_js, not_outermost_js_2; | 3708 Label not_outermost_js, not_outermost_js_2; |
3709 { // NOLINT. Scope block confuses linter. | 3709 { // NOLINT. Scope block confuses linter. |
3710 MacroAssembler::NoRootArrayScope uninitialized_root_register(masm); | 3710 MacroAssembler::NoRootArrayScope uninitialized_root_register(masm); |
3711 // Setup frame. | 3711 // Setup frame. |
3712 __ push(rbp); | 3712 __ push(rbp); |
3713 __ movq(rbp, rsp); | 3713 __ movq(rbp, rsp); |
3714 | 3714 |
3715 // Push the stack frame type marker twice. | 3715 // Push the stack frame type marker twice. |
3716 int marker = is_construct ? StackFrame::ENTRY_CONSTRUCT : StackFrame::ENTRY; | 3716 int marker = is_construct ? StackFrame::ENTRY_CONSTRUCT : StackFrame::ENTRY; |
3717 // Scratch register is neither callee-save, nor an argument register on any | 3717 // Scratch register is neither callee-save, nor an argument register on any |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3757 __ j(not_zero, ¬_outermost_js); | 3757 __ j(not_zero, ¬_outermost_js); |
3758 __ Push(Smi::FromInt(StackFrame::OUTERMOST_JSENTRY_FRAME)); | 3758 __ Push(Smi::FromInt(StackFrame::OUTERMOST_JSENTRY_FRAME)); |
3759 __ movq(rax, rbp); | 3759 __ movq(rax, rbp); |
3760 __ Store(js_entry_sp, rax); | 3760 __ Store(js_entry_sp, rax); |
3761 Label cont; | 3761 Label cont; |
3762 __ jmp(&cont); | 3762 __ jmp(&cont); |
3763 __ bind(¬_outermost_js); | 3763 __ bind(¬_outermost_js); |
3764 __ Push(Smi::FromInt(StackFrame::INNER_JSENTRY_FRAME)); | 3764 __ Push(Smi::FromInt(StackFrame::INNER_JSENTRY_FRAME)); |
3765 __ bind(&cont); | 3765 __ bind(&cont); |
3766 | 3766 |
3767 // Jump to a faked try block that does the invoke, with a faked catch | 3767 // Call a faked try-block that does the invoke. |
3768 // block that sets the pending exception. | 3768 __ call(&invoke); |
3769 __ jmp(&invoke); | 3769 |
3770 __ bind(&handler_entry); | 3770 // Caught exception: Store result (exception) in the pending |
3771 handler_offset_ = handler_entry.pos(); | 3771 // exception field in the JSEnv and return a failure sentinel. |
3772 // Caught exception: Store result (exception) in the pending exception | |
3773 // field in the JSEnv and return a failure sentinel. | |
3774 ExternalReference pending_exception(Isolate::kPendingExceptionAddress, | 3772 ExternalReference pending_exception(Isolate::kPendingExceptionAddress, |
3775 isolate); | 3773 isolate); |
3776 __ Store(pending_exception, rax); | 3774 __ Store(pending_exception, rax); |
3777 __ movq(rax, Failure::Exception(), RelocInfo::NONE); | 3775 __ movq(rax, Failure::Exception(), RelocInfo::NONE); |
3778 __ jmp(&exit); | 3776 __ jmp(&exit); |
3779 | 3777 |
3780 // Invoke: Link this frame into the handler chain. There's only one | 3778 // Invoke: Link this frame into the handler chain. |
3781 // handler block in this code object, so its index is 0. | |
3782 __ bind(&invoke); | 3779 __ bind(&invoke); |
3783 __ PushTryHandler(IN_JS_ENTRY, JS_ENTRY_HANDLER, 0); | 3780 __ PushTryHandler(IN_JS_ENTRY, JS_ENTRY_HANDLER); |
3784 | 3781 |
3785 // Clear any pending exceptions. | 3782 // Clear any pending exceptions. |
3786 __ LoadRoot(rax, Heap::kTheHoleValueRootIndex); | 3783 __ LoadRoot(rax, Heap::kTheHoleValueRootIndex); |
3787 __ Store(pending_exception, rax); | 3784 __ Store(pending_exception, rax); |
3788 | 3785 |
3789 // Fake a receiver (NULL). | 3786 // Fake a receiver (NULL). |
3790 __ push(Immediate(0)); // receiver | 3787 __ push(Immediate(0)); // receiver |
3791 | 3788 |
3792 // Invoke the function by calling through JS entry trampoline builtin and | 3789 // Invoke the function by calling through JS entry trampoline |
3793 // pop the faked function when we return. We load the address from an | 3790 // builtin and pop the faked function when we return. We load the address |
3794 // external reference instead of inlining the call target address directly | 3791 // from an external reference instead of inlining the call target address |
3795 // in the code, because the builtin stubs may not have been generated yet | 3792 // directly in the code, because the builtin stubs may not have been |
3796 // at the time this code is generated. | 3793 // generated yet at the time this code is generated. |
3797 if (is_construct) { | 3794 if (is_construct) { |
3798 ExternalReference construct_entry(Builtins::kJSConstructEntryTrampoline, | 3795 ExternalReference construct_entry(Builtins::kJSConstructEntryTrampoline, |
3799 isolate); | 3796 isolate); |
3800 __ Load(rax, construct_entry); | 3797 __ Load(rax, construct_entry); |
3801 } else { | 3798 } else { |
3802 ExternalReference entry(Builtins::kJSEntryTrampoline, isolate); | 3799 ExternalReference entry(Builtins::kJSEntryTrampoline, isolate); |
3803 __ Load(rax, entry); | 3800 __ Load(rax, entry); |
3804 } | 3801 } |
3805 __ lea(kScratchRegister, FieldOperand(rax, Code::kHeaderSize)); | 3802 __ lea(kScratchRegister, FieldOperand(rax, Code::kHeaderSize)); |
3806 __ call(kScratchRegister); | 3803 __ call(kScratchRegister); |
(...skipping 2226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6033 __ bind(&element_done); | 6030 __ bind(&element_done); |
6034 __ ret(0); | 6031 __ ret(0); |
6035 } | 6032 } |
6036 } | 6033 } |
6037 | 6034 |
6038 #undef __ | 6035 #undef __ |
6039 | 6036 |
6040 } } // namespace v8::internal | 6037 } } // namespace v8::internal |
6041 | 6038 |
6042 #endif // V8_TARGET_ARCH_X64 | 6039 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |