blob: a7cf1206d76ca302b81d3cfc752d1290073117b8 [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
Ben Murdoch61f157c2016-09-16 13:49:30 +010014void CallInterfaceDescriptor::DefaultInitializePlatformSpecific(
15 CallInterfaceDescriptorData* data, int register_parameter_count) {
16 const Register default_stub_registers[] = {rax, rbx, rcx, rdx, rdi};
17 CHECK_LE(static_cast<size_t>(register_parameter_count),
18 arraysize(default_stub_registers));
19 data->InitializePlatformSpecific(register_parameter_count,
20 default_stub_registers);
21}
Ben Murdochb8a8cc12014-11-26 15:28:44 +000022
23const Register LoadDescriptor::ReceiverRegister() { return rdx; }
24const Register LoadDescriptor::NameRegister() { return rcx; }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000025const Register LoadDescriptor::SlotRegister() { return rax; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000026
27
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000028const Register LoadWithVectorDescriptor::VectorRegister() { return rbx; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000029
30
31const Register StoreDescriptor::ReceiverRegister() { return rdx; }
32const Register StoreDescriptor::NameRegister() { return rcx; }
33const Register StoreDescriptor::ValueRegister() { return rax; }
34
35
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000036const Register VectorStoreICTrampolineDescriptor::SlotRegister() { return rdi; }
37
38
39const Register VectorStoreICDescriptor::VectorRegister() { return rbx; }
40
41
42const Register VectorStoreTransitionDescriptor::SlotRegister() { return rdi; }
43const Register VectorStoreTransitionDescriptor::VectorRegister() { return rbx; }
44const Register VectorStoreTransitionDescriptor::MapRegister() { return r11; }
45
46
Emily Bernierd0a1eb72015-03-24 16:35:39 -040047const Register StoreTransitionDescriptor::MapRegister() { return rbx; }
48
49
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000050const Register StoreGlobalViaContextDescriptor::SlotRegister() { return rbx; }
51const Register StoreGlobalViaContextDescriptor::ValueRegister() { return rax; }
52
53
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000054const Register StringCompareDescriptor::LeftRegister() { return rdx; }
55const Register StringCompareDescriptor::RightRegister() { return rax; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000056
Ben Murdochc5610432016-08-08 18:44:38 +010057const Register ApiGetterDescriptor::HolderRegister() { return rcx; }
58const Register ApiGetterDescriptor::CallbackRegister() { return rbx; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000059
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
Ben Murdochc5610432016-08-08 18:44:38 +0100246void ArrayNoArgumentConstructorDescriptor::InitializePlatformSpecific(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000247 CallInterfaceDescriptorData* data) {
Ben Murdochc5610432016-08-08 18:44:38 +0100248 // register state
249 // rax -- number of arguments
250 // rdi -- function
251 // rbx -- allocation site with elements kind
252 Register registers[] = {rdi, rbx, rax};
253 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000254}
255
Ben Murdoch61f157c2016-09-16 13:49:30 +0100256void ArraySingleArgumentConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000257 CallInterfaceDescriptorData* data) {
258 // register state
259 // rax -- number of arguments
260 // rdi -- function
261 // rbx -- allocation site with elements kind
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000262 Register registers[] = {rdi, rbx, rax};
Ben Murdoch61f157c2016-09-16 13:49:30 +0100263 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000264}
265
Ben Murdoch61f157c2016-09-16 13:49:30 +0100266void ArrayNArgumentsConstructorDescriptor::InitializePlatformSpecific(
267 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000268 // register state
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000269 // rax -- number of arguments
Ben Murdoch61f157c2016-09-16 13:49:30 +0100270 // rdi -- function
271 // rbx -- allocation site with elements kind
272 Register registers[] = {rdi, rbx, rax};
273 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000274}
275
Ben Murdoch61f157c2016-09-16 13:49:30 +0100276void VarArgFunctionDescriptor::InitializePlatformSpecific(
Ben Murdochda12d292016-06-02 14:46:10 +0100277 CallInterfaceDescriptorData* data) {
278 // stack param count needs (arg count)
279 Register registers[] = {rax};
280 data->InitializePlatformSpecific(arraysize(registers), registers);
281}
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000282
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000283void CompareDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000284 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000285 Register registers[] = {rdx, rax};
286 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000287}
288
289
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000290void BinaryOpDescriptor::InitializePlatformSpecific(
291 CallInterfaceDescriptorData* data) {
292 Register registers[] = {rdx, rax};
293 data->InitializePlatformSpecific(arraysize(registers), registers);
294}
295
296
297void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
298 CallInterfaceDescriptorData* data) {
299 Register registers[] = {rcx, rdx, rax};
300 data->InitializePlatformSpecific(arraysize(registers), registers);
301}
302
Ben Murdochc5610432016-08-08 18:44:38 +0100303void CountOpDescriptor::InitializePlatformSpecific(
304 CallInterfaceDescriptorData* data) {
305 Register registers[] = {rax};
306 data->InitializePlatformSpecific(arraysize(registers), registers);
307}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000308
309void StringAddDescriptor::InitializePlatformSpecific(
310 CallInterfaceDescriptorData* data) {
311 Register registers[] = {rdx, rax};
312 data->InitializePlatformSpecific(arraysize(registers), registers);
313}
314
315
316void KeyedDescriptor::InitializePlatformSpecific(
317 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000318 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000319 rcx, // key
320 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000321 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000322}
323
324
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000325void NamedDescriptor::InitializePlatformSpecific(
326 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000327 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000328 rcx, // name
329 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000330 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000331}
332
333
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000334void CallHandlerDescriptor::InitializePlatformSpecific(
335 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000336 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000337 rdx, // receiver
338 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000339 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000340}
341
342
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000343void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
344 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000345 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000346 rdi, // JSFunction
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000347 rdx, // the new target
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000348 rax, // actual number of arguments
349 rbx, // expected number of arguments
350 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000351 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000352}
353
Ben Murdochda12d292016-06-02 14:46:10 +0100354void ApiCallbackDescriptorBase::InitializePlatformSpecific(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000355 CallInterfaceDescriptorData* data) {
356 Register registers[] = {
357 rdi, // callee
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000358 rbx, // call_data
359 rcx, // holder
360 rdx, // api_function_address
361 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000362 data->InitializePlatformSpecific(arraysize(registers), registers);
363}
364
Ben Murdoch097c5b22016-05-18 11:27:45 +0100365void InterpreterDispatchDescriptor::InitializePlatformSpecific(
366 CallInterfaceDescriptorData* data) {
367 Register registers[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100368 kInterpreterAccumulatorRegister, kInterpreterBytecodeOffsetRegister,
369 kInterpreterBytecodeArrayRegister, kInterpreterDispatchTableRegister};
Ben Murdoch097c5b22016-05-18 11:27:45 +0100370 data->InitializePlatformSpecific(arraysize(registers), registers);
371}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000372
373void InterpreterPushArgsAndCallDescriptor::InitializePlatformSpecific(
374 CallInterfaceDescriptorData* data) {
375 Register registers[] = {
376 rax, // argument count (not including receiver)
377 rbx, // address of first argument
378 rdi // the target callable to be call
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000379 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000380 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000381}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000382
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000383void InterpreterPushArgsAndConstructDescriptor::InitializePlatformSpecific(
384 CallInterfaceDescriptorData* data) {
385 Register registers[] = {
386 rax, // argument count (not including receiver)
387 rdx, // new target
388 rdi, // constructor
389 rbx, // address of first argument
390 };
391 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000392}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000393
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000394void InterpreterCEntryDescriptor::InitializePlatformSpecific(
395 CallInterfaceDescriptorData* data) {
396 Register registers[] = {
397 rax, // argument count (argc)
398 r15, // address of first argument (argv)
399 rbx // the runtime function to call
400 };
401 data->InitializePlatformSpecific(arraysize(registers), registers);
402}
403
Ben Murdochc5610432016-08-08 18:44:38 +0100404void ResumeGeneratorDescriptor::InitializePlatformSpecific(
405 CallInterfaceDescriptorData* data) {
406 Register registers[] = {
407 rax, // the value to pass to the generator
408 rbx, // the JSGeneratorObject to resume
409 rdx // the resume mode (tagged)
410 };
411 data->InitializePlatformSpecific(arraysize(registers), registers);
412}
413
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000414} // namespace internal
415} // namespace v8
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000416
417#endif // V8_TARGET_ARCH_X64