v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
register-arm64.h
Go to the documentation of this file.
1// Copyright 2018 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_ARM64_REGISTER_ARM64_H_
6#define V8_CODEGEN_ARM64_REGISTER_ARM64_H_
7
10#include "src/common/globals.h"
11
12namespace v8 {
13namespace internal {
14
15// -----------------------------------------------------------------------------
16// Registers.
17// clang-format off
18#define GENERAL_REGISTER_CODE_LIST(R) \
19 R(0) R(1) R(2) R(3) R(4) R(5) R(6) R(7) \
20 R(8) R(9) R(10) R(11) R(12) R(13) R(14) R(15) \
21 R(16) R(17) R(18) R(19) R(20) R(21) R(22) R(23) \
22 R(24) R(25) R(26) R(27) R(28) R(29) R(30) R(31)
23
24#define GENERAL_REGISTERS(R) \
25 R(x0) R(x1) R(x2) R(x3) R(x4) R(x5) R(x6) R(x7) \
26 R(x8) R(x9) R(x10) R(x11) R(x12) R(x13) R(x14) R(x15) \
27 R(x16) R(x17) R(x18) R(x19) R(x20) R(x21) R(x22) R(x23) \
28 R(x24) R(x25) R(x26) R(x27) R(x28) R(x29) R(x30) R(x31)
29
30// x18 is the platform register and is reserved for the use of platform ABIs.
31// It is known to be reserved by the OS at least on Windows and iOS.
32#define ALWAYS_ALLOCATABLE_GENERAL_REGISTERS(R) \
33 R(x0) R(x1) R(x2) R(x3) R(x4) R(x5) R(x6) R(x7) \
34 R(x8) R(x9) R(x10) R(x11) R(x12) R(x13) R(x14) R(x15) \
35 R(x19) R(x20) R(x21) R(x22) R(x23) R(x24) R(x25) \
36 R(x27)
37
38#ifdef V8_COMPRESS_POINTERS
39#define MAYBE_ALLOCATABLE_GENERAL_REGISTERS(R)
40#else
41#define MAYBE_ALLOCATABLE_GENERAL_REGISTERS(R) R(x28)
42#endif
43
44#define ALLOCATABLE_GENERAL_REGISTERS(V) \
45 ALWAYS_ALLOCATABLE_GENERAL_REGISTERS(V) \
46 MAYBE_ALLOCATABLE_GENERAL_REGISTERS(V)
47
48#define FLOAT_REGISTERS(V) \
49 V(s0) V(s1) V(s2) V(s3) V(s4) V(s5) V(s6) V(s7) \
50 V(s8) V(s9) V(s10) V(s11) V(s12) V(s13) V(s14) V(s15) \
51 V(s16) V(s17) V(s18) V(s19) V(s20) V(s21) V(s22) V(s23) \
52 V(s24) V(s25) V(s26) V(s27) V(s28) V(s29) V(s30) V(s31)
53
54#define DOUBLE_REGISTERS(R) \
55 R(d0) R(d1) R(d2) R(d3) R(d4) R(d5) R(d6) R(d7) \
56 R(d8) R(d9) R(d10) R(d11) R(d12) R(d13) R(d14) R(d15) \
57 R(d16) R(d17) R(d18) R(d19) R(d20) R(d21) R(d22) R(d23) \
58 R(d24) R(d25) R(d26) R(d27) R(d28) R(d29) R(d30) R(d31)
59
60#define SIMD128_REGISTERS(V) \
61 V(q0) V(q1) V(q2) V(q3) V(q4) V(q5) V(q6) V(q7) \
62 V(q8) V(q9) V(q10) V(q11) V(q12) V(q13) V(q14) V(q15) \
63 V(q16) V(q17) V(q18) V(q19) V(q20) V(q21) V(q22) V(q23) \
64 V(q24) V(q25) V(q26) V(q27) V(q28) V(q29) V(q30) V(q31)
65
66#define VECTOR_REGISTERS(V) \
67 V(v0) V(v1) V(v2) V(v3) V(v4) V(v5) V(v6) V(v7) \
68 V(v8) V(v9) V(v10) V(v11) V(v12) V(v13) V(v14) V(v15) \
69 V(v16) V(v17) V(v18) V(v19) V(v20) V(v21) V(v22) V(v23) \
70 V(v24) V(v25) V(v26) V(v27) V(v28) V(v29) V(v30) V(v31)
71
72// Register d29 could be allocated, but we keep an even length list here, in
73// order to make stack alignment easier for save and restore.
74#define ALLOCATABLE_DOUBLE_REGISTERS(R) \
75 R(d0) R(d1) R(d2) R(d3) R(d4) R(d5) R(d6) R(d7) \
76 R(d8) R(d9) R(d10) R(d11) R(d12) R(d13) R(d14) R(d16) \
77 R(d17) R(d18) R(d19) R(d20) R(d21) R(d22) R(d23) R(d24) \
78 R(d25) R(d26) R(d27) R(d28)
79
80#define MAGLEV_SCRATCH_DOUBLE_REGISTERS(R) \
81 R(d30) R(d31)
82
83// clang-format on
84
85// Some CPURegister methods can return Register and VRegister types, so we
86// need to declare them in advance.
87class Register;
88class VRegister;
89
91#define REGISTER_CODE(R) kRegCode_##R,
93#undef REGISTER_CODE
95};
96
97class CPURegister : public RegisterBase<CPURegister, kRegAfterLast> {
98 public:
100
101 static constexpr CPURegister no_reg() {
103 }
104
105 static constexpr CPURegister Create(int code, int size, RegisterType type) {
106 DCHECK(IsValid(code, size, type));
107 return CPURegister{code, size, type};
108 }
109
110 RegisterType type() const { return reg_type_; }
111 int SizeInBits() const {
112 DCHECK(is_valid());
113 return reg_size_;
114 }
115 int SizeInBytes() const {
116 DCHECK(is_valid());
117 DCHECK_EQ(SizeInBits() % 8, 0);
118 return reg_size_ / 8;
119 }
120 bool Is8Bits() const {
121 DCHECK(is_valid());
122 return reg_size_ == 8;
123 }
124 bool Is16Bits() const {
125 DCHECK(is_valid());
126 return reg_size_ == 16;
127 }
128 bool Is32Bits() const {
129 DCHECK(is_valid());
130 return reg_size_ == 32;
131 }
132 bool Is64Bits() const {
133 DCHECK(is_valid());
134 return reg_size_ == 64;
135 }
136 bool Is128Bits() const {
137 DCHECK(is_valid());
138 return reg_size_ == 128;
139 }
140 bool IsNone() const { return reg_type_ == kNoRegister; }
141 constexpr bool Aliases(const CPURegister& other) const {
142 return RegisterBase::operator==(other) && reg_type_ == other.reg_type_;
143 }
144
145 constexpr bool operator==(const CPURegister& other) const {
146 return RegisterBase::operator==(other) && reg_size_ == other.reg_size_ &&
147 reg_type_ == other.reg_type_;
148 }
149 constexpr bool operator!=(const CPURegister& other) const {
150 return !operator==(other);
151 }
152
153 bool IsZero() const;
154 bool IsSP() const;
155
156 bool IsRegister() const { return reg_type_ == kRegister; }
157 bool IsVRegister() const { return reg_type_ == kVRegister; }
158
159 bool IsFPRegister() const { return IsS() || IsD(); }
160
161 bool IsW() const { return IsRegister() && Is32Bits(); }
162 bool IsX() const { return IsRegister() && Is64Bits(); }
163
164 // These assertions ensure that the size and type of the register are as
165 // described. They do not consider the number of lanes that make up a vector.
166 // So, for example, Is8B() implies IsD(), and Is1D() implies IsD, but IsD()
167 // does not imply Is1D() or Is8B().
168 // Check the number of lanes, ie. the format of the vector, using methods such
169 // as Is8B(), Is1D(), etc. in the VRegister class.
170 bool IsV() const { return IsVRegister(); }
171 bool IsB() const { return IsV() && Is8Bits(); }
172 bool IsH() const { return IsV() && Is16Bits(); }
173 bool IsS() const { return IsV() && Is32Bits(); }
174 bool IsD() const { return IsV() && Is64Bits(); }
175 bool IsQ() const { return IsV() && Is128Bits(); }
176
177 Register Reg() const;
178 VRegister VReg() const;
179
180 Register X() const;
181 Register W() const;
182 VRegister V() const;
183 VRegister B() const;
184 VRegister H() const;
185 VRegister D() const;
186 VRegister S() const;
187 VRegister Q() const;
188
189 bool IsSameSizeAndType(const CPURegister& other) const;
190
191 constexpr bool IsEven() const { return (code() % 2) == 0; }
192
193 int MaxCode() const {
194 if (IsVRegister()) {
195 return kNumberOfVRegisters - 1;
196 }
198 return kNumberOfRegisters - 1;
199 }
200
201 protected:
202 uint8_t reg_size_;
204
205#if defined(V8_OS_WIN) && !defined(__clang__)
206 // MSVC has problem to parse template base class as friend class.
207 friend RegisterBase;
208#else
209 friend class RegisterBase;
210#endif
211
212 constexpr CPURegister(int code, int size, RegisterType type)
213 : RegisterBase(code), reg_size_(size), reg_type_(type) {}
214
215 static constexpr bool IsValidRegister(int code, int size) {
216 return (size == kWRegSizeInBits || size == kXRegSizeInBits) &&
217 (code < kNumberOfRegisters || code == kSPRegInternalCode);
218 }
219
220 static constexpr bool IsValidVRegister(int code, int size) {
221 return (size == kBRegSizeInBits || size == kHRegSizeInBits ||
222 size == kSRegSizeInBits || size == kDRegSizeInBits ||
223 size == kQRegSizeInBits) &&
224 code < kNumberOfVRegisters;
225 }
226
227 static constexpr bool IsValid(int code, int size, RegisterType type) {
228 return (type == kRegister && IsValidRegister(code, size)) ||
229 (type == kVRegister && IsValidVRegister(code, size));
230 }
231
232 static constexpr bool IsNone(int code, int size, RegisterType type) {
233 return type == kNoRegister && code == 0 && size == 0;
234 }
235};
236
238static_assert(sizeof(CPURegister) <= sizeof(int),
239 "CPURegister can efficiently be passed by value");
240
241class Register : public CPURegister {
242 public:
243 static constexpr Register no_reg() { return Register(CPURegister::no_reg()); }
244
245 static constexpr Register Create(int code, int size) {
247 }
248
249 static Register XRegFromCode(unsigned code);
250 static Register WRegFromCode(unsigned code);
251
252 static constexpr Register from_code(int code) {
253 // Always return an X register.
254 return Register::Create(code, kXRegSizeInBits);
255 }
256
257 static const char* GetSpecialRegisterName(int code) {
258 return (code == kSPRegInternalCode) ? "sp" : "UNKNOWN";
259 }
260
261 private:
262 constexpr explicit Register(const CPURegister& r) : CPURegister(r) {}
263};
264
266static_assert(sizeof(Register) <= sizeof(int),
267 "Register can efficiently be passed by value");
268
269// Assign |source| value to |no_reg| and return the |source|'s previous value.
270template <typename RegT>
271inline RegT ReassignRegister(RegT& source) {
272 RegT result = source;
273 source = RegT::no_reg();
274 return result;
275}
276
277// Stack frame alignment and padding.
278constexpr int ArgumentPaddingSlots(int argument_count) {
279 // Stack frames are aligned to 16 bytes.
280 constexpr int kStackFrameAlignment = 16;
281 constexpr int alignment_mask = kStackFrameAlignment / kSystemPointerSize - 1;
282 return argument_count & alignment_mask;
283}
284
286constexpr bool kSimdMaskRegisters = false;
287
289#define REGISTER_CODE(R) kDoubleCode_##R,
291#undef REGISTER_CODE
293};
294
295// Functions for handling NEON vector format information.
297 kFormatUndefined = 0xffffffff,
306
307 // Scalar formats. We add the scalar bit to distinguish between scalar and
308 // vector enumerations; the bit is always set in the encoding of scalar ops
309 // and always clear for vector ops. Although kFormatD and kFormat1D appear
310 // to be the same, their meaning is subtly different. The first is a scalar
311 // operation, the second a vector operation that only affects one lane.
316
317 kFormat1Q = 0xfffffffd
319
340
341class VRegister : public CPURegister {
342 public:
343 static constexpr VRegister no_reg() {
344 return VRegister(CPURegister::no_reg(), 0);
345 }
346
347 static constexpr VRegister Create(int code, int size, int lane_count = 1) {
348 DCHECK(IsValidLaneCount(lane_count));
350 lane_count);
351 }
352
353 static VRegister Create(int reg_code, VectorFormat format) {
354 int reg_size = RegisterSizeInBitsFromFormat(format);
355 int reg_count = IsVectorFormat(format) ? LaneCountFromFormat(format) : 1;
356 return VRegister::Create(reg_code, reg_size, reg_count);
357 }
358
359 static VRegister BRegFromCode(unsigned code);
360 static VRegister HRegFromCode(unsigned code);
361 static VRegister SRegFromCode(unsigned code);
362 static VRegister DRegFromCode(unsigned code);
363 static VRegister QRegFromCode(unsigned code);
364 static VRegister VRegFromCode(unsigned code);
365
366 VRegister V8B() const {
368 }
369 VRegister V16B() const {
371 }
372 VRegister V4H() const {
374 }
375 VRegister V8H() const {
377 }
378 VRegister V2S() const {
380 }
381 VRegister V4S() const {
383 }
384 VRegister V2D() const {
386 }
387 VRegister V1D() const {
389 }
390 VRegister V1Q() const {
392 }
393
395 return VRegister::Create(code(), f);
396 }
397
398 bool Is8B() const { return (Is64Bits() && (lane_count_ == 8)); }
399 bool Is16B() const { return (Is128Bits() && (lane_count_ == 16)); }
400 bool Is4H() const { return (Is64Bits() && (lane_count_ == 4)); }
401 bool Is8H() const { return (Is128Bits() && (lane_count_ == 8)); }
402 bool Is2S() const { return (Is64Bits() && (lane_count_ == 2)); }
403 bool Is4S() const { return (Is128Bits() && (lane_count_ == 4)); }
404 bool Is1D() const { return (Is64Bits() && (lane_count_ == 1)); }
405 bool Is2D() const { return (Is128Bits() && (lane_count_ == 2)); }
406 bool Is1Q() const { return (Is128Bits() && (lane_count_ == 1)); }
407
408 // For consistency, we assert the number of lanes of these scalar registers,
409 // even though there are no vectors of equivalent total size with which they
410 // could alias.
411 bool Is1B() const {
412 DCHECK(!(Is8Bits() && IsVector()));
413 return Is8Bits();
414 }
415 bool Is1H() const {
416 DCHECK(!(Is16Bits() && IsVector()));
417 return Is16Bits();
418 }
419 bool Is1S() const {
420 DCHECK(!(Is32Bits() && IsVector()));
421 return Is32Bits();
422 }
423
424 bool IsLaneSizeB() const { return LaneSizeInBits() == kBRegSizeInBits; }
425 bool IsLaneSizeH() const { return LaneSizeInBits() == kHRegSizeInBits; }
426 bool IsLaneSizeS() const { return LaneSizeInBits() == kSRegSizeInBits; }
427 bool IsLaneSizeD() const { return LaneSizeInBits() == kDRegSizeInBits; }
428
429 bool IsScalar() const { return lane_count_ == 1; }
430 bool IsVector() const { return lane_count_ > 1; }
431
432 bool IsSameFormat(const VRegister& other) const {
433 return (reg_size_ == other.reg_size_) && (lane_count_ == other.lane_count_);
434 }
435
436 int LaneCount() const { return lane_count_; }
437
438 unsigned LaneSizeInBytes() const { return SizeInBytes() / lane_count_; }
439
440 unsigned LaneSizeInBits() const { return LaneSizeInBytes() * 8; }
441
442 static constexpr int kMaxNumRegisters = kNumberOfVRegisters;
443 static_assert(kMaxNumRegisters == kDoubleAfterLast);
444
445 static constexpr VRegister from_code(int code) {
446 // Always return a D register.
448 }
449
450 private:
452
453 constexpr explicit VRegister(const CPURegister& r, int lane_count)
454 : CPURegister(r), lane_count_(lane_count) {}
455
456 static constexpr bool IsValidLaneCount(int lane_count) {
457 return base::bits::IsPowerOfTwo(lane_count) && lane_count <= 16;
458 }
459};
460
462static_assert(sizeof(VRegister) <= sizeof(int),
463 "VRegister can efficiently be passed by value");
464
465// No*Reg is used to indicate an unused argument, or an error case. Note that
466// these all compare equal. The Register and VRegister variants are provided for
467// convenience.
471constexpr Register no_reg = NoReg;
472constexpr VRegister no_dreg = NoVReg;
473
474#define DEFINE_REGISTER(register_class, name, ...) \
475 constexpr register_class name = register_class::Create(__VA_ARGS__)
476#define ALIAS_REGISTER(register_class, alias, name) \
477 constexpr register_class alias = name
478
479#define DEFINE_REGISTERS(N) \
480 DEFINE_REGISTER(Register, w##N, N, kWRegSizeInBits); \
481 DEFINE_REGISTER(Register, x##N, N, kXRegSizeInBits);
483#undef DEFINE_REGISTERS
484
487
488#define DEFINE_VREGISTERS(N) \
489 DEFINE_REGISTER(VRegister, b##N, N, kBRegSizeInBits); \
490 DEFINE_REGISTER(VRegister, h##N, N, kHRegSizeInBits); \
491 DEFINE_REGISTER(VRegister, s##N, N, kSRegSizeInBits); \
492 DEFINE_REGISTER(VRegister, d##N, N, kDRegSizeInBits); \
493 DEFINE_REGISTER(VRegister, q##N, N, kQRegSizeInBits); \
494 DEFINE_REGISTER(VRegister, v##N, N, kQRegSizeInBits);
496#undef DEFINE_VREGISTERS
497
498#undef DEFINE_REGISTER
499
500// Registers aliases.
502ALIAS_REGISTER(VRegister, v8_, v8); // Avoid conflicts with namespace v8.
507// Root register.
510// Pointer cage base register.
511#ifdef V8_COMPRESS_POINTERS
513#else
515#endif
516// Context pointer register.
522
523// Register used for padding stack slots.
525
526// Keeps the 0 double value.
528// MacroAssembler fixed V Registers.
529// d29 is not part of ALLOCATABLE_DOUBLE_REGISTERS, so use 27 and 28.
530ALIAS_REGISTER(VRegister, fp_fixed1, d27);
531ALIAS_REGISTER(VRegister, fp_fixed2, d28);
532
533// MacroAssembler scratch V registers.
534ALIAS_REGISTER(VRegister, fp_scratch, d30);
535ALIAS_REGISTER(VRegister, fp_scratch1, d30);
536ALIAS_REGISTER(VRegister, fp_scratch2, d31);
537
538#undef ALIAS_REGISTER
539
540// Arm64 calling convention
541constexpr Register kCArgRegs[] = {x0, x1, x2, x3, x4, x5, x6, x7};
544
545// AreAliased returns true if any of the named registers overlap. Arguments set
546// to NoReg are ignored. The system stack pointer may be specified.
548 const CPURegister& reg1, const CPURegister& reg2,
549 const CPURegister& reg3 = NoReg, const CPURegister& reg4 = NoReg,
550 const CPURegister& reg5 = NoReg, const CPURegister& reg6 = NoReg,
551 const CPURegister& reg7 = NoReg, const CPURegister& reg8 = NoReg);
552
553// AreSameSizeAndType returns true if all of the specified registers have the
554// same size, and are of the same type. The system stack pointer may be
555// specified. Arguments set to NoReg are ignored, as are any subsequent
556// arguments. At least one argument (reg1) must be valid (not NoCPUReg).
558 const CPURegister& reg1, const CPURegister& reg2 = NoCPUReg,
559 const CPURegister& reg3 = NoCPUReg, const CPURegister& reg4 = NoCPUReg,
560 const CPURegister& reg5 = NoCPUReg, const CPURegister& reg6 = NoCPUReg,
561 const CPURegister& reg7 = NoCPUReg, const CPURegister& reg8 = NoCPUReg);
562
563// AreSameFormat returns true if all of the specified VRegisters have the same
564// vector format. Arguments set to NoVReg are ignored, as are any subsequent
565// arguments. At least one argument (reg1) must be valid (not NoVReg).
566bool AreSameFormat(const Register& reg1, const Register& reg2,
567 const Register& reg3 = NoReg, const Register& reg4 = NoReg);
568bool AreSameFormat(const VRegister& reg1, const VRegister& reg2,
569 const VRegister& reg3 = NoVReg,
570 const VRegister& reg4 = NoVReg);
571
572// AreConsecutive returns true if all of the specified VRegisters are
573// consecutive in the register file. Arguments may be set to NoVReg, and if so,
574// subsequent arguments must also be NoVReg. At least one argument (reg1) must
575// be valid (not NoVReg).
577 const CPURegister& reg2,
578 const CPURegister& reg3 = NoReg,
579 const CPURegister& reg4 = NoReg);
580
581bool AreEven(const CPURegister& reg1, const CPURegister& reg2,
582 const CPURegister& reg3 = NoReg, const CPURegister& reg4 = NoReg,
583 const CPURegister& reg5 = NoReg, const CPURegister& reg6 = NoReg,
584 const CPURegister& reg7 = NoReg, const CPURegister& reg8 = NoReg);
585
589
590// Define a {RegisterName} method for {Register} and {VRegister}.
593
594// Give alias names to registers for calling conventions.
595constexpr Register kReturnRegister0 = x0;
596constexpr Register kReturnRegister1 = x1;
597constexpr Register kReturnRegister2 = x2;
598constexpr Register kJSFunctionRegister = x1;
599constexpr Register kContextRegister = cp;
600constexpr Register kAllocateSizeRegister = x1;
601
606
613
616constexpr Register kRuntimeCallArgvRegister = x11;
621
623
624} // namespace internal
625} // namespace v8
626
627#endif // V8_CODEGEN_ARM64_REGISTER_ARM64_H_
static constexpr bool IsValidRegister(int code, int size)
constexpr bool operator!=(const CPURegister &other) const
static constexpr bool IsValidVRegister(int code, int size)
constexpr bool IsEven() const
static constexpr bool IsNone(int code, int size, RegisterType type)
constexpr CPURegister(int code, int size, RegisterType type)
constexpr bool operator==(const CPURegister &other) const
RegisterType type() const
static constexpr CPURegister Create(int code, int size, RegisterType type)
static constexpr bool IsValid(int code, int size, RegisterType type)
static constexpr CPURegister no_reg()
constexpr bool Aliases(const CPURegister &other) const
bool IsSameSizeAndType(const CPURegister &other) const
constexpr bool operator==(const RegisterBase< SubType, kAfterLastRegister > &other) const
static constexpr Register from_code(int code)
constexpr Register(const CPURegister &r)
static Register WRegFromCode(unsigned code)
static Register XRegFromCode(unsigned code)
static const char * GetSpecialRegisterName(int code)
constexpr Register(int code)
static constexpr Register Create(int code, int size)
static constexpr Register no_reg()
VRegister V16B() const
VRegister V2D() const
static VRegister HRegFromCode(unsigned code)
static constexpr VRegister Create(int code, int size, int lane_count=1)
static constexpr VRegister no_reg()
VRegister Format(VectorFormat f) const
static VRegister VRegFromCode(unsigned code)
static VRegister BRegFromCode(unsigned code)
unsigned LaneSizeInBits() const
VRegister V2S() const
static constexpr int kMaxNumRegisters
static VRegister QRegFromCode(unsigned code)
static VRegister DRegFromCode(unsigned code)
bool IsSameFormat(const VRegister &other) const
unsigned LaneSizeInBytes() const
static constexpr VRegister from_code(int code)
constexpr VRegister(const CPURegister &r, int lane_count)
static VRegister Create(int reg_code, VectorFormat format)
VRegister V1Q() const
VRegister V8H() const
VRegister V1D() const
static VRegister SRegFromCode(unsigned code)
VRegister V4S() const
static constexpr bool IsValidLaneCount(int lane_count)
VRegister V4H() const
VRegister V8B() const
ZoneVector< RpoNumber > & result
InstructionOperand source
int r
Definition mul-fft.cc:298
constexpr bool IsPowerOfTwo(T value)
Definition bits.h:187
constexpr Register no_reg
V8_EXPORT_PRIVATE bool AreConsecutive(const CPURegister &reg1, const CPURegister &reg2, const CPURegister &reg3=NoReg, const CPURegister &reg4=NoReg)
constexpr Register kRootRegister
VectorFormat ScalarFormatFromLaneSize(int lanesize)
constexpr NEONFormatField NEON_8B
constexpr NEONFormatField NEON_16B
VectorFormat VectorFormatHalfLanes(VectorFormat vform)
constexpr AliasingKind kFPAliasing
constexpr Register kRuntimeCallFunctionRegister
constexpr NEONScalarFormatField NEON_H
V8_EXPORT_PRIVATE int LaneCountFromFormat(VectorFormat vform)
constexpr int kFPRegisterPassedArguments
constexpr NEONFormatField NEON_2S
V8_EXPORT_PRIVATE unsigned RegisterSizeInBitsFromFormat(VectorFormat vform)
constexpr Register kRuntimeCallArgvRegister
constexpr NEONFormatField NEON_1D
constexpr Register kJavaScriptCallTargetRegister
constexpr int kWRegSizeInBits
constexpr int kNumberOfRegisters
bool AreEven(const CPURegister &reg1, const CPURegister &reg2, const CPURegister &reg3=NoReg, const CPURegister &reg4=NoReg, const CPURegister &reg5=NoReg, const CPURegister &reg6=NoReg, const CPURegister &reg7=NoReg, const CPURegister &reg8=NoReg)
int64_t MinIntFromFormat(VectorFormat vform)
uint64_t MaxUintFromFormat(VectorFormat vform)
constexpr DwVfpRegister no_dreg
int LaneSizeInBytesLog2FromFormat(VectorFormat vform)
constexpr NEONFormatField NEON_4H
constexpr Register kJavaScriptCallArgCountRegister
constexpr Register kInterpreterAccumulatorRegister
static const int kRegisterPassedArguments
constexpr NEONFormatField NEON_8H
int MaxLaneCountFromFormat(VectorFormat vform)
constexpr int kSystemPointerSize
Definition globals.h:410
constexpr DoubleRegister kFPReturnRegister0
constexpr Register kReturnRegister1
int64_t MaxIntFromFormat(VectorFormat vform)
constexpr NEONScalarFormatField NEONScalar
VectorFormat VectorFormatHalfWidth(VectorFormat vform)
constexpr Register kReturnRegister0
constexpr int kBRegSizeInBits
V8_EXPORT_PRIVATE bool IsVectorFormat(VectorFormat vform)
constexpr Register kWasmImplicitArgRegister
constexpr Register kContextRegister
V8_EXPORT_PRIVATE bool AreAliased(const CPURegister &reg1, const CPURegister &reg2, const CPURegister &reg3=NoReg, const CPURegister &reg4=NoReg, const CPURegister &reg5=NoReg, const CPURegister &reg6=NoReg, const CPURegister &reg7=NoReg, const CPURegister &reg8=NoReg)
constexpr Register kRuntimeCallArgCountRegister
constexpr NEONFormatField NEON_4S
constexpr VRegister NoVReg
constexpr Register kInterpreterDispatchTableRegister
bool AreSameFormat(const Register &reg1, const Register &reg2, const Register &reg3=NoReg, const Register &reg4=NoReg)
constexpr Register kAllocateSizeRegister
unsigned LaneSizeInBitsFromFormat(VectorFormat vform)
constexpr Register kWasmTrapHandlerFaultAddressRegister
constexpr Register kSimulatorHltArgument
constexpr Register kJavaScriptCallExtraArg1Register
constexpr NEONScalarFormatField NEON_D
constexpr Register kJavaScriptCallCodeStartRegister
constexpr CPURegister NoCPUReg
constexpr Register kPtrComprCageBaseRegister
VectorFormat VectorFormatDoubleLanes(VectorFormat vform)
constexpr Register kReturnRegister2
Register ReassignRegister(Register &source)
constexpr Register kWasmCompileLazyFuncIndexRegister
constexpr NEONFormatField NEON_2D
constexpr int kXRegSizeInBits
constexpr NEONScalarFormatField NEON_S
constexpr int kNumberOfVRegisters
constexpr int kSPRegInternalCode
constexpr int kSRegSizeInBits
VectorFormat VectorFormatDoubleWidth(VectorFormat vform)
constexpr Register kStackPointerRegister
constexpr int ArgumentPaddingSlots(int argument_count)
constexpr NEONScalarFormatField NEON_B
constexpr Register cp
constexpr int kQRegSizeInBits
constexpr Register kCArgRegs[]
int LaneSizeInBytesFromFormat(VectorFormat vform)
constexpr bool kSimdMaskRegisters
VectorFormat VectorFormatHalfWidthDoubleLanes(VectorFormat vform)
V8_EXPORT_PRIVATE bool AreSameSizeAndType(const CPURegister &reg1, const CPURegister &reg2=NoCPUReg, const CPURegister &reg3=NoCPUReg, const CPURegister &reg4=NoCPUReg, const CPURegister &reg5=NoCPUReg, const CPURegister &reg6=NoCPUReg, const CPURegister &reg7=NoCPUReg, const CPURegister &reg8=NoCPUReg)
constexpr Register kJavaScriptCallDispatchHandleRegister
constexpr Register NoReg
constexpr Register kInterpreterBytecodeOffsetRegister
unsigned RegisterSizeInBytesFromFormat(VectorFormat vform)
constexpr Register kJavaScriptCallNewTargetRegister
constexpr Register kJSFunctionRegister
constexpr int kHRegSizeInBits
VectorFormat VectorFormatFillQ(int laneSize)
VectorFormat ScalarFormatFromFormat(VectorFormat vform)
constexpr Register kInterpreterBytecodeArrayRegister
constexpr Register padreg
constexpr int kDRegSizeInBits
#define GENERAL_REGISTER_CODE_LIST(R)
#define DEFINE_REGISTER(register_class, name,...)
#define DEFINE_VREGISTERS(N)
#define VECTOR_REGISTERS(V)
#define DEFINE_REGISTERS(N)
#define ALIAS_REGISTER(register_class, alias, name)
#define GENERAL_REGISTERS(V)
#define REGISTER_CODE(R)
#define DOUBLE_REGISTERS(V)
#define DEFINE_REGISTER_NAMES(RegType, LIST)
#define DCHECK(condition)
Definition logging.h:482
#define DCHECK_EQ(v1, v2)
Definition logging.h:485
#define ASSERT_TRIVIALLY_COPYABLE(T)
Definition macros.h:267
#define V8_EXPORT_PRIVATE
Definition macros.h:460
#define arraysize(array)
Definition macros.h:67