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