1 // 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.
7 #if V8_TARGET_ARCH_ARM64
9 #include "src/interface-descriptors.h"
14 const Register CallInterfaceDescriptor::ContextRegister() { return cp; }
17 const Register LoadDescriptor::ReceiverRegister() { return x1; }
18 const Register LoadDescriptor::NameRegister() { return x2; }
21 const Register VectorLoadICTrampolineDescriptor::SlotRegister() { return x0; }
24 const Register VectorLoadICDescriptor::VectorRegister() { return x3; }
27 const Register StoreDescriptor::ReceiverRegister() { return x1; }
28 const Register StoreDescriptor::NameRegister() { return x2; }
29 const Register StoreDescriptor::ValueRegister() { return x0; }
32 const Register ElementTransitionAndStoreDescriptor::MapRegister() { return x3; }
35 const Register InstanceofDescriptor::left() {
36 // Object to check (instanceof lhs).
41 const Register InstanceofDescriptor::right() {
42 // Constructor function (instanceof rhs).
47 const Register ArgumentsAccessReadDescriptor::index() { return x1; }
48 const Register ArgumentsAccessReadDescriptor::parameter_count() { return x0; }
51 const Register ApiGetterDescriptor::function_address() { return x2; }
54 const Register MathPowTaggedDescriptor::exponent() { return x11; }
57 const Register MathPowIntegerDescriptor::exponent() { return x12; }
60 void FastNewClosureDescriptor::Initialize(CallInterfaceDescriptorData* data) {
63 Register registers[] = {cp, x2};
64 data->Initialize(arraysize(registers), registers, NULL);
68 void FastNewContextDescriptor::Initialize(CallInterfaceDescriptorData* data) {
71 Register registers[] = {cp, x1};
72 data->Initialize(arraysize(registers), registers, NULL);
76 void ToNumberDescriptor::Initialize(CallInterfaceDescriptorData* data) {
79 Register registers[] = {cp, x0};
80 data->Initialize(arraysize(registers), registers, NULL);
84 void NumberToStringDescriptor::Initialize(CallInterfaceDescriptorData* data) {
87 Register registers[] = {cp, x0};
88 data->Initialize(arraysize(registers), registers, NULL);
92 void FastCloneShallowArrayDescriptor::Initialize(
93 CallInterfaceDescriptorData* data) {
95 // x3: array literals array
96 // x2: array literal index
97 // x1: constant elements
98 Register registers[] = {cp, x3, x2, x1};
99 Representation representations[] = {
100 Representation::Tagged(), Representation::Tagged(), Representation::Smi(),
101 Representation::Tagged()};
102 data->Initialize(arraysize(registers), registers, representations);
106 void FastCloneShallowObjectDescriptor::Initialize(
107 CallInterfaceDescriptorData* data) {
109 // x3: object literals array
110 // x2: object literal index
111 // x1: constant properties
112 // x0: object literal flags
113 Register registers[] = {cp, x3, x2, x1, x0};
114 data->Initialize(arraysize(registers), registers, NULL);
118 void CreateAllocationSiteDescriptor::Initialize(
119 CallInterfaceDescriptorData* data) {
121 // x2: feedback vector
122 // x3: call feedback slot
123 Register registers[] = {cp, x2, x3};
124 data->Initialize(arraysize(registers), registers, NULL);
128 void StoreArrayLiteralElementDescriptor::Initialize(
129 CallInterfaceDescriptorData* data) {
130 Register registers[] = {cp, x3, x0};
131 data->Initialize(arraysize(registers), registers, NULL);
135 void CallFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
136 // x1 function the function to call
137 Register registers[] = {cp, x1};
138 data->Initialize(arraysize(registers), registers, NULL);
142 void CallFunctionWithFeedbackDescriptor::Initialize(
143 CallInterfaceDescriptorData* data) {
144 Register registers[] = {cp, x1, x3};
145 Representation representations[] = {Representation::Tagged(),
146 Representation::Tagged(),
147 Representation::Smi()};
148 data->Initialize(arraysize(registers), registers, representations);
152 void CallConstructDescriptor::Initialize(CallInterfaceDescriptorData* data) {
153 // x0 : number of arguments
154 // x1 : the function to call
155 // x2 : feedback vector
156 // x3 : slot in feedback vector (smi) (if r2 is not the megamorphic symbol)
157 // TODO(turbofan): So far we don't gather type feedback and hence skip the
158 // slot parameter, but ArrayConstructStub needs the vector to be undefined.
159 Register registers[] = {cp, x0, x1, x2};
160 data->Initialize(arraysize(registers), registers, NULL);
164 void RegExpConstructResultDescriptor::Initialize(
165 CallInterfaceDescriptorData* data) {
168 // x1: index (of last match)
170 Register registers[] = {cp, x2, x1, x0};
171 data->Initialize(arraysize(registers), registers, NULL);
175 void TransitionElementsKindDescriptor::Initialize(
176 CallInterfaceDescriptorData* data) {
178 // x0: value (js_array)
180 Register registers[] = {cp, x0, x1};
181 data->Initialize(arraysize(registers), registers, NULL);
185 void ArrayConstructorConstantArgCountDescriptor::Initialize(
186 CallInterfaceDescriptorData* data) {
189 // x2: allocation site with elements kind
190 // x0: number of arguments to the constructor function
191 Register registers[] = {cp, x1, x2};
192 data->Initialize(arraysize(registers), registers, NULL);
196 void ArrayConstructorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
197 // stack param count needs (constructor pointer, and single argument)
198 Register registers[] = {cp, x1, x2, x0};
199 Representation representations[] = {
200 Representation::Tagged(), Representation::Tagged(),
201 Representation::Tagged(), Representation::Integer32()};
202 data->Initialize(arraysize(registers), registers, representations);
206 void InternalArrayConstructorConstantArgCountDescriptor::Initialize(
207 CallInterfaceDescriptorData* data) {
209 // x1: constructor function
210 // x0: number of arguments to the constructor function
211 Register registers[] = {cp, x1};
212 data->Initialize(arraysize(registers), registers, NULL);
216 void InternalArrayConstructorDescriptor::Initialize(
217 CallInterfaceDescriptorData* data) {
218 // stack param count needs (constructor pointer, and single argument)
219 Register registers[] = {cp, x1, x0};
220 Representation representations[] = {Representation::Tagged(),
221 Representation::Tagged(),
222 Representation::Integer32()};
223 data->Initialize(arraysize(registers), registers, representations);
227 void CompareNilDescriptor::Initialize(CallInterfaceDescriptorData* data) {
229 // x0: value to compare
230 Register registers[] = {cp, x0};
231 data->Initialize(arraysize(registers), registers, NULL);
235 void ToBooleanDescriptor::Initialize(CallInterfaceDescriptorData* data) {
238 Register registers[] = {cp, x0};
239 data->Initialize(arraysize(registers), registers, NULL);
243 void BinaryOpDescriptor::Initialize(CallInterfaceDescriptorData* data) {
247 Register registers[] = {cp, x1, x0};
248 data->Initialize(arraysize(registers), registers, NULL);
252 void BinaryOpWithAllocationSiteDescriptor::Initialize(
253 CallInterfaceDescriptorData* data) {
255 // x2: allocation site
258 Register registers[] = {cp, x2, x1, x0};
259 data->Initialize(arraysize(registers), registers, NULL);
263 void StringAddDescriptor::Initialize(CallInterfaceDescriptorData* data) {
267 Register registers[] = {cp, x1, x0};
268 data->Initialize(arraysize(registers), registers, NULL);
272 void KeyedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
273 static PlatformInterfaceDescriptor noInlineDescriptor =
274 PlatformInterfaceDescriptor(NEVER_INLINE_TARGET_ADDRESS);
276 Register registers[] = {
280 Representation representations[] = {
281 Representation::Tagged(), // context
282 Representation::Tagged(), // key
284 data->Initialize(arraysize(registers), registers, representations,
285 &noInlineDescriptor);
289 void NamedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
290 static PlatformInterfaceDescriptor noInlineDescriptor =
291 PlatformInterfaceDescriptor(NEVER_INLINE_TARGET_ADDRESS);
293 Register registers[] = {
297 Representation representations[] = {
298 Representation::Tagged(), // context
299 Representation::Tagged(), // name
301 data->Initialize(arraysize(registers), registers, representations,
302 &noInlineDescriptor);
306 void CallHandlerDescriptor::Initialize(CallInterfaceDescriptorData* data) {
307 static PlatformInterfaceDescriptor default_descriptor =
308 PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS);
310 Register registers[] = {
314 Representation representations[] = {
315 Representation::Tagged(), // context
316 Representation::Tagged(), // receiver
318 data->Initialize(arraysize(registers), registers, representations,
319 &default_descriptor);
323 void ArgumentAdaptorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
324 static PlatformInterfaceDescriptor default_descriptor =
325 PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS);
327 Register registers[] = {
330 x0, // actual number of arguments
331 x2, // expected number of arguments
333 Representation representations[] = {
334 Representation::Tagged(), // context
335 Representation::Tagged(), // JSFunction
336 Representation::Integer32(), // actual number of arguments
337 Representation::Integer32(), // expected number of arguments
339 data->Initialize(arraysize(registers), registers, representations,
340 &default_descriptor);
344 void ApiFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
345 static PlatformInterfaceDescriptor default_descriptor =
346 PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS);
348 Register registers[] = {
353 x1, // api_function_address
355 Representation representations[] = {
356 Representation::Tagged(), // context
357 Representation::Tagged(), // callee
358 Representation::Tagged(), // call_data
359 Representation::Tagged(), // holder
360 Representation::External(), // api_function_address
362 data->Initialize(arraysize(registers), registers, representations,
363 &default_descriptor);
366 } // namespace v8::internal
368 #endif // V8_TARGET_ARCH_ARM64