interface-descriptors.cc revision f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3
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 3// found in the LICENSE file. 4 5#include "src/interface-descriptors.h" 6 7namespace v8 { 8namespace internal { 9 10 11void CallInterfaceDescriptorData::InitializePlatformSpecific( 12 int register_parameter_count, const Register* registers, 13 PlatformInterfaceDescriptor* platform_descriptor) { 14 platform_specific_descriptor_ = platform_descriptor; 15 register_param_count_ = register_parameter_count; 16 17 // InterfaceDescriptor owns a copy of the registers array. 18 register_params_.reset(NewArray<Register>(register_parameter_count)); 19 for (int i = 0; i < register_parameter_count; i++) { 20 register_params_[i] = registers[i]; 21 } 22} 23 24void CallInterfaceDescriptorData::InitializePlatformIndependent( 25 int parameter_count, int extra_parameter_count, 26 const MachineType* machine_types) { 27 // InterfaceDescriptor owns a copy of the MachineType array. 28 // We only care about parameters, not receiver and result. 29 param_count_ = parameter_count + extra_parameter_count; 30 machine_types_.reset(NewArray<MachineType>(param_count_)); 31 for (int i = 0; i < param_count_; i++) { 32 if (machine_types == NULL || i >= parameter_count) { 33 machine_types_[i] = MachineType::AnyTagged(); 34 } else { 35 machine_types_[i] = machine_types[i]; 36 } 37 } 38} 39 40const char* CallInterfaceDescriptor::DebugName(Isolate* isolate) const { 41 CallInterfaceDescriptorData* start = isolate->call_descriptor_data(0); 42 size_t index = data_ - start; 43 DCHECK(index < CallDescriptors::NUMBER_OF_DESCRIPTORS); 44 CallDescriptors::Key key = static_cast<CallDescriptors::Key>(index); 45 switch (key) { 46#define DEF_CASE(NAME) \ 47 case CallDescriptors::NAME: \ 48 return #NAME " Descriptor"; 49 INTERFACE_DESCRIPTOR_LIST(DEF_CASE) 50#undef DEF_CASE 51 case CallDescriptors::NUMBER_OF_DESCRIPTORS: 52 break; 53 } 54 return ""; 55} 56 57 58void VoidDescriptor::InitializePlatformSpecific( 59 CallInterfaceDescriptorData* data) { 60 data->InitializePlatformSpecific(0, nullptr); 61} 62 63void FastNewFunctionContextDescriptor::InitializePlatformIndependent( 64 CallInterfaceDescriptorData* data) { 65 MachineType machine_types[] = {MachineType::AnyTagged(), 66 MachineType::Int32()}; 67 data->InitializePlatformIndependent(arraysize(machine_types), 0, 68 machine_types); 69} 70 71void FastNewFunctionContextDescriptor::InitializePlatformSpecific( 72 CallInterfaceDescriptorData* data) { 73 Register registers[] = {FunctionRegister(), SlotsRegister()}; 74 data->InitializePlatformSpecific(arraysize(registers), registers); 75} 76 77void LoadDescriptor::InitializePlatformIndependent( 78 CallInterfaceDescriptorData* data) { 79 // kReceiver, kName, kSlot 80 MachineType machine_types[] = {MachineType::AnyTagged(), 81 MachineType::AnyTagged(), 82 MachineType::TaggedSigned()}; 83 data->InitializePlatformIndependent(arraysize(machine_types), 0, 84 machine_types); 85} 86 87void LoadDescriptor::InitializePlatformSpecific( 88 CallInterfaceDescriptorData* data) { 89 Register registers[] = {ReceiverRegister(), NameRegister(), SlotRegister()}; 90 data->InitializePlatformSpecific(arraysize(registers), registers); 91} 92 93void LoadGlobalDescriptor::InitializePlatformIndependent( 94 CallInterfaceDescriptorData* data) { 95 // kSlot 96 MachineType machine_types[] = {MachineType::TaggedSigned()}; 97 data->InitializePlatformIndependent(arraysize(machine_types), 0, 98 machine_types); 99} 100 101void LoadGlobalDescriptor::InitializePlatformSpecific( 102 CallInterfaceDescriptorData* data) { 103 Register registers[] = {LoadWithVectorDescriptor::SlotRegister()}; 104 data->InitializePlatformSpecific(arraysize(registers), registers); 105} 106 107void LoadGlobalWithVectorDescriptor::InitializePlatformIndependent( 108 CallInterfaceDescriptorData* data) { 109 // kSlot, kVector 110 MachineType machine_types[] = {MachineType::TaggedSigned(), 111 MachineType::AnyTagged()}; 112 data->InitializePlatformIndependent(arraysize(machine_types), 0, 113 machine_types); 114} 115 116void LoadGlobalWithVectorDescriptor::InitializePlatformSpecific( 117 CallInterfaceDescriptorData* data) { 118 Register registers[] = {LoadWithVectorDescriptor::SlotRegister(), 119 LoadWithVectorDescriptor::VectorRegister()}; 120 data->InitializePlatformSpecific(arraysize(registers), registers); 121} 122 123void StoreDescriptor::InitializePlatformIndependent( 124 CallInterfaceDescriptorData* data) { 125 // kReceiver, kName, kValue, kSlot 126 MachineType machine_types[] = { 127 MachineType::AnyTagged(), MachineType::AnyTagged(), 128 MachineType::AnyTagged(), MachineType::TaggedSigned()}; 129 data->InitializePlatformIndependent(arraysize(machine_types), 0, 130 machine_types); 131} 132 133void StoreDescriptor::InitializePlatformSpecific( 134 CallInterfaceDescriptorData* data) { 135 Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(), 136 SlotRegister()}; 137 138 int len = arraysize(registers) - kStackArgumentsCount; 139 data->InitializePlatformSpecific(len, registers); 140} 141 142void StoreTransitionDescriptor::InitializePlatformSpecific( 143 CallInterfaceDescriptorData* data) { 144 Register registers[] = { 145 ReceiverRegister(), NameRegister(), MapRegister(), 146 ValueRegister(), SlotRegister(), VectorRegister(), 147 }; 148 int len = arraysize(registers) - kStackArgumentsCount; 149 data->InitializePlatformSpecific(len, registers); 150} 151 152void StoreTransitionDescriptor::InitializePlatformIndependent( 153 CallInterfaceDescriptorData* data) { 154 // kReceiver, kName, kMap, kValue, kSlot, kVector 155 MachineType machine_types[] = { 156 MachineType::AnyTagged(), MachineType::AnyTagged(), 157 MachineType::AnyTagged(), MachineType::AnyTagged(), 158 MachineType::TaggedSigned(), MachineType::AnyTagged()}; 159 data->InitializePlatformIndependent(arraysize(machine_types), 0, 160 machine_types); 161} 162 163void StoreNamedTransitionDescriptor::InitializePlatformIndependent( 164 CallInterfaceDescriptorData* data) { 165 // kReceiver, kFieldOffset, kMap, kValue, kSlot, kVector, kName 166 MachineType machine_types[] = { 167 MachineType::AnyTagged(), MachineType::TaggedSigned(), 168 MachineType::AnyTagged(), MachineType::AnyTagged(), 169 MachineType::TaggedSigned(), MachineType::AnyTagged(), 170 MachineType::AnyTagged()}; 171 data->InitializePlatformIndependent(arraysize(machine_types), 0, 172 machine_types); 173} 174 175void StoreNamedTransitionDescriptor::InitializePlatformSpecific( 176 CallInterfaceDescriptorData* data) { 177 Register registers[] = { 178 ReceiverRegister(), FieldOffsetRegister(), MapRegister(), 179 ValueRegister(), SlotRegister(), VectorRegister(), 180 NameRegister(), 181 }; 182 int len = arraysize(registers) - kStackArgumentsCount; 183 data->InitializePlatformSpecific(len, registers); 184} 185 186void StoreGlobalViaContextDescriptor::InitializePlatformIndependent( 187 CallInterfaceDescriptorData* data) { 188 // kSlot, kValue 189 MachineType machine_types[] = {MachineType::Int32(), 190 MachineType::AnyTagged()}; 191 data->InitializePlatformIndependent(arraysize(machine_types), 0, 192 machine_types); 193} 194 195void StoreGlobalViaContextDescriptor::InitializePlatformSpecific( 196 CallInterfaceDescriptorData* data) { 197 Register registers[] = {SlotRegister(), ValueRegister()}; 198 data->InitializePlatformSpecific(arraysize(registers), registers); 199} 200 201 202void StringCompareDescriptor::InitializePlatformSpecific( 203 CallInterfaceDescriptorData* data) { 204 Register registers[] = {LeftRegister(), RightRegister()}; 205 data->InitializePlatformSpecific(arraysize(registers), registers); 206} 207 208void TypeConversionDescriptor::InitializePlatformSpecific( 209 CallInterfaceDescriptorData* data) { 210 Register registers[] = {ArgumentRegister()}; 211 data->InitializePlatformSpecific(arraysize(registers), registers); 212} 213 214void MathPowTaggedDescriptor::InitializePlatformSpecific( 215 CallInterfaceDescriptorData* data) { 216 Register registers[] = {exponent()}; 217 data->InitializePlatformSpecific(arraysize(registers), registers); 218} 219 220void MathPowIntegerDescriptor::InitializePlatformSpecific( 221 CallInterfaceDescriptorData* data) { 222 Register registers[] = {exponent()}; 223 data->InitializePlatformSpecific(arraysize(registers), registers); 224} 225 226void LoadWithVectorDescriptor::InitializePlatformIndependent( 227 CallInterfaceDescriptorData* data) { 228 // kReceiver, kName, kSlot, kVector 229 MachineType machine_types[] = { 230 MachineType::AnyTagged(), MachineType::AnyTagged(), 231 MachineType::TaggedSigned(), MachineType::AnyTagged()}; 232 data->InitializePlatformIndependent(arraysize(machine_types), 0, 233 machine_types); 234} 235 236 237void LoadWithVectorDescriptor::InitializePlatformSpecific( 238 CallInterfaceDescriptorData* data) { 239 Register registers[] = {ReceiverRegister(), NameRegister(), SlotRegister(), 240 VectorRegister()}; 241 data->InitializePlatformSpecific(arraysize(registers), registers); 242} 243 244void StoreWithVectorDescriptor::InitializePlatformIndependent( 245 CallInterfaceDescriptorData* data) { 246 // kReceiver, kName, kValue, kSlot, kVector 247 MachineType machine_types[] = { 248 MachineType::AnyTagged(), MachineType::AnyTagged(), 249 MachineType::AnyTagged(), MachineType::TaggedSigned(), 250 MachineType::AnyTagged()}; 251 data->InitializePlatformIndependent(arraysize(machine_types), 0, 252 machine_types); 253} 254 255void StoreWithVectorDescriptor::InitializePlatformSpecific( 256 CallInterfaceDescriptorData* data) { 257 Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(), 258 SlotRegister(), VectorRegister()}; 259 int len = arraysize(registers) - kStackArgumentsCount; 260 data->InitializePlatformSpecific(len, registers); 261} 262 263void BinaryOpWithVectorDescriptor::InitializePlatformIndependent( 264 CallInterfaceDescriptorData* data) { 265 // kLeft, kRight, kSlot, kVector 266 MachineType machine_types[] = {MachineType::AnyTagged(), 267 MachineType::AnyTagged(), MachineType::Int32(), 268 MachineType::AnyTagged()}; 269 data->InitializePlatformIndependent(arraysize(machine_types), 0, 270 machine_types); 271} 272 273const Register ApiGetterDescriptor::ReceiverRegister() { 274 return LoadDescriptor::ReceiverRegister(); 275} 276 277void ApiGetterDescriptor::InitializePlatformSpecific( 278 CallInterfaceDescriptorData* data) { 279 Register registers[] = {ReceiverRegister(), HolderRegister(), 280 CallbackRegister()}; 281 data->InitializePlatformSpecific(arraysize(registers), registers); 282} 283 284void ContextOnlyDescriptor::InitializePlatformSpecific( 285 CallInterfaceDescriptorData* data) { 286 data->InitializePlatformSpecific(0, nullptr); 287} 288 289void GrowArrayElementsDescriptor::InitializePlatformSpecific( 290 CallInterfaceDescriptorData* data) { 291 Register registers[] = {ObjectRegister(), KeyRegister()}; 292 data->InitializePlatformSpecific(arraysize(registers), registers); 293} 294 295void VarArgFunctionDescriptor::InitializePlatformIndependent( 296 CallInterfaceDescriptorData* data) { 297 // kActualArgumentsCount 298 MachineType machine_types[] = {MachineType::Int32()}; 299 data->InitializePlatformIndependent(arraysize(machine_types), 0, 300 machine_types); 301} 302 303void FastCloneRegExpDescriptor::InitializePlatformIndependent( 304 CallInterfaceDescriptorData* data) { 305 // kClosure, kLiteralIndex, kPattern, kFlags 306 MachineType machine_types[] = { 307 MachineType::AnyTagged(), MachineType::TaggedSigned(), 308 MachineType::AnyTagged(), MachineType::AnyTagged()}; 309 data->InitializePlatformIndependent(arraysize(machine_types), 0, 310 machine_types); 311} 312 313void FastCloneShallowArrayDescriptor::InitializePlatformIndependent( 314 CallInterfaceDescriptorData* data) { 315 // kClosure, kLiteralIndex, kConstantElements 316 MachineType machine_types[] = {MachineType::AnyTagged(), 317 MachineType::TaggedSigned(), 318 MachineType::AnyTagged()}; 319 data->InitializePlatformIndependent(arraysize(machine_types), 0, 320 machine_types); 321} 322 323void CreateAllocationSiteDescriptor::InitializePlatformIndependent( 324 CallInterfaceDescriptorData* data) { 325 // kVector, kSlot 326 MachineType machine_types[] = {MachineType::AnyTagged(), 327 MachineType::TaggedSigned()}; 328 data->InitializePlatformIndependent(arraysize(machine_types), 0, 329 machine_types); 330} 331 332void CreateWeakCellDescriptor::InitializePlatformIndependent( 333 CallInterfaceDescriptorData* data) { 334 // kVector, kSlot, kValue 335 MachineType machine_types[] = {MachineType::AnyTagged(), 336 MachineType::TaggedSigned(), 337 MachineType::AnyTagged()}; 338 data->InitializePlatformIndependent(arraysize(machine_types), 0, 339 machine_types); 340} 341 342void CallTrampolineDescriptor::InitializePlatformIndependent( 343 CallInterfaceDescriptorData* data) { 344 // kFunction, kActualArgumentsCount 345 MachineType machine_types[] = {MachineType::AnyTagged(), 346 MachineType::Int32()}; 347 data->InitializePlatformIndependent(arraysize(machine_types), 0, 348 machine_types); 349} 350 351void ConstructStubDescriptor::InitializePlatformIndependent( 352 CallInterfaceDescriptorData* data) { 353 // kFunction, kNewTarget, kActualArgumentsCount, kAllocationSite 354 MachineType machine_types[] = {MachineType::AnyTagged(), 355 MachineType::AnyTagged(), MachineType::Int32(), 356 MachineType::AnyTagged()}; 357 data->InitializePlatformIndependent(arraysize(machine_types), 0, 358 machine_types); 359} 360 361void ConstructTrampolineDescriptor::InitializePlatformIndependent( 362 CallInterfaceDescriptorData* data) { 363 // kFunction, kNewTarget, kActualArgumentsCount 364 MachineType machine_types[] = { 365 MachineType::AnyTagged(), MachineType::AnyTagged(), MachineType::Int32()}; 366 data->InitializePlatformIndependent(arraysize(machine_types), 0, 367 machine_types); 368} 369 370void CallFunctionWithFeedbackDescriptor::InitializePlatformIndependent( 371 CallInterfaceDescriptorData* data) { 372 // kFunction, kSlot 373 MachineType machine_types[] = {MachineType::AnyTagged(), 374 MachineType::TaggedSigned()}; 375 data->InitializePlatformIndependent(arraysize(machine_types), 0, 376 machine_types); 377} 378 379void CallFunctionWithFeedbackAndVectorDescriptor::InitializePlatformIndependent( 380 CallInterfaceDescriptorData* data) { 381 // kFunction, kSlot, kVector 382 MachineType machine_types[] = {MachineType::TaggedPointer(), 383 MachineType::TaggedSigned(), 384 MachineType::AnyTagged()}; 385 data->InitializePlatformIndependent(arraysize(machine_types), 0, 386 machine_types); 387} 388 389void ArrayNoArgumentConstructorDescriptor::InitializePlatformIndependent( 390 CallInterfaceDescriptorData* data) { 391 // kFunction, kAllocationSite, kActualArgumentsCount, kFunctionParameter 392 MachineType machine_types[] = {MachineType::TaggedPointer(), 393 MachineType::AnyTagged(), MachineType::Int32(), 394 MachineType::AnyTagged()}; 395 data->InitializePlatformIndependent(arraysize(machine_types), 0, 396 machine_types); 397} 398 399void ArraySingleArgumentConstructorDescriptor::InitializePlatformIndependent( 400 CallInterfaceDescriptorData* data) { 401 // kFunction, kAllocationSite, kActualArgumentsCount, kFunctionParameter, 402 // kArraySizeSmiParameter 403 MachineType machine_types[] = { 404 MachineType::TaggedPointer(), MachineType::AnyTagged(), 405 MachineType::Int32(), MachineType::AnyTagged(), MachineType::AnyTagged()}; 406 data->InitializePlatformIndependent(arraysize(machine_types), 0, 407 machine_types); 408} 409 410void ArrayNArgumentsConstructorDescriptor::InitializePlatformIndependent( 411 CallInterfaceDescriptorData* data) { 412 // kFunction, kAllocationSite, kActualArgumentsCount 413 MachineType machine_types[] = {MachineType::TaggedPointer(), 414 MachineType::AnyTagged(), 415 MachineType::Int32()}; 416 data->InitializePlatformIndependent(arraysize(machine_types), 0, 417 machine_types); 418} 419 420void ArgumentAdaptorDescriptor::InitializePlatformIndependent( 421 CallInterfaceDescriptorData* data) { 422 // kFunction, kNewTarget, kActualArgumentsCount, kExpectedArgumentsCount 423 MachineType machine_types[] = {MachineType::TaggedPointer(), 424 MachineType::AnyTagged(), MachineType::Int32(), 425 MachineType::Int32()}; 426 data->InitializePlatformIndependent(arraysize(machine_types), 0, 427 machine_types); 428} 429 430void ApiCallbackDescriptor::InitializePlatformIndependent( 431 CallInterfaceDescriptorData* data) { 432 // kFunction, kCallData, kHolder, kApiFunctionAddress 433 MachineType machine_types[] = { 434 MachineType::AnyTagged(), MachineType::AnyTagged(), 435 MachineType::AnyTagged(), MachineType::Pointer()}; 436 data->InitializePlatformIndependent(arraysize(machine_types), 0, 437 machine_types); 438} 439 440void InterpreterDispatchDescriptor::InitializePlatformIndependent( 441 CallInterfaceDescriptorData* data) { 442 // kAccumulator, kBytecodeOffset, kBytecodeArray, kDispatchTable 443 MachineType machine_types[] = { 444 MachineType::AnyTagged(), MachineType::IntPtr(), MachineType::AnyTagged(), 445 MachineType::AnyTagged()}; 446 data->InitializePlatformIndependent(arraysize(machine_types), 0, 447 machine_types); 448} 449 450void InterpreterPushArgsAndCallDescriptor::InitializePlatformIndependent( 451 CallInterfaceDescriptorData* data) { 452 // kNumberOfArguments, kFirstArgument, kFunction 453 MachineType machine_types[] = {MachineType::Int32(), MachineType::Pointer(), 454 MachineType::AnyTagged()}; 455 data->InitializePlatformIndependent(arraysize(machine_types), 0, 456 machine_types); 457} 458 459void InterpreterPushArgsAndConstructDescriptor::InitializePlatformIndependent( 460 CallInterfaceDescriptorData* data) { 461 // kNumberOfArguments, kNewTarget, kConstructor, kFeedbackElement, 462 // kFirstArgument 463 MachineType machine_types[] = { 464 MachineType::Int32(), MachineType::AnyTagged(), MachineType::AnyTagged(), 465 MachineType::AnyTagged(), MachineType::Pointer()}; 466 data->InitializePlatformIndependent(arraysize(machine_types), 0, 467 machine_types); 468} 469 470void InterpreterPushArgsAndConstructArrayDescriptor:: 471 InitializePlatformIndependent(CallInterfaceDescriptorData* data) { 472 // kNumberOfArguments, kFunction, kFeedbackElement, kFirstArgument 473 MachineType machine_types[] = {MachineType::Int32(), MachineType::AnyTagged(), 474 MachineType::AnyTagged(), 475 MachineType::Pointer()}; 476 data->InitializePlatformIndependent(arraysize(machine_types), 0, 477 machine_types); 478} 479 480void InterpreterCEntryDescriptor::InitializePlatformIndependent( 481 CallInterfaceDescriptorData* data) { 482 // kNumberOfArguments, kFirstArgument, kFunctionEntry 483 MachineType machine_types[] = {MachineType::Int32(), MachineType::Pointer(), 484 MachineType::Pointer()}; 485 data->InitializePlatformIndependent(arraysize(machine_types), 0, 486 machine_types); 487} 488 489} // namespace internal 490} // namespace v8 491