v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
register-loong64.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_CODEGEN_LOONG64_REGISTER_LOONG64_H_
6#define V8_CODEGEN_LOONG64_REGISTER_LOONG64_H_
7
10
11namespace v8 {
12namespace internal {
13
14// clang-format off
15#define GENERAL_REGISTERS(V) \
16 V(zero_reg) V(ra) V(tp) V(sp) \
17 V(a0) V(a1) V(a2) V(a3) V(a4) V(a5) V(a6) V(a7) \
18 V(t0) V(t1) V(t2) V(t3) V(t4) V(t5) V(t6) V(t7) V(t8) \
19 V(x_reg) V(fp) \
20 V(s0) V(s1) V(s2) V(s3) V(s4) V(s5) V(s6) V(s7) V(s8) \
21
22#define ALWAYS_ALLOCATABLE_GENERAL_REGISTERS(V) \
23 V(a0) V(a1) V(a2) V(a3) V(a4) V(a5) V(a6) V(a7) \
24 V(t0) V(t1) V(t2) V(t3) V(t4) V(t5) \
25 V(s0) V(s1) V(s2) V(s3) V(s4) V(s5) V(s7)
26
27#ifdef V8_COMPRESS_POINTERS
28#define MAYBE_ALLOCATABLE_GENERAL_REGISTERS(V)
29#else
30#define MAYBE_ALLOCATABLE_GENERAL_REGISTERS(V) V(s8)
31#endif
32
33#define ALLOCATABLE_GENERAL_REGISTERS(V) \
34 ALWAYS_ALLOCATABLE_GENERAL_REGISTERS(V) \
35 MAYBE_ALLOCATABLE_GENERAL_REGISTERS(V)
36
37#define DOUBLE_REGISTERS(V) \
38 V(f0) V(f1) V(f2) V(f3) V(f4) V(f5) V(f6) V(f7) \
39 V(f8) V(f9) V(f10) V(f11) V(f12) V(f13) V(f14) V(f15) \
40 V(f16) V(f17) V(f18) V(f19) V(f20) V(f21) V(f22) V(f23) \
41 V(f24) V(f25) V(f26) V(f27) V(f28) V(f29) V(f30) V(f31)
42
43#define FLOAT_REGISTERS DOUBLE_REGISTERS
44#define SIMD128_REGISTERS(V) \
45 V(w0) V(w1) V(w2) V(w3) V(w4) V(w5) V(w6) V(w7) \
46 V(w8) V(w9) V(w10) V(w11) V(w12) V(w13) V(w14) V(w15) \
47 V(w16) V(w17) V(w18) V(w19) V(w20) V(w21) V(w22) V(w23) \
48 V(w24) V(w25) V(w26) V(w27) V(w28) V(w29) V(w30) V(w31)
49
50#define ALLOCATABLE_DOUBLE_REGISTERS(V) \
51 V(f0) V(f1) V(f2) V(f3) V(f4) V(f5) V(f6) V(f7) \
52 V(f8) V(f9) V(f10) V(f11) V(f12) V(f13) V(f14) V(f15) \
53 V(f16) V(f17) V(f18) V(f19) V(f20) V(f21) V(f22) V(f23) \
54 V(f24) V(f25) V(f26) V(f27) V(f28)
55// clang-format on
56
57// Note that the bit values must match those used in actual instruction
58// encoding.
59const int kNumRegs = 32;
60
61// CPU Registers.
62//
63// 1) We would prefer to use an enum, but enum values are assignment-
64// compatible with int, which has caused code-generation bugs.
65//
66// 2) We would prefer to use a class instead of a struct but we don't like
67// the register initialization to depend on the particular initialization
68// order (which appears to be different on OS X, Linux, and Windows for the
69// installed versions of C++ we tried). Using a struct permits C-style
70// "initialization". Also, the Register objects cannot be const as this
71// forces initialization stubs in MSVC, making us dependent on initialization
72// order.
73//
74// 3) By not using an enum, we are possibly preventing the compiler from
75// doing certain constant folds, which may significantly reduce the
76// code generated for some assembly instructions (because they boil down
77// to a few constants). If this is a problem, we could change the code
78// such that we use an enum in optimized mode, and the struct in debug
79// mode. This way we get the compile-time error checking in debug mode
80// and best performance in optimized code.
81
82// -----------------------------------------------------------------------------
83// Implementation of Register and FPURegister.
84
86#define REGISTER_CODE(R) kRegCode_##R,
88#undef REGISTER_CODE
90};
91
92class Register : public RegisterBase<Register, kRegAfterLast> {
93 public:
94 static constexpr int kMantissaOffset = 0;
95 static constexpr int kExponentOffset = 4;
96
97 private:
98 friend class RegisterBase;
99 explicit constexpr Register(int code) : RegisterBase(code) {}
100};
101
102// s7: context register
103// s3: scratch register
104// s4: scratch register 2
105#define DECLARE_REGISTER(R) \
106 constexpr Register R = Register::from_code(kRegCode_##R);
108#undef DECLARE_REGISTER
109
110constexpr Register no_reg = Register::no_reg();
111
112int ToNumber(Register reg);
113
114Register ToRegister(int num);
115
116// Assign |source| value to |no_reg| and return the |source|'s previous value.
117inline Register ReassignRegister(Register& source) {
118 Register result = source;
119 source = Register::no_reg();
120 return result;
121}
122
123// Returns the number of padding slots needed for stack pointer alignment.
124constexpr int ArgumentPaddingSlots(int argument_count) {
125 // No argument padding required.
126 return 0;
127}
128
130constexpr bool kSimdMaskRegisters = false;
131
133#define REGISTER_CODE(R) kDoubleCode_##R,
135#undef REGISTER_CODE
137};
138
139// FPURegister register.
140class FPURegister : public RegisterBase<FPURegister, kDoubleAfterLast> {
141 public:
143
144 private:
145 friend class RegisterBase;
146 explicit constexpr FPURegister(int code) : RegisterBase(code) {}
147};
148
149// Condition Flag Register
151
152using FloatRegister = FPURegister;
153
154using DoubleRegister = FPURegister;
155
156using Simd128Register = FPURegister;
157
158#define DECLARE_DOUBLE_REGISTER(R) \
159 constexpr DoubleRegister R = DoubleRegister::from_code(kDoubleCode_##R);
161#undef DECLARE_DOUBLE_REGISTER
162
164
165// Register aliases.
166// cp is assumed to be a callee saved register.
167constexpr Register kRootRegister = s6;
168constexpr Register cp = s7;
169constexpr Register kScratchReg = s3;
170constexpr Register kScratchReg2 = s4;
171constexpr DoubleRegister kScratchDoubleReg = f30;
173// FPU zero reg is often used to hold 0.0, but it's not hardwired to 0.0.
174constexpr DoubleRegister kDoubleRegZero = f29;
175
176struct FPUControlRegister {
177 bool is_valid() const { return (reg_code >> 2) == 0; }
178 bool is(FPUControlRegister creg) const { return reg_code == creg.reg_code; }
179 int code() const {
180 DCHECK(is_valid());
181 return reg_code;
182 }
183 int bit() const {
184 DCHECK(is_valid());
185 return 1 << reg_code;
186 }
187 void setcode(int f) {
188 reg_code = f;
189 DCHECK(is_valid());
190 }
191 // Unfortunately we can't make this private in a struct.
193};
194
201
202// Define {RegisterName} methods for the register types.
205
206// LoongArch64 calling convention.
207constexpr Register kCArgRegs[] = {a0, a1, a2, a3, a4, a5, a6, a7};
209constexpr int kFPRegisterPassedArguments = 8;
210
211constexpr Register kReturnRegister0 = a0;
212constexpr Register kReturnRegister1 = a1;
213constexpr Register kReturnRegister2 = a2;
214constexpr Register kJSFunctionRegister = a1;
215constexpr Register kContextRegister = s7;
216constexpr Register kAllocateSizeRegister = a0;
217constexpr Register kInterpreterAccumulatorRegister = a0;
218constexpr Register kInterpreterBytecodeOffsetRegister = t0;
219constexpr Register kInterpreterBytecodeArrayRegister = t1;
220constexpr Register kInterpreterDispatchTableRegister = t2;
221
222constexpr Register kJavaScriptCallArgCountRegister = a0;
223constexpr Register kJavaScriptCallCodeStartRegister = a2;
225constexpr Register kJavaScriptCallNewTargetRegister = a3;
226constexpr Register kJavaScriptCallExtraArg1Register = a2;
227constexpr Register kJavaScriptCallDispatchHandleRegister = a4;
228
229constexpr Register kRuntimeCallFunctionRegister = a1;
230constexpr Register kRuntimeCallArgCountRegister = a0;
231constexpr Register kRuntimeCallArgvRegister = a2;
232constexpr Register kWasmImplicitArgRegister = a7;
233constexpr Register kWasmCompileLazyFuncIndexRegister = t0;
234constexpr Register kWasmTrapHandlerFaultAddressRegister = t6;
235
236#ifdef V8_COMPRESS_POINTERS
237constexpr Register kPtrComprCageBaseRegister = s8;
238#else
240#endif
241
243
244} // namespace internal
245} // namespace v8
246
247#endif // V8_CODEGEN_LOONG64_REGISTER_LOONG64_H_
constexpr FPURegister(int code)
static constexpr FPURegister from_code(int8_t code)
static constexpr int kMantissaOffset
constexpr Register(int code)
static constexpr int kExponentOffset
static constexpr Register no_reg()
ZoneVector< RpoNumber > & result
LiftoffRegister reg
InstructionOperand source
constexpr Register no_reg
constexpr Register kRootRegister
constexpr FPUControlRegister no_fpucreg
const int kInvalidFPUControlRegister
const int kFCSRRegister
constexpr AliasingKind kFPAliasing
constexpr Register kRuntimeCallFunctionRegister
constexpr int kFPRegisterPassedArguments
DwVfpRegister DoubleRegister
constexpr DoubleRegister kScratchDoubleReg
constexpr int kNumRegs
constexpr Register kRuntimeCallArgvRegister
constexpr Register kJavaScriptCallTargetRegister
constexpr FPUControlRegister FCSR2
constexpr DwVfpRegister no_dreg
constexpr FPUControlRegister FCSR
constexpr DoubleRegister kScratchDoubleReg2
constexpr Register kJavaScriptCallArgCountRegister
constexpr Register kInterpreterAccumulatorRegister
int ToNumber(Register reg)
constexpr Register kScratchReg2
constexpr Register kScratchReg
static const int kRegisterPassedArguments
QwNeonRegister Simd128Register
constexpr DoubleRegister kFPReturnRegister0
constexpr Register kReturnRegister1
constexpr Register kReturnRegister0
constexpr Register kWasmImplicitArgRegister
constexpr Register kContextRegister
constexpr Register kRuntimeCallArgCountRegister
constexpr Register kInterpreterDispatchTableRegister
constexpr Register kAllocateSizeRegister
constexpr Register kWasmTrapHandlerFaultAddressRegister
constexpr LowDwVfpRegister kDoubleRegZero
constexpr Register kJavaScriptCallExtraArg1Register
Register ToRegister(int num)
constexpr Register kJavaScriptCallCodeStartRegister
constexpr Register kPtrComprCageBaseRegister
constexpr Register kReturnRegister2
Register ReassignRegister(Register &source)
constexpr Register kWasmCompileLazyFuncIndexRegister
constexpr FPUControlRegister FCSR3
constexpr int ArgumentPaddingSlots(int argument_count)
constexpr Register cp
constexpr FPUControlRegister FCSR1
constexpr Register kCArgRegs[]
constexpr bool kSimdMaskRegisters
constexpr Register kJavaScriptCallDispatchHandleRegister
constexpr FPUControlRegister FCSR0
constexpr Register kInterpreterBytecodeOffsetRegister
constexpr Register kJavaScriptCallNewTargetRegister
constexpr Register kJSFunctionRegister
SwVfpRegister FloatRegister
constexpr Register kInterpreterBytecodeArrayRegister
#define GENERAL_REGISTERS(V)
#define DECLARE_DOUBLE_REGISTER(R)
#define REGISTER_CODE(R)
#define DECLARE_REGISTER(R)
#define DOUBLE_REGISTERS(V)
#define DEFINE_REGISTER_NAMES(RegType, LIST)
#define DCHECK(condition)
Definition logging.h:482
#define arraysize(array)
Definition macros.h:67
bool is(FPUControlRegister creg) const