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