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_X64 | 7 #if V8_TARGET_ARCH_X64 |
8 | 8 |
9 #include "src/interface-descriptors.h" | 9 #include "src/interface-descriptors.h" |
10 | 10 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
59 return MathPowTaggedDescriptor::exponent(); | 59 return MathPowTaggedDescriptor::exponent(); |
60 } | 60 } |
61 | 61 |
62 | 62 |
63 const Register GrowArrayElementsDescriptor::ObjectRegister() { return rax; } | 63 const Register GrowArrayElementsDescriptor::ObjectRegister() { return rax; } |
64 const Register GrowArrayElementsDescriptor::KeyRegister() { return rbx; } | 64 const Register GrowArrayElementsDescriptor::KeyRegister() { return rbx; } |
65 | 65 |
66 | 66 |
67 void FastNewClosureDescriptor::InitializePlatformSpecific( | 67 void FastNewClosureDescriptor::InitializePlatformSpecific( |
68 CallInterfaceDescriptorData* data) { | 68 CallInterfaceDescriptorData* data) { |
69 Register registers[] = {rsi, rbx}; | 69 Register registers[] = {rbx}; |
70 data->InitializePlatformSpecific(arraysize(registers), registers); | 70 data->InitializePlatformSpecific(arraysize(registers), registers); |
71 } | 71 } |
72 | 72 |
73 | 73 |
74 void FastNewContextDescriptor::InitializePlatformSpecific( | 74 void FastNewContextDescriptor::InitializePlatformSpecific( |
75 CallInterfaceDescriptorData* data) { | 75 CallInterfaceDescriptorData* data) { |
76 Register registers[] = {rsi, rdi}; | 76 Register registers[] = {rdi}; |
77 data->InitializePlatformSpecific(arraysize(registers), registers); | 77 data->InitializePlatformSpecific(arraysize(registers), registers); |
78 } | 78 } |
79 | 79 |
80 | 80 |
81 void TypeofDescriptor::InitializePlatformSpecific( | 81 void TypeofDescriptor::InitializePlatformSpecific( |
82 CallInterfaceDescriptorData* data) { | 82 CallInterfaceDescriptorData* data) { |
83 Register registers[] = {rsi, rbx}; | 83 Register registers[] = {rbx}; |
84 data->InitializePlatformSpecific(arraysize(registers), registers); | 84 data->InitializePlatformSpecific(arraysize(registers), registers); |
85 } | 85 } |
86 | 86 |
87 | 87 |
88 void ToNumberDescriptor::InitializePlatformSpecific( | 88 void ToNumberDescriptor::InitializePlatformSpecific( |
89 CallInterfaceDescriptorData* data) { | 89 CallInterfaceDescriptorData* data) { |
90 // ToNumberStub invokes a function, and therefore needs a context. | 90 // ToNumberStub invokes a function, and therefore needs a context. |
91 Register registers[] = {rsi, rax}; | 91 Register registers[] = {rax}; |
92 data->InitializePlatformSpecific(arraysize(registers), registers); | 92 data->InitializePlatformSpecific(arraysize(registers), registers); |
93 } | 93 } |
94 | 94 |
95 | 95 |
96 void NumberToStringDescriptor::InitializePlatformSpecific( | 96 void NumberToStringDescriptor::InitializePlatformSpecific( |
97 CallInterfaceDescriptorData* data) { | 97 CallInterfaceDescriptorData* data) { |
98 Register registers[] = {rsi, rax}; | 98 Register registers[] = {rax}; |
99 data->InitializePlatformSpecific(arraysize(registers), registers); | 99 data->InitializePlatformSpecific(arraysize(registers), registers); |
100 } | 100 } |
101 | 101 |
102 | 102 |
103 void FastCloneShallowArrayDescriptor::InitializePlatformSpecific( | 103 void FastCloneShallowArrayDescriptor::InitializePlatformSpecific( |
104 CallInterfaceDescriptorData* data) { | 104 CallInterfaceDescriptorData* data) { |
105 Register registers[] = {rsi, rax, rbx, rcx}; | 105 Register registers[] = {rax, rbx, rcx}; |
106 data->InitializePlatformSpecific(arraysize(registers), registers); | 106 data->InitializePlatformSpecific(arraysize(registers), registers); |
107 } | 107 } |
108 | 108 |
109 | 109 |
110 void FastCloneShallowObjectDescriptor::InitializePlatformSpecific( | 110 void FastCloneShallowObjectDescriptor::InitializePlatformSpecific( |
111 CallInterfaceDescriptorData* data) { | 111 CallInterfaceDescriptorData* data) { |
112 Register registers[] = {rsi, rax, rbx, rcx, rdx}; | 112 Register registers[] = {rax, rbx, rcx, rdx}; |
113 data->InitializePlatformSpecific(arraysize(registers), registers); | 113 data->InitializePlatformSpecific(arraysize(registers), registers); |
114 } | 114 } |
115 | 115 |
116 | 116 |
117 void CreateAllocationSiteDescriptor::InitializePlatformSpecific( | 117 void CreateAllocationSiteDescriptor::InitializePlatformSpecific( |
118 CallInterfaceDescriptorData* data) { | 118 CallInterfaceDescriptorData* data) { |
119 Register registers[] = {rsi, rbx, rdx}; | 119 Register registers[] = {rbx, rdx}; |
120 data->InitializePlatformSpecific(arraysize(registers), registers); | 120 data->InitializePlatformSpecific(arraysize(registers), registers); |
121 } | 121 } |
122 | 122 |
123 | 123 |
124 void CreateWeakCellDescriptor::InitializePlatformSpecific( | 124 void CreateWeakCellDescriptor::InitializePlatformSpecific( |
125 CallInterfaceDescriptorData* data) { | 125 CallInterfaceDescriptorData* data) { |
126 Register registers[] = {rsi, rbx, rdx, rdi}; | 126 Register registers[] = {rbx, rdx, rdi}; |
127 data->InitializePlatformSpecific(arraysize(registers), registers); | 127 data->InitializePlatformSpecific(arraysize(registers), registers); |
128 } | 128 } |
129 | 129 |
130 | 130 |
131 void StoreArrayLiteralElementDescriptor::InitializePlatformSpecific( | 131 void StoreArrayLiteralElementDescriptor::InitializePlatformSpecific( |
132 CallInterfaceDescriptorData* data) { | 132 CallInterfaceDescriptorData* data) { |
133 Register registers[] = {rsi, rcx, rax}; | 133 Register registers[] = {rcx, rax}; |
134 data->InitializePlatformSpecific(arraysize(registers), registers); | 134 data->InitializePlatformSpecific(arraysize(registers), registers); |
135 } | 135 } |
136 | 136 |
137 | 137 |
138 void CallFunctionDescriptor::InitializePlatformSpecific( | 138 void CallFunctionDescriptor::InitializePlatformSpecific( |
139 CallInterfaceDescriptorData* data) { | 139 CallInterfaceDescriptorData* data) { |
140 Register registers[] = {rsi, rdi}; | 140 Register registers[] = {rdi}; |
141 data->InitializePlatformSpecific(arraysize(registers), registers); | 141 data->InitializePlatformSpecific(arraysize(registers), registers); |
142 } | 142 } |
143 | 143 |
144 | 144 |
145 void CallFunctionWithFeedbackDescriptor::InitializePlatformSpecific( | 145 void CallFunctionWithFeedbackDescriptor::InitializePlatformSpecific( |
146 CallInterfaceDescriptorData* data) { | 146 CallInterfaceDescriptorData* data) { |
147 Register registers[] = {rsi, rdi, rdx}; | 147 Register registers[] = {rdi, rdx}; |
148 data->InitializePlatformSpecific(arraysize(registers), registers); | 148 data->InitializePlatformSpecific(arraysize(registers), registers); |
149 } | 149 } |
150 | 150 |
151 | 151 |
152 void CallFunctionWithFeedbackAndVectorDescriptor::InitializePlatformSpecific( | 152 void CallFunctionWithFeedbackAndVectorDescriptor::InitializePlatformSpecific( |
153 CallInterfaceDescriptorData* data) { | 153 CallInterfaceDescriptorData* data) { |
154 Register registers[] = {rsi, rdi, rdx, rbx}; | 154 Register registers[] = {rdi, rdx, rbx}; |
155 data->InitializePlatformSpecific(arraysize(registers), registers); | 155 data->InitializePlatformSpecific(arraysize(registers), registers); |
156 } | 156 } |
157 | 157 |
158 | 158 |
159 void CallConstructDescriptor::InitializePlatformSpecific( | 159 void CallConstructDescriptor::InitializePlatformSpecific( |
160 CallInterfaceDescriptorData* data) { | 160 CallInterfaceDescriptorData* data) { |
161 // rax : number of arguments | 161 // rax : number of arguments |
162 // rbx : feedback vector | 162 // rbx : feedback vector |
163 // rdx : (only if rbx is not the megamorphic symbol) slot in feedback | 163 // rdx : (only if rbx is not the megamorphic symbol) slot in feedback |
164 // vector (Smi) | 164 // vector (Smi) |
165 // rdi : constructor function | 165 // rdi : constructor function |
166 // TODO(turbofan): So far we don't gather type feedback and hence skip the | 166 // TODO(turbofan): So far we don't gather type feedback and hence skip the |
167 // slot parameter, but ArrayConstructStub needs the vector to be undefined. | 167 // slot parameter, but ArrayConstructStub needs the vector to be undefined. |
168 Register registers[] = {rsi, rax, rdi, rbx}; | 168 Register registers[] = {rax, rdi, rbx}; |
169 data->InitializePlatformSpecific(arraysize(registers), registers); | 169 data->InitializePlatformSpecific(arraysize(registers), registers); |
170 } | 170 } |
171 | 171 |
172 | 172 |
173 void RegExpConstructResultDescriptor::InitializePlatformSpecific( | 173 void RegExpConstructResultDescriptor::InitializePlatformSpecific( |
174 CallInterfaceDescriptorData* data) { | 174 CallInterfaceDescriptorData* data) { |
175 Register registers[] = {rsi, rcx, rbx, rax}; | 175 Register registers[] = {rcx, rbx, rax}; |
176 data->InitializePlatformSpecific(arraysize(registers), registers); | 176 data->InitializePlatformSpecific(arraysize(registers), registers); |
177 } | 177 } |
178 | 178 |
179 | 179 |
180 void TransitionElementsKindDescriptor::InitializePlatformSpecific( | 180 void TransitionElementsKindDescriptor::InitializePlatformSpecific( |
181 CallInterfaceDescriptorData* data) { | 181 CallInterfaceDescriptorData* data) { |
182 Register registers[] = {rsi, rax, rbx}; | 182 Register registers[] = {rax, rbx}; |
183 data->InitializePlatformSpecific(arraysize(registers), registers); | 183 data->InitializePlatformSpecific(arraysize(registers), registers); |
184 } | 184 } |
185 | 185 |
186 | 186 |
187 void AllocateHeapNumberDescriptor::InitializePlatformSpecific( | 187 void AllocateHeapNumberDescriptor::InitializePlatformSpecific( |
188 CallInterfaceDescriptorData* data) { | 188 CallInterfaceDescriptorData* data) { |
189 // register state | 189 data->InitializePlatformSpecific(0, nullptr, nullptr); |
190 // rsi -- context | |
191 Register registers[] = {rsi}; | |
192 data->InitializePlatformSpecific(arraysize(registers), registers, nullptr); | |
193 } | 190 } |
194 | 191 |
195 | 192 |
196 void ArrayConstructorConstantArgCountDescriptor::InitializePlatformSpecific( | 193 void ArrayConstructorConstantArgCountDescriptor::InitializePlatformSpecific( |
197 CallInterfaceDescriptorData* data) { | 194 CallInterfaceDescriptorData* data) { |
198 // register state | 195 // register state |
199 // rax -- number of arguments | 196 // rax -- number of arguments |
200 // rdi -- function | 197 // rdi -- function |
201 // rbx -- allocation site with elements kind | 198 // rbx -- allocation site with elements kind |
202 Register registers[] = {rsi, rdi, rbx}; | 199 Register registers[] = {rdi, rbx}; |
203 data->InitializePlatformSpecific(arraysize(registers), registers); | 200 data->InitializePlatformSpecific(arraysize(registers), registers); |
204 } | 201 } |
205 | 202 |
206 | 203 |
207 void ArrayConstructorDescriptor::InitializePlatformSpecific( | 204 void ArrayConstructorDescriptor::InitializePlatformSpecific( |
208 CallInterfaceDescriptorData* data) { | 205 CallInterfaceDescriptorData* data) { |
209 // stack param count needs (constructor pointer, and single argument) | 206 // stack param count needs (constructor pointer, and single argument) |
210 Register registers[] = {rsi, rdi, rbx, rax}; | 207 Register registers[] = {rdi, rbx, rax}; |
211 data->InitializePlatformSpecific(arraysize(registers), registers); | 208 data->InitializePlatformSpecific(arraysize(registers), registers); |
212 } | 209 } |
213 | 210 |
214 | 211 |
215 void InternalArrayConstructorConstantArgCountDescriptor:: | 212 void InternalArrayConstructorConstantArgCountDescriptor:: |
216 InitializePlatformSpecific(CallInterfaceDescriptorData* data) { | 213 InitializePlatformSpecific(CallInterfaceDescriptorData* data) { |
217 // register state | 214 // register state |
218 // rsi -- context | |
219 // rax -- number of arguments | 215 // rax -- number of arguments |
220 // rdi -- constructor function | 216 // rdi -- constructor function |
221 Register registers[] = {rsi, rdi}; | 217 Register registers[] = {rdi}; |
222 data->InitializePlatformSpecific(arraysize(registers), registers); | 218 data->InitializePlatformSpecific(arraysize(registers), registers); |
223 } | 219 } |
224 | 220 |
225 | 221 |
226 void InternalArrayConstructorDescriptor::InitializePlatformSpecific( | 222 void InternalArrayConstructorDescriptor::InitializePlatformSpecific( |
227 CallInterfaceDescriptorData* data) { | 223 CallInterfaceDescriptorData* data) { |
228 // stack param count needs (constructor pointer, and single argument) | 224 // stack param count needs (constructor pointer, and single argument) |
229 Register registers[] = {rsi, rdi, rax}; | 225 Register registers[] = {rdi, rax}; |
230 data->InitializePlatformSpecific(arraysize(registers), registers); | 226 data->InitializePlatformSpecific(arraysize(registers), registers); |
231 } | 227 } |
232 | 228 |
233 | 229 |
234 void CompareDescriptor::InitializePlatformSpecific( | 230 void CompareDescriptor::InitializePlatformSpecific( |
235 CallInterfaceDescriptorData* data) { | 231 CallInterfaceDescriptorData* data) { |
236 Register registers[] = {rsi, rdx, rax}; | 232 Register registers[] = {rdx, rax}; |
237 data->InitializePlatformSpecific(arraysize(registers), registers); | 233 data->InitializePlatformSpecific(arraysize(registers), registers); |
238 } | 234 } |
239 | 235 |
240 | 236 |
241 void CompareNilDescriptor::InitializePlatformSpecific( | 237 void CompareNilDescriptor::InitializePlatformSpecific( |
242 CallInterfaceDescriptorData* data) { | 238 CallInterfaceDescriptorData* data) { |
243 Register registers[] = {rsi, rax}; | 239 Register registers[] = {rax}; |
244 data->InitializePlatformSpecific(arraysize(registers), registers); | 240 data->InitializePlatformSpecific(arraysize(registers), registers); |
245 } | 241 } |
246 | 242 |
247 | 243 |
248 void ToBooleanDescriptor::InitializePlatformSpecific( | 244 void ToBooleanDescriptor::InitializePlatformSpecific( |
249 CallInterfaceDescriptorData* data) { | 245 CallInterfaceDescriptorData* data) { |
250 Register registers[] = {rsi, rax}; | 246 Register registers[] = {rax}; |
251 data->InitializePlatformSpecific(arraysize(registers), registers); | 247 data->InitializePlatformSpecific(arraysize(registers), registers); |
252 } | 248 } |
253 | 249 |
254 | 250 |
255 void BinaryOpDescriptor::InitializePlatformSpecific( | 251 void BinaryOpDescriptor::InitializePlatformSpecific( |
256 CallInterfaceDescriptorData* data) { | 252 CallInterfaceDescriptorData* data) { |
257 Register registers[] = {rsi, rdx, rax}; | 253 Register registers[] = {rdx, rax}; |
258 data->InitializePlatformSpecific(arraysize(registers), registers); | 254 data->InitializePlatformSpecific(arraysize(registers), registers); |
259 } | 255 } |
260 | 256 |
261 | 257 |
262 void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific( | 258 void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific( |
263 CallInterfaceDescriptorData* data) { | 259 CallInterfaceDescriptorData* data) { |
264 Register registers[] = {rsi, rcx, rdx, rax}; | 260 Register registers[] = {rcx, rdx, rax}; |
265 data->InitializePlatformSpecific(arraysize(registers), registers); | 261 data->InitializePlatformSpecific(arraysize(registers), registers); |
266 } | 262 } |
267 | 263 |
268 | 264 |
269 void StringAddDescriptor::InitializePlatformSpecific( | 265 void StringAddDescriptor::InitializePlatformSpecific( |
270 CallInterfaceDescriptorData* data) { | 266 CallInterfaceDescriptorData* data) { |
271 Register registers[] = {rsi, rdx, rax}; | 267 Register registers[] = {rdx, rax}; |
272 data->InitializePlatformSpecific(arraysize(registers), registers); | 268 data->InitializePlatformSpecific(arraysize(registers), registers); |
273 } | 269 } |
274 | 270 |
275 | 271 |
276 void KeyedDescriptor::InitializePlatformSpecific( | 272 void KeyedDescriptor::InitializePlatformSpecific( |
277 CallInterfaceDescriptorData* data) { | 273 CallInterfaceDescriptorData* data) { |
278 Register registers[] = { | 274 Register registers[] = { |
279 rsi, // context | |
280 rcx, // key | 275 rcx, // key |
281 }; | 276 }; |
282 data->InitializePlatformSpecific(arraysize(registers), registers); | 277 data->InitializePlatformSpecific(arraysize(registers), registers); |
283 } | 278 } |
284 | 279 |
285 | 280 |
286 void NamedDescriptor::InitializePlatformSpecific( | 281 void NamedDescriptor::InitializePlatformSpecific( |
287 CallInterfaceDescriptorData* data) { | 282 CallInterfaceDescriptorData* data) { |
288 Register registers[] = { | 283 Register registers[] = { |
289 rsi, // context | |
290 rcx, // name | 284 rcx, // name |
291 }; | 285 }; |
292 data->InitializePlatformSpecific(arraysize(registers), registers); | 286 data->InitializePlatformSpecific(arraysize(registers), registers); |
293 } | 287 } |
294 | 288 |
295 | 289 |
296 void CallHandlerDescriptor::InitializePlatformSpecific( | 290 void CallHandlerDescriptor::InitializePlatformSpecific( |
297 CallInterfaceDescriptorData* data) { | 291 CallInterfaceDescriptorData* data) { |
298 Register registers[] = { | 292 Register registers[] = { |
299 rsi, // context | |
300 rdx, // receiver | 293 rdx, // receiver |
301 }; | 294 }; |
302 data->InitializePlatformSpecific(arraysize(registers), registers); | 295 data->InitializePlatformSpecific(arraysize(registers), registers); |
303 } | 296 } |
304 | 297 |
305 | 298 |
306 void ArgumentAdaptorDescriptor::InitializePlatformSpecific( | 299 void ArgumentAdaptorDescriptor::InitializePlatformSpecific( |
307 CallInterfaceDescriptorData* data) { | 300 CallInterfaceDescriptorData* data) { |
308 Register registers[] = { | 301 Register registers[] = { |
309 rsi, // context | |
310 rdi, // JSFunction | 302 rdi, // JSFunction |
311 rax, // actual number of arguments | 303 rax, // actual number of arguments |
312 rbx, // expected number of arguments | 304 rbx, // expected number of arguments |
313 }; | 305 }; |
314 data->InitializePlatformSpecific(arraysize(registers), registers); | 306 data->InitializePlatformSpecific(arraysize(registers), registers); |
315 } | 307 } |
316 | 308 |
317 | 309 |
318 void ApiFunctionDescriptor::InitializePlatformSpecific( | 310 void ApiFunctionDescriptor::InitializePlatformSpecific( |
319 CallInterfaceDescriptorData* data) { | 311 CallInterfaceDescriptorData* data) { |
320 Register registers[] = { | 312 Register registers[] = { |
321 rsi, // context | |
322 rdi, // callee | 313 rdi, // callee |
323 rbx, // call_data | 314 rbx, // call_data |
324 rcx, // holder | 315 rcx, // holder |
325 rdx, // api_function_address | 316 rdx, // api_function_address |
326 rax, // actual number of arguments | 317 rax, // actual number of arguments |
327 }; | 318 }; |
328 data->InitializePlatformSpecific(arraysize(registers), registers); | 319 data->InitializePlatformSpecific(arraysize(registers), registers); |
329 } | 320 } |
330 | 321 |
331 | 322 |
332 void ApiAccessorDescriptor::InitializePlatformSpecific( | 323 void ApiAccessorDescriptor::InitializePlatformSpecific( |
333 CallInterfaceDescriptorData* data) { | 324 CallInterfaceDescriptorData* data) { |
334 Register registers[] = { | 325 Register registers[] = { |
335 rsi, // context | |
336 rdi, // callee | 326 rdi, // callee |
337 rbx, // call_data | 327 rbx, // call_data |
338 rcx, // holder | 328 rcx, // holder |
339 rdx, // api_function_address | 329 rdx, // api_function_address |
340 }; | 330 }; |
341 data->InitializePlatformSpecific(arraysize(registers), registers); | 331 data->InitializePlatformSpecific(arraysize(registers), registers); |
342 } | 332 } |
343 | 333 |
344 | 334 |
345 void MathRoundVariantDescriptor::InitializePlatformSpecific( | 335 void MathRoundVariantDescriptor::InitializePlatformSpecific( |
346 CallInterfaceDescriptorData* data) { | 336 CallInterfaceDescriptorData* data) { |
347 Register registers[] = { | 337 Register registers[] = { |
348 rsi, // context | |
349 rdi, // math rounding function | 338 rdi, // math rounding function |
350 rdx, // vector slot id | 339 rdx, // vector slot id |
351 }; | 340 }; |
352 data->InitializePlatformSpecific(arraysize(registers), registers); | 341 data->InitializePlatformSpecific(arraysize(registers), registers); |
353 } | 342 } |
354 } // namespace internal | 343 } // namespace internal |
355 } // namespace v8 | 344 } // namespace v8 |
356 | 345 |
357 #endif // V8_TARGET_ARCH_X64 | 346 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |