| 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/codegen.h" | 9 #include "src/codegen.h" |
| 10 #include "src/debug.h" | 10 #include "src/debug.h" |
| (...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 void Builtins::Generate_InOptimizationQueue(MacroAssembler* masm) { | 287 void Builtins::Generate_InOptimizationQueue(MacroAssembler* masm) { |
| 288 // Checking whether the queued function is ready for install is optional, | 288 // Checking whether the queued function is ready for install is optional, |
| 289 // since we come across interrupts and stack checks elsewhere. However, not | 289 // since we come across interrupts and stack checks elsewhere. However, not |
| 290 // checking may delay installing ready functions, and always checking would be | 290 // checking may delay installing ready functions, and always checking would be |
| 291 // quite expensive. A good compromise is to first check against stack limit as | 291 // quite expensive. A good compromise is to first check against stack limit as |
| 292 // a cue for an interrupt signal. | 292 // a cue for an interrupt signal. |
| 293 Label ok; | 293 Label ok; |
| 294 __ CompareRoot(masm->StackPointer(), Heap::kStackLimitRootIndex); | 294 __ CompareRoot(masm->StackPointer(), Heap::kStackLimitRootIndex); |
| 295 __ B(hs, &ok); | 295 __ B(hs, &ok); |
| 296 | 296 |
| 297 CallRuntimePassFunction(masm, Runtime::kHiddenTryInstallOptimizedCode); | 297 CallRuntimePassFunction(masm, Runtime::kTryInstallOptimizedCode); |
| 298 GenerateTailCallToReturnedCode(masm); | 298 GenerateTailCallToReturnedCode(masm); |
| 299 | 299 |
| 300 __ Bind(&ok); | 300 __ Bind(&ok); |
| 301 GenerateTailCallToSharedCode(masm); | 301 GenerateTailCallToSharedCode(masm); |
| 302 } | 302 } |
| 303 | 303 |
| 304 | 304 |
| 305 static void Generate_JSConstructStubHelper(MacroAssembler* masm, | 305 static void Generate_JSConstructStubHelper(MacroAssembler* masm, |
| 306 bool is_api_function, | 306 bool is_api_function, |
| 307 bool create_memento) { | 307 bool create_memento) { |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 373 __ B(eq, &allocate); | 373 __ B(eq, &allocate); |
| 374 // Decrease generous allocation count. | 374 // Decrease generous allocation count. |
| 375 __ Subs(x4, x4, Operand(1 << Map::ConstructionCount::kShift)); | 375 __ Subs(x4, x4, Operand(1 << Map::ConstructionCount::kShift)); |
| 376 __ Str(x4, bit_field3); | 376 __ Str(x4, bit_field3); |
| 377 __ Cmp(constructon_count, Operand(JSFunction::kFinishSlackTracking)); | 377 __ Cmp(constructon_count, Operand(JSFunction::kFinishSlackTracking)); |
| 378 __ B(ne, &allocate); | 378 __ B(ne, &allocate); |
| 379 | 379 |
| 380 // Push the constructor and map to the stack, and the constructor again | 380 // Push the constructor and map to the stack, and the constructor again |
| 381 // as argument to the runtime call. | 381 // as argument to the runtime call. |
| 382 __ Push(constructor, init_map, constructor); | 382 __ Push(constructor, init_map, constructor); |
| 383 __ CallRuntime(Runtime::kHiddenFinalizeInstanceSize, 1); | 383 __ CallRuntime(Runtime::kFinalizeInstanceSize, 1); |
| 384 __ Pop(init_map, constructor); | 384 __ Pop(init_map, constructor); |
| 385 __ Mov(constructon_count, Operand(JSFunction::kNoSlackTracking)); | 385 __ Mov(constructon_count, Operand(JSFunction::kNoSlackTracking)); |
| 386 __ Bind(&allocate); | 386 __ Bind(&allocate); |
| 387 } | 387 } |
| 388 | 388 |
| 389 // Now allocate the JSObject on the heap. | 389 // Now allocate the JSObject on the heap. |
| 390 Register obj_size = x3; | 390 Register obj_size = x3; |
| 391 Register new_obj = x4; | 391 Register new_obj = x4; |
| 392 __ Ldrb(obj_size, FieldMemOperand(init_map, Map::kInstanceSizeOffset)); | 392 __ Ldrb(obj_size, FieldMemOperand(init_map, Map::kInstanceSizeOffset)); |
| 393 if (create_memento) { | 393 if (create_memento) { |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 535 } | 535 } |
| 536 | 536 |
| 537 // Allocate the new receiver object using the runtime call. | 537 // Allocate the new receiver object using the runtime call. |
| 538 __ Bind(&rt_call); | 538 __ Bind(&rt_call); |
| 539 Label count_incremented; | 539 Label count_incremented; |
| 540 if (create_memento) { | 540 if (create_memento) { |
| 541 // Get the cell or allocation site. | 541 // Get the cell or allocation site. |
| 542 __ Peek(x4, 2 * kXRegSize); | 542 __ Peek(x4, 2 * kXRegSize); |
| 543 __ Push(x4); | 543 __ Push(x4); |
| 544 __ Push(constructor); // Argument for Runtime_NewObject. | 544 __ Push(constructor); // Argument for Runtime_NewObject. |
| 545 __ CallRuntime(Runtime::kHiddenNewObjectWithAllocationSite, 2); | 545 __ CallRuntime(Runtime::kNewObjectWithAllocationSite, 2); |
| 546 __ Mov(x4, x0); | 546 __ Mov(x4, x0); |
| 547 // If we ended up using the runtime, and we want a memento, then the | 547 // If we ended up using the runtime, and we want a memento, then the |
| 548 // runtime call made it for us, and we shouldn't do create count | 548 // runtime call made it for us, and we shouldn't do create count |
| 549 // increment. | 549 // increment. |
| 550 __ jmp(&count_incremented); | 550 __ jmp(&count_incremented); |
| 551 } else { | 551 } else { |
| 552 __ Push(constructor); // Argument for Runtime_NewObject. | 552 __ Push(constructor); // Argument for Runtime_NewObject. |
| 553 __ CallRuntime(Runtime::kHiddenNewObject, 1); | 553 __ CallRuntime(Runtime::kNewObject, 1); |
| 554 __ Mov(x4, x0); | 554 __ Mov(x4, x0); |
| 555 } | 555 } |
| 556 | 556 |
| 557 // Receiver for constructor call allocated. | 557 // Receiver for constructor call allocated. |
| 558 // x4: JSObject | 558 // x4: JSObject |
| 559 __ Bind(&allocated); | 559 __ Bind(&allocated); |
| 560 | 560 |
| 561 if (create_memento) { | 561 if (create_memento) { |
| 562 __ Peek(x10, 2 * kXRegSize); | 562 __ Peek(x10, 2 * kXRegSize); |
| 563 __ JumpIfRoot(x10, Heap::kUndefinedValueRootIndex, &count_incremented); | 563 __ JumpIfRoot(x10, Heap::kUndefinedValueRootIndex, &count_incremented); |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 775 Generate_JSEntryTrampolineHelper(masm, false); | 775 Generate_JSEntryTrampolineHelper(masm, false); |
| 776 } | 776 } |
| 777 | 777 |
| 778 | 778 |
| 779 void Builtins::Generate_JSConstructEntryTrampoline(MacroAssembler* masm) { | 779 void Builtins::Generate_JSConstructEntryTrampoline(MacroAssembler* masm) { |
| 780 Generate_JSEntryTrampolineHelper(masm, true); | 780 Generate_JSEntryTrampolineHelper(masm, true); |
| 781 } | 781 } |
| 782 | 782 |
| 783 | 783 |
| 784 void Builtins::Generate_CompileUnoptimized(MacroAssembler* masm) { | 784 void Builtins::Generate_CompileUnoptimized(MacroAssembler* masm) { |
| 785 CallRuntimePassFunction(masm, Runtime::kHiddenCompileUnoptimized); | 785 CallRuntimePassFunction(masm, Runtime::kCompileUnoptimized); |
| 786 GenerateTailCallToReturnedCode(masm); | 786 GenerateTailCallToReturnedCode(masm); |
| 787 } | 787 } |
| 788 | 788 |
| 789 | 789 |
| 790 static void CallCompileOptimized(MacroAssembler* masm, bool concurrent) { | 790 static void CallCompileOptimized(MacroAssembler* masm, bool concurrent) { |
| 791 FrameScope scope(masm, StackFrame::INTERNAL); | 791 FrameScope scope(masm, StackFrame::INTERNAL); |
| 792 Register function = x1; | 792 Register function = x1; |
| 793 | 793 |
| 794 // Preserve function. At the same time, push arguments for | 794 // Preserve function. At the same time, push arguments for |
| 795 // kHiddenCompileOptimized. | 795 // kCompileOptimized. |
| 796 __ LoadObject(x10, masm->isolate()->factory()->ToBoolean(concurrent)); | 796 __ LoadObject(x10, masm->isolate()->factory()->ToBoolean(concurrent)); |
| 797 __ Push(function, function, x10); | 797 __ Push(function, function, x10); |
| 798 | 798 |
| 799 __ CallRuntime(Runtime::kHiddenCompileOptimized, 2); | 799 __ CallRuntime(Runtime::kCompileOptimized, 2); |
| 800 | 800 |
| 801 // Restore receiver. | 801 // Restore receiver. |
| 802 __ Pop(function); | 802 __ Pop(function); |
| 803 } | 803 } |
| 804 | 804 |
| 805 | 805 |
| 806 void Builtins::Generate_CompileOptimized(MacroAssembler* masm) { | 806 void Builtins::Generate_CompileOptimized(MacroAssembler* masm) { |
| 807 CallCompileOptimized(masm, false); | 807 CallCompileOptimized(masm, false); |
| 808 GenerateTailCallToReturnedCode(masm); | 808 GenerateTailCallToReturnedCode(masm); |
| 809 } | 809 } |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 899 FrameScope scope(masm, StackFrame::INTERNAL); | 899 FrameScope scope(masm, StackFrame::INTERNAL); |
| 900 | 900 |
| 901 // Preserve registers across notification, this is important for compiled | 901 // Preserve registers across notification, this is important for compiled |
| 902 // stubs that tail call the runtime on deopts passing their parameters in | 902 // stubs that tail call the runtime on deopts passing their parameters in |
| 903 // registers. | 903 // registers. |
| 904 // TODO(jbramley): Is it correct (and appropriate) to use safepoint | 904 // TODO(jbramley): Is it correct (and appropriate) to use safepoint |
| 905 // registers here? According to the comment above, we should only need to | 905 // registers here? According to the comment above, we should only need to |
| 906 // preserve the registers with parameters. | 906 // preserve the registers with parameters. |
| 907 __ PushXRegList(kSafepointSavedRegisters); | 907 __ PushXRegList(kSafepointSavedRegisters); |
| 908 // Pass the function and deoptimization type to the runtime system. | 908 // Pass the function and deoptimization type to the runtime system. |
| 909 __ CallRuntime(Runtime::kHiddenNotifyStubFailure, 0, save_doubles); | 909 __ CallRuntime(Runtime::kNotifyStubFailure, 0, save_doubles); |
| 910 __ PopXRegList(kSafepointSavedRegisters); | 910 __ PopXRegList(kSafepointSavedRegisters); |
| 911 } | 911 } |
| 912 | 912 |
| 913 // Ignore state (pushed by Deoptimizer::EntryGenerator::Generate). | 913 // Ignore state (pushed by Deoptimizer::EntryGenerator::Generate). |
| 914 __ Drop(1); | 914 __ Drop(1); |
| 915 | 915 |
| 916 // Jump to the miss handler. Deoptimizer::EntryGenerator::Generate loads this | 916 // Jump to the miss handler. Deoptimizer::EntryGenerator::Generate loads this |
| 917 // into lr before it jumps here. | 917 // into lr before it jumps here. |
| 918 __ Br(lr); | 918 __ Br(lr); |
| 919 } | 919 } |
| 920 | 920 |
| 921 | 921 |
| 922 void Builtins::Generate_NotifyStubFailure(MacroAssembler* masm) { | 922 void Builtins::Generate_NotifyStubFailure(MacroAssembler* masm) { |
| 923 Generate_NotifyStubFailureHelper(masm, kDontSaveFPRegs); | 923 Generate_NotifyStubFailureHelper(masm, kDontSaveFPRegs); |
| 924 } | 924 } |
| 925 | 925 |
| 926 | 926 |
| 927 void Builtins::Generate_NotifyStubFailureSaveDoubles(MacroAssembler* masm) { | 927 void Builtins::Generate_NotifyStubFailureSaveDoubles(MacroAssembler* masm) { |
| 928 Generate_NotifyStubFailureHelper(masm, kSaveFPRegs); | 928 Generate_NotifyStubFailureHelper(masm, kSaveFPRegs); |
| 929 } | 929 } |
| 930 | 930 |
| 931 | 931 |
| 932 static void Generate_NotifyDeoptimizedHelper(MacroAssembler* masm, | 932 static void Generate_NotifyDeoptimizedHelper(MacroAssembler* masm, |
| 933 Deoptimizer::BailoutType type) { | 933 Deoptimizer::BailoutType type) { |
| 934 { | 934 { |
| 935 FrameScope scope(masm, StackFrame::INTERNAL); | 935 FrameScope scope(masm, StackFrame::INTERNAL); |
| 936 // Pass the deoptimization type to the runtime system. | 936 // Pass the deoptimization type to the runtime system. |
| 937 __ Mov(x0, Smi::FromInt(static_cast<int>(type))); | 937 __ Mov(x0, Smi::FromInt(static_cast<int>(type))); |
| 938 __ Push(x0); | 938 __ Push(x0); |
| 939 __ CallRuntime(Runtime::kHiddenNotifyDeoptimized, 1); | 939 __ CallRuntime(Runtime::kNotifyDeoptimized, 1); |
| 940 } | 940 } |
| 941 | 941 |
| 942 // Get the full codegen state from the stack and untag it. | 942 // Get the full codegen state from the stack and untag it. |
| 943 Register state = x6; | 943 Register state = x6; |
| 944 __ Peek(state, 0); | 944 __ Peek(state, 0); |
| 945 __ SmiUntag(state); | 945 __ SmiUntag(state); |
| 946 | 946 |
| 947 // Switch on the state. | 947 // Switch on the state. |
| 948 Label with_tos_register, unknown_state; | 948 Label with_tos_register, unknown_state; |
| 949 __ CompareAndBranch( | 949 __ CompareAndBranch( |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1014 } | 1014 } |
| 1015 | 1015 |
| 1016 | 1016 |
| 1017 void Builtins::Generate_OsrAfterStackCheck(MacroAssembler* masm) { | 1017 void Builtins::Generate_OsrAfterStackCheck(MacroAssembler* masm) { |
| 1018 // We check the stack limit as indicator that recompilation might be done. | 1018 // We check the stack limit as indicator that recompilation might be done. |
| 1019 Label ok; | 1019 Label ok; |
| 1020 __ CompareRoot(jssp, Heap::kStackLimitRootIndex); | 1020 __ CompareRoot(jssp, Heap::kStackLimitRootIndex); |
| 1021 __ B(hs, &ok); | 1021 __ B(hs, &ok); |
| 1022 { | 1022 { |
| 1023 FrameScope scope(masm, StackFrame::INTERNAL); | 1023 FrameScope scope(masm, StackFrame::INTERNAL); |
| 1024 __ CallRuntime(Runtime::kHiddenStackGuard, 0); | 1024 __ CallRuntime(Runtime::kStackGuard, 0); |
| 1025 } | 1025 } |
| 1026 __ Jump(masm->isolate()->builtins()->OnStackReplacement(), | 1026 __ Jump(masm->isolate()->builtins()->OnStackReplacement(), |
| 1027 RelocInfo::CODE_TARGET); | 1027 RelocInfo::CODE_TARGET); |
| 1028 | 1028 |
| 1029 __ Bind(&ok); | 1029 __ Bind(&ok); |
| 1030 __ Ret(); | 1030 __ Ret(); |
| 1031 } | 1031 } |
| 1032 | 1032 |
| 1033 | 1033 |
| 1034 void Builtins::Generate_FunctionCall(MacroAssembler* masm) { | 1034 void Builtins::Generate_FunctionCall(MacroAssembler* masm) { |
| (...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1556 __ Unreachable(); | 1556 __ Unreachable(); |
| 1557 } | 1557 } |
| 1558 } | 1558 } |
| 1559 | 1559 |
| 1560 | 1560 |
| 1561 #undef __ | 1561 #undef __ |
| 1562 | 1562 |
| 1563 } } // namespace v8::internal | 1563 } } // namespace v8::internal |
| 1564 | 1564 |
| 1565 #endif // V8_TARGET_ARCH_ARM | 1565 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |