blob: b1ebc3faeef53feaf626409c17280e97ebb13941 [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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
3// found in the LICENSE file.
4
5#include "src/v8.h"
6
7#include "src/interface-descriptors.h"
8
9namespace v8 {
10namespace internal {
11
12void CallInterfaceDescriptorData::Initialize(
13 int register_parameter_count, Register* registers,
14 Representation* register_param_representations,
15 PlatformInterfaceDescriptor* platform_descriptor) {
16 platform_specific_descriptor_ = platform_descriptor;
17 register_param_count_ = register_parameter_count;
18
19 // An interface descriptor must have a context register.
20 DCHECK(register_parameter_count > 0 &&
21 registers[0].is(CallInterfaceDescriptor::ContextRegister()));
22
23 // InterfaceDescriptor owns a copy of the registers array.
24 register_params_.Reset(NewArray<Register>(register_parameter_count));
25 for (int i = 0; i < register_parameter_count; i++) {
26 register_params_[i] = registers[i];
27 }
28
29 // If a representations array is specified, then the descriptor owns that as
30 // well.
31 if (register_param_representations != NULL) {
32 register_param_representations_.Reset(
33 NewArray<Representation>(register_parameter_count));
34 for (int i = 0; i < register_parameter_count; i++) {
35 // If there is a context register, the representation must be tagged.
36 DCHECK(
37 i != 0 ||
38 register_param_representations[i].Equals(Representation::Tagged()));
39 register_param_representations_[i] = register_param_representations[i];
40 }
41 }
42}
43
44
Emily Bernierd0a1eb72015-03-24 16:35:39 -040045const char* CallInterfaceDescriptor::DebugName(Isolate* isolate) const {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000046 CallInterfaceDescriptorData* start = isolate->call_descriptor_data(0);
47 size_t index = data_ - start;
48 DCHECK(index < CallDescriptors::NUMBER_OF_DESCRIPTORS);
49 CallDescriptors::Key key = static_cast<CallDescriptors::Key>(index);
50 switch (key) {
51#define DEF_CASE(NAME) \
52 case CallDescriptors::NAME: \
53 return #NAME " Descriptor";
54 INTERFACE_DESCRIPTOR_LIST(DEF_CASE)
55#undef DEF_CASE
56 case CallDescriptors::NUMBER_OF_DESCRIPTORS:
57 break;
58 }
59 return "";
60}
61
62
63void LoadDescriptor::Initialize(CallInterfaceDescriptorData* data) {
64 Register registers[] = {ContextRegister(), ReceiverRegister(),
65 NameRegister()};
66 data->Initialize(arraysize(registers), registers, NULL);
67}
68
69
70void StoreDescriptor::Initialize(CallInterfaceDescriptorData* data) {
71 Register registers[] = {ContextRegister(), ReceiverRegister(), NameRegister(),
72 ValueRegister()};
73 data->Initialize(arraysize(registers), registers, NULL);
74}
75
76
Emily Bernierd0a1eb72015-03-24 16:35:39 -040077void StoreTransitionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
78 Register registers[] = {ContextRegister(), ReceiverRegister(), NameRegister(),
79 ValueRegister(), MapRegister()};
80 data->Initialize(arraysize(registers), registers, NULL);
81}
82
83
Ben Murdochb8a8cc12014-11-26 15:28:44 +000084void ElementTransitionAndStoreDescriptor::Initialize(
85 CallInterfaceDescriptorData* data) {
86 Register registers[] = {ContextRegister(), ValueRegister(), MapRegister(),
87 NameRegister(), ReceiverRegister()};
88 data->Initialize(arraysize(registers), registers, NULL);
89}
90
91
92void InstanceofDescriptor::Initialize(CallInterfaceDescriptorData* data) {
93 Register registers[] = {ContextRegister(), left(), right()};
94 data->Initialize(arraysize(registers), registers, NULL);
95}
96
97
98void MathPowTaggedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
99 Register registers[] = {ContextRegister(), exponent()};
100 data->Initialize(arraysize(registers), registers, NULL);
101}
102
103
104void MathPowIntegerDescriptor::Initialize(CallInterfaceDescriptorData* data) {
105 Register registers[] = {ContextRegister(), exponent()};
106 data->Initialize(arraysize(registers), registers, NULL);
107}
108
109
110void VectorLoadICTrampolineDescriptor::Initialize(
111 CallInterfaceDescriptorData* data) {
112 Register registers[] = {ContextRegister(), ReceiverRegister(), NameRegister(),
113 SlotRegister()};
114 data->Initialize(arraysize(registers), registers, NULL);
115}
116
117
118void VectorLoadICDescriptor::Initialize(CallInterfaceDescriptorData* data) {
119 Register registers[] = {ContextRegister(), ReceiverRegister(), NameRegister(),
120 SlotRegister(), VectorRegister()};
121 Representation representations[] = {
122 Representation::Tagged(), Representation::Tagged(),
123 Representation::Tagged(), Representation::Smi(),
124 Representation::Tagged()};
125 data->Initialize(arraysize(registers), registers, representations);
126}
127
128
129void ApiGetterDescriptor::Initialize(CallInterfaceDescriptorData* data) {
130 Register registers[] = {ContextRegister(), function_address()};
131 Representation representations[] = {Representation::Tagged(),
132 Representation::External()};
133 data->Initialize(arraysize(registers), registers, representations);
134}
135
136
137void ArgumentsAccessReadDescriptor::Initialize(
138 CallInterfaceDescriptorData* data) {
139 Register registers[] = {ContextRegister(), index(), parameter_count()};
140 data->Initialize(arraysize(registers), registers, NULL);
141}
142
143
144void ContextOnlyDescriptor::Initialize(CallInterfaceDescriptorData* data) {
145 Register registers[] = {ContextRegister()};
146 data->Initialize(arraysize(registers), registers, NULL);
147}
148
149}
150} // namespace v8::internal