Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(188)

Side by Side Diff: src/arm/interface-descriptors-arm.cc

Issue 527093002: Make concrete classes for individual call descriptors. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: REBASE. Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 #if V8_TARGET_ARCH_ARM 7 #if V8_TARGET_ARCH_ARM
8 8
9 #include "src/interface-descriptors.h" 9 #include "src/interface-descriptors.h"
10 10
11 namespace v8 { 11 namespace v8 {
12 namespace internal { 12 namespace internal {
13 13
14 const Register CallInterfaceDescriptor::ContextRegister() { return cp; } 14 const Register CallInterfaceDescriptor::ContextRegister() { return cp; }
15 15
16 16
17 void CallDescriptors::InitializeForIsolate(Isolate* isolate) { 17 const Register LoadDescriptor::ReceiverRegister() { return r1; }
18 static PlatformInterfaceDescriptor default_descriptor = 18 const Register LoadDescriptor::NameRegister() { return r2; }
19 PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS); 19
20 20
21 const Register VectorLoadICDescriptor::ReceiverRegister() {
22 return LoadDescriptor::ReceiverRegister();
Yang 2014/09/03 09:24:34 Looks like you could just subclass VectorLoadICDes
23 }
24
25
26 const Register VectorLoadICDescriptor::NameRegister() {
27 return LoadDescriptor::NameRegister();
28 }
29
30
31 const Register VectorLoadICDescriptor::SlotRegister() { return r0; }
32 const Register VectorLoadICDescriptor::VectorRegister() { return r3; }
33
34
35 const Register StoreDescriptor::ReceiverRegister() { return r1; }
36 const Register StoreDescriptor::NameRegister() { return r2; }
37 const Register StoreDescriptor::ValueRegister() { return r0; }
38
39
40 const Register ElementTransitionAndStoreDescriptor::ReceiverRegister() {
41 return StoreDescriptor::ReceiverRegister();
Yang 2014/09/03 09:24:34 Same here with ElementTransitionAndStoreDescriptor
42 }
43
44
45 const Register ElementTransitionAndStoreDescriptor::NameRegister() {
46 return StoreDescriptor::NameRegister();
47 }
48
49
50 const Register ElementTransitionAndStoreDescriptor::ValueRegister() {
51 return StoreDescriptor::ValueRegister();
52 }
53
54
55 const Register ElementTransitionAndStoreDescriptor::MapRegister() { return r3; }
56
57
58 const Register InstanceofDescriptor::left() { return r0; }
59 const Register InstanceofDescriptor::right() { return r1; }
60
61
62 void FastNewClosureDescriptor::Initialize(Isolate* isolate) {
63 Register registers[] = {cp, r2};
64 InitializeData(isolate, key(), arraysize(registers), registers, NULL);
65 }
66
67
68 void FastNewContextDescriptor::Initialize(Isolate* isolate) {
69 Register registers[] = {cp, r1};
70 InitializeData(isolate, key(), arraysize(registers), registers, NULL);
71 }
72
73
74 void ToNumberDescriptor::Initialize(Isolate* isolate) {
75 Register registers[] = {cp, r0};
76 InitializeData(isolate, key(), arraysize(registers), registers, NULL);
77 }
78
79
80 void NumberToStringDescriptor::Initialize(Isolate* isolate) {
81 Register registers[] = {cp, r0};
82 InitializeData(isolate, key(), arraysize(registers), registers, NULL);
83 }
84
85
86 void FastCloneShallowArrayDescriptor::Initialize(Isolate* isolate) {
87 Register registers[] = {cp, r3, r2, r1};
88 Representation representations[] = {
89 Representation::Tagged(), Representation::Tagged(), Representation::Smi(),
90 Representation::Tagged()};
91 InitializeData(isolate, key(), arraysize(registers), registers,
92 representations);
93 }
94
95
96 void FastCloneShallowObjectDescriptor::Initialize(Isolate* isolate) {
97 Register registers[] = {cp, r3, r2, r1, r0};
98 InitializeData(isolate, key(), arraysize(registers), registers, NULL);
99 }
100
101
102 void CreateAllocationSiteDescriptor::Initialize(Isolate* isolate) {
103 Register registers[] = {cp, r2, r3};
104 InitializeData(isolate, key(), arraysize(registers), registers, NULL);
105 }
106
107
108 void CallFunctionDescriptor::Initialize(Isolate* isolate) {
109 Register registers[] = {cp, r1};
110 InitializeData(isolate, key(), arraysize(registers), registers, NULL);
111 }
112
113
114 void CallConstructDescriptor::Initialize(Isolate* isolate) {
115 // r0 : number of arguments
116 // r1 : the function to call
117 // r2 : feedback vector
118 // r3 : (only if r2 is not the megamorphic symbol) slot in feedback
119 // vector (Smi)
120 // TODO(turbofan): So far we don't gather type feedback and hence skip the
121 // slot parameter, but ArrayConstructStub needs the vector to be undefined.
122 Register registers[] = {cp, r0, r1, r2};
123 InitializeData(isolate, key(), arraysize(registers), registers, NULL);
124 }
125
126
127 void RegExpConstructResultDescriptor::Initialize(Isolate* isolate) {
128 Register registers[] = {cp, r2, r1, r0};
129 InitializeData(isolate, key(), arraysize(registers), registers, NULL);
130 }
131
132
133 void TransitionElementsKindDescriptor::Initialize(Isolate* isolate) {
134 Register registers[] = {cp, r0, r1};
135 InitializeData(isolate, key(), arraysize(registers), registers, NULL);
136 }
137
138
139 void ArrayConstructorConstantArgCountDescriptor::Initialize(Isolate* isolate) {
140 // register state
141 // cp -- context
142 // r0 -- number of arguments
143 // r1 -- function
144 // r2 -- allocation site with elements kind
145 Register registers[] = {cp, r1, r2};
146 InitializeData(isolate, key(), arraysize(registers), registers, NULL);
147 }
148
149
150 void ArrayConstructorDescriptor::Initialize(Isolate* isolate) {
151 // stack param count needs (constructor pointer, and single argument)
152 Register registers[] = {cp, r1, r2, r0};
153 Representation representations[] = {
154 Representation::Tagged(), Representation::Tagged(),
155 Representation::Tagged(), Representation::Integer32()};
156 InitializeData(isolate, key(), arraysize(registers), registers,
157 representations);
158 }
159
160
161 void InternalArrayConstructorConstantArgCountDescriptor::Initialize(
162 Isolate* isolate) {
163 // register state
164 // cp -- context
165 // r0 -- number of arguments
166 // r1 -- constructor function
167 Register registers[] = {cp, r1};
168 InitializeData(isolate, key(), arraysize(registers), registers, NULL);
169 }
170
171
172 void InternalArrayConstructorDescriptor::Initialize(Isolate* isolate) {
173 // stack param count needs (constructor pointer, and single argument)
174 Register registers[] = {cp, r1, r0};
175 Representation representations[] = {Representation::Tagged(),
176 Representation::Tagged(),
177 Representation::Integer32()};
178 InitializeData(isolate, key(), arraysize(registers), registers,
179 representations);
180 }
181
182
183 void CompareNilDescriptor::Initialize(Isolate* isolate) {
184 Register registers[] = {cp, r0};
185 InitializeData(isolate, key(), arraysize(registers), registers, NULL);
186 }
187
188
189 void ToBooleanDescriptor::Initialize(Isolate* isolate) {
190 Register registers[] = {cp, r0};
191 InitializeData(isolate, key(), arraysize(registers), registers, NULL);
192 }
193
194
195 void BinaryOpDescriptor::Initialize(Isolate* isolate) {
196 Register registers[] = {cp, r1, r0};
197 InitializeData(isolate, key(), arraysize(registers), registers, NULL);
198 }
199
200
201 void BinaryOpWithAllocationSiteDescriptor::Initialize(Isolate* isolate) {
202 Register registers[] = {cp, r2, r1, r0};
203 InitializeData(isolate, key(), arraysize(registers), registers, NULL);
204 }
205
206
207 void StringAddDescriptor::Initialize(Isolate* isolate) {
208 Register registers[] = {cp, r1, r0};
209 InitializeData(isolate, key(), arraysize(registers), registers, NULL);
210 }
211
212
213 void KeyedDescriptor::Initialize(Isolate* isolate) {
21 static PlatformInterfaceDescriptor noInlineDescriptor = 214 static PlatformInterfaceDescriptor noInlineDescriptor =
22 PlatformInterfaceDescriptor(NEVER_INLINE_TARGET_ADDRESS); 215 PlatformInterfaceDescriptor(NEVER_INLINE_TARGET_ADDRESS);
23 216
24 InitializeForIsolateAllPlatforms(isolate); 217 Register registers[] = {
25 218 cp, // context
26 { 219 r2, // key
27 CallInterfaceDescriptor* descriptor = 220 };
28 isolate->call_descriptor(CallDescriptorKey::FastNewClosureCall); 221 Representation representations[] = {
29 Register registers[] = {cp, r2}; 222 Representation::Tagged(), // context
30 descriptor->Initialize(arraysize(registers), registers, NULL); 223 Representation::Tagged(), // key
31 } 224 };
32 { 225 InitializeData(isolate, key(), arraysize(registers), registers,
33 CallInterfaceDescriptor* descriptor = 226 representations, &noInlineDescriptor);
34 isolate->call_descriptor(CallDescriptorKey::FastNewContextCall); 227 }
35 Register registers[] = {cp, r1}; 228
36 descriptor->Initialize(arraysize(registers), registers, NULL); 229
37 } 230 void NamedDescriptor::Initialize(Isolate* isolate) {
38 { 231 static PlatformInterfaceDescriptor noInlineDescriptor =
39 CallInterfaceDescriptor* descriptor = 232 PlatformInterfaceDescriptor(NEVER_INLINE_TARGET_ADDRESS);
40 isolate->call_descriptor(CallDescriptorKey::ToNumberCall); 233
41 Register registers[] = {cp, r0}; 234 Register registers[] = {
42 descriptor->Initialize(arraysize(registers), registers, NULL); 235 cp, // context
43 } 236 r2, // name
44 { 237 };
45 CallInterfaceDescriptor* descriptor = 238 Representation representations[] = {
46 isolate->call_descriptor(CallDescriptorKey::NumberToStringCall); 239 Representation::Tagged(), // context
47 Register registers[] = {cp, r0}; 240 Representation::Tagged(), // name
48 descriptor->Initialize(arraysize(registers), registers, NULL); 241 };
49 } 242 InitializeData(isolate, key(), arraysize(registers), registers,
50 { 243 representations, &noInlineDescriptor);
51 CallInterfaceDescriptor* descriptor = 244 }
52 isolate->call_descriptor(CallDescriptorKey::FastCloneShallowArrayCall); 245
53 Register registers[] = {cp, r3, r2, r1}; 246
54 Representation representations[] = { 247 void CallHandlerDescriptor::Initialize(Isolate* isolate) {
55 Representation::Tagged(), Representation::Tagged(), 248 Register registers[] = {
56 Representation::Smi(), Representation::Tagged()}; 249 cp, // context
57 descriptor->Initialize(arraysize(registers), registers, representations); 250 r0, // receiver
58 } 251 };
59 { 252 Representation representations[] = {
60 CallInterfaceDescriptor* descriptor = 253 Representation::Tagged(), // context
61 isolate->call_descriptor(CallDescriptorKey::FastCloneShallowObjectCall); 254 Representation::Tagged(), // receiver
62 Register registers[] = {cp, r3, r2, r1, r0}; 255 };
63 descriptor->Initialize(arraysize(registers), registers, NULL); 256 InitializeData(isolate, key(), arraysize(registers), registers,
64 } 257 representations);
65 { 258 }
66 CallInterfaceDescriptor* descriptor = 259
67 isolate->call_descriptor(CallDescriptorKey::CreateAllocationSiteCall); 260
68 Register registers[] = {cp, r2, r3}; 261 void ArgumentAdaptorDescriptor::Initialize(Isolate* isolate) {
69 descriptor->Initialize(arraysize(registers), registers, NULL); 262 Register registers[] = {
70 } 263 cp, // context
71 { 264 r1, // JSFunction
72 CallInterfaceDescriptor* descriptor = 265 r0, // actual number of arguments
73 isolate->call_descriptor(CallDescriptorKey::CallFunctionCall); 266 r2, // expected number of arguments
74 Register registers[] = {cp, r1}; 267 };
75 descriptor->Initialize(arraysize(registers), registers, NULL); 268 Representation representations[] = {
76 } 269 Representation::Tagged(), // context
77 { 270 Representation::Tagged(), // JSFunction
78 CallInterfaceDescriptor* descriptor = 271 Representation::Integer32(), // actual number of arguments
79 isolate->call_descriptor(CallDescriptorKey::CallConstructCall); 272 Representation::Integer32(), // expected number of arguments
80 // r0 : number of arguments 273 };
81 // r1 : the function to call 274 InitializeData(isolate, key(), arraysize(registers), registers,
82 // r2 : feedback vector 275 representations);
83 // r3 : (only if r2 is not the megamorphic symbol) slot in feedback 276 }
84 // vector (Smi) 277
85 // TODO(turbofan): So far we don't gather type feedback and hence skip the 278
86 // slot parameter, but ArrayConstructStub needs the vector to be undefined. 279 void ApiFunctionDescriptor::Initialize(Isolate* isolate) {
87 Register registers[] = {cp, r0, r1, r2}; 280 Register registers[] = {
88 descriptor->Initialize(arraysize(registers), registers, NULL); 281 cp, // context
89 } 282 r0, // callee
90 { 283 r4, // call_data
91 CallInterfaceDescriptor* descriptor = 284 r2, // holder
92 isolate->call_descriptor(CallDescriptorKey::RegExpConstructResultCall); 285 r1, // api_function_address
93 Register registers[] = {cp, r2, r1, r0}; 286 };
94 descriptor->Initialize(arraysize(registers), registers, NULL); 287 Representation representations[] = {
95 } 288 Representation::Tagged(), // context
96 { 289 Representation::Tagged(), // callee
97 CallInterfaceDescriptor* descriptor = 290 Representation::Tagged(), // call_data
98 isolate->call_descriptor(CallDescriptorKey::TransitionElementsKindCall); 291 Representation::Tagged(), // holder
99 Register registers[] = {cp, r0, r1}; 292 Representation::External(), // api_function_address
100 descriptor->Initialize(arraysize(registers), registers, NULL); 293 };
101 } 294 InitializeData(isolate, key(), arraysize(registers), registers,
102 { 295 representations);
103 CallInterfaceDescriptor* descriptor = isolate->call_descriptor(
104 CallDescriptorKey::ArrayConstructorConstantArgCountCall);
105 // register state
106 // cp -- context
107 // r0 -- number of arguments
108 // r1 -- function
109 // r2 -- allocation site with elements kind
110 Register registers[] = {cp, r1, r2};
111 descriptor->Initialize(arraysize(registers), registers, NULL);
112 }
113 {
114 CallInterfaceDescriptor* descriptor =
115 isolate->call_descriptor(CallDescriptorKey::ArrayConstructorCall);
116 // stack param count needs (constructor pointer, and single argument)
117 Register registers[] = {cp, r1, r2, r0};
118 Representation representations[] = {
119 Representation::Tagged(), Representation::Tagged(),
120 Representation::Tagged(), Representation::Integer32()};
121 descriptor->Initialize(arraysize(registers), registers, representations);
122 }
123 {
124 CallInterfaceDescriptor* descriptor = isolate->call_descriptor(
125 CallDescriptorKey::InternalArrayConstructorConstantArgCountCall);
126 // register state
127 // cp -- context
128 // r0 -- number of arguments
129 // r1 -- constructor function
130 Register registers[] = {cp, r1};
131 descriptor->Initialize(arraysize(registers), registers, NULL);
132 }
133 {
134 CallInterfaceDescriptor* descriptor = isolate->call_descriptor(
135 CallDescriptorKey::InternalArrayConstructorCall);
136 // stack param count needs (constructor pointer, and single argument)
137 Register registers[] = {cp, r1, r0};
138 Representation representations[] = {Representation::Tagged(),
139 Representation::Tagged(),
140 Representation::Integer32()};
141 descriptor->Initialize(arraysize(registers), registers, representations);
142 }
143 {
144 CallInterfaceDescriptor* descriptor =
145 isolate->call_descriptor(CallDescriptorKey::CompareNilCall);
146 Register registers[] = {cp, r0};
147 descriptor->Initialize(arraysize(registers), registers, NULL);
148 }
149 {
150 CallInterfaceDescriptor* descriptor =
151 isolate->call_descriptor(CallDescriptorKey::ToBooleanCall);
152 Register registers[] = {cp, r0};
153 descriptor->Initialize(arraysize(registers), registers, NULL);
154 }
155 {
156 CallInterfaceDescriptor* descriptor =
157 isolate->call_descriptor(CallDescriptorKey::BinaryOpCall);
158 Register registers[] = {cp, r1, r0};
159 descriptor->Initialize(arraysize(registers), registers, NULL);
160 }
161 {
162 CallInterfaceDescriptor* descriptor = isolate->call_descriptor(
163 CallDescriptorKey::BinaryOpWithAllocationSiteCall);
164 Register registers[] = {cp, r2, r1, r0};
165 descriptor->Initialize(arraysize(registers), registers, NULL);
166 }
167 {
168 CallInterfaceDescriptor* descriptor =
169 isolate->call_descriptor(CallDescriptorKey::StringAddCall);
170 Register registers[] = {cp, r1, r0};
171 descriptor->Initialize(arraysize(registers), registers, NULL);
172 }
173
174 {
175 CallInterfaceDescriptor* descriptor =
176 isolate->call_descriptor(CallDescriptorKey::ArgumentAdaptorCall);
177 Register registers[] = {
178 cp, // context
179 r1, // JSFunction
180 r0, // actual number of arguments
181 r2, // expected number of arguments
182 };
183 Representation representations[] = {
184 Representation::Tagged(), // context
185 Representation::Tagged(), // JSFunction
186 Representation::Integer32(), // actual number of arguments
187 Representation::Integer32(), // expected number of arguments
188 };
189 descriptor->Initialize(arraysize(registers), registers, representations,
190 &default_descriptor);
191 }
192 {
193 CallInterfaceDescriptor* descriptor =
194 isolate->call_descriptor(CallDescriptorKey::KeyedCall);
195 Register registers[] = {
196 cp, // context
197 r2, // key
198 };
199 Representation representations[] = {
200 Representation::Tagged(), // context
201 Representation::Tagged(), // key
202 };
203 descriptor->Initialize(arraysize(registers), registers, representations,
204 &noInlineDescriptor);
205 }
206 {
207 CallInterfaceDescriptor* descriptor =
208 isolate->call_descriptor(CallDescriptorKey::NamedCall);
209 Register registers[] = {
210 cp, // context
211 r2, // name
212 };
213 Representation representations[] = {
214 Representation::Tagged(), // context
215 Representation::Tagged(), // name
216 };
217 descriptor->Initialize(arraysize(registers), registers, representations,
218 &noInlineDescriptor);
219 }
220 {
221 CallInterfaceDescriptor* descriptor =
222 isolate->call_descriptor(CallDescriptorKey::CallHandler);
223 Register registers[] = {
224 cp, // context
225 r0, // receiver
226 };
227 Representation representations[] = {
228 Representation::Tagged(), // context
229 Representation::Tagged(), // receiver
230 };
231 descriptor->Initialize(arraysize(registers), registers, representations,
232 &default_descriptor);
233 }
234 {
235 CallInterfaceDescriptor* descriptor =
236 isolate->call_descriptor(CallDescriptorKey::ApiFunctionCall);
237 Register registers[] = {
238 cp, // context
239 r0, // callee
240 r4, // call_data
241 r2, // holder
242 r1, // api_function_address
243 };
244 Representation representations[] = {
245 Representation::Tagged(), // context
246 Representation::Tagged(), // callee
247 Representation::Tagged(), // call_data
248 Representation::Tagged(), // holder
249 Representation::External(), // api_function_address
250 };
251 descriptor->Initialize(arraysize(registers), registers, representations,
252 &default_descriptor);
253 }
254 } 296 }
255 } 297 }
256 } // namespace v8::internal 298 } // namespace v8::internal
257 299
258 #endif // V8_TARGET_ARCH_ARM 300 #endif // V8_TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « src/arm/full-codegen-arm.cc ('k') | src/arm/lithium-arm.h » ('j') | src/code-stubs.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698