Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(884)

Side by Side Diff: src/x64/code-stubs-x64.cc

Issue 140553004: Introduce Assembler::RelocInfoNone static function for X64 (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/x64/assembler-x64.cc ('k') | src/x64/deoptimizer-x64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 2719 matching lines...) Expand 10 before | Expand all | Expand 10 after
2730 // Do space-specific GC and retry runtime call. 2730 // Do space-specific GC and retry runtime call.
2731 GenerateCore(masm, 2731 GenerateCore(masm,
2732 &throw_normal_exception, 2732 &throw_normal_exception,
2733 &throw_termination_exception, 2733 &throw_termination_exception,
2734 &throw_out_of_memory_exception, 2734 &throw_out_of_memory_exception,
2735 true, 2735 true,
2736 false); 2736 false);
2737 2737
2738 // Do full GC and retry runtime call one final time. 2738 // Do full GC and retry runtime call one final time.
2739 Failure* failure = Failure::InternalError(); 2739 Failure* failure = Failure::InternalError();
2740 __ Move(rax, failure, RelocInfo::NONE64); 2740 __ Move(rax, failure, Assembler::RelocInfoNone());
2741 GenerateCore(masm, 2741 GenerateCore(masm,
2742 &throw_normal_exception, 2742 &throw_normal_exception,
2743 &throw_termination_exception, 2743 &throw_termination_exception,
2744 &throw_out_of_memory_exception, 2744 &throw_out_of_memory_exception,
2745 true, 2745 true,
2746 true); 2746 true);
2747 2747
2748 __ bind(&throw_out_of_memory_exception); 2748 __ bind(&throw_out_of_memory_exception);
2749 // Set external caught exception to false. 2749 // Set external caught exception to false.
2750 Isolate* isolate = masm->isolate(); 2750 Isolate* isolate = masm->isolate();
2751 ExternalReference external_caught(Isolate::kExternalCaughtExceptionAddress, 2751 ExternalReference external_caught(Isolate::kExternalCaughtExceptionAddress,
2752 isolate); 2752 isolate);
2753 __ Set(rax, static_cast<int64_t>(false)); 2753 __ Set(rax, static_cast<int64_t>(false));
2754 __ Store(external_caught, rax); 2754 __ Store(external_caught, rax);
2755 2755
2756 // Set pending exception and rax to out of memory exception. 2756 // Set pending exception and rax to out of memory exception.
2757 ExternalReference pending_exception(Isolate::kPendingExceptionAddress, 2757 ExternalReference pending_exception(Isolate::kPendingExceptionAddress,
2758 isolate); 2758 isolate);
2759 Label already_have_failure; 2759 Label already_have_failure;
2760 JumpIfOOM(masm, rax, kScratchRegister, &already_have_failure); 2760 JumpIfOOM(masm, rax, kScratchRegister, &already_have_failure);
2761 __ Move(rax, Failure::OutOfMemoryException(0x1), RelocInfo::NONE64); 2761 __ Move(rax, Failure::OutOfMemoryException(0x1), Assembler::RelocInfoNone());
2762 __ bind(&already_have_failure); 2762 __ bind(&already_have_failure);
2763 __ Store(pending_exception, rax); 2763 __ Store(pending_exception, rax);
2764 // Fall through to the next label. 2764 // Fall through to the next label.
2765 2765
2766 __ bind(&throw_termination_exception); 2766 __ bind(&throw_termination_exception);
2767 __ ThrowUncatchable(rax); 2767 __ ThrowUncatchable(rax);
2768 2768
2769 __ bind(&throw_normal_exception); 2769 __ bind(&throw_normal_exception);
2770 __ Throw(rax); 2770 __ Throw(rax);
2771 } 2771 }
2772 2772
2773 2773
2774 void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { 2774 void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) {
2775 Label invoke, handler_entry, exit; 2775 Label invoke, handler_entry, exit;
2776 Label not_outermost_js, not_outermost_js_2; 2776 Label not_outermost_js, not_outermost_js_2;
2777 2777
2778 ProfileEntryHookStub::MaybeCallEntryHook(masm); 2778 ProfileEntryHookStub::MaybeCallEntryHook(masm);
2779 2779
2780 { // NOLINT. Scope block confuses linter. 2780 { // NOLINT. Scope block confuses linter.
2781 MacroAssembler::NoRootArrayScope uninitialized_root_register(masm); 2781 MacroAssembler::NoRootArrayScope uninitialized_root_register(masm);
2782 // Set up frame. 2782 // Set up frame.
2783 __ push(rbp); 2783 __ push(rbp);
2784 __ movp(rbp, rsp); 2784 __ movp(rbp, rsp);
2785 2785
2786 // Push the stack frame type marker twice. 2786 // Push the stack frame type marker twice.
2787 int marker = is_construct ? StackFrame::ENTRY_CONSTRUCT : StackFrame::ENTRY; 2787 int marker = is_construct ? StackFrame::ENTRY_CONSTRUCT : StackFrame::ENTRY;
2788 // Scratch register is neither callee-save, nor an argument register on any 2788 // Scratch register is neither callee-save, nor an argument register on any
2789 // platform. It's free to use at this point. 2789 // platform. It's free to use at this point.
2790 // Cannot use smi-register for loading yet. 2790 // Cannot use smi-register for loading yet.
2791 __ Move(kScratchRegister, Smi::FromInt(marker), RelocInfo::NONE64); 2791 __ Move(kScratchRegister, Smi::FromInt(marker), Assembler::RelocInfoNone());
2792 __ push(kScratchRegister); // context slot 2792 __ push(kScratchRegister); // context slot
2793 __ push(kScratchRegister); // function slot 2793 __ push(kScratchRegister); // function slot
2794 // Save callee-saved registers (X64/Win64 calling conventions). 2794 // Save callee-saved registers (X64/Win64 calling conventions).
2795 __ push(r12); 2795 __ push(r12);
2796 __ push(r13); 2796 __ push(r13);
2797 __ push(r14); 2797 __ push(r14);
2798 __ push(r15); 2798 __ push(r15);
2799 #ifdef _WIN64 2799 #ifdef _WIN64
2800 __ push(rdi); // Only callee save in Win64 ABI, argument in AMD64 ABI. 2800 __ push(rdi); // Only callee save in Win64 ABI, argument in AMD64 ABI.
2801 __ push(rsi); // Only callee save in Win64 ABI, argument in AMD64 ABI. 2801 __ push(rsi); // Only callee save in Win64 ABI, argument in AMD64 ABI.
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
2849 // Jump to a faked try block that does the invoke, with a faked catch 2849 // Jump to a faked try block that does the invoke, with a faked catch
2850 // block that sets the pending exception. 2850 // block that sets the pending exception.
2851 __ jmp(&invoke); 2851 __ jmp(&invoke);
2852 __ bind(&handler_entry); 2852 __ bind(&handler_entry);
2853 handler_offset_ = handler_entry.pos(); 2853 handler_offset_ = handler_entry.pos();
2854 // Caught exception: Store result (exception) in the pending exception 2854 // Caught exception: Store result (exception) in the pending exception
2855 // field in the JSEnv and return a failure sentinel. 2855 // field in the JSEnv and return a failure sentinel.
2856 ExternalReference pending_exception(Isolate::kPendingExceptionAddress, 2856 ExternalReference pending_exception(Isolate::kPendingExceptionAddress,
2857 isolate); 2857 isolate);
2858 __ Store(pending_exception, rax); 2858 __ Store(pending_exception, rax);
2859 __ Move(rax, Failure::Exception(), RelocInfo::NONE64); 2859 __ Move(rax, Failure::Exception(), Assembler::RelocInfoNone());
2860 __ jmp(&exit); 2860 __ jmp(&exit);
2861 2861
2862 // Invoke: Link this frame into the handler chain. There's only one 2862 // Invoke: Link this frame into the handler chain. There's only one
2863 // handler block in this code object, so its index is 0. 2863 // handler block in this code object, so its index is 0.
2864 __ bind(&invoke); 2864 __ bind(&invoke);
2865 __ PushTryHandler(StackHandler::JS_ENTRY, 0); 2865 __ PushTryHandler(StackHandler::JS_ENTRY, 0);
2866 2866
2867 // Clear any pending exceptions. 2867 // Clear any pending exceptions.
2868 __ LoadRoot(rax, Heap::kTheHoleValueRootIndex); 2868 __ LoadRoot(rax, Heap::kTheHoleValueRootIndex);
2869 __ Store(pending_exception, rax); 2869 __ Store(pending_exception, rax);
(...skipping 2505 matching lines...) Expand 10 before | Expand all | Expand 10 after
5375 5375
5376 // Calculate the function address to the first arg. 5376 // Calculate the function address to the first arg.
5377 __ movp(arg_reg_1, Operand(rsp, kNumSavedRegisters * kRegisterSize)); 5377 __ movp(arg_reg_1, Operand(rsp, kNumSavedRegisters * kRegisterSize));
5378 __ subq(arg_reg_1, Immediate(Assembler::kShortCallInstructionLength)); 5378 __ subq(arg_reg_1, Immediate(Assembler::kShortCallInstructionLength));
5379 5379
5380 // Save the remainder of the volatile registers. 5380 // Save the remainder of the volatile registers.
5381 masm->PushCallerSaved(kSaveFPRegs, arg_reg_1, arg_reg_2); 5381 masm->PushCallerSaved(kSaveFPRegs, arg_reg_1, arg_reg_2);
5382 5382
5383 // Call the entry hook function. 5383 // Call the entry hook function.
5384 __ Move(rax, FUNCTION_ADDR(masm->isolate()->function_entry_hook()), 5384 __ Move(rax, FUNCTION_ADDR(masm->isolate()->function_entry_hook()),
5385 RelocInfo::NONE64); 5385 Assembler::RelocInfoNone());
5386 5386
5387 AllowExternalCallThatCantCauseGC scope(masm); 5387 AllowExternalCallThatCantCauseGC scope(masm);
5388 5388
5389 const int kArgumentCount = 2; 5389 const int kArgumentCount = 2;
5390 __ PrepareCallCFunction(kArgumentCount); 5390 __ PrepareCallCFunction(kArgumentCount);
5391 __ CallCFunction(rax, kArgumentCount); 5391 __ CallCFunction(rax, kArgumentCount);
5392 5392
5393 // Restore volatile regs. 5393 // Restore volatile regs.
5394 masm->PopCallerSaved(kSaveFPRegs, arg_reg_1, arg_reg_2); 5394 masm->PopCallerSaved(kSaveFPRegs, arg_reg_1, arg_reg_2);
5395 __ pop(arg_reg_2); 5395 __ pop(arg_reg_2);
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after
5724 __ bind(&fast_elements_case); 5724 __ bind(&fast_elements_case);
5725 GenerateCase(masm, FAST_ELEMENTS); 5725 GenerateCase(masm, FAST_ELEMENTS);
5726 } 5726 }
5727 5727
5728 5728
5729 #undef __ 5729 #undef __
5730 5730
5731 } } // namespace v8::internal 5731 } } // namespace v8::internal
5732 5732
5733 #endif // V8_TARGET_ARCH_X64 5733 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/x64/assembler-x64.cc ('k') | src/x64/deoptimizer-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698