v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
register-ia32.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_IA32_REGISTER_IA32_H_
6#define V8_CODEGEN_IA32_REGISTER_IA32_H_
7
9
10namespace v8 {
11namespace internal {
12
13#define GENERAL_REGISTERS(V) \
14 V(eax) \
15 V(ecx) \
16 V(edx) \
17 V(ebx) \
18 V(esp) \
19 V(ebp) \
20 V(esi) \
21 V(edi)
22
23#define ALLOCATABLE_GENERAL_REGISTERS(V) \
24 V(eax) \
25 V(ecx) \
26 V(edx) \
27 V(esi) \
28 V(edi)
29
30#define DOUBLE_REGISTERS(V) \
31 V(xmm0) \
32 V(xmm1) \
33 V(xmm2) \
34 V(xmm3) \
35 V(xmm4) \
36 V(xmm5) \
37 V(xmm6) \
38 V(xmm7)
39
40#define FLOAT_REGISTERS DOUBLE_REGISTERS
41#define SIMD128_REGISTERS DOUBLE_REGISTERS
42
43#define ALLOCATABLE_DOUBLE_REGISTERS(V) \
44 V(xmm0) \
45 V(xmm1) \
46 V(xmm2) \
47 V(xmm3) \
48 V(xmm4) \
49 V(xmm5) \
50 V(xmm6)
51
53#define REGISTER_CODE(R) kRegCode_##R,
55#undef REGISTER_CODE
57};
58
59class Register : public RegisterBase<Register, kRegAfterLast> {
60 public:
61 bool is_byte_register() const { return code() <= 3; }
62
63 private:
64 friend class RegisterBase<Register, kRegAfterLast>;
65 explicit constexpr Register(int code) : RegisterBase(code) {}
66};
67
69static_assert(sizeof(Register) <= sizeof(int),
70 "Register can efficiently be passed by value");
71
72// Assign |source| value to |no_reg| and return the |source|'s previous value.
73inline Register ReassignRegister(Register& source) {
74 Register result = source;
75 source = Register::no_reg();
76 return result;
77}
78
79#define DEFINE_REGISTER(R) \
80 constexpr Register R = Register::from_code(kRegCode_##R);
82#undef DEFINE_REGISTER
83constexpr Register no_reg = Register::no_reg();
84
85// Returns the number of padding slots needed for stack pointer alignment.
86constexpr int ArgumentPaddingSlots(int argument_count) {
87 // No argument padding required.
88 return 0;
89}
90
92constexpr bool kSimdMaskRegisters = false;
93
95#define REGISTER_CODE(R) kDoubleCode_##R,
97#undef REGISTER_CODE
99};
100
101class XMMRegister : public RegisterBase<XMMRegister, kDoubleAfterLast> {
103 explicit constexpr XMMRegister(int code) : RegisterBase(code) {}
104};
105
106using FloatRegister = XMMRegister;
107
108using DoubleRegister = XMMRegister;
109
110using Simd128Register = XMMRegister;
111
112#define DEFINE_REGISTER(R) \
113 constexpr DoubleRegister R = DoubleRegister::from_code(kDoubleCode_##R);
115#undef DEFINE_REGISTER
117
118// Note that the bit values must match those used in actual instruction encoding
119constexpr int kNumRegs = 8;
120
121// Define {RegisterName} methods for the register types.
124
125// Give alias names to registers for calling conventions.
126constexpr Register kReturnRegister0 = eax;
127constexpr Register kReturnRegister1 = edx;
128constexpr Register kReturnRegister2 = edi;
129constexpr Register kJSFunctionRegister = edi;
130constexpr Register kContextRegister = esi;
131constexpr Register kAllocateSizeRegister = edx;
136
141// DispatchHandle is only needed for the sandbox which is not available on Ia32.
143
144// The ExtraArg1Register not part of the real JS calling convention and is
145// mostly there to simplify consistent interface descriptor definitions across
146// platforms. Note that on ia32 it aliases kJavaScriptCallCodeStartRegister.
148
151constexpr Register kRuntimeCallArgvRegister = ecx;
152constexpr Register kWasmImplicitArgRegister = esi;
154
155constexpr Register kRootRegister = ebx;
156
157constexpr DoubleRegister kFPReturnRegister0 = xmm0;
159
160} // namespace internal
161} // namespace v8
162
163#endif // V8_CODEGEN_IA32_REGISTER_IA32_H_
constexpr Register(int code)
bool is_byte_register() const
static constexpr Register no_reg()
constexpr XMMRegister(int code)
ZoneVector< RpoNumber > & result
InstructionOperand source
constexpr Register no_reg
constexpr Register kRootRegister
constexpr AliasingKind kFPAliasing
constexpr Register kRuntimeCallFunctionRegister
DwVfpRegister DoubleRegister
constexpr DoubleRegister kScratchDoubleReg
constexpr int kNumRegs
constexpr Register kRuntimeCallArgvRegister
constexpr Register kJavaScriptCallTargetRegister
constexpr DwVfpRegister no_dreg
constexpr Register kJavaScriptCallArgCountRegister
constexpr Register kInterpreterAccumulatorRegister
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 kJavaScriptCallExtraArg1Register
constexpr Register kJavaScriptCallCodeStartRegister
constexpr Register kReturnRegister2
Register ReassignRegister(Register &source)
constexpr Register kWasmCompileLazyFuncIndexRegister
constexpr int ArgumentPaddingSlots(int argument_count)
constexpr bool kSimdMaskRegisters
constexpr Register kJavaScriptCallDispatchHandleRegister
constexpr Register kInterpreterBytecodeOffsetRegister
constexpr Register kJavaScriptCallNewTargetRegister
constexpr Register kJSFunctionRegister
SwVfpRegister FloatRegister
constexpr Register kInterpreterBytecodeArrayRegister
#define DEFINE_REGISTER(register_class, name,...)
#define GENERAL_REGISTERS(V)
#define REGISTER_CODE(R)
#define DOUBLE_REGISTERS(V)
#define DEFINE_REGISTER_NAMES(RegType, LIST)
#define ASSERT_TRIVIALLY_COPYABLE(T)
Definition macros.h:267