18#if V8_TARGET_ARCH_IA32
22#define CALLEE_SAVE_REGISTERS esi, edi, ebx
23#define CALLEE_SAVE_FP_REGISTERS
25#elif V8_TARGET_ARCH_X64
30#ifdef V8_TARGET_OS_WIN
32#define STACK_SHADOW_WORDS 4
33#define PARAM_REGISTERS rcx, rdx, r8, r9
34#define FP_PARAM_REGISTERS xmm0, xmm1, xmm2, xmm3
35#define FP_RETURN_REGISTER xmm0
36#define CALLEE_SAVE_REGISTERS rbx, rdi, rsi, r12, r13, r14, r15
37#define CALLEE_SAVE_FP_REGISTERS \
38 xmm6, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15
42#define PARAM_REGISTERS rdi, rsi, rdx, rcx, r8, r9
43#define FP_PARAM_REGISTERS xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
44#define FP_RETURN_REGISTER xmm0
45#define CALLEE_SAVE_REGISTERS rbx, r12, r13, r14, r15
46#define CALLEE_SAVE_FP_REGISTERS
49#elif V8_TARGET_ARCH_ARM
53#define PARAM_REGISTERS r0, r1, r2, r3
54#define CALLEE_SAVE_REGISTERS r4, r5, r6, r7, r8, r9, r10
55#define CALLEE_SAVE_FP_REGISTERS d8, d9, d10, d11, d12, d13, d14, d15
57#elif V8_TARGET_ARCH_ARM64
61#define PARAM_REGISTERS x0, x1, x2, x3, x4, x5, x6, x7
62#define FP_PARAM_REGISTERS d0, d1, d2, d3, d4, d5, d6, d7
63#define FP_RETURN_REGISTER d0
64#define CALLEE_SAVE_REGISTERS x19, x20, x21, x22, x23, x24, x25, x26, x27, x28
66#define CALLEE_SAVE_FP_REGISTERS d8, d9, d10, d11, d12, d13, d14, d15
68#elif V8_TARGET_ARCH_MIPS64
72#define PARAM_REGISTERS a0, a1, a2, a3, a4, a5, a6, a7
73#define FP_PARAM_REGISTERS f12, f13, f14, f15, f16, f17, f18, f19
74#define FP_RETURN_REGISTER f0
75#define CALLEE_SAVE_REGISTERS s0, s1, s2, s3, s4, s5, s6, s7
76#define CALLEE_SAVE_FP_REGISTERS f20, f22, f24, f26, f28, f30
78#elif V8_TARGET_ARCH_LOONG64
82#define PARAM_REGISTERS a0, a1, a2, a3, a4, a5, a6, a7
83#define FP_PARAM_REGISTERS f0, f1, f2, f3, f4, f5, f6, f7
84#define FP_RETURN_REGISTER f0
85#define CALLEE_SAVE_REGISTERS s0, s1, s2, s3, s4, s5, s6, s7, s8, fp
86#define CALLEE_SAVE_FP_REGISTERS f24, f25, f26, f27, f28, f29, f30, f31
88#elif V8_TARGET_ARCH_PPC64
92#ifdef V8_TARGET_LITTLE_ENDIAN
93#define STACK_SHADOW_WORDS 12
95#define STACK_SHADOW_WORDS 14
97#define PARAM_REGISTERS r3, r4, r5, r6, r7, r8, r9, r10
98#define CALLEE_SAVE_REGISTERS \
99 r14, r15, r16, r17, r18, r19, r20, r21, r22, r23, r24, r25, r26, r27, r28, \
102#define CALLEE_SAVE_FP_REGISTERS \
103 d14, d15, d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, \
106#elif V8_TARGET_ARCH_S390X
110#define STACK_SHADOW_WORDS 20
111#define PARAM_REGISTERS r2, r3, r4, r5, r6
112#define CALLEE_SAVE_REGISTERS r6, r7, r8, r9, r10, ip, r13
113#define CALLEE_SAVE_FP_REGISTERS d8, d9, d10, d11, d12, d13, d14, d15
115#elif V8_TARGET_ARCH_RISCV32 || V8_TARGET_ARCH_RISCV64
119#define PARAM_REGISTERS a0, a1, a2, a3, a4, a5, a6, a7
120#define FP_PARAM_REGISTERS fa0, fa1, fa2, fa3, fa4, fa5, fa6, fa7
123#define CALLEE_SAVE_REGISTERS s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11
124#define CALLEE_SAVE_FP_REGISTERS \
125 fs0, fs1, fs2, fs3, fs4, fs5, fs6, fs7, fs8, fs9, fs10, fs11
130#define UNSUPPORTED_C_LINKAGE 1
134#if (defined(V8_TARGET_OS_WIN) && defined(V8_TARGET_ARCH_X64)) || \
135 defined(V8_TARGET_ARCH_MIPS64)
144 size_t kFPParamRegisterCount,
145 size_t kParamRegisterCount,
149#ifdef STACK_SHADOW_WORDS
150 int stack_offset = STACK_SHADOW_WORDS;
152 int stack_offset = 0;
154 CHECK_EQ(kFPParamRegisterCount, kParamRegisterCount);
156 for (
size_t i = 0;
i < msig->parameter_count();
i++) {
157 MachineType type = msig->GetParam(
i);
158 bool spill = (
i >= kParamRegisterCount);
160 out_locations->AddParam(
165 out_locations->AddParam(
168 out_locations->AddParam(
174#elif defined(V8_TARGET_ARCH_LOONG64)
180 size_t kFPParamRegisterCount,
181 size_t kParamRegisterCount,
185#ifdef STACK_SHADOW_WORDS
186 int stack_offset = STACK_SHADOW_WORDS;
188 int stack_offset = 0;
190 size_t num_params = 0;
191 size_t num_fp_params = 0;
192 for (
size_t i = 0;
i < msig->parameter_count();
i++) {
193 MachineType type = msig->GetParam(
i);
195 if (num_fp_params < kFPParamRegisterCount) {
197 kFPParamRegisters[num_fp_params].
code(), type));
199 }
else if (num_params < kParamRegisterCount) {
204 -kParamRegisters[num_params].
code(), type));
207 out_locations->AddParam(
212 if (num_params < kParamRegisterCount) {
214 kParamRegisters[num_params].
code(), type));
217 out_locations->AddParam(
231 size_t kFPParamRegisterCount,
232 size_t kParamRegisterCount,
236#ifdef STACK_SHADOW_WORDS
237 int stack_offset = STACK_SHADOW_WORDS;
239 int stack_offset = 0;
241 size_t num_params = 0;
242 size_t num_fp_params = 0;
246 ? (num_fp_params >= kFPParamRegisterCount)
247 : (num_params >= kParamRegisterCount);
255 kFPParamRegisters[num_fp_params].
code(), type));
259 kParamRegisters[num_params].
code(), type));
272#ifdef UNSUPPORTED_C_LINKAGE
274 FATAL(
"requested C call descriptor on unsupported architecture");
284#ifndef V8_ENABLE_FP_PARAMS_IN_C_LINKAGE
300#ifdef FP_RETURN_REGISTER
303 ? kFPReturnRegister.
code()
321#ifdef PARAM_REGISTERS
323 const int kParamRegisterCount =
static_cast<int>(
arraysize(kParamRegisters));
326 const int kParamRegisterCount = 0;
329#ifdef FP_PARAM_REGISTERS
331 const size_t kFPParamRegisterCount =
arraysize(kFPParamRegisters);
334 const size_t kFPParamRegisterCount = 0;
339 kFPParamRegisters, kParamRegisters, &locations);
341 const RegList kCalleeSaveRegisters = {CALLEE_SAVE_REGISTERS};
342 const DoubleRegList kCalleeSaveFPRegisters = {CALLEE_SAVE_FP_REGISTERS};
358 kCalleeSaveRegisters,
359 kCalleeSaveFPRegisters,
static LinkageLocation ForRegister(int32_t reg, MachineType type=MachineType::None())
static LinkageLocation ForCallerFrameSlot(int32_t slot, MachineType type)
static LinkageLocation ForAnyRegister(MachineType type=MachineType::None())
static LinkageLocation ForNullRegister(int32_t reg, MachineType type=MachineType::None())
static constexpr MachineType Pointer()
constexpr int8_t code() const
const size_t return_count_
size_t return_count() const
T GetParam(size_t index) const
T GetReturn(size_t index=0) const
SignatureBuilder< Signature< T >, T > Builder
size_t parameter_count() const
static CallDescriptor * GetSimplifiedCDescriptor(Zone *zone, const MachineSignature *sig, CallDescriptor::Flags flags=CallDescriptor::kNoFlags, Operator::Properties properties=Operator::kNoThrow)
void BuildParameterLocations(const MachineSignature *msig, size_t kFPParamRegisterCount, size_t kParamRegisterCount, const DoubleRegister *kFPParamRegisters, const v8::internal::Register *kParamRegisters, LocationSignature::Builder *out_locations)
DwVfpRegister DoubleRegister
@ kDefaultCodeEntrypointTag
Signature< MachineType > MachineSignature
constexpr Register kReturnRegister1
constexpr bool IsFloatingPoint(MachineRepresentation rep)
static constexpr int kMaxCParameters
constexpr Register kReturnRegister0
#define DCHECK_LE(v1, v2)
#define CHECK_GE(lhs, rhs)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)