• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_RISCV64_BASELINE_COMPILER_RISCV64_INL_H_
6 #define V8_BASELINE_RISCV64_BASELINE_COMPILER_RISCV64_INL_H_
7 
8 #include "src/baseline/baseline-compiler.h"
9 
10 namespace v8 {
11 namespace internal {
12 namespace baseline {
13 
14 #define __ basm_.
15 
Prologue()16 void BaselineCompiler::Prologue() {
17   ASM_CODE_COMMENT(&masm_);
18   // Enter the frame here, since CallBuiltin will override lr.
19   __ masm()->EnterFrame(StackFrame::BASELINE);
20   DCHECK_EQ(kJSFunctionRegister, kJavaScriptCallTargetRegister);
21   int max_frame_size =
22       bytecode_->frame_size() + max_call_args_ * kSystemPointerSize;
23   CallBuiltin<Builtin::kBaselineOutOfLinePrologue>(
24       kContextRegister, kJSFunctionRegister, kJavaScriptCallArgCountRegister,
25       max_frame_size, kJavaScriptCallNewTargetRegister, bytecode_);
26   PrologueFillFrame();
27 }
28 
PrologueFillFrame()29 void BaselineCompiler::PrologueFillFrame() {
30   ASM_CODE_COMMENT(&masm_);
31   // Inlined register frame fill
32   interpreter::Register new_target_or_generator_register =
33       bytecode_->incoming_new_target_or_generator_register();
34   __ LoadRoot(kInterpreterAccumulatorRegister, RootIndex::kUndefinedValue);
35   int register_count = bytecode_->register_count();
36   // Magic value
37   const int kLoopUnrollSize = 8;
38   const int new_target_index = new_target_or_generator_register.index();
39   const bool has_new_target = new_target_index != kMaxInt;
40   if (has_new_target) {
41     DCHECK_LE(new_target_index, register_count);
42     __ masm()->Add64(sp, sp, Operand(-(kPointerSize * new_target_index)));
43     for (int i = 0; i < new_target_index; i++) {
44       __ masm()->Sd(kInterpreterAccumulatorRegister, MemOperand(sp, i * 8));
45     }
46     // Push new_target_or_generator.
47     __ Push(kJavaScriptCallNewTargetRegister);
48     register_count -= new_target_index + 1;
49   }
50   if (register_count < 2 * kLoopUnrollSize) {
51     // If the frame is small enough, just unroll the frame fill completely.
52     __ masm()->Add64(sp, sp, Operand(-(kPointerSize * register_count)));
53     for (int i = 0; i < register_count; ++i) {
54       __ masm()->Sd(kInterpreterAccumulatorRegister, MemOperand(sp, i * 8));
55     }
56   } else {
57     __ masm()->Add64(sp, sp, Operand(-(kPointerSize * register_count)));
58     for (int i = 0; i < register_count; ++i) {
59       __ masm()->Sd(kInterpreterAccumulatorRegister, MemOperand(sp, i * 8));
60     }
61   }
62 }
63 
VerifyFrameSize()64 void BaselineCompiler::VerifyFrameSize() {
65   ASM_CODE_COMMENT(&masm_);
66   __ masm()->Add64(kScratchReg, sp,
67                    Operand(InterpreterFrameConstants::kFixedFrameSizeFromFp +
68                            bytecode_->frame_size()));
69   __ masm()->Assert(eq, AbortReason::kUnexpectedStackPointer, kScratchReg,
70                     Operand(fp));
71 }
72 
73 #undef __
74 
75 }  // namespace baseline
76 }  // namespace internal
77 }  // namespace v8
78 
79 #endif  // V8_BASELINE_RISCV64_BASELINE_COMPILER_RISCV64_INL_H_
80