v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
register-s390.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_S390_REGISTER_S390_H_
6#define V8_CODEGEN_S390_REGISTER_S390_H_
7
9
10namespace v8 {
11namespace internal {
12
13// clang-format off
14#define GENERAL_REGISTERS(V) \
15 V(r0) V(r1) V(r2) V(r3) V(r4) V(r5) V(r6) V(r7) \
16 V(r8) V(r9) V(r10) V(fp) V(ip) V(r13) V(r14) V(sp)
17
18#define ALWAYS_ALLOCATABLE_GENERAL_REGISTERS(V) \
19 V(r2) V(r3) V(r4) V(r5) V(r6) V(r7) \
20 V(r8) V(r13)
21
22#ifdef V8_COMPRESS_POINTERS_IN_SHARED_CAGE
23#define MAYBE_ALLOCATABLE_GENERAL_REGISTERS(V)
24#else
25#define MAYBE_ALLOCATABLE_GENERAL_REGISTERS(V) V(r9)
26#endif
27
28#define ALLOCATABLE_GENERAL_REGISTERS(V) \
29 ALWAYS_ALLOCATABLE_GENERAL_REGISTERS(V) \
30 MAYBE_ALLOCATABLE_GENERAL_REGISTERS(V)
31
32#define DOUBLE_REGISTERS(V) \
33 V(d0) V(d1) V(d2) V(d3) V(d4) V(d5) V(d6) V(d7) \
34 V(d8) V(d9) V(d10) V(d11) V(d12) V(d13) V(d14) V(d15)
35
36#define FLOAT_REGISTERS DOUBLE_REGISTERS
37#define SIMD128_REGISTERS DOUBLE_REGISTERS
38
39#define ALLOCATABLE_DOUBLE_REGISTERS(V) \
40 V(d1) V(d2) V(d3) V(d4) V(d5) V(d6) V(d7) \
41 V(d8) V(d9) V(d10) V(d11) V(d12) V(d15) V(d0)
42
43#define C_REGISTERS(V) \
44 V(cr0) V(cr1) V(cr2) V(cr3) V(cr4) V(cr5) V(cr6) V(cr7) \
45 V(cr8) V(cr9) V(cr10) V(cr11) V(cr12) V(cr15)
46// clang-format on
47
48// The following constants describe the stack frame linkage area as
49// defined by the ABI.
50
51#if V8_OS_ZOS
52// z/OS XPLINK 64-bit frame shape (without the 2k stack bias):
53// [0] Backchain
54// [1] Environment
55// [2] Entry Point
56// [3] Return Address (XPLINK)
57// [4] GPR8
58// [5] GPR9
59// ...
60// [10] GPR14 / RA Slot
61// [11] GPR15 / SP Slot
62// [12] Reserved
63// [13] Reserved
64// [14] Debug Area
65// [15] Reserved
66// [16] Register Arg1
67// [17] Register Arg2
68// [18] Register Arg3
69// [19] Register Arg4
70// [20] Register Arg5
71
72// Since z/OS port of V8 follows the register assignment from Linux in the
73// JavaScript context, JS code will set up r2-r6 as parameter registers,
74// with 6th+ parameters passed on the stack, when calling C functions.
75// XPLINK allocates stack slots for all parameters regardless of whether
76// they are passed in registers. To ensure stack slots are available to
77// store register parameters back to the stack for XPLINK calls, we include
78// slots for the 5 "register" arguments (r2-r6 as noted above) as part of
79// the required stack frame slots. Additional params being passed on the
80// stack will continue to grow from slot 22 and beyond.
81//
82// The 2k stack bias for XPLINK will be adjusted from SP into r4 (system
83// stack pointer) by the CallCFunctionHelper and CEntryStub right before
84// the actual native call.
85const int kNumRequiredStackFrameSlots = 21;
86const int kStackFrameSPSlot = 11;
87const int kStackFrameRASlot = 10;
88const int kStackFrameExtraParamSlot = 21;
89const int kXPLINKStackFrameExtraParamSlot = 19;
90const int kStackPointerBias = 2048;
91#else
92// [0] Back Chain
93// [1] Reserved for compiler use
94// [2] GPR 2
95// [3] GPR 3
96// ...
97// [15] GPR 15
98// [16] FPR 0
99// [17] FPR 2
100// [18] FPR 4
101// [19] FPR 6
102const int kNumRequiredStackFrameSlots = 20;
103const int kStackFrameRASlot = 14;
104const int kStackFrameSPSlot = 15;
105const int kStackFrameExtraParamSlot = 20;
106#endif
107
108// zLinux ABI requires caller frames to include sufficient space for
109// callee preserved register save area.
111
113#define REGISTER_CODE(R) kRegCode_##R,
115#undef REGISTER_CODE
117};
118
119class Register : public RegisterBase<Register, kRegAfterLast> {
120 public:
121#if V8_TARGET_LITTLE_ENDIAN
122 static constexpr int kMantissaOffset = 0;
123 static constexpr int kExponentOffset = 4;
124#else
125 static constexpr int kMantissaOffset = 4;
126 static constexpr int kExponentOffset = 0;
127#endif
128
129 private:
130 friend class RegisterBase;
131 explicit constexpr Register(int code) : RegisterBase(code) {}
132};
133
135static_assert(sizeof(Register) <= sizeof(int),
136 "Register can efficiently be passed by value");
137
138// Assign |source| value to |no_reg| and return the |source|'s previous value.
139inline Register ReassignRegister(Register& source) {
140 Register result = source;
141 source = Register::no_reg();
142 return result;
143}
144
145#define DEFINE_REGISTER(R) \
146 constexpr Register R = Register::from_code(kRegCode_##R);
148#undef DEFINE_REGISTER
149constexpr Register no_reg = Register::no_reg();
150
151// Register aliases
152constexpr Register kRootRegister = r10; // Roots array pointer.
153#ifdef V8_COMPRESS_POINTERS_IN_SHARED_CAGE
154constexpr Register kPtrComprCageBaseRegister = r9; // callee save
155#else
156constexpr Register kPtrComprCageBaseRegister = kRootRegister;
157#endif
158constexpr Register cp = r13; // JavaScript context pointer.
159
160// s390x calling convention
161constexpr Register kCArgRegs[] = {r2, r3, r4, r5, r6};
163
164// Returns the number of padding slots needed for stack pointer alignment.
165constexpr int ArgumentPaddingSlots(int argument_count) {
166 // No argument padding required.
167 return 0;
168}
169
171constexpr bool kSimdMaskRegisters = false;
172
174#define REGISTER_CODE(R) kDoubleCode_##R,
176#undef REGISTER_CODE
178};
179
180// Double word VFP register.
181class DoubleRegister : public RegisterBase<DoubleRegister, kDoubleAfterLast> {
182 public:
183 // A few double registers are reserved: one as a scratch register and one to
184 // hold 0.0, that does not fit in the immediate field of vmov instructions.
185 // d14: 0.0
186 // d15: scratch register.
187 static constexpr int kSizeInBytes = 8;
188
189 // This function differs from kNumRegisters by returning the number of double
190 // registers supported by the current CPU, while kNumRegisters always returns
191 // 32.
192 inline static int SupportedRegisterCount();
193
194 private:
195 friend class RegisterBase;
196
197 explicit constexpr DoubleRegister(int code) : RegisterBase(code) {}
198};
199
201static_assert(sizeof(DoubleRegister) <= sizeof(int),
202 "DoubleRegister can efficiently be passed by value");
203
205
206// TODO(john.yan) Define SIMD registers.
208
209#define DEFINE_REGISTER(R) \
210 constexpr DoubleRegister R = DoubleRegister::from_code(kDoubleCode_##R);
212#undef DEFINE_REGISTER
214
215constexpr DoubleRegister kDoubleRegZero = d14;
216constexpr DoubleRegister kScratchDoubleReg = d13;
217
218Register ToRegister(int num);
219
221#define REGISTER_CODE(R) kCCode_##R,
223#undef REGISTER_CODE
225};
226
227// Coprocessor register
228class CRegister : public RegisterBase<CRegister, kCAfterLast> {
229 friend class RegisterBase;
230 explicit constexpr CRegister(int code) : RegisterBase(code) {}
231};
232
233constexpr CRegister no_creg = CRegister::no_reg();
234#define DECLARE_C_REGISTER(R) \
235 constexpr CRegister R = CRegister::from_code(kCCode_##R);
237#undef DECLARE_C_REGISTER
238
239// Define {RegisterName} methods for the register types.
242
243// Give alias names to registers for calling conventions.
244constexpr Register kStackPointerRegister = sp;
245constexpr Register kReturnRegister0 = r2;
246constexpr Register kReturnRegister1 = r3;
247constexpr Register kReturnRegister2 = r4;
248constexpr Register kJSFunctionRegister = r3;
249constexpr Register kContextRegister = r13;
250constexpr Register kAllocateSizeRegister = r3;
251constexpr Register kInterpreterAccumulatorRegister = r2;
252constexpr Register kInterpreterBytecodeOffsetRegister = r6;
253constexpr Register kInterpreterBytecodeArrayRegister = r7;
254constexpr Register kInterpreterDispatchTableRegister = r8;
255
256constexpr Register kJavaScriptCallArgCountRegister = r2;
257constexpr Register kJavaScriptCallCodeStartRegister = r4;
259constexpr Register kJavaScriptCallNewTargetRegister = r5;
260constexpr Register kJavaScriptCallExtraArg1Register = r4;
261// DispatchHandle is only needed for the sandbox which is not available on
262// s390x.
264
265constexpr Register kRuntimeCallFunctionRegister = r3;
266constexpr Register kRuntimeCallArgCountRegister = r2;
267constexpr Register kRuntimeCallArgvRegister = r4;
268constexpr Register kWasmImplicitArgRegister = r6;
269constexpr Register kWasmCompileLazyFuncIndexRegister = r7;
270
272
273} // namespace internal
274} // namespace v8
275
276#endif // V8_CODEGEN_S390_REGISTER_S390_H_
constexpr CRegister(int code)
static int SupportedRegisterCount()
constexpr DoubleRegister(int code)
static constexpr int kSizeInBytes
static constexpr int kMantissaOffset
friend class RegisterBase
constexpr Register(int code)
static constexpr int kExponentOffset
static constexpr Register no_reg()
ZoneVector< RpoNumber > & result
InstructionOperand source
constexpr Register no_reg
constexpr Register kRootRegister
constexpr AliasingKind kFPAliasing
constexpr Register kRuntimeCallFunctionRegister
const int kStackFrameRASlot
const int kNumRequiredStackFrameSlots
DwVfpRegister DoubleRegister
constexpr DoubleRegister kScratchDoubleReg
constexpr Register kRuntimeCallArgvRegister
constexpr Register kJavaScriptCallTargetRegister
const int kStackFrameExtraParamSlot
constexpr DwVfpRegister no_dreg
constexpr Register kJavaScriptCallArgCountRegister
constexpr Register kInterpreterAccumulatorRegister
static const int kRegisterPassedArguments
QwNeonRegister Simd128Register
constexpr DoubleRegister kFPReturnRegister0
constexpr Register kReturnRegister1
const int kStackFrameSPSlot
constexpr Register kReturnRegister0
constexpr Register kWasmImplicitArgRegister
constexpr Register kContextRegister
constexpr Register kRuntimeCallArgCountRegister
constexpr Register kInterpreterDispatchTableRegister
constexpr Register kAllocateSizeRegister
const int kCalleeRegisterSaveAreaSize
constexpr LowDwVfpRegister kDoubleRegZero
constexpr Register kJavaScriptCallExtraArg1Register
Register ToRegister(int num)
constexpr Register kJavaScriptCallCodeStartRegister
constexpr Register kPtrComprCageBaseRegister
constexpr Register kReturnRegister2
Register ReassignRegister(Register &source)
constexpr CRegister no_creg
constexpr Register kWasmCompileLazyFuncIndexRegister
constexpr Register kStackPointerRegister
constexpr int ArgumentPaddingSlots(int argument_count)
constexpr Register cp
constexpr Register kCArgRegs[]
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 C_REGISTERS(V)
#define REGISTER_CODE(R)
#define DECLARE_C_REGISTER(R)
#define DOUBLE_REGISTERS(V)
#define DEFINE_REGISTER_NAMES(RegType, LIST)
#define ASSERT_TRIVIALLY_COPYABLE(T)
Definition macros.h:267
#define arraysize(array)
Definition macros.h:67