blob: 79315c70a0ac4de058df1dd43329f3968dfc8189 [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// Copyright 2012 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
Ben Murdochb8a8cc12014-11-26 15:28:44 +00005#if V8_TARGET_ARCH_X64
6
7#include "src/interface-descriptors.h"
8
9namespace v8 {
10namespace internal {
11
12const Register CallInterfaceDescriptor::ContextRegister() { return rsi; }
13
14
15const Register LoadDescriptor::ReceiverRegister() { return rdx; }
16const Register LoadDescriptor::NameRegister() { return rcx; }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000017const Register LoadDescriptor::SlotRegister() { return rax; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000018
19
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000020const Register LoadWithVectorDescriptor::VectorRegister() { return rbx; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000021
22
23const Register StoreDescriptor::ReceiverRegister() { return rdx; }
24const Register StoreDescriptor::NameRegister() { return rcx; }
25const Register StoreDescriptor::ValueRegister() { return rax; }
26
27
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000028const Register VectorStoreICTrampolineDescriptor::SlotRegister() { return rdi; }
29
30
31const Register VectorStoreICDescriptor::VectorRegister() { return rbx; }
32
33
34const Register VectorStoreTransitionDescriptor::SlotRegister() { return rdi; }
35const Register VectorStoreTransitionDescriptor::VectorRegister() { return rbx; }
36const Register VectorStoreTransitionDescriptor::MapRegister() { return r11; }
37
38
Emily Bernierd0a1eb72015-03-24 16:35:39 -040039const Register StoreTransitionDescriptor::MapRegister() { return rbx; }
40
41
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000042const Register LoadGlobalViaContextDescriptor::SlotRegister() { return rbx; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000043
44
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000045const Register StoreGlobalViaContextDescriptor::SlotRegister() { return rbx; }
46const Register StoreGlobalViaContextDescriptor::ValueRegister() { return rax; }
47
48
49const Register InstanceOfDescriptor::LeftRegister() { return rdx; }
50const Register InstanceOfDescriptor::RightRegister() { return rax; }
51
52
53const Register StringCompareDescriptor::LeftRegister() { return rdx; }
54const Register StringCompareDescriptor::RightRegister() { return rax; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000055
56
57const Register ArgumentsAccessReadDescriptor::index() { return rdx; }
58const Register ArgumentsAccessReadDescriptor::parameter_count() { return rax; }
59
60
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000061const Register ArgumentsAccessNewDescriptor::function() { return rdi; }
62const Register ArgumentsAccessNewDescriptor::parameter_count() { return rcx; }
63const Register ArgumentsAccessNewDescriptor::parameter_pointer() { return rdx; }
64
65
66const Register RestParamAccessDescriptor::parameter_count() { return rcx; }
67const Register RestParamAccessDescriptor::parameter_pointer() { return rdx; }
68const Register RestParamAccessDescriptor::rest_parameter_index() { return rbx; }
69
70
Ben Murdochb8a8cc12014-11-26 15:28:44 +000071const Register ApiGetterDescriptor::function_address() { return r8; }
72
73
74const Register MathPowTaggedDescriptor::exponent() { return rdx; }
75
76
77const Register MathPowIntegerDescriptor::exponent() {
78 return MathPowTaggedDescriptor::exponent();
79}
80
81
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000082const Register GrowArrayElementsDescriptor::ObjectRegister() { return rax; }
83const Register GrowArrayElementsDescriptor::KeyRegister() { return rbx; }
84
85
86void FastNewClosureDescriptor::InitializePlatformSpecific(
87 CallInterfaceDescriptorData* data) {
88 Register registers[] = {rbx};
89 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000090}
91
92
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000093void FastNewContextDescriptor::InitializePlatformSpecific(
94 CallInterfaceDescriptorData* data) {
95 Register registers[] = {rdi};
96 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000097}
98
99
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000100void TypeofDescriptor::InitializePlatformSpecific(
101 CallInterfaceDescriptorData* data) {
102 Register registers[] = {rbx};
103 data->InitializePlatformSpecific(arraysize(registers), registers);
104}
105
106
107void ToNumberDescriptor::InitializePlatformSpecific(
108 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000109 // ToNumberStub invokes a function, and therefore needs a context.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000110 Register registers[] = {rax};
111 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000112}
113
114
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000115// static
116const Register ToLengthDescriptor::ReceiverRegister() { return rax; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000117
118
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000119// static
120const Register ToStringDescriptor::ReceiverRegister() { return rax; }
121
122
123// static
124const Register ToObjectDescriptor::ReceiverRegister() { return rax; }
125
126
127void NumberToStringDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000128 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000129 Register registers[] = {rax};
130 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000131}
132
133
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000134void FastCloneRegExpDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000135 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000136 Register registers[] = {rdi, rax, rcx, rdx};
137 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000138}
139
140
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000141void FastCloneShallowArrayDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000142 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000143 Register registers[] = {rax, rbx, rcx};
144 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000145}
146
147
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000148void FastCloneShallowObjectDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000149 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000150 Register registers[] = {rax, rbx, rcx, rdx};
151 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000152}
153
154
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000155void CreateAllocationSiteDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000156 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000157 Register registers[] = {rbx, rdx};
158 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000159}
160
161
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000162void CreateWeakCellDescriptor::InitializePlatformSpecific(
163 CallInterfaceDescriptorData* data) {
164 Register registers[] = {rbx, rdx, rdi};
165 data->InitializePlatformSpecific(arraysize(registers), registers);
166}
167
168
169void StoreArrayLiteralElementDescriptor::InitializePlatformSpecific(
170 CallInterfaceDescriptorData* data) {
171 Register registers[] = {rcx, rax};
172 data->InitializePlatformSpecific(arraysize(registers), registers);
173}
174
175
176void CallFunctionDescriptor::InitializePlatformSpecific(
177 CallInterfaceDescriptorData* data) {
178 Register registers[] = {rdi};
179 data->InitializePlatformSpecific(arraysize(registers), registers);
180}
181
182
183void CallFunctionWithFeedbackDescriptor::InitializePlatformSpecific(
184 CallInterfaceDescriptorData* data) {
185 Register registers[] = {rdi, rdx};
186 data->InitializePlatformSpecific(arraysize(registers), registers);
187}
188
189
190void CallFunctionWithFeedbackAndVectorDescriptor::InitializePlatformSpecific(
191 CallInterfaceDescriptorData* data) {
192 Register registers[] = {rdi, rdx, rbx};
193 data->InitializePlatformSpecific(arraysize(registers), registers);
194}
195
196
197void CallConstructDescriptor::InitializePlatformSpecific(
198 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000199 // rax : number of arguments
200 // rbx : feedback vector
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000201 // rdx : slot in feedback vector (Smi, for RecordCallTarget)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000202 // rdi : constructor function
203 // TODO(turbofan): So far we don't gather type feedback and hence skip the
204 // slot parameter, but ArrayConstructStub needs the vector to be undefined.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000205 Register registers[] = {rax, rdi, rbx};
206 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000207}
208
209
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000210void CallTrampolineDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000211 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000212 // rax : number of arguments
213 // rdi : the target to call
214 Register registers[] = {rdi, rax};
215 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000216}
217
218
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000219void ConstructStubDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000220 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000221 // rax : number of arguments
222 // rdx : the new target
223 // rdi : the target to call
224 // rbx : allocation site or undefined
225 Register registers[] = {rdi, rdx, rax, rbx};
226 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000227}
228
229
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000230void ConstructTrampolineDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400231 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000232 // rax : number of arguments
233 // rdx : the new target
234 // rdi : the target to call
235 Register registers[] = {rdi, rdx, rax};
236 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400237}
238
239
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000240void RegExpConstructResultDescriptor::InitializePlatformSpecific(
241 CallInterfaceDescriptorData* data) {
242 Register registers[] = {rcx, rbx, rax};
243 data->InitializePlatformSpecific(arraysize(registers), registers);
244}
245
246
247void TransitionElementsKindDescriptor::InitializePlatformSpecific(
248 CallInterfaceDescriptorData* data) {
249 Register registers[] = {rax, rbx};
250 data->InitializePlatformSpecific(arraysize(registers), registers);
251}
252
253
254void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
255 CallInterfaceDescriptorData* data) {
256 data->InitializePlatformSpecific(0, nullptr, nullptr);
257}
258
259
260void AllocateInNewSpaceDescriptor::InitializePlatformSpecific(
261 CallInterfaceDescriptorData* data) {
262 Register registers[] = {rax};
263 data->InitializePlatformSpecific(arraysize(registers), registers);
264}
265
266
267void ArrayConstructorConstantArgCountDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000268 CallInterfaceDescriptorData* data) {
269 // register state
270 // rax -- number of arguments
271 // rdi -- function
272 // rbx -- allocation site with elements kind
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000273 Register registers[] = {rdi, rbx};
274 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000275}
276
277
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000278void ArrayConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000279 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000280 // stack param count needs (constructor pointer, and single argument)
281 Register registers[] = {rdi, rbx, rax};
282 data->InitializePlatformSpecific(arraysize(registers), registers);
283}
284
285
286void InternalArrayConstructorConstantArgCountDescriptor::
287 InitializePlatformSpecific(CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000288 // register state
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000289 // rax -- number of arguments
290 // rdi -- constructor function
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000291 Register registers[] = {rdi};
292 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000293}
294
295
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000296void InternalArrayConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000297 CallInterfaceDescriptorData* data) {
298 // stack param count needs (constructor pointer, and single argument)
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000299 Register registers[] = {rdi, rax};
300 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000301}
302
303
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000304void CompareDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000305 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000306 Register registers[] = {rdx, rax};
307 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000308}
309
310
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000311void CompareNilDescriptor::InitializePlatformSpecific(
312 CallInterfaceDescriptorData* data) {
313 Register registers[] = {rax};
314 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000315}
316
317
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000318void ToBooleanDescriptor::InitializePlatformSpecific(
319 CallInterfaceDescriptorData* data) {
320 Register registers[] = {rax};
321 data->InitializePlatformSpecific(arraysize(registers), registers);
322}
323
324
325void BinaryOpDescriptor::InitializePlatformSpecific(
326 CallInterfaceDescriptorData* data) {
327 Register registers[] = {rdx, rax};
328 data->InitializePlatformSpecific(arraysize(registers), registers);
329}
330
331
332void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
333 CallInterfaceDescriptorData* data) {
334 Register registers[] = {rcx, rdx, rax};
335 data->InitializePlatformSpecific(arraysize(registers), registers);
336}
337
338
339void StringAddDescriptor::InitializePlatformSpecific(
340 CallInterfaceDescriptorData* data) {
341 Register registers[] = {rdx, rax};
342 data->InitializePlatformSpecific(arraysize(registers), registers);
343}
344
345
346void KeyedDescriptor::InitializePlatformSpecific(
347 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000348 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000349 rcx, // key
350 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000351 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000352}
353
354
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000355void NamedDescriptor::InitializePlatformSpecific(
356 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000357 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000358 rcx, // name
359 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000360 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000361}
362
363
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000364void CallHandlerDescriptor::InitializePlatformSpecific(
365 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000366 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000367 rdx, // receiver
368 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000369 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000370}
371
372
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000373void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
374 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000375 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000376 rdi, // JSFunction
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000377 rdx, // the new target
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000378 rax, // actual number of arguments
379 rbx, // expected number of arguments
380 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000381 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000382}
383
384
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000385void ApiFunctionDescriptor::InitializePlatformSpecific(
386 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000387 Register registers[] = {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000388 rdi, // callee
389 rbx, // call_data
390 rcx, // holder
391 rdx, // api_function_address
392 rax, // actual number of arguments
393 };
394 data->InitializePlatformSpecific(arraysize(registers), registers);
395}
396
397
398void ApiAccessorDescriptor::InitializePlatformSpecific(
399 CallInterfaceDescriptorData* data) {
400 Register registers[] = {
401 rdi, // callee
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000402 rbx, // call_data
403 rcx, // holder
404 rdx, // api_function_address
405 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000406 data->InitializePlatformSpecific(arraysize(registers), registers);
407}
408
409
410void InterpreterPushArgsAndCallDescriptor::InitializePlatformSpecific(
411 CallInterfaceDescriptorData* data) {
412 Register registers[] = {
413 rax, // argument count (not including receiver)
414 rbx, // address of first argument
415 rdi // the target callable to be call
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000416 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000417 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000418}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000419
420
421void InterpreterPushArgsAndConstructDescriptor::InitializePlatformSpecific(
422 CallInterfaceDescriptorData* data) {
423 Register registers[] = {
424 rax, // argument count (not including receiver)
425 rdx, // new target
426 rdi, // constructor
427 rbx, // address of first argument
428 };
429 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000430}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000431
432
433void InterpreterCEntryDescriptor::InitializePlatformSpecific(
434 CallInterfaceDescriptorData* data) {
435 Register registers[] = {
436 rax, // argument count (argc)
437 r15, // address of first argument (argv)
438 rbx // the runtime function to call
439 };
440 data->InitializePlatformSpecific(arraysize(registers), registers);
441}
442
443} // namespace internal
444} // namespace v8
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000445
446#endif // V8_TARGET_ARCH_X64