OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #if V8_TARGET_ARCH_ARM64 | 7 #if V8_TARGET_ARCH_ARM64 |
8 | 8 |
9 #include "src/interface-descriptors.h" | 9 #include "src/interface-descriptors.h" |
10 | 10 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 return x11; | 60 return x11; |
61 } | 61 } |
62 | 62 |
63 | 63 |
64 const Register InstanceofDescriptor::right() { | 64 const Register InstanceofDescriptor::right() { |
65 // Constructor function (instanceof rhs). | 65 // Constructor function (instanceof rhs). |
66 return x10; | 66 return x10; |
67 } | 67 } |
68 | 68 |
69 | 69 |
70 void FastNewClosureDescriptor::Initialize(Isolate* isolate) { | 70 void FastNewClosureDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
71 // cp: context | 71 // cp: context |
72 // x2: function info | 72 // x2: function info |
73 Register registers[] = {cp, x2}; | 73 Register registers[] = {cp, x2}; |
74 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 74 data->Initialize(arraysize(registers), registers, NULL); |
75 } | 75 } |
76 | 76 |
77 | 77 |
78 void FastNewContextDescriptor::Initialize(Isolate* isolate) { | 78 void FastNewContextDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
79 // cp: context | 79 // cp: context |
80 // x1: function | 80 // x1: function |
81 Register registers[] = {cp, x1}; | 81 Register registers[] = {cp, x1}; |
82 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 82 data->Initialize(arraysize(registers), registers, NULL); |
83 } | 83 } |
84 | 84 |
85 | 85 |
86 void ToNumberDescriptor::Initialize(Isolate* isolate) { | 86 void ToNumberDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
87 // cp: context | 87 // cp: context |
88 // x0: value | 88 // x0: value |
89 Register registers[] = {cp, x0}; | 89 Register registers[] = {cp, x0}; |
90 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 90 data->Initialize(arraysize(registers), registers, NULL); |
91 } | 91 } |
92 | 92 |
93 | 93 |
94 void NumberToStringDescriptor::Initialize(Isolate* isolate) { | 94 void NumberToStringDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
95 // cp: context | 95 // cp: context |
96 // x0: value | 96 // x0: value |
97 Register registers[] = {cp, x0}; | 97 Register registers[] = {cp, x0}; |
98 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 98 data->Initialize(arraysize(registers), registers, NULL); |
99 } | 99 } |
100 | 100 |
101 | 101 |
102 void FastCloneShallowArrayDescriptor::Initialize(Isolate* isolate) { | 102 void FastCloneShallowArrayDescriptor::Initialize( |
| 103 CallInterfaceDescriptorData* data) { |
103 // cp: context | 104 // cp: context |
104 // x3: array literals array | 105 // x3: array literals array |
105 // x2: array literal index | 106 // x2: array literal index |
106 // x1: constant elements | 107 // x1: constant elements |
107 Register registers[] = {cp, x3, x2, x1}; | 108 Register registers[] = {cp, x3, x2, x1}; |
108 Representation representations[] = { | 109 Representation representations[] = { |
109 Representation::Tagged(), Representation::Tagged(), Representation::Smi(), | 110 Representation::Tagged(), Representation::Tagged(), Representation::Smi(), |
110 Representation::Tagged()}; | 111 Representation::Tagged()}; |
111 InitializeData(isolate, key(), arraysize(registers), registers, | 112 data->Initialize(arraysize(registers), registers, representations); |
112 representations); | |
113 } | 113 } |
114 | 114 |
115 | 115 |
116 void FastCloneShallowObjectDescriptor::Initialize(Isolate* isolate) { | 116 void FastCloneShallowObjectDescriptor::Initialize( |
| 117 CallInterfaceDescriptorData* data) { |
117 // cp: context | 118 // cp: context |
118 // x3: object literals array | 119 // x3: object literals array |
119 // x2: object literal index | 120 // x2: object literal index |
120 // x1: constant properties | 121 // x1: constant properties |
121 // x0: object literal flags | 122 // x0: object literal flags |
122 Register registers[] = {cp, x3, x2, x1, x0}; | 123 Register registers[] = {cp, x3, x2, x1, x0}; |
123 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 124 data->Initialize(arraysize(registers), registers, NULL); |
124 } | 125 } |
125 | 126 |
126 | 127 |
127 void CreateAllocationSiteDescriptor::Initialize(Isolate* isolate) { | 128 void CreateAllocationSiteDescriptor::Initialize( |
| 129 CallInterfaceDescriptorData* data) { |
128 // cp: context | 130 // cp: context |
129 // x2: feedback vector | 131 // x2: feedback vector |
130 // x3: call feedback slot | 132 // x3: call feedback slot |
131 Register registers[] = {cp, x2, x3}; | 133 Register registers[] = {cp, x2, x3}; |
132 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 134 data->Initialize(arraysize(registers), registers, NULL); |
133 } | 135 } |
134 | 136 |
135 | 137 |
136 void CallFunctionDescriptor::Initialize(Isolate* isolate) { | 138 void CallFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
137 // x1 function the function to call | 139 // x1 function the function to call |
138 Register registers[] = {cp, x1}; | 140 Register registers[] = {cp, x1}; |
139 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 141 data->Initialize(arraysize(registers), registers, NULL); |
140 } | 142 } |
141 | 143 |
142 | 144 |
143 void CallConstructDescriptor::Initialize(Isolate* isolate) { | 145 void CallConstructDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
144 // x0 : number of arguments | 146 // x0 : number of arguments |
145 // x1 : the function to call | 147 // x1 : the function to call |
146 // x2 : feedback vector | 148 // x2 : feedback vector |
147 // x3 : slot in feedback vector (smi) (if r2 is not the megamorphic symbol) | 149 // x3 : slot in feedback vector (smi) (if r2 is not the megamorphic symbol) |
148 // TODO(turbofan): So far we don't gather type feedback and hence skip the | 150 // TODO(turbofan): So far we don't gather type feedback and hence skip the |
149 // slot parameter, but ArrayConstructStub needs the vector to be undefined. | 151 // slot parameter, but ArrayConstructStub needs the vector to be undefined. |
150 Register registers[] = {cp, x0, x1, x2}; | 152 Register registers[] = {cp, x0, x1, x2}; |
151 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 153 data->Initialize(arraysize(registers), registers, NULL); |
152 } | 154 } |
153 | 155 |
154 | 156 |
155 void RegExpConstructResultDescriptor::Initialize(Isolate* isolate) { | 157 void RegExpConstructResultDescriptor::Initialize( |
| 158 CallInterfaceDescriptorData* data) { |
156 // cp: context | 159 // cp: context |
157 // x2: length | 160 // x2: length |
158 // x1: index (of last match) | 161 // x1: index (of last match) |
159 // x0: string | 162 // x0: string |
160 Register registers[] = {cp, x2, x1, x0}; | 163 Register registers[] = {cp, x2, x1, x0}; |
161 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 164 data->Initialize(arraysize(registers), registers, NULL); |
162 } | 165 } |
163 | 166 |
164 | 167 |
165 void TransitionElementsKindDescriptor::Initialize(Isolate* isolate) { | 168 void TransitionElementsKindDescriptor::Initialize( |
| 169 CallInterfaceDescriptorData* data) { |
166 // cp: context | 170 // cp: context |
167 // x0: value (js_array) | 171 // x0: value (js_array) |
168 // x1: to_map | 172 // x1: to_map |
169 Register registers[] = {cp, x0, x1}; | 173 Register registers[] = {cp, x0, x1}; |
170 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 174 data->Initialize(arraysize(registers), registers, NULL); |
171 } | 175 } |
172 | 176 |
173 | 177 |
174 void ArrayConstructorConstantArgCountDescriptor::Initialize(Isolate* isolate) { | 178 void ArrayConstructorConstantArgCountDescriptor::Initialize( |
| 179 CallInterfaceDescriptorData* data) { |
175 // cp: context | 180 // cp: context |
176 // x1: function | 181 // x1: function |
177 // x2: allocation site with elements kind | 182 // x2: allocation site with elements kind |
178 // x0: number of arguments to the constructor function | 183 // x0: number of arguments to the constructor function |
179 Register registers[] = {cp, x1, x2}; | 184 Register registers[] = {cp, x1, x2}; |
180 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 185 data->Initialize(arraysize(registers), registers, NULL); |
181 } | 186 } |
182 | 187 |
183 | 188 |
184 void ArrayConstructorDescriptor::Initialize(Isolate* isolate) { | 189 void ArrayConstructorDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
185 // stack param count needs (constructor pointer, and single argument) | 190 // stack param count needs (constructor pointer, and single argument) |
186 Register registers[] = {cp, x1, x2, x0}; | 191 Register registers[] = {cp, x1, x2, x0}; |
187 Representation representations[] = { | 192 Representation representations[] = { |
188 Representation::Tagged(), Representation::Tagged(), | 193 Representation::Tagged(), Representation::Tagged(), |
189 Representation::Tagged(), Representation::Integer32()}; | 194 Representation::Tagged(), Representation::Integer32()}; |
190 InitializeData(isolate, key(), arraysize(registers), registers, | 195 data->Initialize(arraysize(registers), registers, representations); |
191 representations); | |
192 } | 196 } |
193 | 197 |
194 | 198 |
195 void InternalArrayConstructorConstantArgCountDescriptor::Initialize( | 199 void InternalArrayConstructorConstantArgCountDescriptor::Initialize( |
196 Isolate* isolate) { | 200 CallInterfaceDescriptorData* data) { |
197 // cp: context | 201 // cp: context |
198 // x1: constructor function | 202 // x1: constructor function |
199 // x0: number of arguments to the constructor function | 203 // x0: number of arguments to the constructor function |
200 Register registers[] = {cp, x1}; | 204 Register registers[] = {cp, x1}; |
201 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 205 data->Initialize(arraysize(registers), registers, NULL); |
202 } | 206 } |
203 | 207 |
204 | 208 |
205 void InternalArrayConstructorDescriptor::Initialize(Isolate* isolate) { | 209 void InternalArrayConstructorDescriptor::Initialize( |
| 210 CallInterfaceDescriptorData* data) { |
206 // stack param count needs (constructor pointer, and single argument) | 211 // stack param count needs (constructor pointer, and single argument) |
207 Register registers[] = {cp, x1, x0}; | 212 Register registers[] = {cp, x1, x0}; |
208 Representation representations[] = {Representation::Tagged(), | 213 Representation representations[] = {Representation::Tagged(), |
209 Representation::Tagged(), | 214 Representation::Tagged(), |
210 Representation::Integer32()}; | 215 Representation::Integer32()}; |
211 InitializeData(isolate, key(), arraysize(registers), registers, | 216 data->Initialize(arraysize(registers), registers, representations); |
212 representations); | |
213 } | 217 } |
214 | 218 |
215 | 219 |
216 void CompareNilDescriptor::Initialize(Isolate* isolate) { | 220 void CompareNilDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
217 // cp: context | 221 // cp: context |
218 // x0: value to compare | 222 // x0: value to compare |
219 Register registers[] = {cp, x0}; | 223 Register registers[] = {cp, x0}; |
220 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 224 data->Initialize(arraysize(registers), registers, NULL); |
221 } | 225 } |
222 | 226 |
223 | 227 |
224 void ToBooleanDescriptor::Initialize(Isolate* isolate) { | 228 void ToBooleanDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
225 // cp: context | 229 // cp: context |
226 // x0: value | 230 // x0: value |
227 Register registers[] = {cp, x0}; | 231 Register registers[] = {cp, x0}; |
228 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 232 data->Initialize(arraysize(registers), registers, NULL); |
229 } | 233 } |
230 | 234 |
231 | 235 |
232 void BinaryOpDescriptor::Initialize(Isolate* isolate) { | 236 void BinaryOpDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
233 // cp: context | 237 // cp: context |
234 // x1: left operand | 238 // x1: left operand |
235 // x0: right operand | 239 // x0: right operand |
236 Register registers[] = {cp, x1, x0}; | 240 Register registers[] = {cp, x1, x0}; |
237 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 241 data->Initialize(arraysize(registers), registers, NULL); |
238 } | 242 } |
239 | 243 |
240 | 244 |
241 void BinaryOpWithAllocationSiteDescriptor::Initialize(Isolate* isolate) { | 245 void BinaryOpWithAllocationSiteDescriptor::Initialize( |
| 246 CallInterfaceDescriptorData* data) { |
242 // cp: context | 247 // cp: context |
243 // x2: allocation site | 248 // x2: allocation site |
244 // x1: left operand | 249 // x1: left operand |
245 // x0: right operand | 250 // x0: right operand |
246 Register registers[] = {cp, x2, x1, x0}; | 251 Register registers[] = {cp, x2, x1, x0}; |
247 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 252 data->Initialize(arraysize(registers), registers, NULL); |
248 } | 253 } |
249 | 254 |
250 | 255 |
251 void StringAddDescriptor::Initialize(Isolate* isolate) { | 256 void StringAddDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
252 // cp: context | 257 // cp: context |
253 // x1: left operand | 258 // x1: left operand |
254 // x0: right operand | 259 // x0: right operand |
255 Register registers[] = {cp, x1, x0}; | 260 Register registers[] = {cp, x1, x0}; |
256 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 261 data->Initialize(arraysize(registers), registers, NULL); |
257 } | 262 } |
258 | 263 |
259 | 264 |
260 void KeyedDescriptor::Initialize(Isolate* isolate) { | 265 void KeyedDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
261 static PlatformInterfaceDescriptor noInlineDescriptor = | 266 static PlatformInterfaceDescriptor noInlineDescriptor = |
262 PlatformInterfaceDescriptor(NEVER_INLINE_TARGET_ADDRESS); | 267 PlatformInterfaceDescriptor(NEVER_INLINE_TARGET_ADDRESS); |
263 | 268 |
264 Register registers[] = { | 269 Register registers[] = { |
265 cp, // context | 270 cp, // context |
266 x2, // key | 271 x2, // key |
267 }; | 272 }; |
268 Representation representations[] = { | 273 Representation representations[] = { |
269 Representation::Tagged(), // context | 274 Representation::Tagged(), // context |
270 Representation::Tagged(), // key | 275 Representation::Tagged(), // key |
271 }; | 276 }; |
272 InitializeData(isolate, key(), arraysize(registers), registers, | 277 data->Initialize(arraysize(registers), registers, representations, |
273 representations, &noInlineDescriptor); | 278 &noInlineDescriptor); |
274 } | 279 } |
275 | 280 |
276 | 281 |
277 void NamedDescriptor::Initialize(Isolate* isolate) { | 282 void NamedDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
278 static PlatformInterfaceDescriptor noInlineDescriptor = | 283 static PlatformInterfaceDescriptor noInlineDescriptor = |
279 PlatformInterfaceDescriptor(NEVER_INLINE_TARGET_ADDRESS); | 284 PlatformInterfaceDescriptor(NEVER_INLINE_TARGET_ADDRESS); |
280 | 285 |
281 Register registers[] = { | 286 Register registers[] = { |
282 cp, // context | 287 cp, // context |
283 x2, // name | 288 x2, // name |
284 }; | 289 }; |
285 Representation representations[] = { | 290 Representation representations[] = { |
286 Representation::Tagged(), // context | 291 Representation::Tagged(), // context |
287 Representation::Tagged(), // name | 292 Representation::Tagged(), // name |
288 }; | 293 }; |
289 InitializeData(isolate, key(), arraysize(registers), registers, | 294 data->Initialize(arraysize(registers), registers, representations, |
290 representations, &noInlineDescriptor); | 295 &noInlineDescriptor); |
291 } | 296 } |
292 | 297 |
293 | 298 |
294 void CallHandlerDescriptor::Initialize(Isolate* isolate) { | 299 void CallHandlerDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
295 static PlatformInterfaceDescriptor default_descriptor = | 300 static PlatformInterfaceDescriptor default_descriptor = |
296 PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS); | 301 PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS); |
297 | 302 |
298 Register registers[] = { | 303 Register registers[] = { |
299 cp, // context | 304 cp, // context |
300 x0, // receiver | 305 x0, // receiver |
301 }; | 306 }; |
302 Representation representations[] = { | 307 Representation representations[] = { |
303 Representation::Tagged(), // context | 308 Representation::Tagged(), // context |
304 Representation::Tagged(), // receiver | 309 Representation::Tagged(), // receiver |
305 }; | 310 }; |
306 InitializeData(isolate, key(), arraysize(registers), registers, | 311 data->Initialize(arraysize(registers), registers, representations, |
307 representations, &default_descriptor); | 312 &default_descriptor); |
308 } | 313 } |
309 | 314 |
310 | 315 |
311 void ArgumentAdaptorDescriptor::Initialize(Isolate* isolate) { | 316 void ArgumentAdaptorDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
312 static PlatformInterfaceDescriptor default_descriptor = | 317 static PlatformInterfaceDescriptor default_descriptor = |
313 PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS); | 318 PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS); |
314 | 319 |
315 Register registers[] = { | 320 Register registers[] = { |
316 cp, // context | 321 cp, // context |
317 x1, // JSFunction | 322 x1, // JSFunction |
318 x0, // actual number of arguments | 323 x0, // actual number of arguments |
319 x2, // expected number of arguments | 324 x2, // expected number of arguments |
320 }; | 325 }; |
321 Representation representations[] = { | 326 Representation representations[] = { |
322 Representation::Tagged(), // context | 327 Representation::Tagged(), // context |
323 Representation::Tagged(), // JSFunction | 328 Representation::Tagged(), // JSFunction |
324 Representation::Integer32(), // actual number of arguments | 329 Representation::Integer32(), // actual number of arguments |
325 Representation::Integer32(), // expected number of arguments | 330 Representation::Integer32(), // expected number of arguments |
326 }; | 331 }; |
327 InitializeData(isolate, key(), arraysize(registers), registers, | 332 data->Initialize(arraysize(registers), registers, representations, |
328 representations, &default_descriptor); | 333 &default_descriptor); |
329 } | 334 } |
330 | 335 |
331 | 336 |
332 void ApiFunctionDescriptor::Initialize(Isolate* isolate) { | 337 void ApiFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
333 static PlatformInterfaceDescriptor default_descriptor = | 338 static PlatformInterfaceDescriptor default_descriptor = |
334 PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS); | 339 PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS); |
335 | 340 |
336 Register registers[] = { | 341 Register registers[] = { |
337 cp, // context | 342 cp, // context |
338 x0, // callee | 343 x0, // callee |
339 x4, // call_data | 344 x4, // call_data |
340 x2, // holder | 345 x2, // holder |
341 x1, // api_function_address | 346 x1, // api_function_address |
342 }; | 347 }; |
343 Representation representations[] = { | 348 Representation representations[] = { |
344 Representation::Tagged(), // context | 349 Representation::Tagged(), // context |
345 Representation::Tagged(), // callee | 350 Representation::Tagged(), // callee |
346 Representation::Tagged(), // call_data | 351 Representation::Tagged(), // call_data |
347 Representation::Tagged(), // holder | 352 Representation::Tagged(), // holder |
348 Representation::External(), // api_function_address | 353 Representation::External(), // api_function_address |
349 }; | 354 }; |
350 InitializeData(isolate, key(), arraysize(registers), registers, | 355 data->Initialize(arraysize(registers), registers, representations, |
351 representations, &default_descriptor); | 356 &default_descriptor); |
352 } | 357 } |
353 } | 358 } |
354 } // namespace v8::internal | 359 } // namespace v8::internal |
355 | 360 |
356 #endif // V8_TARGET_ARCH_ARM64 | 361 #endif // V8_TARGET_ARCH_ARM64 |
OLD | NEW |