blob: e41d42cdf58f58dbe7175768768d2494a0a14cb8 [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_X87
6
7#include "src/interface-descriptors.h"
8
9namespace v8 {
10namespace internal {
11
12const Register CallInterfaceDescriptor::ContextRegister() { return esi; }
13
14
15const Register LoadDescriptor::ReceiverRegister() { return edx; }
16const Register LoadDescriptor::NameRegister() { return ecx; }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000017const Register LoadDescriptor::SlotRegister() { return eax; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000018
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000019const Register LoadWithVectorDescriptor::VectorRegister() { return ebx; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000020
21
22const Register StoreDescriptor::ReceiverRegister() { return edx; }
23const Register StoreDescriptor::NameRegister() { return ecx; }
24const Register StoreDescriptor::ValueRegister() { return eax; }
25
26
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000027const Register VectorStoreICTrampolineDescriptor::SlotRegister() { return edi; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040028
29
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000030const Register VectorStoreICDescriptor::VectorRegister() { return ebx; }
31
32
33const Register VectorStoreTransitionDescriptor::SlotRegister() {
34 return no_reg;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000035}
36
37
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000038const Register VectorStoreTransitionDescriptor::VectorRegister() { return ebx; }
39
40
41const Register VectorStoreTransitionDescriptor::MapRegister() { return edi; }
42
43
44const Register StoreTransitionDescriptor::MapRegister() { return ebx; }
45
46
47const Register LoadGlobalViaContextDescriptor::SlotRegister() { return ebx; }
48
49
50const Register StoreGlobalViaContextDescriptor::SlotRegister() { return ebx; }
51const Register StoreGlobalViaContextDescriptor::ValueRegister() { return eax; }
52
53
54const Register InstanceOfDescriptor::LeftRegister() { return edx; }
55const Register InstanceOfDescriptor::RightRegister() { return eax; }
56
57
58const Register StringCompareDescriptor::LeftRegister() { return edx; }
59const Register StringCompareDescriptor::RightRegister() { return eax; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000060
61
Ben Murdochb8a8cc12014-11-26 15:28:44 +000062const Register ApiGetterDescriptor::function_address() { return edx; }
63
64
65const Register MathPowTaggedDescriptor::exponent() { return eax; }
66
67
68const Register MathPowIntegerDescriptor::exponent() {
69 return MathPowTaggedDescriptor::exponent();
70}
71
72
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000073const Register GrowArrayElementsDescriptor::ObjectRegister() { return eax; }
74const Register GrowArrayElementsDescriptor::KeyRegister() { return ebx; }
75
76
77void FastNewClosureDescriptor::InitializePlatformSpecific(
78 CallInterfaceDescriptorData* data) {
79 Register registers[] = {ebx};
80 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000081}
82
83
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000084void FastNewContextDescriptor::InitializePlatformSpecific(
85 CallInterfaceDescriptorData* data) {
86 Register registers[] = {edi};
87 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000088}
89
Ben Murdoch097c5b22016-05-18 11:27:45 +010090void FastNewObjectDescriptor::InitializePlatformSpecific(
91 CallInterfaceDescriptorData* data) {
92 Register registers[] = {edi, edx};
93 data->InitializePlatformSpecific(arraysize(registers), registers);
94}
95
96void FastNewRestParameterDescriptor::InitializePlatformSpecific(
97 CallInterfaceDescriptorData* data) {
98 Register registers[] = {edi};
99 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
100}
101
102void FastNewSloppyArgumentsDescriptor::InitializePlatformSpecific(
103 CallInterfaceDescriptorData* data) {
104 Register registers[] = {edi};
105 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
106}
107
108void FastNewStrictArgumentsDescriptor::InitializePlatformSpecific(
109 CallInterfaceDescriptorData* data) {
110 Register registers[] = {edi};
111 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
112}
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000113
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000114
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000115// static
Ben Murdochda12d292016-06-02 14:46:10 +0100116const Register TypeConversionDescriptor::ArgumentRegister() { return eax; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000117
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000118void TypeofDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000119 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000120 Register registers[] = {ebx};
121 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000122}
123
124
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000125void FastCloneRegExpDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000126 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000127 Register registers[] = {edi, eax, ecx, edx};
128 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000129}
130
131
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000132void FastCloneShallowArrayDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000133 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000134 Register registers[] = {eax, ebx, ecx};
135 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000136}
137
138
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000139void FastCloneShallowObjectDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000140 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000141 Register registers[] = {eax, ebx, ecx, edx};
142 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000143}
144
145
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000146void CreateAllocationSiteDescriptor::InitializePlatformSpecific(
147 CallInterfaceDescriptorData* data) {
148 Register registers[] = {ebx, edx};
149 data->InitializePlatformSpecific(arraysize(registers), registers);
150}
151
152
153void CreateWeakCellDescriptor::InitializePlatformSpecific(
154 CallInterfaceDescriptorData* data) {
155 Register registers[] = {ebx, edx, edi};
156 data->InitializePlatformSpecific(arraysize(registers), registers);
157}
158
159
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000160void CallFunctionDescriptor::InitializePlatformSpecific(
161 CallInterfaceDescriptorData* data) {
162 Register registers[] = {edi};
163 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
164}
165
166
167void CallFunctionWithFeedbackDescriptor::InitializePlatformSpecific(
168 CallInterfaceDescriptorData* data) {
169 Register registers[] = {edi, edx};
170 data->InitializePlatformSpecific(arraysize(registers), registers);
171}
172
173
174void CallFunctionWithFeedbackAndVectorDescriptor::InitializePlatformSpecific(
175 CallInterfaceDescriptorData* data) {
176 Register registers[] = {edi, edx, ebx};
177 data->InitializePlatformSpecific(arraysize(registers), registers);
178}
179
180
181void CallConstructDescriptor::InitializePlatformSpecific(
182 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000183 // eax : number of arguments
184 // ebx : feedback vector
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000185 // ecx : new target (for IsSuperConstructorCall)
186 // edx : slot in feedback vector (Smi, for RecordCallTarget)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000187 // edi : constructor function
188 // TODO(turbofan): So far we don't gather type feedback and hence skip the
189 // slot parameter, but ArrayConstructStub needs the vector to be undefined.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000190 Register registers[] = {eax, edi, ecx, ebx};
191 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000192}
193
194
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000195void CallTrampolineDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000196 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000197 // eax : number of arguments
198 // edi : the target to call
199 Register registers[] = {edi, eax};
200 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000201}
202
203
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000204void ConstructStubDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000205 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000206 // eax : number of arguments
207 // edx : the new target
208 // edi : the target to call
209 // ebx : allocation site or undefined
210 Register registers[] = {edi, edx, eax, ebx};
211 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000212}
213
214
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000215void ConstructTrampolineDescriptor::InitializePlatformSpecific(
216 CallInterfaceDescriptorData* data) {
217 // eax : number of arguments
218 // edx : the new target
219 // edi : the target to call
220 Register registers[] = {edi, edx, eax};
221 data->InitializePlatformSpecific(arraysize(registers), registers);
222}
223
224
225void RegExpConstructResultDescriptor::InitializePlatformSpecific(
226 CallInterfaceDescriptorData* data) {
227 Register registers[] = {ecx, ebx, eax};
228 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
229}
230
231
232void TransitionElementsKindDescriptor::InitializePlatformSpecific(
233 CallInterfaceDescriptorData* data) {
234 Register registers[] = {eax, ebx};
235 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
236}
237
238
239void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400240 CallInterfaceDescriptorData* data) {
241 // register state
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000242 data->InitializePlatformSpecific(0, nullptr, nullptr);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400243}
244
Ben Murdochda12d292016-06-02 14:46:10 +0100245#define SIMD128_ALLOC_DESC(TYPE, Type, type, lane_count, lane_type) \
246 void Allocate##Type##Descriptor::InitializePlatformSpecific( \
247 CallInterfaceDescriptorData* data) { \
248 data->InitializePlatformSpecific(0, nullptr, nullptr); \
249 }
250SIMD128_TYPES(SIMD128_ALLOC_DESC)
251#undef SIMD128_ALLOC_DESC
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400252
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000253void AllocateInNewSpaceDescriptor::InitializePlatformSpecific(
254 CallInterfaceDescriptorData* data) {
255 Register registers[] = {eax};
256 data->InitializePlatformSpecific(arraysize(registers), registers);
257}
258
259
260void ArrayConstructorConstantArgCountDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000261 CallInterfaceDescriptorData* data) {
262 // register state
263 // eax -- number of arguments
264 // edi -- function
265 // ebx -- allocation site with elements kind
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000266 Register registers[] = {edi, ebx};
267 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000268}
269
270
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000271void ArrayConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000272 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000273 // stack param count needs (constructor pointer, and single argument)
274 Register registers[] = {edi, ebx, eax};
275 data->InitializePlatformSpecific(arraysize(registers), registers);
276}
277
278
279void InternalArrayConstructorConstantArgCountDescriptor::
280 InitializePlatformSpecific(CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000281 // register state
282 // eax -- number of arguments
283 // edi -- function
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000284 Register registers[] = {edi};
285 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000286}
287
288
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000289void InternalArrayConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000290 CallInterfaceDescriptorData* data) {
291 // stack param count needs (constructor pointer, and single argument)
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000292 Register registers[] = {edi, eax};
293 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000294}
295
Ben Murdochda12d292016-06-02 14:46:10 +0100296void FastArrayPushDescriptor::InitializePlatformSpecific(
297 CallInterfaceDescriptorData* data) {
298 // stack param count needs (arg count)
299 Register registers[] = {eax};
300 data->InitializePlatformSpecific(arraysize(registers), registers);
301}
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000302
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000303void CompareDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000304 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000305 Register registers[] = {edx, eax};
306 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000307}
308
309
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000310void BinaryOpDescriptor::InitializePlatformSpecific(
311 CallInterfaceDescriptorData* data) {
312 Register registers[] = {edx, eax};
313 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
314}
315
316
317void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
318 CallInterfaceDescriptorData* data) {
319 Register registers[] = {ecx, edx, eax};
320 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
321}
322
323
324void StringAddDescriptor::InitializePlatformSpecific(
325 CallInterfaceDescriptorData* data) {
326 Register registers[] = {edx, eax};
327 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
328}
329
330
331void KeyedDescriptor::InitializePlatformSpecific(
332 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000333 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000334 ecx, // key
335 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000336 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000337}
338
339
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000340void NamedDescriptor::InitializePlatformSpecific(
341 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000342 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000343 ecx, // name
344 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000345 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000346}
347
348
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000349void CallHandlerDescriptor::InitializePlatformSpecific(
350 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000351 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000352 edx, // name
353 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000354 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000355}
356
357
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000358void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
359 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000360 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000361 edi, // JSFunction
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000362 edx, // the new target
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000363 eax, // actual number of arguments
364 ebx, // expected number of arguments
365 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000366 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000367}
368
Ben Murdochda12d292016-06-02 14:46:10 +0100369void ApiCallbackDescriptorBase::InitializePlatformSpecific(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000370 CallInterfaceDescriptorData* data) {
371 Register registers[] = {
372 edi, // callee
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000373 ebx, // call_data
374 ecx, // holder
375 edx, // api_function_address
376 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000377 data->InitializePlatformSpecific(arraysize(registers), registers);
378}
379
Ben Murdoch097c5b22016-05-18 11:27:45 +0100380void InterpreterDispatchDescriptor::InitializePlatformSpecific(
381 CallInterfaceDescriptorData* data) {
382 Register registers[] = {
383 kInterpreterAccumulatorRegister, kInterpreterRegisterFileRegister,
384 kInterpreterBytecodeOffsetRegister, kInterpreterBytecodeArrayRegister};
385 data->InitializePlatformSpecific(arraysize(registers), registers);
386}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000387
388void InterpreterPushArgsAndCallDescriptor::InitializePlatformSpecific(
389 CallInterfaceDescriptorData* data) {
390 Register registers[] = {
391 eax, // argument count (not including receiver)
392 ebx, // address of first argument
393 edi // the target callable to be call
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000394 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000395 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000396}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000397
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000398void InterpreterPushArgsAndConstructDescriptor::InitializePlatformSpecific(
399 CallInterfaceDescriptorData* data) {
400 Register registers[] = {
401 eax, // argument count (not including receiver)
402 edx, // new target
403 edi, // constructor
404 ebx, // address of first argument
405 };
406 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000407}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000408
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000409void InterpreterCEntryDescriptor::InitializePlatformSpecific(
410 CallInterfaceDescriptorData* data) {
411 Register registers[] = {
412 eax, // argument count (argc)
413 ecx, // address of first argument (argv)
414 ebx // the runtime function to call
415 };
416 data->InitializePlatformSpecific(arraysize(registers), registers);
417}
418
419} // namespace internal
420} // namespace v8
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000421
422#endif // V8_TARGET_ARCH_X87