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

Side by Side Diff: src/arm64/macro-assembler-arm64.cc

Issue 1460503008: [turbofan] Switch passing of new.target to register. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@local_turbofan-pass-new-target-6
Patch Set: Ported to MIPS64. Created 5 years 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
« no previous file with comments | « src/arm64/macro-assembler-arm64.h ('k') | src/compiler/ast-graph-builder.h » ('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 // 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 #if V8_TARGET_ARCH_ARM64 5 #if V8_TARGET_ARCH_ARM64
6 6
7 #include "src/base/bits.h" 7 #include "src/base/bits.h"
8 #include "src/base/division-by-constant.h" 8 #include "src/base/division-by-constant.h"
9 #include "src/bootstrapper.h" 9 #include "src/bootstrapper.h"
10 #include "src/codegen.h" 10 #include "src/codegen.h"
(...skipping 2533 matching lines...) Expand 10 before | Expand all | Expand 10 after
2544 } 2544 }
2545 } else { 2545 } else {
2546 Jump(adaptor, RelocInfo::CODE_TARGET); 2546 Jump(adaptor, RelocInfo::CODE_TARGET);
2547 } 2547 }
2548 } 2548 }
2549 Bind(&regular_invoke); 2549 Bind(&regular_invoke);
2550 } 2550 }
2551 2551
2552 2552
2553 void MacroAssembler::InvokeCode(Register code, 2553 void MacroAssembler::InvokeCode(Register code,
2554 Register new_target,
2554 const ParameterCount& expected, 2555 const ParameterCount& expected,
2555 const ParameterCount& actual, 2556 const ParameterCount& actual,
2556 InvokeFlag flag, 2557 InvokeFlag flag,
2557 const CallWrapper& call_wrapper) { 2558 const CallWrapper& call_wrapper) {
2558 // You can't call a function without a valid frame. 2559 // You can't call a function without a valid frame.
2559 DCHECK(flag == JUMP_FUNCTION || has_frame()); 2560 DCHECK(flag == JUMP_FUNCTION || has_frame());
2560 2561
2562 // Ensure new target is passed in the correct register. Otherwise clear the
2563 // appropriate register in case new target is not given.
2564 DCHECK_IMPLIES(new_target.is_valid(), new_target.is(x3));
2565 if (!new_target.is_valid()) {
2566 LoadRoot(x3, Heap::kUndefinedValueRootIndex);
2567 }
2568
2561 Label done; 2569 Label done;
2562
2563 bool definitely_mismatches = false; 2570 bool definitely_mismatches = false;
2564 InvokePrologue(expected, actual, &done, flag, &definitely_mismatches, 2571 InvokePrologue(expected, actual, &done, flag, &definitely_mismatches,
2565 call_wrapper); 2572 call_wrapper);
2566 2573
2567 // If we are certain that actual != expected, then we know InvokePrologue will 2574 // If we are certain that actual != expected, then we know InvokePrologue will
2568 // have handled the call through the argument adaptor mechanism. 2575 // have handled the call through the argument adaptor mechanism.
2569 // The called function expects the call kind in x5. 2576 // The called function expects the call kind in x5.
2570 if (!definitely_mismatches) { 2577 if (!definitely_mismatches) {
2571 if (flag == CALL_FUNCTION) { 2578 if (flag == CALL_FUNCTION) {
2572 call_wrapper.BeforeCall(CallSize(code)); 2579 call_wrapper.BeforeCall(CallSize(code));
2573 Call(code); 2580 Call(code);
2574 call_wrapper.AfterCall(); 2581 call_wrapper.AfterCall();
2575 } else { 2582 } else {
2576 DCHECK(flag == JUMP_FUNCTION); 2583 DCHECK(flag == JUMP_FUNCTION);
2577 Jump(code); 2584 Jump(code);
2578 } 2585 }
2579 } 2586 }
2580 2587
2581 // Continue here if InvokePrologue does handle the invocation due to 2588 // Continue here if InvokePrologue does handle the invocation due to
2582 // mismatched parameter counts. 2589 // mismatched parameter counts.
2583 Bind(&done); 2590 Bind(&done);
2584 } 2591 }
2585 2592
2586 2593
2587 void MacroAssembler::InvokeFunction(Register function, 2594 void MacroAssembler::InvokeFunction(Register function,
2595 Register new_target,
2588 const ParameterCount& actual, 2596 const ParameterCount& actual,
2589 InvokeFlag flag, 2597 InvokeFlag flag,
2590 const CallWrapper& call_wrapper) { 2598 const CallWrapper& call_wrapper) {
2591 // You can't call a function without a valid frame. 2599 // You can't call a function without a valid frame.
2592 DCHECK(flag == JUMP_FUNCTION || has_frame()); 2600 DCHECK(flag == JUMP_FUNCTION || has_frame());
2593 2601
2594 // Contract with called JS functions requires that function is passed in x1. 2602 // Contract with called JS functions requires that function is passed in x1.
2595 // (See FullCodeGenerator::Generate().) 2603 // (See FullCodeGenerator::Generate().)
2596 DCHECK(function.is(x1)); 2604 DCHECK(function.is(x1));
2597 2605
2598 Register expected_reg = x2; 2606 Register expected_reg = x2;
2599 Register code_reg = x3; 2607 Register code_reg = x4;
2600 2608
2601 Ldr(cp, FieldMemOperand(function, JSFunction::kContextOffset)); 2609 Ldr(cp, FieldMemOperand(function, JSFunction::kContextOffset));
2602 // The number of arguments is stored as an int32_t, and -1 is a marker 2610 // The number of arguments is stored as an int32_t, and -1 is a marker
2603 // (SharedFunctionInfo::kDontAdaptArgumentsSentinel), so we need sign 2611 // (SharedFunctionInfo::kDontAdaptArgumentsSentinel), so we need sign
2604 // extension to correctly handle it. 2612 // extension to correctly handle it.
2605 Ldr(expected_reg, FieldMemOperand(function, 2613 Ldr(expected_reg, FieldMemOperand(function,
2606 JSFunction::kSharedFunctionInfoOffset)); 2614 JSFunction::kSharedFunctionInfoOffset));
2607 Ldrsw(expected_reg, 2615 Ldrsw(expected_reg,
2608 FieldMemOperand(expected_reg, 2616 FieldMemOperand(expected_reg,
2609 SharedFunctionInfo::kFormalParameterCountOffset)); 2617 SharedFunctionInfo::kFormalParameterCountOffset));
2610 Ldr(code_reg, 2618 Ldr(code_reg,
2611 FieldMemOperand(function, JSFunction::kCodeEntryOffset)); 2619 FieldMemOperand(function, JSFunction::kCodeEntryOffset));
2612 2620
2613 ParameterCount expected(expected_reg); 2621 ParameterCount expected(expected_reg);
2614 InvokeCode(code_reg, expected, actual, flag, call_wrapper); 2622 InvokeCode(code_reg, new_target, expected, actual, flag, call_wrapper);
2615 } 2623 }
2616 2624
2617 2625
2618 void MacroAssembler::InvokeFunction(Register function, 2626 void MacroAssembler::InvokeFunction(Register function,
2619 const ParameterCount& expected, 2627 const ParameterCount& expected,
2620 const ParameterCount& actual, 2628 const ParameterCount& actual,
2621 InvokeFlag flag, 2629 InvokeFlag flag,
2622 const CallWrapper& call_wrapper) { 2630 const CallWrapper& call_wrapper) {
2623 // You can't call a function without a valid frame. 2631 // You can't call a function without a valid frame.
2624 DCHECK(flag == JUMP_FUNCTION || has_frame()); 2632 DCHECK(flag == JUMP_FUNCTION || has_frame());
2625 2633
2626 // Contract with called JS functions requires that function is passed in x1. 2634 // Contract with called JS functions requires that function is passed in x1.
2627 // (See FullCodeGenerator::Generate().) 2635 // (See FullCodeGenerator::Generate().)
2628 DCHECK(function.Is(x1)); 2636 DCHECK(function.Is(x1));
2629 2637
2630 Register code_reg = x3; 2638 Register code_reg = x4;
2631 2639
2632 // Set up the context. 2640 // Set up the context.
2633 Ldr(cp, FieldMemOperand(function, JSFunction::kContextOffset)); 2641 Ldr(cp, FieldMemOperand(function, JSFunction::kContextOffset));
2634 2642
2635 // We call indirectly through the code field in the function to 2643 // We call indirectly through the code field in the function to
2636 // allow recompilation to take effect without changing any of the 2644 // allow recompilation to take effect without changing any of the
2637 // call sites. 2645 // call sites.
2638 Ldr(code_reg, FieldMemOperand(function, JSFunction::kCodeEntryOffset)); 2646 Ldr(code_reg, FieldMemOperand(function, JSFunction::kCodeEntryOffset));
2639 InvokeCode(code_reg, expected, actual, flag, call_wrapper); 2647 InvokeCode(code_reg, no_reg, expected, actual, flag, call_wrapper);
2640 } 2648 }
2641 2649
2642 2650
2643 void MacroAssembler::InvokeFunction(Handle<JSFunction> function, 2651 void MacroAssembler::InvokeFunction(Handle<JSFunction> function,
2644 const ParameterCount& expected, 2652 const ParameterCount& expected,
2645 const ParameterCount& actual, 2653 const ParameterCount& actual,
2646 InvokeFlag flag, 2654 InvokeFlag flag,
2647 const CallWrapper& call_wrapper) { 2655 const CallWrapper& call_wrapper) {
2648 // Contract with called JS functions requires that function is passed in x1. 2656 // Contract with called JS functions requires that function is passed in x1.
2649 // (See FullCodeGenerator::Generate().) 2657 // (See FullCodeGenerator::Generate().)
(...skipping 2413 matching lines...) Expand 10 before | Expand all | Expand 10 after
5063 } 5071 }
5064 5072
5065 5073
5066 #undef __ 5074 #undef __
5067 5075
5068 5076
5069 } // namespace internal 5077 } // namespace internal
5070 } // namespace v8 5078 } // namespace v8
5071 5079
5072 #endif // V8_TARGET_ARCH_ARM64 5080 #endif // V8_TARGET_ARCH_ARM64
OLDNEW
« no previous file with comments | « src/arm64/macro-assembler-arm64.h ('k') | src/compiler/ast-graph-builder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698