| 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_IA32 | 7 #if V8_TARGET_ARCH_IA32 |
| 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 ebx; | 56 return ebx; |
| 57 } | 57 } |
| 58 | 58 |
| 59 | 59 |
| 60 const Register InstanceofDescriptor::left() { return eax; } | 60 const Register InstanceofDescriptor::left() { return eax; } |
| 61 const Register InstanceofDescriptor::right() { return edx; } | 61 const Register InstanceofDescriptor::right() { return edx; } |
| 62 | 62 |
| 63 | 63 |
| 64 void FastNewClosureDescriptor::Initialize(Isolate* isolate) { | 64 void FastNewClosureDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 65 Register registers[] = {esi, ebx}; | 65 Register registers[] = {esi, ebx}; |
| 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[] = {esi, edi}; | 71 Register registers[] = {esi, edi}; |
| 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[] = {esi, eax}; | 78 Register registers[] = {esi, eax}; |
| 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[] = {esi, eax}; | 84 Register registers[] = {esi, eax}; |
| 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[] = {esi, eax, ebx, ecx}; | 91 Register registers[] = {esi, eax, ebx, ecx}; |
| 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[] = {esi, eax, ebx, ecx, edx}; | 101 Register registers[] = {esi, eax, ebx, ecx, edx}; |
| 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[] = {esi, ebx, edx}; | 108 Register registers[] = {esi, ebx, edx}; |
| 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[] = {esi, edi}; | 114 Register registers[] = {esi, edi}; |
| 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 // eax : number of arguments | 120 // eax : number of arguments |
| 119 // ebx : feedback vector | 121 // ebx : feedback vector |
| 120 // edx : (only if ebx is not the megamorphic symbol) slot in feedback | 122 // edx : (only if ebx is not the megamorphic symbol) slot in feedback |
| 121 // vector (Smi) | 123 // vector (Smi) |
| 122 // edi : constructor function | 124 // edi : 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[] = {esi, eax, edi, ebx}; | 127 Register registers[] = {esi, eax, edi, ebx}; |
| 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[] = {esi, ecx, ebx, eax}; | 134 Register registers[] = {esi, ecx, ebx, eax}; |
| 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[] = {esi, eax, ebx}; | 141 Register registers[] = {esi, eax, ebx}; |
| 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 // eax -- number of arguments | 149 // eax -- number of arguments |
| 145 // edi -- function | 150 // edi -- function |
| 146 // ebx -- allocation site with elements kind | 151 // ebx -- allocation site with elements kind |
| 147 Register registers[] = {esi, edi, ebx}; | 152 Register registers[] = {esi, edi, ebx}; |
| 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[] = {esi, edi, ebx, eax}; | 159 Register registers[] = {esi, edi, ebx, eax}; |
| 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 // eax -- number of arguments | 170 // eax -- number of arguments |
| 167 // edi -- function | 171 // edi -- function |
| 168 Register registers[] = {esi, edi}; | 172 Register registers[] = {esi, edi}; |
| 169 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 173 data->Initialize(arraysize(registers), registers, NULL); |
| 170 } | 174 } |
| 171 | 175 |
| 172 | 176 |
| 173 void InternalArrayConstructorDescriptor::Initialize(Isolate* isolate) { | 177 void InternalArrayConstructorDescriptor::Initialize( |
| 178 CallInterfaceDescriptorData* data) { |
| 174 // stack param count needs (constructor pointer, and single argument) | 179 // stack param count needs (constructor pointer, and single argument) |
| 175 Register registers[] = {esi, edi, eax}; | 180 Register registers[] = {esi, edi, eax}; |
| 176 Representation representations[] = {Representation::Tagged(), | 181 Representation representations[] = {Representation::Tagged(), |
| 177 Representation::Tagged(), | 182 Representation::Tagged(), |
| 178 Representation::Integer32()}; | 183 Representation::Integer32()}; |
| 179 InitializeData(isolate, key(), arraysize(registers), registers, | 184 data->Initialize(arraysize(registers), registers, representations); |
| 180 representations); | |
| 181 } | 185 } |
| 182 | 186 |
| 183 | 187 |
| 184 void CompareNilDescriptor::Initialize(Isolate* isolate) { | 188 void CompareNilDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 185 Register registers[] = {esi, eax}; | 189 Register registers[] = {esi, eax}; |
| 186 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 190 data->Initialize(arraysize(registers), registers, NULL); |
| 187 } | 191 } |
| 188 | 192 |
| 189 | 193 |
| 190 void ToBooleanDescriptor::Initialize(Isolate* isolate) { | 194 void ToBooleanDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 191 Register registers[] = {esi, eax}; | 195 Register registers[] = {esi, eax}; |
| 192 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 196 data->Initialize(arraysize(registers), registers, NULL); |
| 193 } | 197 } |
| 194 | 198 |
| 195 | 199 |
| 196 void BinaryOpDescriptor::Initialize(Isolate* isolate) { | 200 void BinaryOpDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 197 Register registers[] = {esi, edx, eax}; | 201 Register registers[] = {esi, edx, eax}; |
| 198 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 202 data->Initialize(arraysize(registers), registers, NULL); |
| 199 } | 203 } |
| 200 | 204 |
| 201 | 205 |
| 202 void BinaryOpWithAllocationSiteDescriptor::Initialize(Isolate* isolate) { | 206 void BinaryOpWithAllocationSiteDescriptor::Initialize( |
| 207 CallInterfaceDescriptorData* data) { |
| 203 Register registers[] = {esi, ecx, edx, eax}; | 208 Register registers[] = {esi, ecx, edx, eax}; |
| 204 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 209 data->Initialize(arraysize(registers), registers, NULL); |
| 205 } | 210 } |
| 206 | 211 |
| 207 | 212 |
| 208 void StringAddDescriptor::Initialize(Isolate* isolate) { | 213 void StringAddDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 209 Register registers[] = {esi, edx, eax}; | 214 Register registers[] = {esi, edx, eax}; |
| 210 InitializeData(isolate, key(), arraysize(registers), registers, NULL); | 215 data->Initialize(arraysize(registers), registers, NULL); |
| 211 } | 216 } |
| 212 | 217 |
| 213 | 218 |
| 214 void KeyedDescriptor::Initialize(Isolate* isolate) { | 219 void KeyedDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 215 Register registers[] = { | 220 Register registers[] = { |
| 216 esi, // context | 221 esi, // context |
| 217 ecx, // key | 222 ecx, // key |
| 218 }; | 223 }; |
| 219 Representation representations[] = { | 224 Representation representations[] = { |
| 220 Representation::Tagged(), // context | 225 Representation::Tagged(), // context |
| 221 Representation::Tagged(), // key | 226 Representation::Tagged(), // key |
| 222 }; | 227 }; |
| 223 InitializeData(isolate, key(), arraysize(registers), registers, | 228 data->Initialize(arraysize(registers), registers, representations); |
| 224 representations); | |
| 225 } | 229 } |
| 226 | 230 |
| 227 | 231 |
| 228 void NamedDescriptor::Initialize(Isolate* isolate) { | 232 void NamedDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 229 Register registers[] = { | 233 Register registers[] = { |
| 230 esi, // context | 234 esi, // context |
| 231 ecx, // name | 235 ecx, // name |
| 232 }; | 236 }; |
| 233 Representation representations[] = { | 237 Representation representations[] = { |
| 234 Representation::Tagged(), // context | 238 Representation::Tagged(), // context |
| 235 Representation::Tagged(), // name | 239 Representation::Tagged(), // name |
| 236 }; | 240 }; |
| 237 InitializeData(isolate, key(), arraysize(registers), registers, | 241 data->Initialize(arraysize(registers), registers, representations); |
| 238 representations); | |
| 239 } | 242 } |
| 240 | 243 |
| 241 | 244 |
| 242 void CallHandlerDescriptor::Initialize(Isolate* isolate) { | 245 void CallHandlerDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 243 Register registers[] = { | 246 Register registers[] = { |
| 244 esi, // context | 247 esi, // context |
| 245 edx, // name | 248 edx, // name |
| 246 }; | 249 }; |
| 247 Representation representations[] = { | 250 Representation representations[] = { |
| 248 Representation::Tagged(), // context | 251 Representation::Tagged(), // context |
| 249 Representation::Tagged(), // receiver | 252 Representation::Tagged(), // receiver |
| 250 }; | 253 }; |
| 251 InitializeData(isolate, key(), arraysize(registers), registers, | 254 data->Initialize(arraysize(registers), registers, representations); |
| 252 representations); | |
| 253 } | 255 } |
| 254 | 256 |
| 255 | 257 |
| 256 void ArgumentAdaptorDescriptor::Initialize(Isolate* isolate) { | 258 void ArgumentAdaptorDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 257 Register registers[] = { | 259 Register registers[] = { |
| 258 esi, // context | 260 esi, // context |
| 259 edi, // JSFunction | 261 edi, // JSFunction |
| 260 eax, // actual number of arguments | 262 eax, // actual number of arguments |
| 261 ebx, // expected number of arguments | 263 ebx, // expected number of arguments |
| 262 }; | 264 }; |
| 263 Representation representations[] = { | 265 Representation representations[] = { |
| 264 Representation::Tagged(), // context | 266 Representation::Tagged(), // context |
| 265 Representation::Tagged(), // JSFunction | 267 Representation::Tagged(), // JSFunction |
| 266 Representation::Integer32(), // actual number of arguments | 268 Representation::Integer32(), // actual number of arguments |
| 267 Representation::Integer32(), // expected number of arguments | 269 Representation::Integer32(), // expected number of arguments |
| 268 }; | 270 }; |
| 269 InitializeData(isolate, key(), arraysize(registers), registers, | 271 data->Initialize(arraysize(registers), registers, representations); |
| 270 representations); | |
| 271 } | 272 } |
| 272 | 273 |
| 273 | 274 |
| 274 void ApiFunctionDescriptor::Initialize(Isolate* isolate) { | 275 void ApiFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 275 Register registers[] = { | 276 Register registers[] = { |
| 276 esi, // context | 277 esi, // context |
| 277 eax, // callee | 278 eax, // callee |
| 278 ebx, // call_data | 279 ebx, // call_data |
| 279 ecx, // holder | 280 ecx, // holder |
| 280 edx, // api_function_address | 281 edx, // api_function_address |
| 281 }; | 282 }; |
| 282 Representation representations[] = { | 283 Representation representations[] = { |
| 283 Representation::Tagged(), // context | 284 Representation::Tagged(), // context |
| 284 Representation::Tagged(), // callee | 285 Representation::Tagged(), // callee |
| 285 Representation::Tagged(), // call_data | 286 Representation::Tagged(), // call_data |
| 286 Representation::Tagged(), // holder | 287 Representation::Tagged(), // holder |
| 287 Representation::External(), // api_function_address | 288 Representation::External(), // api_function_address |
| 288 }; | 289 }; |
| 289 InitializeData(isolate, key(), arraysize(registers), registers, | 290 data->Initialize(arraysize(registers), registers, representations); |
| 290 representations); | |
| 291 } | 291 } |
| 292 } | 292 } |
| 293 } // namespace v8::internal | 293 } // namespace v8::internal |
| 294 | 294 |
| 295 #endif // V8_TARGET_ARCH_IA32 | 295 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |