| 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 |