| 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 #include "src/ic/ic-conventions.h" | |
| 8 #include "src/interface-descriptors.h" | 7 #include "src/interface-descriptors.h" |
| 9 | 8 |
| 10 namespace v8 { | 9 namespace v8 { |
| 11 namespace internal { | 10 namespace internal { |
| 12 | 11 |
| 13 void CallInterfaceDescriptor::Initialize( | 12 void CallInterfaceDescriptorData::Initialize( |
| 14 int register_parameter_count, Register* registers, | 13 int register_parameter_count, Register* registers, |
| 15 Representation* register_param_representations, | 14 Representation* register_param_representations, |
| 16 PlatformInterfaceDescriptor* platform_descriptor) { | 15 PlatformInterfaceDescriptor* platform_descriptor) { |
| 17 platform_specific_descriptor_ = platform_descriptor; | 16 platform_specific_descriptor_ = platform_descriptor; |
| 18 register_param_count_ = register_parameter_count; | 17 register_param_count_ = register_parameter_count; |
| 19 | 18 |
| 20 // An interface descriptor must have a context register. | 19 // An interface descriptor must have a context register. |
| 21 DCHECK(register_parameter_count > 0 && registers[0].is(ContextRegister())); | 20 DCHECK(register_parameter_count > 0 && |
| 21 registers[0].is(CallInterfaceDescriptor::ContextRegister())); |
| 22 | 22 |
| 23 // InterfaceDescriptor owns a copy of the registers array. | 23 // InterfaceDescriptor owns a copy of the registers array. |
| 24 register_params_.Reset(NewArray<Register>(register_parameter_count)); | 24 register_params_.Reset(NewArray<Register>(register_parameter_count)); |
| 25 for (int i = 0; i < register_parameter_count; i++) { | 25 for (int i = 0; i < register_parameter_count; i++) { |
| 26 register_params_[i] = registers[i]; | 26 register_params_[i] = registers[i]; |
| 27 } | 27 } |
| 28 | 28 |
| 29 // If a representations array is specified, then the descriptor owns that as | 29 // If a representations array is specified, then the descriptor owns that as |
| 30 // well. | 30 // well. |
| 31 if (register_param_representations != NULL) { | 31 if (register_param_representations != NULL) { |
| 32 register_param_representations_.Reset( | 32 register_param_representations_.Reset( |
| 33 NewArray<Representation>(register_parameter_count)); | 33 NewArray<Representation>(register_parameter_count)); |
| 34 for (int i = 0; i < register_parameter_count; i++) { | 34 for (int i = 0; i < register_parameter_count; i++) { |
| 35 // If there is a context register, the representation must be tagged. | 35 // If there is a context register, the representation must be tagged. |
| 36 DCHECK( | 36 DCHECK( |
| 37 i != 0 || | 37 i != 0 || |
| 38 register_param_representations[i].Equals(Representation::Tagged())); | 38 register_param_representations[i].Equals(Representation::Tagged())); |
| 39 register_param_representations_[i] = register_param_representations[i]; | 39 register_param_representations_[i] = register_param_representations[i]; |
| 40 } | 40 } |
| 41 } | 41 } |
| 42 } | 42 } |
| 43 | 43 |
| 44 | 44 |
| 45 void CallDescriptors::InitializeForIsolateAllPlatforms(Isolate* isolate) { | 45 void LoadDescriptor::Initialize(Isolate* isolate) { |
| 46 { | 46 Register registers[] = {ContextRegister(), ReceiverRegister(), |
| 47 CallInterfaceDescriptor* descriptor = | 47 NameRegister()}; |
| 48 isolate->call_descriptor(CallDescriptorKey::LoadICCall); | 48 InitializeData(isolate, key(), arraysize(registers), registers, NULL); |
| 49 Register registers[] = {CallInterfaceDescriptor::ContextRegister(), | 49 } |
| 50 LoadConvention::ReceiverRegister(), | 50 |
| 51 LoadConvention::NameRegister()}; | 51 |
| 52 descriptor->Initialize(arraysize(registers), registers, NULL); | 52 void StoreDescriptor::Initialize(Isolate* isolate) { |
| 53 } | 53 Register registers[] = {ContextRegister(), ReceiverRegister(), NameRegister(), |
| 54 { | 54 ValueRegister()}; |
| 55 CallInterfaceDescriptor* descriptor = | 55 InitializeData(isolate, key(), arraysize(registers), registers, NULL); |
| 56 isolate->call_descriptor(CallDescriptorKey::StoreICCall); | 56 } |
| 57 Register registers[] = {CallInterfaceDescriptor::ContextRegister(), | 57 |
| 58 StoreConvention::ReceiverRegister(), | 58 |
| 59 StoreConvention::NameRegister(), | 59 void ElementTransitionAndStoreDescriptor::Initialize(Isolate* isolate) { |
| 60 StoreConvention::ValueRegister()}; | 60 Register registers[] = {ContextRegister(), ValueRegister(), MapRegister(), |
| 61 descriptor->Initialize(arraysize(registers), registers, NULL); | 61 NameRegister(), ReceiverRegister()}; |
| 62 } | 62 InitializeData(isolate, key(), arraysize(registers), registers, NULL); |
| 63 { | 63 } |
| 64 CallInterfaceDescriptor* descriptor = isolate->call_descriptor( | 64 |
| 65 CallDescriptorKey::ElementTransitionAndStoreCall); | 65 |
| 66 Register registers[] = { | 66 void InstanceofDescriptor::Initialize(Isolate* isolate) { |
| 67 CallInterfaceDescriptor::ContextRegister(), | 67 Register registers[] = {ContextRegister(), left(), right()}; |
| 68 StoreConvention::ValueRegister(), StoreConvention::MapRegister(), | 68 InitializeData(isolate, key(), arraysize(registers), registers, NULL); |
| 69 StoreConvention::NameRegister(), StoreConvention::ReceiverRegister()}; | 69 } |
| 70 descriptor->Initialize(arraysize(registers), registers, NULL); | 70 |
| 71 } | 71 |
| 72 { | 72 void VectorLoadICDescriptor::Initialize(Isolate* isolate) { |
| 73 CallInterfaceDescriptor* descriptor = | 73 Register registers[] = {ContextRegister(), ReceiverRegister(), NameRegister(), |
| 74 isolate->call_descriptor(CallDescriptorKey::InstanceofCall); | 74 SlotRegister(), VectorRegister()}; |
| 75 Register registers[] = {CallInterfaceDescriptor::ContextRegister(), | 75 InitializeData(isolate, key(), arraysize(registers), registers, NULL); |
| 76 InstanceofConvention::left(), | 76 } |
| 77 InstanceofConvention::right()}; | 77 |
| 78 descriptor->Initialize(arraysize(registers), registers, NULL); | 78 |
| 79 } | 79 void CallDescriptors::InitializeForIsolate(Isolate* isolate) { |
| 80 { | 80 // Mechanically initialize all descriptors. The DCHECK makes sure that the |
| 81 CallInterfaceDescriptor* descriptor = | 81 // Initialize() method did what it is supposed to do. |
| 82 isolate->call_descriptor(CallDescriptorKey::VectorLoadICCall); | 82 |
| 83 Register registers[] = {CallInterfaceDescriptor::ContextRegister(), | 83 #define INITIALIZE_DESCRIPTOR(D) \ |
| 84 FullVectorLoadConvention::ReceiverRegister(), | 84 D##Descriptor::Initialize(isolate); \ |
| 85 FullVectorLoadConvention::NameRegister(), | 85 DCHECK(D##Descriptor(isolate).IsInitialized()); |
| 86 FullVectorLoadConvention::SlotRegister(), | 86 |
| 87 FullVectorLoadConvention::VectorRegister()}; | 87 INTERFACE_DESCRIPTOR_LIST(INITIALIZE_DESCRIPTOR) |
| 88 descriptor->Initialize(arraysize(registers), registers, NULL); | 88 #undef INITIALIZE_DESCRIPTOR |
| 89 } | |
| 90 } | 89 } |
| 91 } | 90 } |
| 92 } // namespace v8::internal | 91 } // namespace v8::internal |
| OLD | NEW |