V8 API Reference, 7.2.502.16 (for Deno 0.2.4)
interface-descriptors-mips.cc
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.
4 
5 #if V8_TARGET_ARCH_MIPS
6 
7 #include "src/interface-descriptors.h"
8 #include "src/macro-assembler.h"
9 
10 namespace v8 {
11 namespace internal {
12 
13 const Register CallInterfaceDescriptor::ContextRegister() { return cp; }
14 
15 void CallInterfaceDescriptor::DefaultInitializePlatformSpecific(
16  CallInterfaceDescriptorData* data, int register_parameter_count) {
17  const Register default_stub_registers[] = {a0, a1, a2, a3, t0};
18  CHECK_LE(static_cast<size_t>(register_parameter_count),
19  arraysize(default_stub_registers));
20  data->InitializePlatformSpecific(register_parameter_count,
21  default_stub_registers);
22 }
23 
24 void RecordWriteDescriptor::InitializePlatformSpecific(
25  CallInterfaceDescriptorData* data) {
26  const Register default_stub_registers[] = {a0, a1, a2, a3, kReturnRegister0};
27 
28  data->RestrictAllocatableRegisters(default_stub_registers,
29  arraysize(default_stub_registers));
30 
31  CHECK_LE(static_cast<size_t>(kParameterCount),
32  arraysize(default_stub_registers));
33  data->InitializePlatformSpecific(kParameterCount, default_stub_registers);
34 }
35 
36 const Register FastNewFunctionContextDescriptor::ScopeInfoRegister() {
37  return a1;
38 }
39 const Register FastNewFunctionContextDescriptor::SlotsRegister() { return a0; }
40 
41 const Register LoadDescriptor::ReceiverRegister() { return a1; }
42 const Register LoadDescriptor::NameRegister() { return a2; }
43 const Register LoadDescriptor::SlotRegister() { return a0; }
44 
45 const Register LoadWithVectorDescriptor::VectorRegister() { return a3; }
46 
47 const Register StoreDescriptor::ReceiverRegister() { return a1; }
48 const Register StoreDescriptor::NameRegister() { return a2; }
49 const Register StoreDescriptor::ValueRegister() { return a0; }
50 const Register StoreDescriptor::SlotRegister() { return t0; }
51 
52 const Register StoreWithVectorDescriptor::VectorRegister() { return a3; }
53 
54 const Register StoreTransitionDescriptor::SlotRegister() { return t0; }
55 const Register StoreTransitionDescriptor::VectorRegister() { return a3; }
56 const Register StoreTransitionDescriptor::MapRegister() { return t1; }
57 
58 const Register ApiGetterDescriptor::HolderRegister() { return a0; }
59 const Register ApiGetterDescriptor::CallbackRegister() { return a3; }
60 
61 const Register GrowArrayElementsDescriptor::ObjectRegister() { return a0; }
62 const Register GrowArrayElementsDescriptor::KeyRegister() { return a3; }
63 
64 
65 // static
66 const Register TypeConversionDescriptor::ArgumentRegister() { return a0; }
67 
68 void TypeofDescriptor::InitializePlatformSpecific(
69  CallInterfaceDescriptorData* data) {
70  Register registers[] = {a3};
71  data->InitializePlatformSpecific(arraysize(registers), registers);
72 }
73 
74 void CallFunctionDescriptor::InitializePlatformSpecific(
75  CallInterfaceDescriptorData* data) {
76  Register registers[] = {a1};
77  data->InitializePlatformSpecific(arraysize(registers), registers);
78 }
79 
80 void CallTrampolineDescriptor::InitializePlatformSpecific(
81  CallInterfaceDescriptorData* data) {
82  // a1: target
83  // a0: number of arguments
84  Register registers[] = {a1, a0};
85  data->InitializePlatformSpecific(arraysize(registers), registers);
86 }
87 
88 void CallVarargsDescriptor::InitializePlatformSpecific(
89  CallInterfaceDescriptorData* data) {
90  // a0 : number of arguments (on the stack, not including receiver)
91  // a1 : the target to call
92  // t0 : arguments list length (untagged)
93  // a2 : arguments list (FixedArray)
94  Register registers[] = {a1, a0, t0, a2};
95  data->InitializePlatformSpecific(arraysize(registers), registers);
96 }
97 
98 void CallForwardVarargsDescriptor::InitializePlatformSpecific(
99  CallInterfaceDescriptorData* data) {
100  // a1: the target to call
101  // a0: number of arguments
102  // a2: start index (to support rest parameters)
103  Register registers[] = {a1, a0, a2};
104  data->InitializePlatformSpecific(arraysize(registers), registers);
105 }
106 
107 void CallWithSpreadDescriptor::InitializePlatformSpecific(
108  CallInterfaceDescriptorData* data) {
109  // a0 : number of arguments (on the stack, not including receiver)
110  // a1 : the target to call
111  // a2 : the object to spread
112  Register registers[] = {a1, a0, a2};
113  data->InitializePlatformSpecific(arraysize(registers), registers);
114 }
115 
116 void CallWithArrayLikeDescriptor::InitializePlatformSpecific(
117  CallInterfaceDescriptorData* data) {
118  // a1 : the target to call
119  // a2 : the arguments list
120  Register registers[] = {a1, a2};
121  data->InitializePlatformSpecific(arraysize(registers), registers);
122 }
123 
124 void ConstructVarargsDescriptor::InitializePlatformSpecific(
125  CallInterfaceDescriptorData* data) {
126  // a0 : number of arguments (on the stack, not including receiver)
127  // a1 : the target to call
128  // a3 : the new target
129  // t0 : arguments list length (untagged)
130  // a2 : arguments list (FixedArray)
131  Register registers[] = {a1, a3, a0, t0, a2};
132  data->InitializePlatformSpecific(arraysize(registers), registers);
133 }
134 
135 void ConstructForwardVarargsDescriptor::InitializePlatformSpecific(
136  CallInterfaceDescriptorData* data) {
137  // a1: the target to call
138  // a3: new target
139  // a0: number of arguments
140  // a2: start index (to support rest parameters)
141  Register registers[] = {a1, a3, a0, a2};
142  data->InitializePlatformSpecific(arraysize(registers), registers);
143 }
144 
145 void ConstructWithSpreadDescriptor::InitializePlatformSpecific(
146  CallInterfaceDescriptorData* data) {
147  // a0 : number of arguments (on the stack, not including receiver)
148  // a1 : the target to call
149  // a3 : the new target
150  // a2 : the object to spread
151  Register registers[] = {a1, a3, a0, a2};
152  data->InitializePlatformSpecific(arraysize(registers), registers);
153 }
154 
155 void ConstructWithArrayLikeDescriptor::InitializePlatformSpecific(
156  CallInterfaceDescriptorData* data) {
157  // a1 : the target to call
158  // a3 : the new target
159  // a2 : the arguments list
160  Register registers[] = {a1, a3, a2};
161  data->InitializePlatformSpecific(arraysize(registers), registers);
162 }
163 
164 void ConstructStubDescriptor::InitializePlatformSpecific(
165  CallInterfaceDescriptorData* data) {
166  // a1: target
167  // a3: new target
168  // a0: number of arguments
169  // a2: allocation site or undefined
170  Register registers[] = {a1, a3, a0, a2};
171  data->InitializePlatformSpecific(arraysize(registers), registers);
172 }
173 
174 void AbortDescriptor::InitializePlatformSpecific(
175  CallInterfaceDescriptorData* data) {
176  Register registers[] = {a0};
177  data->InitializePlatformSpecific(arraysize(registers), registers);
178 }
179 
180 void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
181  CallInterfaceDescriptorData* data) {
182  // register state
183  data->InitializePlatformSpecific(0, nullptr);
184 }
185 
186 void CompareDescriptor::InitializePlatformSpecific(
187  CallInterfaceDescriptorData* data) {
188  Register registers[] = {a1, a0};
189  data->InitializePlatformSpecific(arraysize(registers), registers);
190 }
191 
192 void BinaryOpDescriptor::InitializePlatformSpecific(
193  CallInterfaceDescriptorData* data) {
194  Register registers[] = {a1, a0};
195  data->InitializePlatformSpecific(arraysize(registers), registers);
196 }
197 
198 void ArgumentsAdaptorDescriptor::InitializePlatformSpecific(
199  CallInterfaceDescriptorData* data) {
200  Register registers[] = {
201  a1, // JSFunction
202  a3, // the new target
203  a0, // actual number of arguments
204  a2, // expected number of arguments
205  };
206  data->InitializePlatformSpecific(arraysize(registers), registers);
207 }
208 
209 void ApiCallbackDescriptor::InitializePlatformSpecific(
210  CallInterfaceDescriptorData* data) {
211  Register registers[] = {
212  JavaScriptFrame::context_register(), // callee context
213  t0, // call_data
214  a2, // holder
215  a1, // api_function_address
216  };
217  data->InitializePlatformSpecific(arraysize(registers), registers);
218 }
219 
220 void InterpreterDispatchDescriptor::InitializePlatformSpecific(
221  CallInterfaceDescriptorData* data) {
222  Register registers[] = {
223  kInterpreterAccumulatorRegister, kInterpreterBytecodeOffsetRegister,
224  kInterpreterBytecodeArrayRegister, kInterpreterDispatchTableRegister};
225  data->InitializePlatformSpecific(arraysize(registers), registers);
226 }
227 
228 void InterpreterPushArgsThenCallDescriptor::InitializePlatformSpecific(
229  CallInterfaceDescriptorData* data) {
230  Register registers[] = {
231  a0, // argument count (not including receiver)
232  a2, // address of first argument
233  a1 // the target callable to be call
234  };
235  data->InitializePlatformSpecific(arraysize(registers), registers);
236 }
237 
238 void InterpreterPushArgsThenConstructDescriptor::InitializePlatformSpecific(
239  CallInterfaceDescriptorData* data) {
240  Register registers[] = {
241  a0, // argument count (not including receiver)
242  t4, // address of the first argument
243  a1, // constructor to call
244  a3, // new target
245  a2, // allocation site feedback if available, undefined otherwise
246  };
247  data->InitializePlatformSpecific(arraysize(registers), registers);
248 }
249 
250 void ResumeGeneratorDescriptor::InitializePlatformSpecific(
251  CallInterfaceDescriptorData* data) {
252  Register registers[] = {
253  v0, // the value to pass to the generator
254  a1 // the JSGeneratorObject to resume
255  };
256  data->InitializePlatformSpecific(arraysize(registers), registers);
257 }
258 
259 void FrameDropperTrampolineDescriptor::InitializePlatformSpecific(
260  CallInterfaceDescriptorData* data) {
261  Register registers[] = {
262  a1, // loaded new FP
263  };
264  data->InitializePlatformSpecific(arraysize(registers), registers);
265 }
266 
267 } // namespace internal
268 } // namespace v8
269 
270 #endif // V8_TARGET_ARCH_MIPS
Definition: libplatform.h:13