blob: b10b52298bc811b9ddb5cbb26e0aa066ab33514c [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
Ben Murdochb8a8cc12014-11-26 15:28:44 +000057const Register ApiGetterDescriptor::function_address() { return r8; }
58
59
60const Register MathPowTaggedDescriptor::exponent() { return rdx; }
61
62
63const Register MathPowIntegerDescriptor::exponent() {
64 return MathPowTaggedDescriptor::exponent();
65}
66
67
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000068const Register GrowArrayElementsDescriptor::ObjectRegister() { return rax; }
69const Register GrowArrayElementsDescriptor::KeyRegister() { return rbx; }
70
71
72void FastNewClosureDescriptor::InitializePlatformSpecific(
73 CallInterfaceDescriptorData* data) {
74 Register registers[] = {rbx};
75 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000076}
77
78
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000079void FastNewContextDescriptor::InitializePlatformSpecific(
80 CallInterfaceDescriptorData* data) {
81 Register registers[] = {rdi};
82 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000083}
84
Ben Murdoch097c5b22016-05-18 11:27:45 +010085void FastNewObjectDescriptor::InitializePlatformSpecific(
86 CallInterfaceDescriptorData* data) {
87 Register registers[] = {rdi, rdx};
88 data->InitializePlatformSpecific(arraysize(registers), registers);
89}
90
91void FastNewRestParameterDescriptor::InitializePlatformSpecific(
92 CallInterfaceDescriptorData* data) {
93 Register registers[] = {rdi};
94 data->InitializePlatformSpecific(arraysize(registers), registers);
95}
96
97void FastNewSloppyArgumentsDescriptor::InitializePlatformSpecific(
98 CallInterfaceDescriptorData* data) {
99 Register registers[] = {rdi};
100 data->InitializePlatformSpecific(arraysize(registers), registers);
101}
102
103void FastNewStrictArgumentsDescriptor::InitializePlatformSpecific(
104 CallInterfaceDescriptorData* data) {
105 Register registers[] = {rdi};
106 data->InitializePlatformSpecific(arraysize(registers), registers);
107}
108
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000109
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000110void TypeofDescriptor::InitializePlatformSpecific(
111 CallInterfaceDescriptorData* data) {
112 Register registers[] = {rbx};
113 data->InitializePlatformSpecific(arraysize(registers), registers);
114}
115
116
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000117// static
Ben Murdochda12d292016-06-02 14:46:10 +0100118const Register TypeConversionDescriptor::ArgumentRegister() { return rax; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000119
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000120void FastCloneRegExpDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000121 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000122 Register registers[] = {rdi, rax, rcx, rdx};
123 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000124}
125
126
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000127void FastCloneShallowArrayDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000128 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000129 Register registers[] = {rax, rbx, rcx};
130 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000131}
132
133
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000134void FastCloneShallowObjectDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000135 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000136 Register registers[] = {rax, rbx, 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 CreateAllocationSiteDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000142 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000143 Register registers[] = {rbx, rdx};
144 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000145}
146
147
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000148void CreateWeakCellDescriptor::InitializePlatformSpecific(
149 CallInterfaceDescriptorData* data) {
150 Register registers[] = {rbx, rdx, rdi};
151 data->InitializePlatformSpecific(arraysize(registers), registers);
152}
153
154
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000155void CallFunctionDescriptor::InitializePlatformSpecific(
156 CallInterfaceDescriptorData* data) {
157 Register registers[] = {rdi};
158 data->InitializePlatformSpecific(arraysize(registers), registers);
159}
160
161
162void CallFunctionWithFeedbackDescriptor::InitializePlatformSpecific(
163 CallInterfaceDescriptorData* data) {
164 Register registers[] = {rdi, rdx};
165 data->InitializePlatformSpecific(arraysize(registers), registers);
166}
167
168
169void CallFunctionWithFeedbackAndVectorDescriptor::InitializePlatformSpecific(
170 CallInterfaceDescriptorData* data) {
171 Register registers[] = {rdi, rdx, rbx};
172 data->InitializePlatformSpecific(arraysize(registers), registers);
173}
174
175
176void CallConstructDescriptor::InitializePlatformSpecific(
177 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000178 // rax : number of arguments
179 // rbx : feedback vector
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000180 // rdx : slot in feedback vector (Smi, for RecordCallTarget)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000181 // rdi : constructor function
182 // TODO(turbofan): So far we don't gather type feedback and hence skip the
183 // slot parameter, but ArrayConstructStub needs the vector to be undefined.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000184 Register registers[] = {rax, rdi, rbx};
185 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000186}
187
188
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000189void CallTrampolineDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000190 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000191 // rax : number of arguments
192 // rdi : the target to call
193 Register registers[] = {rdi, rax};
194 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000195}
196
197
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000198void ConstructStubDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000199 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000200 // rax : number of arguments
201 // rdx : the new target
202 // rdi : the target to call
203 // rbx : allocation site or undefined
204 Register registers[] = {rdi, rdx, rax, rbx};
205 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000206}
207
208
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000209void ConstructTrampolineDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400210 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000211 // rax : number of arguments
212 // rdx : the new target
213 // rdi : the target to call
214 Register registers[] = {rdi, rdx, rax};
215 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400216}
217
218
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000219void RegExpConstructResultDescriptor::InitializePlatformSpecific(
220 CallInterfaceDescriptorData* data) {
221 Register registers[] = {rcx, rbx, rax};
222 data->InitializePlatformSpecific(arraysize(registers), registers);
223}
224
225
226void TransitionElementsKindDescriptor::InitializePlatformSpecific(
227 CallInterfaceDescriptorData* data) {
228 Register registers[] = {rax, rbx};
229 data->InitializePlatformSpecific(arraysize(registers), registers);
230}
231
232
233void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
234 CallInterfaceDescriptorData* data) {
235 data->InitializePlatformSpecific(0, nullptr, nullptr);
236}
237
Ben Murdochda12d292016-06-02 14:46:10 +0100238#define SIMD128_ALLOC_DESC(TYPE, Type, type, lane_count, lane_type) \
239 void Allocate##Type##Descriptor::InitializePlatformSpecific( \
240 CallInterfaceDescriptorData* data) { \
241 data->InitializePlatformSpecific(0, nullptr, nullptr); \
242 }
243SIMD128_TYPES(SIMD128_ALLOC_DESC)
244#undef SIMD128_ALLOC_DESC
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000245
246void AllocateInNewSpaceDescriptor::InitializePlatformSpecific(
247 CallInterfaceDescriptorData* data) {
248 Register registers[] = {rax};
249 data->InitializePlatformSpecific(arraysize(registers), registers);
250}
251
252
253void ArrayConstructorConstantArgCountDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000254 CallInterfaceDescriptorData* data) {
255 // register state
256 // rax -- number of arguments
257 // rdi -- function
258 // rbx -- allocation site with elements kind
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000259 Register registers[] = {rdi, rbx};
260 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000261}
262
263
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000264void ArrayConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000265 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000266 // stack param count needs (constructor pointer, and single argument)
267 Register registers[] = {rdi, rbx, rax};
268 data->InitializePlatformSpecific(arraysize(registers), registers);
269}
270
271
272void InternalArrayConstructorConstantArgCountDescriptor::
273 InitializePlatformSpecific(CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000274 // register state
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000275 // rax -- number of arguments
276 // rdi -- constructor function
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000277 Register registers[] = {rdi};
278 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000279}
280
281
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000282void InternalArrayConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000283 CallInterfaceDescriptorData* data) {
284 // stack param count needs (constructor pointer, and single argument)
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000285 Register registers[] = {rdi, rax};
286 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000287}
288
Ben Murdochda12d292016-06-02 14:46:10 +0100289void FastArrayPushDescriptor::InitializePlatformSpecific(
290 CallInterfaceDescriptorData* data) {
291 // stack param count needs (arg count)
292 Register registers[] = {rax};
293 data->InitializePlatformSpecific(arraysize(registers), registers);
294}
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000295
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000296void CompareDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000297 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000298 Register registers[] = {rdx, rax};
299 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000300}
301
302
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000303void BinaryOpDescriptor::InitializePlatformSpecific(
304 CallInterfaceDescriptorData* data) {
305 Register registers[] = {rdx, rax};
306 data->InitializePlatformSpecific(arraysize(registers), registers);
307}
308
309
310void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
311 CallInterfaceDescriptorData* data) {
312 Register registers[] = {rcx, rdx, rax};
313 data->InitializePlatformSpecific(arraysize(registers), registers);
314}
315
316
317void StringAddDescriptor::InitializePlatformSpecific(
318 CallInterfaceDescriptorData* data) {
319 Register registers[] = {rdx, rax};
320 data->InitializePlatformSpecific(arraysize(registers), registers);
321}
322
323
324void KeyedDescriptor::InitializePlatformSpecific(
325 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000326 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000327 rcx, // key
328 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000329 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000330}
331
332
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000333void NamedDescriptor::InitializePlatformSpecific(
334 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000335 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000336 rcx, // name
337 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000338 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000339}
340
341
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000342void CallHandlerDescriptor::InitializePlatformSpecific(
343 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000344 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000345 rdx, // receiver
346 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000347 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000348}
349
350
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000351void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
352 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000353 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000354 rdi, // JSFunction
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000355 rdx, // the new target
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000356 rax, // actual number of arguments
357 rbx, // expected number of arguments
358 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000359 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000360}
361
Ben Murdochda12d292016-06-02 14:46:10 +0100362void ApiCallbackDescriptorBase::InitializePlatformSpecific(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000363 CallInterfaceDescriptorData* data) {
364 Register registers[] = {
365 rdi, // callee
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000366 rbx, // call_data
367 rcx, // holder
368 rdx, // api_function_address
369 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000370 data->InitializePlatformSpecific(arraysize(registers), registers);
371}
372
Ben Murdoch097c5b22016-05-18 11:27:45 +0100373void InterpreterDispatchDescriptor::InitializePlatformSpecific(
374 CallInterfaceDescriptorData* data) {
375 Register registers[] = {
376 kInterpreterAccumulatorRegister, kInterpreterRegisterFileRegister,
377 kInterpreterBytecodeOffsetRegister, kInterpreterBytecodeArrayRegister,
378 kInterpreterDispatchTableRegister};
379 data->InitializePlatformSpecific(arraysize(registers), registers);
380}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000381
382void InterpreterPushArgsAndCallDescriptor::InitializePlatformSpecific(
383 CallInterfaceDescriptorData* data) {
384 Register registers[] = {
385 rax, // argument count (not including receiver)
386 rbx, // address of first argument
387 rdi // the target callable to be call
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000388 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000389 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000390}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000391
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000392void InterpreterPushArgsAndConstructDescriptor::InitializePlatformSpecific(
393 CallInterfaceDescriptorData* data) {
394 Register registers[] = {
395 rax, // argument count (not including receiver)
396 rdx, // new target
397 rdi, // constructor
398 rbx, // address of first argument
399 };
400 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000401}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000402
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000403void InterpreterCEntryDescriptor::InitializePlatformSpecific(
404 CallInterfaceDescriptorData* data) {
405 Register registers[] = {
406 rax, // argument count (argc)
407 r15, // address of first argument (argv)
408 rbx // the runtime function to call
409 };
410 data->InitializePlatformSpecific(arraysize(registers), registers);
411}
412
413} // namespace internal
414} // namespace v8
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000415
416#endif // V8_TARGET_ARCH_X64