v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
push_registers_asm.cc
Go to the documentation of this file.
1// Copyright 2020 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// Push all callee-saved registers to get them on the stack for conservative
6// stack scanning.
7//
8// See asm/x64/push_registers_asm.cc for why the function is not generated
9// using clang.
10//
11// Calling convention source:
12// https://riscv.org/wp-content/uploads/2015/01/riscv-calling.pdf Table 18.2
13#ifdef V8_TARGET_ARCH_RISCV64
14asm(".global PushAllRegistersAndIterateStack \n"
15 ".type PushAllRegistersAndIterateStack, %function \n"
16 ".hidden PushAllRegistersAndIterateStack \n"
17 "PushAllRegistersAndIterateStack: \n"
18 // Push all callee-saved registers and save return address.
19 " addi sp, sp, -112 \n"
20 // Save return address.
21 " sd ra, 104(sp) \n"
22 // sp is callee-saved.
23 " sd sp, 96(sp) \n"
24 // s0-s11 are callee-saved.
25 " sd s11, 88(sp) \n"
26 " sd s10, 80(sp) \n"
27 " sd s9, 72(sp) \n"
28 " sd s8, 64(sp) \n"
29 " sd s7, 56(sp) \n"
30 " sd s6, 48(sp) \n"
31 " sd s5, 40(sp) \n"
32 " sd s4, 32(sp) \n"
33 " sd s3, 24(sp) \n"
34 " sd s2, 16(sp) \n"
35 " sd s1, 8(sp) \n"
36 " sd s0, 0(sp) \n"
37 // Maintain frame pointer(fp is s0).
38 " mv s0, sp \n"
39 // Pass 1st parameter (a0) unchanged (Stack*).
40 // Pass 2nd parameter (a1) unchanged (StackVisitor*).
41 // Save 3rd parameter (a2; IterateStackCallback) to a3.
42 " mv a3, a2 \n"
43 // Pass 3rd parameter as sp (stack pointer).
44 " mv a2, sp \n"
45 // Call the callback.
46 " jalr a3 \n"
47 // Load return address.
48 " ld ra, 104(sp) \n"
49 // Restore frame pointer.
50 " ld s0, 0(sp) \n"
51 " addi sp, sp, 112 \n"
52 " jr ra \n"
53 ".Lfunc_end0: \n"
54 ".size PushAllRegistersAndIterateStack, "
55 ".Lfunc_end0-PushAllRegistersAndIterateStack \n");
56#elif V8_TARGET_ARCH_RISCV32
57asm(".global PushAllRegistersAndIterateStack \n"
58 ".type PushAllRegistersAndIterateStack, %function \n"
59 ".hidden PushAllRegistersAndIterateStack \n"
60 "PushAllRegistersAndIterateStack: \n"
61 // Push all callee-saved registers and save return address.
62 " addi sp, sp, -56 \n"
63 // Save return address.
64 " sw ra, 52(sp) \n"
65 // sp is callee-saved.
66 " sw sp, 48(sp) \n"
67 // s0-s11 are callee-saved.
68 " sw s11, 44(sp) \n"
69 " sw s10, 40(sp) \n"
70 " sw s9, 36(sp) \n"
71 " sw s8, 32(sp) \n"
72 " sw s7, 28(sp) \n"
73 " sw s6, 24(sp) \n"
74 " sw s5, 20(sp) \n"
75 " sw s4, 16(sp) \n"
76 " sw s3, 12(sp) \n"
77 " sw s2, 8(sp) \n"
78 " sw s1, 4(sp) \n"
79 " sw s0, 0(sp) \n"
80 // Maintain frame pointer(fp is s0).
81 " mv s0, sp \n"
82 // Pass 1st parameter (a0) unchanged (Stack*).
83 // Pass 2nd parameter (a1) unchanged (StackVisitor*).
84 // Save 3rd parameter (a2; IterateStackCallback) to a3.
85 " mv a3, a2 \n"
86 // Pass 3rd parameter as sp (stack pointer).
87 " mv a2, sp \n"
88 // Call the callback.
89 " jalr a3 \n"
90 // Load return address.
91 " lw ra, 52(sp) \n"
92 // Restore frame pointer.
93 " lw s0, 0(sp) \n"
94 " addi sp, sp, 56 \n"
95 " jr ra \n"
96 ".Lfunc_end0: \n"
97 ".size PushAllRegistersAndIterateStack, "
98 ".Lfunc_end0-PushAllRegistersAndIterateStack \n");
99#endif