interface-descriptors.cc 6.39 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11
// 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 {

12
void CallInterfaceDescriptorData::Initialize(
13 14 15 16 17 18 19
    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.
20 21
  DCHECK(register_parameter_count > 0 &&
         registers[0].is(CallInterfaceDescriptor::ContextRegister()));
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44

  // 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];
    }
  }
}


45
const char* CallInterfaceDescriptor::DebugName(Isolate* isolate) const {
46
  CallInterfaceDescriptorData* start = isolate->call_descriptor_data(0);
47
  size_t index = data_ - start;
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
  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 "";
}


63
void LoadDescriptor::Initialize(CallInterfaceDescriptorData* data) {
64 65 66 67 68 69
  Register registers[] = {ContextRegister(), ReceiverRegister(), NameRegister(),
                          SlotRegister()};
  Representation representations[] = {
      Representation::Tagged(), Representation::Tagged(),
      Representation::Tagged(), Representation::Smi()};
  data->Initialize(arraysize(registers), registers, representations);
70 71 72
}


73
void StoreDescriptor::Initialize(CallInterfaceDescriptorData* data) {
74 75
  Register registers[] = {ContextRegister(), ReceiverRegister(), NameRegister(),
                          ValueRegister()};
76
  data->Initialize(arraysize(registers), registers, NULL);
77 78 79
}


80
void StoreTransitionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
81 82 83 84 85 86
  Register registers[] = {ContextRegister(), ReceiverRegister(), NameRegister(),
                          ValueRegister(), MapRegister()};
  data->Initialize(arraysize(registers), registers, NULL);
}


87 88
void ElementTransitionAndStoreDescriptor::Initialize(
    CallInterfaceDescriptorData* data) {
89 90
  Register registers[] = {ContextRegister(), ValueRegister(), MapRegister(),
                          NameRegister(), ReceiverRegister()};
91
  data->Initialize(arraysize(registers), registers, NULL);
92 93 94
}


95
void InstanceofDescriptor::Initialize(CallInterfaceDescriptorData* data) {
96
  Register registers[] = {ContextRegister(), left(), right()};
97
  data->Initialize(arraysize(registers), registers, NULL);
98 99 100
}


101 102 103 104 105 106 107 108 109 110 111 112
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);
}


113
void LoadWithVectorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
114 115
  Register registers[] = {ContextRegister(), ReceiverRegister(), NameRegister(),
                          SlotRegister(), VectorRegister()};
116 117 118 119 120
  Representation representations[] = {
      Representation::Tagged(), Representation::Tagged(),
      Representation::Tagged(), Representation::Smi(),
      Representation::Tagged()};
  data->Initialize(arraysize(registers), registers, representations);
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
}


void VectorStoreICDescriptor::Initialize(CallInterfaceDescriptorData* data) {
  Register registers[] = {ContextRegister(), ReceiverRegister(),
                          NameRegister(),    ValueRegister(),
                          SlotRegister(),    VectorRegister()};
  Representation representations[] = {
      Representation::Tagged(), Representation::Tagged(),
      Representation::Tagged(), Representation::Tagged(),
      Representation::Smi(),    Representation::Tagged()};
  data->Initialize(arraysize(registers), registers, representations);
}


void VectorStoreICTrampolineDescriptor::Initialize(
    CallInterfaceDescriptorData* data) {
  Register registers[] = {ContextRegister(), ReceiverRegister(), NameRegister(),
                          ValueRegister(), SlotRegister()};
  Representation representations[] = {
      Representation::Tagged(), Representation::Tagged(),
      Representation::Tagged(), Representation::Tagged(),
      Representation::Smi()};
  data->Initialize(arraysize(registers), registers, representations);
145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
}


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()};
165
  data->Initialize(arraysize(registers), registers, NULL);
166 167
}

168 169 170

void GrowArrayElementsDescriptor::Initialize(
    CallInterfaceDescriptorData* data) {
171
  Register registers[] = {ContextRegister(), ObjectRegister(), KeyRegister()};
172 173
  data->Initialize(arraysize(registers), registers, NULL);
}
174 175
}  // namespace internal
}  // namespace v8