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 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 | 54 |
55 const Register ElementTransitionAndStoreDescriptor::MapRegister() { | 55 const Register ElementTransitionAndStoreDescriptor::MapRegister() { |
56 return rbx; | 56 return rbx; |
57 } | 57 } |
58 | 58 |
59 | 59 |
60 const Register InstanceofDescriptor::left() { return rax; } | 60 const Register InstanceofDescriptor::left() { return rax; } |
61 const Register InstanceofDescriptor::right() { return rdx; } | 61 const Register InstanceofDescriptor::right() { return rdx; } |
62 | 62 |
63 | 63 |
64 void FastNewClosureDescriptor::Initialize(Isolate* isolate) { | 64 void FastNewClosureDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
65 Register registers[] = {rsi, rbx}; | 65 Register registers[] = {rsi, rbx}; |
66 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 66 data->Initialize(arraysize(registers), registers, NULL); |
67 } | 67 } |
68 | 68 |
69 | 69 |
70 void FastNewContextDescriptor::Initialize(Isolate* isolate) { | 70 void FastNewContextDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
71 Register registers[] = {rsi, rdi}; | 71 Register registers[] = {rsi, rdi}; |
72 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 72 data->Initialize(arraysize(registers), registers, NULL); |
73 } | 73 } |
74 | 74 |
75 | 75 |
76 void ToNumberDescriptor::Initialize(Isolate* isolate) { | 76 void ToNumberDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
77 // ToNumberStub invokes a function, and therefore needs a context. | 77 // ToNumberStub invokes a function, and therefore needs a context. |
78 Register registers[] = {rsi, rax}; | 78 Register registers[] = {rsi, rax}; |
79 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 79 data->Initialize(arraysize(registers), registers, NULL); |
80 } | 80 } |
81 | 81 |
82 | 82 |
83 void NumberToStringDescriptor::Initialize(Isolate* isolate) { | 83 void NumberToStringDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
84 Register registers[] = {rsi, rax}; | 84 Register registers[] = {rsi, rax}; |
85 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 85 data->Initialize(arraysize(registers), registers, NULL); |
86 } | 86 } |
87 | 87 |
88 | 88 |
89 void FastCloneShallowArrayDescriptor::Initialize(Isolate* isolate) { | 89 void FastCloneShallowArrayDescriptor::Initialize( |
| 90 CallInterfaceDescriptorData* data) { |
90 Register registers[] = {rsi, rax, rbx, rcx}; | 91 Register registers[] = {rsi, rax, rbx, rcx}; |
91 Representation representations[] = { | 92 Representation representations[] = { |
92 Representation::Tagged(), Representation::Tagged(), Representation::Smi(), | 93 Representation::Tagged(), Representation::Tagged(), Representation::Smi(), |
93 Representation::Tagged()}; | 94 Representation::Tagged()}; |
94 InitializeData(isolate, key(), arraysize(registers), registers, | 95 data->Initialize(arraysize(registers), registers, representations); |
95 representations); | |
96 } | 96 } |
97 | 97 |
98 | 98 |
99 void FastCloneShallowObjectDescriptor::Initialize(Isolate* isolate) { | 99 void FastCloneShallowObjectDescriptor::Initialize( |
| 100 CallInterfaceDescriptorData* data) { |
100 Register registers[] = {rsi, rax, rbx, rcx, rdx}; | 101 Register registers[] = {rsi, rax, rbx, rcx, rdx}; |
101 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 102 data->Initialize(arraysize(registers), registers, NULL); |
102 } | 103 } |
103 | 104 |
104 | 105 |
105 void CreateAllocationSiteDescriptor::Initialize(Isolate* isolate) { | 106 void CreateAllocationSiteDescriptor::Initialize( |
| 107 CallInterfaceDescriptorData* data) { |
106 Register registers[] = {rsi, rbx, rdx}; | 108 Register registers[] = {rsi, rbx, rdx}; |
107 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 109 data->Initialize(arraysize(registers), registers, NULL); |
108 } | 110 } |
109 | 111 |
110 | 112 |
111 void CallFunctionDescriptor::Initialize(Isolate* isolate) { | 113 void CallFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
112 Register registers[] = {rsi, rdi}; | 114 Register registers[] = {rsi, rdi}; |
113 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 115 data->Initialize(arraysize(registers), registers, NULL); |
114 } | 116 } |
115 | 117 |
116 | 118 |
117 void CallConstructDescriptor::Initialize(Isolate* isolate) { | 119 void CallConstructDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
118 // rax : number of arguments | 120 // rax : number of arguments |
119 // rbx : feedback vector | 121 // rbx : feedback vector |
120 // rdx : (only if rbx is not the megamorphic symbol) slot in feedback | 122 // rdx : (only if rbx is not the megamorphic symbol) slot in feedback |
121 // vector (Smi) | 123 // vector (Smi) |
122 // rdi : constructor function | 124 // rdi : constructor function |
123 // TODO(turbofan): So far we don't gather type feedback and hence skip the | 125 // TODO(turbofan): So far we don't gather type feedback and hence skip the |
124 // slot parameter, but ArrayConstructStub needs the vector to be undefined. | 126 // slot parameter, but ArrayConstructStub needs the vector to be undefined. |
125 Register registers[] = {rsi, rax, rdi, rbx}; | 127 Register registers[] = {rsi, rax, rdi, rbx}; |
126 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 128 data->Initialize(arraysize(registers), registers, NULL); |
127 } | 129 } |
128 | 130 |
129 | 131 |
130 void RegExpConstructResultDescriptor::Initialize(Isolate* isolate) { | 132 void RegExpConstructResultDescriptor::Initialize( |
| 133 CallInterfaceDescriptorData* data) { |
131 Register registers[] = {rsi, rcx, rbx, rax}; | 134 Register registers[] = {rsi, rcx, rbx, rax}; |
132 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 135 data->Initialize(arraysize(registers), registers, NULL); |
133 } | 136 } |
134 | 137 |
135 | 138 |
136 void TransitionElementsKindDescriptor::Initialize(Isolate* isolate) { | 139 void TransitionElementsKindDescriptor::Initialize( |
| 140 CallInterfaceDescriptorData* data) { |
137 Register registers[] = {rsi, rax, rbx}; | 141 Register registers[] = {rsi, rax, rbx}; |
138 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 142 data->Initialize(arraysize(registers), registers, NULL); |
139 } | 143 } |
140 | 144 |
141 | 145 |
142 void ArrayConstructorConstantArgCountDescriptor::Initialize(Isolate* isolate) { | 146 void ArrayConstructorConstantArgCountDescriptor::Initialize( |
| 147 CallInterfaceDescriptorData* data) { |
143 // register state | 148 // register state |
144 // rax -- number of arguments | 149 // rax -- number of arguments |
145 // rdi -- function | 150 // rdi -- function |
146 // rbx -- allocation site with elements kind | 151 // rbx -- allocation site with elements kind |
147 Register registers[] = {rsi, rdi, rbx}; | 152 Register registers[] = {rsi, rdi, rbx}; |
148 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 153 data->Initialize(arraysize(registers), registers, NULL); |
149 } | 154 } |
150 | 155 |
151 | 156 |
152 void ArrayConstructorDescriptor::Initialize(Isolate* isolate) { | 157 void ArrayConstructorDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
153 // stack param count needs (constructor pointer, and single argument) | 158 // stack param count needs (constructor pointer, and single argument) |
154 Register registers[] = {rsi, rdi, rbx, rax}; | 159 Register registers[] = {rsi, rdi, rbx, rax}; |
155 Representation representations[] = { | 160 Representation representations[] = { |
156 Representation::Tagged(), Representation::Tagged(), | 161 Representation::Tagged(), Representation::Tagged(), |
157 Representation::Tagged(), Representation::Integer32()}; | 162 Representation::Tagged(), Representation::Integer32()}; |
158 InitializeData(isolate, key(), arraysize(registers), registers, | 163 data->Initialize(arraysize(registers), registers, representations); |
159 representations); | |
160 } | 164 } |
161 | 165 |
162 | 166 |
163 void InternalArrayConstructorConstantArgCountDescriptor::Initialize( | 167 void InternalArrayConstructorConstantArgCountDescriptor::Initialize( |
164 Isolate* isolate) { | 168 CallInterfaceDescriptorData* data) { |
165 // register state | 169 // register state |
166 // rsi -- context | 170 // rsi -- context |
167 // rax -- number of arguments | 171 // rax -- number of arguments |
168 // rdi -- constructor function | 172 // rdi -- constructor function |
169 Register registers[] = {rsi, rdi}; | 173 Register registers[] = {rsi, rdi}; |
170 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 174 data->Initialize(arraysize(registers), registers, NULL); |
171 } | 175 } |
172 | 176 |
173 | 177 |
174 void InternalArrayConstructorDescriptor::Initialize(Isolate* isolate) { | 178 void InternalArrayConstructorDescriptor::Initialize( |
| 179 CallInterfaceDescriptorData* data) { |
175 // stack param count needs (constructor pointer, and single argument) | 180 // stack param count needs (constructor pointer, and single argument) |
176 Register registers[] = {rsi, rdi, rax}; | 181 Register registers[] = {rsi, rdi, rax}; |
177 Representation representations[] = {Representation::Tagged(), | 182 Representation representations[] = {Representation::Tagged(), |
178 Representation::Tagged(), | 183 Representation::Tagged(), |
179 Representation::Integer32()}; | 184 Representation::Integer32()}; |
180 InitializeData(isolate, key(), arraysize(registers), registers, | 185 data->Initialize(arraysize(registers), registers, representations); |
181 representations); | |
182 } | 186 } |
183 | 187 |
184 | 188 |
185 void CompareNilDescriptor::Initialize(Isolate* isolate) { | 189 void CompareNilDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
186 Register registers[] = {rsi, rax}; | 190 Register registers[] = {rsi, rax}; |
187 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 191 data->Initialize(arraysize(registers), registers, NULL); |
188 } | 192 } |
189 | 193 |
190 | 194 |
191 void ToBooleanDescriptor::Initialize(Isolate* isolate) { | 195 void ToBooleanDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
192 Register registers[] = {rsi, rax}; | 196 Register registers[] = {rsi, rax}; |
193 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 197 data->Initialize(arraysize(registers), registers, NULL); |
194 } | 198 } |
195 | 199 |
196 | 200 |
197 void BinaryOpDescriptor::Initialize(Isolate* isolate) { | 201 void BinaryOpDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
198 Register registers[] = {rsi, rdx, rax}; | 202 Register registers[] = {rsi, rdx, rax}; |
199 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 203 data->Initialize(arraysize(registers), registers, NULL); |
200 } | 204 } |
201 | 205 |
202 | 206 |
203 void BinaryOpWithAllocationSiteDescriptor::Initialize(Isolate* isolate) { | 207 void BinaryOpWithAllocationSiteDescriptor::Initialize( |
| 208 CallInterfaceDescriptorData* data) { |
204 Register registers[] = {rsi, rcx, rdx, rax}; | 209 Register registers[] = {rsi, rcx, rdx, rax}; |
205 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 210 data->Initialize(arraysize(registers), registers, NULL); |
206 } | 211 } |
207 | 212 |
208 | 213 |
209 void StringAddDescriptor::Initialize(Isolate* isolate) { | 214 void StringAddDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
210 Register registers[] = {rsi, rdx, rax}; | 215 Register registers[] = {rsi, rdx, rax}; |
211 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 216 data->Initialize(arraysize(registers), registers, NULL); |
212 } | 217 } |
213 | 218 |
214 | 219 |
215 void KeyedDescriptor::Initialize(Isolate* isolate) { | 220 void KeyedDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
216 Register registers[] = { | 221 Register registers[] = { |
217 rsi, // context | 222 rsi, // context |
218 rcx, // key | 223 rcx, // key |
219 }; | 224 }; |
220 Representation representations[] = { | 225 Representation representations[] = { |
221 Representation::Tagged(), // context | 226 Representation::Tagged(), // context |
222 Representation::Tagged(), // key | 227 Representation::Tagged(), // key |
223 }; | 228 }; |
224 InitializeData(isolate, key(), arraysize(registers), registers, | 229 data->Initialize(arraysize(registers), registers, representations); |
225 representations); | |
226 } | 230 } |
227 | 231 |
228 | 232 |
229 void NamedDescriptor::Initialize(Isolate* isolate) { | 233 void NamedDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
230 Register registers[] = { | 234 Register registers[] = { |
231 rsi, // context | 235 rsi, // context |
232 rcx, // name | 236 rcx, // name |
233 }; | 237 }; |
234 Representation representations[] = { | 238 Representation representations[] = { |
235 Representation::Tagged(), // context | 239 Representation::Tagged(), // context |
236 Representation::Tagged(), // name | 240 Representation::Tagged(), // name |
237 }; | 241 }; |
238 InitializeData(isolate, key(), arraysize(registers), registers, | 242 data->Initialize(arraysize(registers), registers, representations); |
239 representations); | |
240 } | 243 } |
241 | 244 |
242 | 245 |
243 void CallHandlerDescriptor::Initialize(Isolate* isolate) { | 246 void CallHandlerDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
244 Register registers[] = { | 247 Register registers[] = { |
245 rsi, // context | 248 rsi, // context |
246 rdx, // receiver | 249 rdx, // receiver |
247 }; | 250 }; |
248 Representation representations[] = { | 251 Representation representations[] = { |
249 Representation::Tagged(), // context | 252 Representation::Tagged(), // context |
250 Representation::Tagged(), // receiver | 253 Representation::Tagged(), // receiver |
251 }; | 254 }; |
252 InitializeData(isolate, key(), arraysize(registers), registers, | 255 data->Initialize(arraysize(registers), registers, representations); |
253 representations); | |
254 } | 256 } |
255 | 257 |
256 | 258 |
257 void ArgumentAdaptorDescriptor::Initialize(Isolate* isolate) { | 259 void ArgumentAdaptorDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
258 Register registers[] = { | 260 Register registers[] = { |
259 rsi, // context | 261 rsi, // context |
260 rdi, // JSFunction | 262 rdi, // JSFunction |
261 rax, // actual number of arguments | 263 rax, // actual number of arguments |
262 rbx, // expected number of arguments | 264 rbx, // expected number of arguments |
263 }; | 265 }; |
264 Representation representations[] = { | 266 Representation representations[] = { |
265 Representation::Tagged(), // context | 267 Representation::Tagged(), // context |
266 Representation::Tagged(), // JSFunction | 268 Representation::Tagged(), // JSFunction |
267 Representation::Integer32(), // actual number of arguments | 269 Representation::Integer32(), // actual number of arguments |
268 Representation::Integer32(), // expected number of arguments | 270 Representation::Integer32(), // expected number of arguments |
269 }; | 271 }; |
270 InitializeData(isolate, key(), arraysize(registers), registers, | 272 data->Initialize(arraysize(registers), registers, representations); |
271 representations); | |
272 } | 273 } |
273 | 274 |
274 | 275 |
275 void ApiFunctionDescriptor::Initialize(Isolate* isolate) { | 276 void ApiFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
276 Register registers[] = { | 277 Register registers[] = { |
277 rsi, // context | 278 rsi, // context |
278 rax, // callee | 279 rax, // callee |
279 rbx, // call_data | 280 rbx, // call_data |
280 rcx, // holder | 281 rcx, // holder |
281 rdx, // api_function_address | 282 rdx, // api_function_address |
282 }; | 283 }; |
283 Representation representations[] = { | 284 Representation representations[] = { |
284 Representation::Tagged(), // context | 285 Representation::Tagged(), // context |
285 Representation::Tagged(), // callee | 286 Representation::Tagged(), // callee |
286 Representation::Tagged(), // call_data | 287 Representation::Tagged(), // call_data |
287 Representation::Tagged(), // holder | 288 Representation::Tagged(), // holder |
288 Representation::External(), // api_function_address | 289 Representation::External(), // api_function_address |
289 }; | 290 }; |
290 InitializeData(isolate, key(), arraysize(registers), registers, | 291 data->Initialize(arraysize(registers), registers, representations); |
291 representations); | |
292 } | 292 } |
293 } | 293 } |
294 } // namespace v8::internal | 294 } // namespace v8::internal |
295 | 295 |
296 #endif // V8_TARGET_ARCH_X64 | 296 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |