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_MIPS
9 #include "src/interface-descriptors.h"
14 const Register CallInterfaceDescriptor::ContextRegister() { return cp; }
17 const Register LoadDescriptor::ReceiverRegister() { return a1; }
18 const Register LoadDescriptor::NameRegister() { return a2; }
21 const Register VectorLoadICTrampolineDescriptor::SlotRegister() { return a0; }
24 const Register VectorLoadICDescriptor::VectorRegister() { return a3; }
27 const Register StoreDescriptor::ReceiverRegister() { return a1; }
28 const Register StoreDescriptor::NameRegister() { return a2; }
29 const Register StoreDescriptor::ValueRegister() { return a0; }
32 const Register StoreTransitionDescriptor::MapRegister() { return a3; }
35 const Register ElementTransitionAndStoreDescriptor::MapRegister() { return a3; }
38 const Register InstanceofDescriptor::left() { return a0; }
39 const Register InstanceofDescriptor::right() { return a1; }
42 const Register ArgumentsAccessReadDescriptor::index() { return a1; }
43 const Register ArgumentsAccessReadDescriptor::parameter_count() { return a0; }
46 const Register ApiGetterDescriptor::function_address() { return a2; }
49 const Register MathPowTaggedDescriptor::exponent() { return a2; }
52 const Register MathPowIntegerDescriptor::exponent() {
53 return MathPowTaggedDescriptor::exponent();
57 void FastNewClosureDescriptor::Initialize(CallInterfaceDescriptorData* data) {
58 Register registers[] = {cp, a2};
59 data->Initialize(arraysize(registers), registers, NULL);
63 void FastNewContextDescriptor::Initialize(CallInterfaceDescriptorData* data) {
64 Register registers[] = {cp, a1};
65 data->Initialize(arraysize(registers), registers, NULL);
69 void ToNumberDescriptor::Initialize(CallInterfaceDescriptorData* data) {
70 Register registers[] = {cp, a0};
71 data->Initialize(arraysize(registers), registers, NULL);
75 void NumberToStringDescriptor::Initialize(CallInterfaceDescriptorData* data) {
76 Register registers[] = {cp, a0};
77 data->Initialize(arraysize(registers), registers, NULL);
81 void FastCloneShallowArrayDescriptor::Initialize(
82 CallInterfaceDescriptorData* data) {
83 Register registers[] = {cp, a3, a2, a1};
84 Representation representations[] = {
85 Representation::Tagged(), Representation::Tagged(), Representation::Smi(),
86 Representation::Tagged()};
87 data->Initialize(arraysize(registers), registers, representations);
91 void FastCloneShallowObjectDescriptor::Initialize(
92 CallInterfaceDescriptorData* data) {
93 Register registers[] = {cp, a3, a2, a1, a0};
94 data->Initialize(arraysize(registers), registers, NULL);
98 void CreateAllocationSiteDescriptor::Initialize(
99 CallInterfaceDescriptorData* data) {
100 Register registers[] = {cp, a2, a3};
101 data->Initialize(arraysize(registers), registers, NULL);
105 void StoreArrayLiteralElementDescriptor::Initialize(
106 CallInterfaceDescriptorData* data) {
107 Register registers[] = {cp, a3, a0};
108 data->Initialize(arraysize(registers), registers, NULL);
112 void CallFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
113 Register registers[] = {cp, a1};
114 data->Initialize(arraysize(registers), registers, NULL);
118 void CallFunctionWithFeedbackDescriptor::Initialize(
119 CallInterfaceDescriptorData* data) {
120 Register registers[] = {cp, a1, a3};
121 Representation representations[] = {Representation::Tagged(),
122 Representation::Tagged(),
123 Representation::Smi()};
124 data->Initialize(arraysize(registers), registers, representations);
128 void CallConstructDescriptor::Initialize(CallInterfaceDescriptorData* data) {
129 // a0 : number of arguments
130 // a1 : the function to call
131 // a2 : feedback vector
132 // a3 : (only if a2 is not the megamorphic symbol) slot in feedback
134 // TODO(turbofan): So far we don't gather type feedback and hence skip the
135 // slot parameter, but ArrayConstructStub needs the vector to be undefined.
136 Register registers[] = {cp, a0, a1, a2};
137 data->Initialize(arraysize(registers), registers, NULL);
141 void RegExpConstructResultDescriptor::Initialize(
142 CallInterfaceDescriptorData* data) {
143 Register registers[] = {cp, a2, a1, a0};
144 data->Initialize(arraysize(registers), registers, NULL);
148 void TransitionElementsKindDescriptor::Initialize(
149 CallInterfaceDescriptorData* data) {
150 Register registers[] = {cp, a0, a1};
151 data->Initialize(arraysize(registers), registers, NULL);
155 void AllocateHeapNumberDescriptor::Initialize(
156 CallInterfaceDescriptorData* data) {
159 Register registers[] = {cp};
160 data->Initialize(arraysize(registers), registers, nullptr);
164 void ArrayConstructorConstantArgCountDescriptor::Initialize(
165 CallInterfaceDescriptorData* data) {
168 // a0 -- number of arguments
170 // a2 -- allocation site with elements kind
171 Register registers[] = {cp, a1, a2};
172 data->Initialize(arraysize(registers), registers, NULL);
176 void ArrayConstructorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
177 // stack param count needs (constructor pointer, and single argument)
178 Register registers[] = {cp, a1, a2, a0};
179 Representation representations[] = {
180 Representation::Tagged(), Representation::Tagged(),
181 Representation::Tagged(), Representation::Integer32()};
182 data->Initialize(arraysize(registers), registers, representations);
186 void InternalArrayConstructorConstantArgCountDescriptor::Initialize(
187 CallInterfaceDescriptorData* data) {
190 // a0 -- number of arguments
191 // a1 -- constructor function
192 Register registers[] = {cp, a1};
193 data->Initialize(arraysize(registers), registers, NULL);
197 void InternalArrayConstructorDescriptor::Initialize(
198 CallInterfaceDescriptorData* data) {
199 // stack param count needs (constructor pointer, and single argument)
200 Register registers[] = {cp, a1, a0};
201 Representation representations[] = {Representation::Tagged(),
202 Representation::Tagged(),
203 Representation::Integer32()};
204 data->Initialize(arraysize(registers), registers, representations);
208 void CompareNilDescriptor::Initialize(CallInterfaceDescriptorData* data) {
209 Register registers[] = {cp, a0};
210 data->Initialize(arraysize(registers), registers, NULL);
214 void ToBooleanDescriptor::Initialize(CallInterfaceDescriptorData* data) {
215 Register registers[] = {cp, a0};
216 data->Initialize(arraysize(registers), registers, NULL);
220 void BinaryOpDescriptor::Initialize(CallInterfaceDescriptorData* data) {
221 Register registers[] = {cp, a1, a0};
222 data->Initialize(arraysize(registers), registers, NULL);
226 void BinaryOpWithAllocationSiteDescriptor::Initialize(
227 CallInterfaceDescriptorData* data) {
228 Register registers[] = {cp, a2, a1, a0};
229 data->Initialize(arraysize(registers), registers, NULL);
233 void StringAddDescriptor::Initialize(CallInterfaceDescriptorData* data) {
234 Register registers[] = {cp, a1, a0};
235 data->Initialize(arraysize(registers), registers, NULL);
239 void KeyedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
240 Register registers[] = {
244 Representation representations[] = {
245 Representation::Tagged(), // context
246 Representation::Tagged(), // key
248 data->Initialize(arraysize(registers), registers, representations);
252 void NamedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
253 Register registers[] = {
257 Representation representations[] = {
258 Representation::Tagged(), // context
259 Representation::Tagged(), // name
261 data->Initialize(arraysize(registers), registers, representations);
265 void CallHandlerDescriptor::Initialize(CallInterfaceDescriptorData* data) {
266 Register registers[] = {
270 Representation representations[] = {
271 Representation::Tagged(), // context
272 Representation::Tagged(), // receiver
274 data->Initialize(arraysize(registers), registers, representations);
278 void ArgumentAdaptorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
279 Register registers[] = {
282 a0, // actual number of arguments
283 a2, // expected number of arguments
285 Representation representations[] = {
286 Representation::Tagged(), // context
287 Representation::Tagged(), // JSFunction
288 Representation::Integer32(), // actual number of arguments
289 Representation::Integer32(), // expected number of arguments
291 data->Initialize(arraysize(registers), registers, representations);
295 void ApiFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
296 Register registers[] = {
301 a1, // api_function_address
303 Representation representations[] = {
304 Representation::Tagged(), // context
305 Representation::Tagged(), // callee
306 Representation::Tagged(), // call_data
307 Representation::Tagged(), // holder
308 Representation::External(), // api_function_address
310 data->Initialize(arraysize(registers), registers, representations);
313 } // namespace v8::internal
315 #endif // V8_TARGET_ARCH_MIPS