blob: f19979d4674773b9664bec255b226fc7fdb98a81 [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
5#include "src/v8.h"
6
7#if V8_TARGET_ARCH_X64
8
9#include "src/interface-descriptors.h"
10
11namespace v8 {
12namespace internal {
13
14const Register CallInterfaceDescriptor::ContextRegister() { return rsi; }
15
16
17const Register LoadDescriptor::ReceiverRegister() { return rdx; }
18const Register LoadDescriptor::NameRegister() { return rcx; }
19
20
21const Register VectorLoadICTrampolineDescriptor::SlotRegister() { return rax; }
22
23
24const Register VectorLoadICDescriptor::VectorRegister() { return rbx; }
25
26
27const Register StoreDescriptor::ReceiverRegister() { return rdx; }
28const Register StoreDescriptor::NameRegister() { return rcx; }
29const Register StoreDescriptor::ValueRegister() { return rax; }
30
31
Emily Bernierd0a1eb72015-03-24 16:35:39 -040032const Register StoreTransitionDescriptor::MapRegister() { return rbx; }
33
34
Ben Murdochb8a8cc12014-11-26 15:28:44 +000035const Register ElementTransitionAndStoreDescriptor::MapRegister() {
36 return rbx;
37}
38
39
40const Register InstanceofDescriptor::left() { return rax; }
41const Register InstanceofDescriptor::right() { return rdx; }
42
43
44const Register ArgumentsAccessReadDescriptor::index() { return rdx; }
45const Register ArgumentsAccessReadDescriptor::parameter_count() { return rax; }
46
47
48const Register ApiGetterDescriptor::function_address() { return r8; }
49
50
51const Register MathPowTaggedDescriptor::exponent() { return rdx; }
52
53
54const Register MathPowIntegerDescriptor::exponent() {
55 return MathPowTaggedDescriptor::exponent();
56}
57
58
59void FastNewClosureDescriptor::Initialize(CallInterfaceDescriptorData* data) {
60 Register registers[] = {rsi, rbx};
61 data->Initialize(arraysize(registers), registers, NULL);
62}
63
64
65void FastNewContextDescriptor::Initialize(CallInterfaceDescriptorData* data) {
66 Register registers[] = {rsi, rdi};
67 data->Initialize(arraysize(registers), registers, NULL);
68}
69
70
71void ToNumberDescriptor::Initialize(CallInterfaceDescriptorData* data) {
72 // ToNumberStub invokes a function, and therefore needs a context.
73 Register registers[] = {rsi, rax};
74 data->Initialize(arraysize(registers), registers, NULL);
75}
76
77
78void NumberToStringDescriptor::Initialize(CallInterfaceDescriptorData* data) {
79 Register registers[] = {rsi, rax};
80 data->Initialize(arraysize(registers), registers, NULL);
81}
82
83
84void FastCloneShallowArrayDescriptor::Initialize(
85 CallInterfaceDescriptorData* data) {
86 Register registers[] = {rsi, rax, rbx, rcx};
87 Representation representations[] = {
88 Representation::Tagged(), Representation::Tagged(), Representation::Smi(),
89 Representation::Tagged()};
90 data->Initialize(arraysize(registers), registers, representations);
91}
92
93
94void FastCloneShallowObjectDescriptor::Initialize(
95 CallInterfaceDescriptorData* data) {
96 Register registers[] = {rsi, rax, rbx, rcx, rdx};
97 data->Initialize(arraysize(registers), registers, NULL);
98}
99
100
101void CreateAllocationSiteDescriptor::Initialize(
102 CallInterfaceDescriptorData* data) {
103 Register registers[] = {rsi, rbx, rdx};
104 data->Initialize(arraysize(registers), registers, NULL);
105}
106
107
108void StoreArrayLiteralElementDescriptor::Initialize(
109 CallInterfaceDescriptorData* data) {
110 Register registers[] = {rsi, rcx, rax};
111 data->Initialize(arraysize(registers), registers, NULL);
112}
113
114
115void CallFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
116 Register registers[] = {rsi, rdi};
117 data->Initialize(arraysize(registers), registers, NULL);
118}
119
120
121void CallFunctionWithFeedbackDescriptor::Initialize(
122 CallInterfaceDescriptorData* data) {
123 Register registers[] = {rsi, rdi, rdx};
124 Representation representations[] = {Representation::Tagged(),
125 Representation::Tagged(),
126 Representation::Smi()};
127 data->Initialize(arraysize(registers), registers, representations);
128}
129
130
131void CallConstructDescriptor::Initialize(CallInterfaceDescriptorData* data) {
132 // rax : number of arguments
133 // rbx : feedback vector
134 // rdx : (only if rbx is not the megamorphic symbol) slot in feedback
135 // vector (Smi)
136 // rdi : constructor function
137 // TODO(turbofan): So far we don't gather type feedback and hence skip the
138 // slot parameter, but ArrayConstructStub needs the vector to be undefined.
139 Register registers[] = {rsi, rax, rdi, rbx};
140 data->Initialize(arraysize(registers), registers, NULL);
141}
142
143
144void RegExpConstructResultDescriptor::Initialize(
145 CallInterfaceDescriptorData* data) {
146 Register registers[] = {rsi, rcx, rbx, rax};
147 data->Initialize(arraysize(registers), registers, NULL);
148}
149
150
151void TransitionElementsKindDescriptor::Initialize(
152 CallInterfaceDescriptorData* data) {
153 Register registers[] = {rsi, rax, rbx};
154 data->Initialize(arraysize(registers), registers, NULL);
155}
156
157
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400158void AllocateHeapNumberDescriptor::Initialize(
159 CallInterfaceDescriptorData* data) {
160 // register state
161 // rsi -- context
162 Register registers[] = {rsi};
163 data->Initialize(arraysize(registers), registers, nullptr);
164}
165
166
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000167void ArrayConstructorConstantArgCountDescriptor::Initialize(
168 CallInterfaceDescriptorData* data) {
169 // register state
170 // rax -- number of arguments
171 // rdi -- function
172 // rbx -- allocation site with elements kind
173 Register registers[] = {rsi, rdi, rbx};
174 data->Initialize(arraysize(registers), registers, NULL);
175}
176
177
178void ArrayConstructorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
179 // stack param count needs (constructor pointer, and single argument)
180 Register registers[] = {rsi, rdi, rbx, rax};
181 Representation representations[] = {
182 Representation::Tagged(), Representation::Tagged(),
183 Representation::Tagged(), Representation::Integer32()};
184 data->Initialize(arraysize(registers), registers, representations);
185}
186
187
188void InternalArrayConstructorConstantArgCountDescriptor::Initialize(
189 CallInterfaceDescriptorData* data) {
190 // register state
191 // rsi -- context
192 // rax -- number of arguments
193 // rdi -- constructor function
194 Register registers[] = {rsi, rdi};
195 data->Initialize(arraysize(registers), registers, NULL);
196}
197
198
199void InternalArrayConstructorDescriptor::Initialize(
200 CallInterfaceDescriptorData* data) {
201 // stack param count needs (constructor pointer, and single argument)
202 Register registers[] = {rsi, rdi, rax};
203 Representation representations[] = {Representation::Tagged(),
204 Representation::Tagged(),
205 Representation::Integer32()};
206 data->Initialize(arraysize(registers), registers, representations);
207}
208
209
210void CompareNilDescriptor::Initialize(CallInterfaceDescriptorData* data) {
211 Register registers[] = {rsi, rax};
212 data->Initialize(arraysize(registers), registers, NULL);
213}
214
215
216void ToBooleanDescriptor::Initialize(CallInterfaceDescriptorData* data) {
217 Register registers[] = {rsi, rax};
218 data->Initialize(arraysize(registers), registers, NULL);
219}
220
221
222void BinaryOpDescriptor::Initialize(CallInterfaceDescriptorData* data) {
223 Register registers[] = {rsi, rdx, rax};
224 data->Initialize(arraysize(registers), registers, NULL);
225}
226
227
228void BinaryOpWithAllocationSiteDescriptor::Initialize(
229 CallInterfaceDescriptorData* data) {
230 Register registers[] = {rsi, rcx, rdx, rax};
231 data->Initialize(arraysize(registers), registers, NULL);
232}
233
234
235void StringAddDescriptor::Initialize(CallInterfaceDescriptorData* data) {
236 Register registers[] = {rsi, rdx, rax};
237 data->Initialize(arraysize(registers), registers, NULL);
238}
239
240
241void KeyedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
242 Register registers[] = {
243 rsi, // context
244 rcx, // key
245 };
246 Representation representations[] = {
247 Representation::Tagged(), // context
248 Representation::Tagged(), // key
249 };
250 data->Initialize(arraysize(registers), registers, representations);
251}
252
253
254void NamedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
255 Register registers[] = {
256 rsi, // context
257 rcx, // name
258 };
259 Representation representations[] = {
260 Representation::Tagged(), // context
261 Representation::Tagged(), // name
262 };
263 data->Initialize(arraysize(registers), registers, representations);
264}
265
266
267void CallHandlerDescriptor::Initialize(CallInterfaceDescriptorData* data) {
268 Register registers[] = {
269 rsi, // context
270 rdx, // receiver
271 };
272 Representation representations[] = {
273 Representation::Tagged(), // context
274 Representation::Tagged(), // receiver
275 };
276 data->Initialize(arraysize(registers), registers, representations);
277}
278
279
280void ArgumentAdaptorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
281 Register registers[] = {
282 rsi, // context
283 rdi, // JSFunction
284 rax, // actual number of arguments
285 rbx, // expected number of arguments
286 };
287 Representation representations[] = {
288 Representation::Tagged(), // context
289 Representation::Tagged(), // JSFunction
290 Representation::Integer32(), // actual number of arguments
291 Representation::Integer32(), // expected number of arguments
292 };
293 data->Initialize(arraysize(registers), registers, representations);
294}
295
296
297void ApiFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
298 Register registers[] = {
299 rsi, // context
300 rax, // callee
301 rbx, // call_data
302 rcx, // holder
303 rdx, // api_function_address
304 };
305 Representation representations[] = {
306 Representation::Tagged(), // context
307 Representation::Tagged(), // callee
308 Representation::Tagged(), // call_data
309 Representation::Tagged(), // holder
310 Representation::External(), // api_function_address
311 };
312 data->Initialize(arraysize(registers), registers, representations);
313}
314}
315} // namespace v8::internal
316
317#endif // V8_TARGET_ARCH_X64