v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
baseline-compiler-arm64-inl.h
Go to the documentation of this file.
1// Copyright 2021 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_BASELINE_ARM64_BASELINE_COMPILER_ARM64_INL_H_
6#define V8_BASELINE_ARM64_BASELINE_COMPILER_ARM64_INL_H_
7
9
10namespace v8 {
11namespace internal {
12namespace baseline {
13
14#define __ basm_.
15
16// A builtin call/jump mode that is used then short builtin calls feature is
17// not enabled.
20
23 // Enter the frame here, since CallBuiltin will override lr.
24 __ masm()->EnterFrame(StackFrame::BASELINE);
26 int max_frame_size = bytecode_->max_frame_size();
30
31 __ masm()->AssertSpAligned();
33 __ masm()->AssertSpAligned();
34}
35
38 // Inlined register frame fill
39 interpreter::Register new_target_or_generator_register =
40 bytecode_->incoming_new_target_or_generator_register();
41 if (v8_flags.debug_code) {
42 __ masm()->CompareRoot(kInterpreterAccumulatorRegister,
43 RootIndex::kUndefinedValue);
44 __ masm()->Assert(eq, AbortReason::kUnexpectedValue);
45 }
46 int register_count = bytecode_->register_count();
47 // Magic value
48 const int kLoopUnrollSize = 8;
49 const int new_target_index = new_target_or_generator_register.index();
50 const bool has_new_target = new_target_index != kMaxInt;
51 if (has_new_target) {
52 DCHECK_LE(new_target_index, register_count);
53 int before_new_target_count = 0;
54 for (; before_new_target_count + 2 <= new_target_index;
55 before_new_target_count += 2) {
58 }
59 if (before_new_target_count == new_target_index) {
62 } else {
63 DCHECK_EQ(before_new_target_count + 1, new_target_index);
66 }
67 // We pushed before_new_target_count registers, plus the two registers
68 // that included new_target.
69 register_count -= (before_new_target_count + 2);
70 }
71 if (register_count < 2 * kLoopUnrollSize) {
72 // If the frame is small enough, just unroll the frame fill completely.
73 for (int i = 0; i < register_count; i += 2) {
76 }
77 } else {
78 BaselineAssembler::ScratchRegisterScope temps(&basm_);
79 Register scratch = temps.AcquireScratch();
80
81 // Extract the first few registers to round to the unroll size.
82 int first_registers = register_count % kLoopUnrollSize;
83 for (int i = 0; i < first_registers; i += 2) {
86 }
87 __ Move(scratch, register_count / kLoopUnrollSize);
88 // We enter the loop unconditionally, so make sure we need to loop at least
89 // once.
90 DCHECK_GT(register_count / kLoopUnrollSize, 0);
91 Label loop;
92 __ Bind(&loop);
93 for (int i = 0; i < kLoopUnrollSize; i += 2) {
96 }
97 __ masm()->Subs(scratch, scratch, 1);
98 __ masm()->B(gt, &loop);
99 }
100}
101
104 __ masm()->Add(x15, sp,
106 bytecode_->frame_size(),
107 2 * kSystemPointerSize));
108 __ masm()->Cmp(x15, fp);
109 __ masm()->Assert(eq, AbortReason::kUnexpectedStackPointer);
110}
111
112#undef __
113
114} // namespace baseline
115} // namespace internal
116} // namespace v8
117
118#endif // V8_BASELINE_ARM64_BASELINE_COMPILER_ARM64_INL_H_
#define ASM_CODE_COMMENT(asm)
Definition assembler.h:617
constexpr BuiltinCallJumpMode kFallbackBuiltinCallJumpModeForBaseline
constexpr Register kJavaScriptCallTargetRegister
constexpr Register kJavaScriptCallArgCountRegister
constexpr Register kInterpreterAccumulatorRegister
constexpr int kSystemPointerSize
Definition globals.h:410
constexpr Register kContextRegister
V8_EXPORT_PRIVATE FlagValues v8_flags
constexpr int kMaxInt
Definition globals.h:374
constexpr Register kJavaScriptCallNewTargetRegister
constexpr Register kJSFunctionRegister
#define DCHECK_LE(v1, v2)
Definition logging.h:490
#define DCHECK_EQ(v1, v2)
Definition logging.h:485
#define DCHECK_GT(v1, v2)
Definition logging.h:487
constexpr T RoundUp(T x, intptr_t m)
Definition macros.h:387