diff options
Diffstat (limited to 'deps/v8/src/interface-descriptors.cc')
-rw-r--r-- | deps/v8/src/interface-descriptors.cc | 363 |
1 files changed, 290 insertions, 73 deletions
diff --git a/deps/v8/src/interface-descriptors.cc b/deps/v8/src/interface-descriptors.cc index 4c7a1159b5..fa41eb0036 100644 --- a/deps/v8/src/interface-descriptors.cc +++ b/deps/v8/src/interface-descriptors.cc @@ -9,39 +9,55 @@ namespace v8 { namespace internal { -void CallInterfaceDescriptorData::Initialize( +namespace { +// Constructors for common combined semantic and representation types. +Type* SmiType() { + return Type::Intersect(Type::SignedSmall(), Type::TaggedSigned()); +} + + +Type* UntaggedSigned32() { + return Type::Intersect(Type::Signed32(), Type::UntaggedSigned32()); +} + + +Type* AnyTagged() { + return Type::Intersect( + Type::Any(), Type::Union(Type::TaggedPointer(), Type::TaggedSigned())); +} + + +Type* ExternalPointer() { + return Type::Intersect(Type::Internal(), Type::UntaggedPointer()); +} +} + + +Type::FunctionType* CallInterfaceDescriptor::BuildDefaultFunctionType( + Isolate* isolate, int parameter_count) { + Type::FunctionType* function = + Type::FunctionType::New(AnyTagged(), Type::Undefined(), parameter_count, + isolate->interface_descriptor_zone()); + while (parameter_count-- != 0) { + function->InitParameter(parameter_count, AnyTagged()); + } + return function; +} + + +void CallInterfaceDescriptorData::InitializePlatformSpecific( int register_parameter_count, Register* registers, - Representation* register_param_representations, PlatformInterfaceDescriptor* platform_descriptor) { platform_specific_descriptor_ = platform_descriptor; register_param_count_ = register_parameter_count; - // An interface descriptor must have a context register. - DCHECK(register_parameter_count > 0 && - registers[0].is(CallInterfaceDescriptor::ContextRegister())); - // InterfaceDescriptor owns a copy of the registers array. register_params_.Reset(NewArray<Register>(register_parameter_count)); for (int i = 0; i < register_parameter_count; i++) { register_params_[i] = registers[i]; } - - // If a representations array is specified, then the descriptor owns that as - // well. - if (register_param_representations != NULL) { - register_param_representations_.Reset( - NewArray<Representation>(register_parameter_count)); - for (int i = 0; i < register_parameter_count; i++) { - // If there is a context register, the representation must be tagged. - DCHECK( - i != 0 || - register_param_representations[i].Equals(Representation::Tagged())); - register_param_representations_[i] = register_param_representations[i]; - } - } } - const char* CallInterfaceDescriptor::DebugName(Isolate* isolate) const { CallInterfaceDescriptorData* start = isolate->call_descriptor_data(0); size_t index = data_ - start; @@ -60,98 +76,299 @@ const char* CallInterfaceDescriptor::DebugName(Isolate* isolate) const { } -void LoadDescriptor::Initialize(CallInterfaceDescriptorData* data) { - Register registers[] = {ContextRegister(), ReceiverRegister(), - NameRegister()}; - data->Initialize(arraysize(registers), registers, NULL); +Type::FunctionType* LoadDescriptor::BuildCallInterfaceDescriptorFunctionType( + Isolate* isolate, int paramater_count) { + Type::FunctionType* function = Type::FunctionType::New( + AnyTagged(), Type::Undefined(), 3, isolate->interface_descriptor_zone()); + function->InitParameter(0, AnyTagged()); + function->InitParameter(1, AnyTagged()); + function->InitParameter(2, SmiType()); + return function; +} + +void LoadDescriptor::InitializePlatformSpecific( + CallInterfaceDescriptorData* data) { + Register registers[] = {ReceiverRegister(), NameRegister(), SlotRegister()}; + data->InitializePlatformSpecific(arraysize(registers), registers); } -void StoreDescriptor::Initialize(CallInterfaceDescriptorData* data) { - Register registers[] = {ContextRegister(), ReceiverRegister(), NameRegister(), - ValueRegister()}; - data->Initialize(arraysize(registers), registers, NULL); +void StoreDescriptor::InitializePlatformSpecific( + CallInterfaceDescriptorData* data) { + Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister()}; + data->InitializePlatformSpecific(arraysize(registers), registers); } -void StoreTransitionDescriptor::Initialize(CallInterfaceDescriptorData* data) { - Register registers[] = {ContextRegister(), ReceiverRegister(), NameRegister(), - ValueRegister(), MapRegister()}; - data->Initialize(arraysize(registers), registers, NULL); +void StoreTransitionDescriptor::InitializePlatformSpecific( + CallInterfaceDescriptorData* data) { + Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(), + MapRegister()}; + data->InitializePlatformSpecific(arraysize(registers), registers); } -void ElementTransitionAndStoreDescriptor::Initialize( +void ElementTransitionAndStoreDescriptor::InitializePlatformSpecific( CallInterfaceDescriptorData* data) { - Register registers[] = {ContextRegister(), ValueRegister(), MapRegister(), - NameRegister(), ReceiverRegister()}; - data->Initialize(arraysize(registers), registers, NULL); + Register registers[] = {ValueRegister(), MapRegister(), NameRegister(), + ReceiverRegister()}; + data->InitializePlatformSpecific(arraysize(registers), registers); } -void InstanceofDescriptor::Initialize(CallInterfaceDescriptorData* data) { - Register registers[] = {ContextRegister(), left(), right()}; - data->Initialize(arraysize(registers), registers, NULL); +void InstanceofDescriptor::InitializePlatformSpecific( + CallInterfaceDescriptorData* data) { + Register registers[] = {left(), right()}; + data->InitializePlatformSpecific(arraysize(registers), registers); } -void MathPowTaggedDescriptor::Initialize(CallInterfaceDescriptorData* data) { - Register registers[] = {ContextRegister(), exponent()}; - data->Initialize(arraysize(registers), registers, NULL); +void MathPowTaggedDescriptor::InitializePlatformSpecific( + CallInterfaceDescriptorData* data) { + Register registers[] = {exponent()}; + data->InitializePlatformSpecific(arraysize(registers), registers); +} + + +void MathPowIntegerDescriptor::InitializePlatformSpecific( + CallInterfaceDescriptorData* data) { + Register registers[] = {exponent()}; + data->InitializePlatformSpecific(arraysize(registers), registers); } -void MathPowIntegerDescriptor::Initialize(CallInterfaceDescriptorData* data) { - Register registers[] = {ContextRegister(), exponent()}; - data->Initialize(arraysize(registers), registers, NULL); +Type::FunctionType* +LoadWithVectorDescriptor::BuildCallInterfaceDescriptorFunctionType( + Isolate* isolate, int paramater_count) { + Type::FunctionType* function = Type::FunctionType::New( + AnyTagged(), Type::Undefined(), 4, isolate->interface_descriptor_zone()); + function->InitParameter(0, AnyTagged()); + function->InitParameter(1, AnyTagged()); + function->InitParameter(2, SmiType()); + function->InitParameter(3, AnyTagged()); + return function; } -void VectorLoadICTrampolineDescriptor::Initialize( +void LoadWithVectorDescriptor::InitializePlatformSpecific( CallInterfaceDescriptorData* data) { - Register registers[] = {ContextRegister(), ReceiverRegister(), NameRegister(), - SlotRegister()}; - data->Initialize(arraysize(registers), registers, NULL); + Register registers[] = {ReceiverRegister(), NameRegister(), SlotRegister(), + VectorRegister()}; + data->InitializePlatformSpecific(arraysize(registers), registers); } -void VectorLoadICDescriptor::Initialize(CallInterfaceDescriptorData* data) { - Register registers[] = {ContextRegister(), ReceiverRegister(), NameRegister(), +Type::FunctionType* +VectorStoreICDescriptor::BuildCallInterfaceDescriptorFunctionType( + Isolate* isolate, int paramater_count) { + Type::FunctionType* function = Type::FunctionType::New( + AnyTagged(), Type::Undefined(), 5, isolate->interface_descriptor_zone()); + function->InitParameter(0, AnyTagged()); + function->InitParameter(1, AnyTagged()); + function->InitParameter(2, AnyTagged()); + function->InitParameter(3, SmiType()); + function->InitParameter(4, AnyTagged()); + return function; +} + + +void VectorStoreICDescriptor::InitializePlatformSpecific( + CallInterfaceDescriptorData* data) { + Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(), SlotRegister(), VectorRegister()}; - Representation representations[] = { - Representation::Tagged(), Representation::Tagged(), - Representation::Tagged(), Representation::Smi(), - Representation::Tagged()}; - data->Initialize(arraysize(registers), registers, representations); + data->InitializePlatformSpecific(arraysize(registers), registers); +} + + +Type::FunctionType* +VectorStoreICTrampolineDescriptor::BuildCallInterfaceDescriptorFunctionType( + Isolate* isolate, int paramater_count) { + Type::FunctionType* function = Type::FunctionType::New( + AnyTagged(), Type::Undefined(), 4, isolate->interface_descriptor_zone()); + function->InitParameter(0, AnyTagged()); + function->InitParameter(1, AnyTagged()); + function->InitParameter(2, AnyTagged()); + function->InitParameter(3, SmiType()); + return function; +} + + +void VectorStoreICTrampolineDescriptor::InitializePlatformSpecific( + CallInterfaceDescriptorData* data) { + Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(), + SlotRegister()}; + data->InitializePlatformSpecific(arraysize(registers), registers); } -void ApiGetterDescriptor::Initialize(CallInterfaceDescriptorData* data) { - Register registers[] = {ContextRegister(), function_address()}; - Representation representations[] = {Representation::Tagged(), - Representation::External()}; - data->Initialize(arraysize(registers), registers, representations); +Type::FunctionType* +ApiGetterDescriptor::BuildCallInterfaceDescriptorFunctionType( + Isolate* isolate, int paramater_count) { + Type::FunctionType* function = Type::FunctionType::New( + AnyTagged(), Type::Undefined(), 1, isolate->interface_descriptor_zone()); + function->InitParameter(0, ExternalPointer()); + return function; } -void ArgumentsAccessReadDescriptor::Initialize( +void ApiGetterDescriptor::InitializePlatformSpecific( CallInterfaceDescriptorData* data) { - Register registers[] = {ContextRegister(), index(), parameter_count()}; - data->Initialize(arraysize(registers), registers, NULL); + Register registers[] = {function_address()}; + data->InitializePlatformSpecific(arraysize(registers), registers); } -void ContextOnlyDescriptor::Initialize(CallInterfaceDescriptorData* data) { - Register registers[] = {ContextRegister()}; - data->Initialize(arraysize(registers), registers, NULL); +void ArgumentsAccessReadDescriptor::InitializePlatformSpecific( + CallInterfaceDescriptorData* data) { + Register registers[] = {index(), parameter_count()}; + data->InitializePlatformSpecific(arraysize(registers), registers); } -void GrowArrayElementsDescriptor::Initialize( +void ContextOnlyDescriptor::InitializePlatformSpecific( CallInterfaceDescriptorData* data) { - Register registers[] = {ContextRegister(), ObjectRegister(), KeyRegister(), - CapacityRegister()}; - data->Initialize(arraysize(registers), registers, NULL); + data->InitializePlatformSpecific(0, nullptr); +} + + +void GrowArrayElementsDescriptor::InitializePlatformSpecific( + CallInterfaceDescriptorData* data) { + Register registers[] = {ObjectRegister(), KeyRegister()}; + data->InitializePlatformSpecific(arraysize(registers), registers); +} + + +Type::FunctionType* +FastCloneShallowArrayDescriptor::BuildCallInterfaceDescriptorFunctionType( + Isolate* isolate, int paramater_count) { + Type::FunctionType* function = Type::FunctionType::New( + AnyTagged(), Type::Undefined(), 3, isolate->interface_descriptor_zone()); + function->InitParameter(0, AnyTagged()); + function->InitParameter(1, SmiType()); + function->InitParameter(2, AnyTagged()); + return function; +} + + +Type::FunctionType* +CreateAllocationSiteDescriptor::BuildCallInterfaceDescriptorFunctionType( + Isolate* isolate, int paramater_count) { + Type::FunctionType* function = Type::FunctionType::New( + AnyTagged(), Type::Undefined(), 2, isolate->interface_descriptor_zone()); + function->InitParameter(0, AnyTagged()); + function->InitParameter(1, SmiType()); + return function; +} + + +Type::FunctionType* +CreateWeakCellDescriptor::BuildCallInterfaceDescriptorFunctionType( + Isolate* isolate, int paramater_count) { + Type::FunctionType* function = Type::FunctionType::New( + AnyTagged(), Type::Undefined(), 3, isolate->interface_descriptor_zone()); + function->InitParameter(0, AnyTagged()); + function->InitParameter(1, SmiType()); + function->InitParameter(2, AnyTagged()); + return function; +} + + +Type::FunctionType* +CallFunctionWithFeedbackDescriptor::BuildCallInterfaceDescriptorFunctionType( + Isolate* isolate, int paramater_count) { + Type::FunctionType* function = Type::FunctionType::New( + AnyTagged(), Type::Undefined(), 2, isolate->interface_descriptor_zone()); + function->InitParameter(0, Type::Receiver()); // JSFunction + function->InitParameter(1, SmiType()); + return function; +} + + +Type::FunctionType* CallFunctionWithFeedbackAndVectorDescriptor:: + BuildCallInterfaceDescriptorFunctionType(Isolate* isolate, + int paramater_count) { + Type::FunctionType* function = Type::FunctionType::New( + AnyTagged(), Type::Undefined(), 3, isolate->interface_descriptor_zone()); + function->InitParameter(0, Type::Receiver()); // JSFunction + function->InitParameter(1, SmiType()); + function->InitParameter(2, AnyTagged()); + return function; } + + +Type::FunctionType* +ArrayConstructorDescriptor::BuildCallInterfaceDescriptorFunctionType( + Isolate* isolate, int paramater_count) { + Type::FunctionType* function = Type::FunctionType::New( + AnyTagged(), Type::Undefined(), 3, isolate->interface_descriptor_zone()); + function->InitParameter(0, Type::Receiver()); // JSFunction + function->InitParameter(1, AnyTagged()); + function->InitParameter(2, UntaggedSigned32()); + return function; } -} // namespace v8::internal + + +Type::FunctionType* +InternalArrayConstructorDescriptor::BuildCallInterfaceDescriptorFunctionType( + Isolate* isolate, int paramater_count) { + Type::FunctionType* function = Type::FunctionType::New( + AnyTagged(), Type::Undefined(), 2, isolate->interface_descriptor_zone()); + function->InitParameter(0, Type::Receiver()); // JSFunction + function->InitParameter(1, UntaggedSigned32()); + return function; +} + + +Type::FunctionType* +ArgumentAdaptorDescriptor::BuildCallInterfaceDescriptorFunctionType( + Isolate* isolate, int paramater_count) { + Type::FunctionType* function = Type::FunctionType::New( + AnyTagged(), Type::Undefined(), 3, isolate->interface_descriptor_zone()); + function->InitParameter(0, Type::Receiver()); // JSFunction + function->InitParameter(1, UntaggedSigned32()); // actual number of arguments + function->InitParameter(2, + UntaggedSigned32()); // expected number of arguments + return function; +} + + +Type::FunctionType* +ApiFunctionDescriptor::BuildCallInterfaceDescriptorFunctionType( + Isolate* isolate, int paramater_count) { + Type::FunctionType* function = Type::FunctionType::New( + AnyTagged(), Type::Undefined(), 5, isolate->interface_descriptor_zone()); + function->InitParameter(0, AnyTagged()); // callee + function->InitParameter(1, AnyTagged()); // call_data + function->InitParameter(2, AnyTagged()); // holder + function->InitParameter(3, ExternalPointer()); // api_function_address + function->InitParameter(4, UntaggedSigned32()); // actual number of arguments + return function; +} + + +Type::FunctionType* +ApiAccessorDescriptor::BuildCallInterfaceDescriptorFunctionType( + Isolate* isolate, int paramater_count) { + Type::FunctionType* function = Type::FunctionType::New( + AnyTagged(), Type::Undefined(), 4, isolate->interface_descriptor_zone()); + function->InitParameter(0, AnyTagged()); // callee + function->InitParameter(1, AnyTagged()); // call_data + function->InitParameter(2, AnyTagged()); // holder + function->InitParameter(3, ExternalPointer()); // api_function_address + return function; +} + + +Type::FunctionType* +MathRoundVariantDescriptor::BuildCallInterfaceDescriptorFunctionType( + Isolate* isolate, int paramater_count) { + Type::FunctionType* function = Type::FunctionType::New( + AnyTagged(), Type::Undefined(), 2, isolate->interface_descriptor_zone()); + function->InitParameter(0, SmiType()); + function->InitParameter(1, AnyTagged()); + return function; +} + + +} // namespace internal +} // namespace v8 |