blob: 99664dca3855c62a0aa7de27baad01c7f027b0a1 [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
Ben Murdoch61f157c2016-09-16 13:49:30 +010014void CallInterfaceDescriptor::DefaultInitializePlatformSpecific(
15 CallInterfaceDescriptorData* data, int register_parameter_count) {
16 const Register default_stub_registers[] = {eax, ebx, ecx, edx, edi};
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 edx; }
24const Register LoadDescriptor::NameRegister() { return ecx; }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000025const Register LoadDescriptor::SlotRegister() { return eax; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000026
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000027const Register LoadWithVectorDescriptor::VectorRegister() { return ebx; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000028
29
30const Register StoreDescriptor::ReceiverRegister() { return edx; }
31const Register StoreDescriptor::NameRegister() { return ecx; }
32const Register StoreDescriptor::ValueRegister() { return eax; }
33
34
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000035const Register VectorStoreICTrampolineDescriptor::SlotRegister() { return edi; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040036
37
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000038const Register VectorStoreICDescriptor::VectorRegister() { return ebx; }
39
40
41const Register VectorStoreTransitionDescriptor::SlotRegister() {
42 return no_reg;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000043}
44
45
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000046const Register VectorStoreTransitionDescriptor::VectorRegister() { return ebx; }
47
48
49const Register VectorStoreTransitionDescriptor::MapRegister() { return edi; }
50
51
52const Register StoreTransitionDescriptor::MapRegister() { return ebx; }
53
54
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000055const Register StoreGlobalViaContextDescriptor::SlotRegister() { return ebx; }
56const Register StoreGlobalViaContextDescriptor::ValueRegister() { return eax; }
57
58
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000059const Register StringCompareDescriptor::LeftRegister() { return edx; }
60const Register StringCompareDescriptor::RightRegister() { return eax; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000061
Ben Murdochc5610432016-08-08 18:44:38 +010062const Register ApiGetterDescriptor::HolderRegister() { return ecx; }
63const Register ApiGetterDescriptor::CallbackRegister() { return eax; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000064
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 Murdochc5610432016-08-08 18:44:38 +0100253void ArrayNoArgumentConstructorDescriptor::InitializePlatformSpecific(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000254 CallInterfaceDescriptorData* data) {
Ben Murdochc5610432016-08-08 18:44:38 +0100255 // register state
256 // eax -- number of arguments
257 // edi -- function
258 // ebx -- allocation site with elements kind
259 Register registers[] = {edi, ebx, eax};
260 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000261}
262
Ben Murdoch61f157c2016-09-16 13:49:30 +0100263void ArraySingleArgumentConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000264 CallInterfaceDescriptorData* data) {
265 // register state
266 // eax -- number of arguments
267 // edi -- function
268 // ebx -- allocation site with elements kind
Ben Murdoch61f157c2016-09-16 13:49:30 +0100269 Register registers[] = {edi, ebx, eax};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000270 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000271}
272
Ben Murdoch61f157c2016-09-16 13:49:30 +0100273void ArrayNArgumentsConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000274 CallInterfaceDescriptorData* data) {
275 // register state
276 // eax -- number of arguments
277 // edi -- function
Ben Murdoch61f157c2016-09-16 13:49:30 +0100278 // ebx -- allocation site with elements kind
279 Register registers[] = {edi, ebx, eax};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000280 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000281}
282
Ben Murdoch61f157c2016-09-16 13:49:30 +0100283void VarArgFunctionDescriptor::InitializePlatformSpecific(
Ben Murdochda12d292016-06-02 14:46:10 +0100284 CallInterfaceDescriptorData* data) {
285 // stack param count needs (arg count)
286 Register registers[] = {eax};
287 data->InitializePlatformSpecific(arraysize(registers), registers);
288}
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000289
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000290void CompareDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000291 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000292 Register registers[] = {edx, eax};
293 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000294}
295
296
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000297void BinaryOpDescriptor::InitializePlatformSpecific(
298 CallInterfaceDescriptorData* data) {
299 Register registers[] = {edx, eax};
300 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
301}
302
303
304void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
305 CallInterfaceDescriptorData* data) {
306 Register registers[] = {ecx, edx, eax};
307 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
308}
309
Ben Murdochc5610432016-08-08 18:44:38 +0100310void CountOpDescriptor::InitializePlatformSpecific(
311 CallInterfaceDescriptorData* data) {
312 Register registers[] = {eax};
313 data->InitializePlatformSpecific(arraysize(registers), registers);
314}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000315
316void StringAddDescriptor::InitializePlatformSpecific(
317 CallInterfaceDescriptorData* data) {
318 Register registers[] = {edx, eax};
319 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
320}
321
322
323void KeyedDescriptor::InitializePlatformSpecific(
324 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000325 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000326 ecx, // key
327 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000328 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000329}
330
331
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000332void NamedDescriptor::InitializePlatformSpecific(
333 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000334 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000335 ecx, // name
336 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000337 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000338}
339
340
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000341void CallHandlerDescriptor::InitializePlatformSpecific(
342 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000343 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000344 edx, // name
345 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000346 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000347}
348
349
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000350void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
351 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000352 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000353 edi, // JSFunction
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000354 edx, // the new target
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000355 eax, // actual number of arguments
356 ebx, // expected number of arguments
357 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000358 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000359}
360
Ben Murdochda12d292016-06-02 14:46:10 +0100361void ApiCallbackDescriptorBase::InitializePlatformSpecific(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000362 CallInterfaceDescriptorData* data) {
363 Register registers[] = {
364 edi, // callee
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000365 ebx, // call_data
366 ecx, // holder
367 edx, // api_function_address
368 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000369 data->InitializePlatformSpecific(arraysize(registers), registers);
370}
371
Ben Murdoch097c5b22016-05-18 11:27:45 +0100372void InterpreterDispatchDescriptor::InitializePlatformSpecific(
373 CallInterfaceDescriptorData* data) {
374 Register registers[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100375 kInterpreterAccumulatorRegister, kInterpreterBytecodeOffsetRegister,
376 kInterpreterBytecodeArrayRegister, kInterpreterDispatchTableRegister};
Ben Murdoch097c5b22016-05-18 11:27:45 +0100377 data->InitializePlatformSpecific(arraysize(registers), registers);
378}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000379
380void InterpreterPushArgsAndCallDescriptor::InitializePlatformSpecific(
381 CallInterfaceDescriptorData* data) {
382 Register registers[] = {
383 eax, // argument count (not including receiver)
384 ebx, // address of first argument
385 edi // the target callable to be call
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000386 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000387 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000388}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000389
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000390void InterpreterPushArgsAndConstructDescriptor::InitializePlatformSpecific(
391 CallInterfaceDescriptorData* data) {
392 Register registers[] = {
393 eax, // argument count (not including receiver)
394 edx, // new target
395 edi, // constructor
396 ebx, // address of first argument
397 };
398 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000399}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000400
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000401void InterpreterCEntryDescriptor::InitializePlatformSpecific(
402 CallInterfaceDescriptorData* data) {
403 Register registers[] = {
404 eax, // argument count (argc)
405 ecx, // address of first argument (argv)
406 ebx // the runtime function to call
407 };
408 data->InitializePlatformSpecific(arraysize(registers), registers);
409}
410
Ben Murdochc5610432016-08-08 18:44:38 +0100411void ResumeGeneratorDescriptor::InitializePlatformSpecific(
412 CallInterfaceDescriptorData* data) {
413 Register registers[] = {
414 eax, // the value to pass to the generator
415 ebx, // the JSGeneratorObject to resume
416 edx // the resume mode (tagged)
417 };
418 data->InitializePlatformSpecific(arraysize(registers), registers);
419}
420
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000421} // namespace internal
422} // namespace v8
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000423
424#endif // V8_TARGET_ARCH_X87