// Copyright 2012 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "src/v8.h" #include "src/interface-descriptors.h" namespace v8 { namespace internal { void CallInterfaceDescriptorData::Initialize( 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) { CallInterfaceDescriptorData* start = isolate->call_descriptor_data(0); size_t index = data_ - start; DCHECK(index < CallDescriptors::NUMBER_OF_DESCRIPTORS); CallDescriptors::Key key = static_cast<CallDescriptors::Key>(index); switch (key) { #define DEF_CASE(NAME) \ case CallDescriptors::NAME: \ return #NAME " Descriptor"; INTERFACE_DESCRIPTOR_LIST(DEF_CASE) #undef DEF_CASE case CallDescriptors::NUMBER_OF_DESCRIPTORS: break; } return ""; } void LoadDescriptor::Initialize(CallInterfaceDescriptorData* data) { Register registers[] = {ContextRegister(), ReceiverRegister(), NameRegister()}; data->Initialize(arraysize(registers), registers, NULL); } void StoreDescriptor::Initialize(CallInterfaceDescriptorData* data) { Register registers[] = {ContextRegister(), ReceiverRegister(), NameRegister(), ValueRegister()}; data->Initialize(arraysize(registers), registers, NULL); } void ElementTransitionAndStoreDescriptor::Initialize( CallInterfaceDescriptorData* data) { Register registers[] = {ContextRegister(), ValueRegister(), MapRegister(), NameRegister(), ReceiverRegister()}; data->Initialize(arraysize(registers), registers, NULL); } void InstanceofDescriptor::Initialize(CallInterfaceDescriptorData* data) { Register registers[] = {ContextRegister(), left(), right()}; data->Initialize(arraysize(registers), registers, NULL); } void MathPowTaggedDescriptor::Initialize(CallInterfaceDescriptorData* data) { Register registers[] = {ContextRegister(), exponent()}; data->Initialize(arraysize(registers), registers, NULL); } void MathPowIntegerDescriptor::Initialize(CallInterfaceDescriptorData* data) { Register registers[] = {ContextRegister(), exponent()}; data->Initialize(arraysize(registers), registers, NULL); } void VectorLoadICTrampolineDescriptor::Initialize( CallInterfaceDescriptorData* data) { Register registers[] = {ContextRegister(), ReceiverRegister(), NameRegister(), SlotRegister()}; data->Initialize(arraysize(registers), registers, NULL); } void VectorLoadICDescriptor::Initialize(CallInterfaceDescriptorData* data) { Register registers[] = {ContextRegister(), ReceiverRegister(), NameRegister(), SlotRegister(), VectorRegister()}; Representation representations[] = { Representation::Tagged(), Representation::Tagged(), Representation::Tagged(), Representation::Smi(), Representation::Tagged()}; data->Initialize(arraysize(registers), registers, representations); } void ApiGetterDescriptor::Initialize(CallInterfaceDescriptorData* data) { Register registers[] = {ContextRegister(), function_address()}; Representation representations[] = {Representation::Tagged(), Representation::External()}; data->Initialize(arraysize(registers), registers, representations); } void ArgumentsAccessReadDescriptor::Initialize( CallInterfaceDescriptorData* data) { Register registers[] = {ContextRegister(), index(), parameter_count()}; data->Initialize(arraysize(registers), registers, NULL); } void ContextOnlyDescriptor::Initialize(CallInterfaceDescriptorData* data) { Register registers[] = {ContextRegister()}; data->Initialize(arraysize(registers), registers, NULL); } } } // namespace v8::internal