1d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 2d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be 3d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org// found in the LICENSE file. 4d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org 5d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org#include "src/v8.h" 6d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org 7d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org#include "src/interface-descriptors.h" 8d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org 9d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.orgnamespace v8 { 10d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.orgnamespace internal { 11d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org 129aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.orgvoid CallInterfaceDescriptorData::Initialize( 13d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org int register_parameter_count, Register* registers, 14d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org Representation* register_param_representations, 15d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org PlatformInterfaceDescriptor* platform_descriptor) { 16d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org platform_specific_descriptor_ = platform_descriptor; 17d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org register_param_count_ = register_parameter_count; 18d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org 19d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org // An interface descriptor must have a context register. 209aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org DCHECK(register_parameter_count > 0 && 219aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org registers[0].is(CallInterfaceDescriptor::ContextRegister())); 22d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org 23d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org // InterfaceDescriptor owns a copy of the registers array. 24d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org register_params_.Reset(NewArray<Register>(register_parameter_count)); 25d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org for (int i = 0; i < register_parameter_count; i++) { 26d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org register_params_[i] = registers[i]; 27d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org } 28d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org 29d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org // If a representations array is specified, then the descriptor owns that as 30d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org // well. 31d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org if (register_param_representations != NULL) { 32d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org register_param_representations_.Reset( 33d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org NewArray<Representation>(register_parameter_count)); 34d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org for (int i = 0; i < register_parameter_count; i++) { 35d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org // If there is a context register, the representation must be tagged. 36d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org DCHECK( 37d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org i != 0 || 38d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org register_param_representations[i].Equals(Representation::Tagged())); 39d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org register_param_representations_[i] = register_param_representations[i]; 40d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org } 41d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org } 42d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org} 43d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org 44d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org 45e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orgconst char* CallInterfaceDescriptor::DebugName(Isolate* isolate) { 46e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org CallInterfaceDescriptorData* start = isolate->call_descriptor_data(0); 47e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org size_t index = data_ - start; 48e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org DCHECK(index < CallDescriptors::NUMBER_OF_DESCRIPTORS); 49e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org CallDescriptors::Key key = static_cast<CallDescriptors::Key>(index); 50e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org switch (key) { 51e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org#define DEF_CASE(NAME) \ 52e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org case CallDescriptors::NAME: \ 53e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org return #NAME " Descriptor"; 54e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org INTERFACE_DESCRIPTOR_LIST(DEF_CASE) 55e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org#undef DEF_CASE 56e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org case CallDescriptors::NUMBER_OF_DESCRIPTORS: 57e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org break; 58e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org } 59e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org return ""; 60e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org} 61e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org 62e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org 639aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.orgvoid LoadDescriptor::Initialize(CallInterfaceDescriptorData* data) { 649aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org Register registers[] = {ContextRegister(), ReceiverRegister(), 659aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org NameRegister()}; 669aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org data->Initialize(arraysize(registers), registers, NULL); 679aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org} 689aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org 699aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org 709aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.orgvoid StoreDescriptor::Initialize(CallInterfaceDescriptorData* data) { 719aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org Register registers[] = {ContextRegister(), ReceiverRegister(), NameRegister(), 729aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org ValueRegister()}; 739aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org data->Initialize(arraysize(registers), registers, NULL); 749aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org} 759aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org 769aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org 779aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.orgvoid ElementTransitionAndStoreDescriptor::Initialize( 789aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org CallInterfaceDescriptorData* data) { 799aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org Register registers[] = {ContextRegister(), ValueRegister(), MapRegister(), 809aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org NameRegister(), ReceiverRegister()}; 819aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org data->Initialize(arraysize(registers), registers, NULL); 829aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org} 839aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org 849aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org 859aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.orgvoid InstanceofDescriptor::Initialize(CallInterfaceDescriptorData* data) { 869aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org Register registers[] = {ContextRegister(), left(), right()}; 879aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org data->Initialize(arraysize(registers), registers, NULL); 88d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org} 899aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org 909aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org 916313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.orgvoid MathPowTaggedDescriptor::Initialize(CallInterfaceDescriptorData* data) { 926313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org Register registers[] = {ContextRegister(), exponent()}; 936313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org data->Initialize(arraysize(registers), registers, NULL); 946313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org} 956313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org 966313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org 976313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.orgvoid MathPowIntegerDescriptor::Initialize(CallInterfaceDescriptorData* data) { 986313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org Register registers[] = {ContextRegister(), exponent()}; 996313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org data->Initialize(arraysize(registers), registers, NULL); 1006313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org} 1016313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org 1026313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org 1036313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.orgvoid VectorLoadICTrampolineDescriptor::Initialize( 1046313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org CallInterfaceDescriptorData* data) { 1056313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org Register registers[] = {ContextRegister(), ReceiverRegister(), NameRegister(), 1066313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org SlotRegister()}; 1076313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org data->Initialize(arraysize(registers), registers, NULL); 1086313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org} 1096313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org 1106313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org 1119aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.orgvoid VectorLoadICDescriptor::Initialize(CallInterfaceDescriptorData* data) { 1129aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org Register registers[] = {ContextRegister(), ReceiverRegister(), NameRegister(), 1139aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org SlotRegister(), VectorRegister()}; 1146313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org Representation representations[] = { 1156313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org Representation::Tagged(), Representation::Tagged(), 1166313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org Representation::Tagged(), Representation::Smi(), 1176313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org Representation::Tagged()}; 1186313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org data->Initialize(arraysize(registers), registers, representations); 1196313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org} 1206313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org 1216313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org 1226313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.orgvoid ApiGetterDescriptor::Initialize(CallInterfaceDescriptorData* data) { 1236313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org Register registers[] = {ContextRegister(), function_address()}; 1246313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org Representation representations[] = {Representation::Tagged(), 1256313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org Representation::External()}; 1266313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org data->Initialize(arraysize(registers), registers, representations); 1276313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org} 1286313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org 1296313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org 1306313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.orgvoid ArgumentsAccessReadDescriptor::Initialize( 1316313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org CallInterfaceDescriptorData* data) { 1326313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org Register registers[] = {ContextRegister(), index(), parameter_count()}; 1336313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org data->Initialize(arraysize(registers), registers, NULL); 1346313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org} 1356313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org 1366313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org 1376313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.orgvoid ContextOnlyDescriptor::Initialize(CallInterfaceDescriptorData* data) { 1386313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org Register registers[] = {ContextRegister()}; 1399aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org data->Initialize(arraysize(registers), registers, NULL); 1409aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org} 1419aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org 142d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org} 143d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org} // namespace v8::internal 144