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_MIPS64
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 ElementTransitionAndStoreDescriptor::MapRegister() { return a3; }
35 const Register InstanceofDescriptor::left() { return a0; }
36 const Register InstanceofDescriptor::right() { return a1; }
39 const Register ArgumentsAccessReadDescriptor::index() { return a1; }
40 const Register ArgumentsAccessReadDescriptor::parameter_count() { return a0; }
43 const Register ApiGetterDescriptor::function_address() { return a2; }
46 const Register MathPowTaggedDescriptor::exponent() { return a2; }
49 const Register MathPowIntegerDescriptor::exponent() {
50 return MathPowTaggedDescriptor::exponent();
54 void FastNewClosureDescriptor::Initialize(CallInterfaceDescriptorData* data) {
55 Register registers[] = {cp, a2};
56 data->Initialize(arraysize(registers), registers, NULL);
60 void FastNewContextDescriptor::Initialize(CallInterfaceDescriptorData* data) {
61 Register registers[] = {cp, a1};
62 data->Initialize(arraysize(registers), registers, NULL);
66 void ToNumberDescriptor::Initialize(CallInterfaceDescriptorData* data) {
67 Register registers[] = {cp, a0};
68 data->Initialize(arraysize(registers), registers, NULL);
72 void NumberToStringDescriptor::Initialize(CallInterfaceDescriptorData* data) {
73 Register registers[] = {cp, a0};
74 data->Initialize(arraysize(registers), registers, NULL);
78 void FastCloneShallowArrayDescriptor::Initialize(
79 CallInterfaceDescriptorData* data) {
80 Register registers[] = {cp, a3, a2, a1};
81 Representation representations[] = {
82 Representation::Tagged(), Representation::Tagged(), Representation::Smi(),
83 Representation::Tagged()};
84 data->Initialize(arraysize(registers), registers, representations);
88 void FastCloneShallowObjectDescriptor::Initialize(
89 CallInterfaceDescriptorData* data) {
90 Register registers[] = {cp, a3, a2, a1, a0};
91 data->Initialize(arraysize(registers), registers, NULL);
95 void CreateAllocationSiteDescriptor::Initialize(
96 CallInterfaceDescriptorData* data) {
97 Register registers[] = {cp, a2, a3};
98 data->Initialize(arraysize(registers), registers, NULL);
102 void StoreArrayLiteralElementDescriptor::Initialize(
103 CallInterfaceDescriptorData* data) {
104 Register registers[] = {cp, a3, a0};
105 data->Initialize(arraysize(registers), registers, NULL);
109 void CallFunctionWithFeedbackDescriptor::Initialize(
110 CallInterfaceDescriptorData* data) {
111 Register registers[] = {cp, a1, a3};
112 Representation representations[] = {Representation::Tagged(),
113 Representation::Tagged(),
114 Representation::Smi()};
115 data->Initialize(arraysize(registers), registers, representations);
119 void CallFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
120 Register registers[] = {cp, a1};
121 data->Initialize(arraysize(registers), registers, NULL);
125 void CallConstructDescriptor::Initialize(CallInterfaceDescriptorData* data) {
126 // a0 : number of arguments
127 // a1 : the function to call
128 // a2 : feedback vector
129 // a3 : (only if a2 is not the megamorphic symbol) slot in feedback
131 // TODO(turbofan): So far we don't gather type feedback and hence skip the
132 // slot parameter, but ArrayConstructStub needs the vector to be undefined.
133 Register registers[] = {cp, a0, a1, a2};
134 data->Initialize(arraysize(registers), registers, NULL);
138 void RegExpConstructResultDescriptor::Initialize(
139 CallInterfaceDescriptorData* data) {
140 Register registers[] = {cp, a2, a1, a0};
141 data->Initialize(arraysize(registers), registers, NULL);
145 void TransitionElementsKindDescriptor::Initialize(
146 CallInterfaceDescriptorData* data) {
147 Register registers[] = {cp, a0, a1};
148 data->Initialize(arraysize(registers), registers, NULL);
152 void ArrayConstructorConstantArgCountDescriptor::Initialize(
153 CallInterfaceDescriptorData* data) {
156 // a0 -- number of arguments
158 // a2 -- allocation site with elements kind
159 Register registers[] = {cp, a1, a2};
160 data->Initialize(arraysize(registers), registers, NULL);
164 void ArrayConstructorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
165 // stack param count needs (constructor pointer, and single argument)
166 Register registers[] = {cp, a1, a2, a0};
167 Representation representations[] = {
168 Representation::Tagged(), Representation::Tagged(),
169 Representation::Tagged(), Representation::Integer32()};
170 data->Initialize(arraysize(registers), registers, representations);
174 void InternalArrayConstructorConstantArgCountDescriptor::Initialize(
175 CallInterfaceDescriptorData* data) {
178 // a0 -- number of arguments
179 // a1 -- constructor function
180 Register registers[] = {cp, a1};
181 data->Initialize(arraysize(registers), registers, NULL);
185 void InternalArrayConstructorDescriptor::Initialize(
186 CallInterfaceDescriptorData* data) {
187 // stack param count needs (constructor pointer, and single argument)
188 Register registers[] = {cp, a1, a0};
189 Representation representations[] = {Representation::Tagged(),
190 Representation::Tagged(),
191 Representation::Integer32()};
192 data->Initialize(arraysize(registers), registers, representations);
196 void CompareNilDescriptor::Initialize(CallInterfaceDescriptorData* data) {
197 Register registers[] = {cp, a0};
198 data->Initialize(arraysize(registers), registers, NULL);
202 void ToBooleanDescriptor::Initialize(CallInterfaceDescriptorData* data) {
203 Register registers[] = {cp, a0};
204 data->Initialize(arraysize(registers), registers, NULL);
208 void BinaryOpDescriptor::Initialize(CallInterfaceDescriptorData* data) {
209 Register registers[] = {cp, a1, a0};
210 data->Initialize(arraysize(registers), registers, NULL);
214 void BinaryOpWithAllocationSiteDescriptor::Initialize(
215 CallInterfaceDescriptorData* data) {
216 Register registers[] = {cp, a2, a1, a0};
217 data->Initialize(arraysize(registers), registers, NULL);
221 void StringAddDescriptor::Initialize(CallInterfaceDescriptorData* data) {
222 Register registers[] = {cp, a1, a0};
223 data->Initialize(arraysize(registers), registers, NULL);
227 void KeyedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
228 Register registers[] = {
232 Representation representations[] = {
233 Representation::Tagged(), // context
234 Representation::Tagged(), // key
236 data->Initialize(arraysize(registers), registers, representations);
240 void NamedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
241 Register registers[] = {
245 Representation representations[] = {
246 Representation::Tagged(), // context
247 Representation::Tagged(), // name
249 data->Initialize(arraysize(registers), registers, representations);
253 void CallHandlerDescriptor::Initialize(CallInterfaceDescriptorData* data) {
254 Register registers[] = {
258 Representation representations[] = {
259 Representation::Tagged(), // context
260 Representation::Tagged(), // receiver
262 data->Initialize(arraysize(registers), registers, representations);
266 void ArgumentAdaptorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
267 Register registers[] = {
270 a0, // actual number of arguments
271 a2, // expected number of arguments
273 Representation representations[] = {
274 Representation::Tagged(), // context
275 Representation::Tagged(), // JSFunction
276 Representation::Integer32(), // actual number of arguments
277 Representation::Integer32(), // expected number of arguments
279 data->Initialize(arraysize(registers), registers, representations);
283 void ApiFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
284 Register registers[] = {
289 a1, // api_function_address
291 Representation representations[] = {
292 Representation::Tagged(), // context
293 Representation::Tagged(), // callee
294 Representation::Tagged(), // call_data
295 Representation::Tagged(), // holder
296 Representation::External(), // api_function_address
298 data->Initialize(arraysize(registers), registers, representations);
301 } // namespace v8::internal
303 #endif // V8_TARGET_ARCH_MIPS64