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