OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_IA32. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_IA32. |
6 #if defined(TARGET_ARCH_IA32) | 6 #if defined(TARGET_ARCH_IA32) |
7 | 7 |
8 #include "vm/flow_graph_compiler.h" | 8 #include "vm/flow_graph_compiler.h" |
9 #include "vm/locations.h" | 9 #include "vm/locations.h" |
| 10 #include "vm/stub_code.h" |
10 | 11 |
11 #define __ compiler->assembler()-> | 12 #define __ compiler->assembler()-> |
12 | 13 |
13 namespace dart { | 14 namespace dart { |
14 | 15 |
| 16 DECLARE_FLAG(bool, optimization_counter_threshold); |
| 17 DECLARE_FLAG(bool, trace_functions); |
| 18 |
| 19 // True iff. the arguments to a call will be properly pushed and can |
| 20 // be popped after the call. |
| 21 template <typename T> static bool VerifyCallComputation(T* comp) { |
| 22 // Argument values should be consecutive temps. |
| 23 // |
| 24 // TODO(kmillikin): implement stack height tracking so we can also assert |
| 25 // they are on top of the stack. |
| 26 intptr_t previous = -1; |
| 27 for (int i = 0; i < comp->ArgumentCount(); ++i) { |
| 28 Value* val = comp->ArgumentAt(i); |
| 29 if (!val->IsUse()) return false; |
| 30 intptr_t current = val->AsUse()->definition()->temp_index(); |
| 31 if (i != 0) { |
| 32 if (current != (previous + 1)) return false; |
| 33 } |
| 34 previous = current; |
| 35 } |
| 36 return true; |
| 37 } |
| 38 |
| 39 |
| 40 // Generic summary for call instructions that have all arguments pushed |
| 41 // on the stack and return the result in a fixed register EAX. |
| 42 static LocationSummary* MakeCallSummary() { |
| 43 LocationSummary* result = new LocationSummary(0, 0); |
| 44 result->set_out(Location::RegisterLocation(EAX)); |
| 45 return result; |
| 46 } |
| 47 |
15 | 48 |
16 void BindInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 49 void BindInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
17 UNIMPLEMENTED(); | 50 computation()->EmitNativeCode(compiler); |
| 51 __ pushl(locs()->out().reg()); |
| 52 } |
| 53 |
| 54 |
| 55 LocationSummary* ReturnInstr::MakeLocationSummary() const { |
| 56 const intptr_t kNumInputs = 1; |
| 57 const intptr_t kNumTemps = 1; |
| 58 LocationSummary* locs = new LocationSummary(kNumInputs, kNumTemps); |
| 59 locs->set_in(0, Location::RegisterLocation(EAX)); |
| 60 locs->set_temp(0, Location::RequiresRegister()); |
| 61 return locs; |
| 62 } |
| 63 |
| 64 |
| 65 void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 66 Register result = locs()->in(0).reg(); |
| 67 Register temp = locs()->temp(0).reg(); |
| 68 ASSERT(result == EAX); |
| 69 if (!compiler->is_optimizing()) { |
| 70 // Count only in unoptimized code. |
| 71 // TODO(srdjan): Replace the counting code with a type feedback |
| 72 // collection and counting stub. |
| 73 const Function& function = |
| 74 Function::ZoneHandle(compiler->parsed_function().function().raw()); |
| 75 __ LoadObject(temp, function); |
| 76 __ incl(FieldAddress(temp, Function::usage_counter_offset())); |
| 77 if (CodeGenerator::CanOptimize()) { |
| 78 // Do not optimize if usage count must be reported. |
| 79 __ cmpl(FieldAddress(temp, Function::usage_counter_offset()), |
| 80 Immediate(FLAG_optimization_counter_threshold)); |
| 81 Label not_yet_hot; |
| 82 __ j(LESS_EQUAL, ¬_yet_hot, Assembler::kNearJump); |
| 83 __ pushl(result); // Preserve result. |
| 84 __ pushl(temp); // Argument for runtime: function to optimize. |
| 85 __ CallRuntime(kOptimizeInvokedFunctionRuntimeEntry); |
| 86 __ popl(temp); // Remove argument. |
| 87 __ popl(result); // Restore result. |
| 88 __ Bind(¬_yet_hot); |
| 89 } |
| 90 } |
| 91 if (FLAG_trace_functions) { |
| 92 const Function& function = |
| 93 Function::ZoneHandle(compiler->parsed_function().function().raw()); |
| 94 __ LoadObject(temp, function); |
| 95 __ pushl(result); // Preserve result. |
| 96 __ pushl(temp); |
| 97 compiler->GenerateCallRuntime(AstNode::kNoId, |
| 98 0, |
| 99 CatchClauseNode::kInvalidTryIndex, |
| 100 kTraceFunctionExitRuntimeEntry); |
| 101 __ popl(temp); // Remove argument. |
| 102 __ popl(result); // Restore result. |
| 103 } |
| 104 __ LeaveFrame(); |
| 105 __ ret(); |
| 106 // Add a NOP to make return code pattern 5 bytes long for patching |
| 107 // in breakpoints during debugging. |
| 108 __ nop(1); |
| 109 compiler->AddCurrentDescriptor(PcDescriptors::kReturn, |
| 110 cid(), |
| 111 token_index(), |
| 112 CatchClauseNode::kInvalidTryIndex); |
18 } | 113 } |
19 | 114 |
20 | 115 |
21 LocationSummary* ThrowInstr::MakeLocationSummary() const { | 116 LocationSummary* ThrowInstr::MakeLocationSummary() const { |
22 return NULL; | 117 return NULL; |
23 } | 118 } |
24 | 119 |
25 | 120 |
26 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 121 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
27 UNIMPLEMENTED(); | 122 UNIMPLEMENTED(); |
(...skipping 18 matching lines...) Expand all Loading... |
46 void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 141 void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
47 UNIMPLEMENTED(); | 142 UNIMPLEMENTED(); |
48 } | 143 } |
49 | 144 |
50 | 145 |
51 LocationSummary* CurrentContextComp::MakeLocationSummary() const { | 146 LocationSummary* CurrentContextComp::MakeLocationSummary() const { |
52 return NULL; | 147 return NULL; |
53 } | 148 } |
54 | 149 |
55 | 150 |
56 void CurrentContextComp::EmitNativeCode(FlowGraphCompiler* compile) { | 151 void CurrentContextComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
57 UNIMPLEMENTED(); | 152 UNIMPLEMENTED(); |
58 } | 153 } |
59 | 154 |
60 | 155 |
61 LocationSummary* StoreContextComp::MakeLocationSummary() const { | 156 LocationSummary* StoreContextComp::MakeLocationSummary() const { |
62 return NULL; | 157 return NULL; |
63 } | 158 } |
64 | 159 |
65 | 160 |
66 void StoreContextComp::EmitNativeCode(FlowGraphCompiler* compile) { | 161 void StoreContextComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
67 UNIMPLEMENTED(); | 162 UNIMPLEMENTED(); |
68 } | 163 } |
69 | 164 |
70 | 165 |
71 LocationSummary* StrictCompareComp::MakeLocationSummary() const { | 166 LocationSummary* StrictCompareComp::MakeLocationSummary() const { |
72 return NULL; | 167 return NULL; |
73 } | 168 } |
74 | 169 |
75 | 170 |
76 void StrictCompareComp::EmitNativeCode(FlowGraphCompiler* compile) { | 171 void StrictCompareComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
77 UNIMPLEMENTED(); | 172 UNIMPLEMENTED(); |
78 } | 173 } |
79 | 174 |
80 | 175 |
81 LocationSummary* ClosureCallComp::MakeLocationSummary() const { | 176 LocationSummary* ClosureCallComp::MakeLocationSummary() const { |
82 return NULL; | 177 return NULL; |
83 } | 178 } |
84 | 179 |
85 | 180 |
86 void ClosureCallComp::EmitNativeCode(FlowGraphCompiler* compile) { | 181 void ClosureCallComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
87 UNIMPLEMENTED(); | 182 UNIMPLEMENTED(); |
88 } | 183 } |
89 | 184 |
90 | 185 |
91 LocationSummary* InstanceCallComp::MakeLocationSummary() const { | 186 LocationSummary* InstanceCallComp::MakeLocationSummary() const { |
92 return NULL; | 187 return MakeCallSummary(); |
93 } | 188 } |
94 | 189 |
95 | 190 |
96 void InstanceCallComp::EmitNativeCode(FlowGraphCompiler* compile) { | 191 void InstanceCallComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
97 UNIMPLEMENTED(); | 192 ASSERT(VerifyCallComputation(this)); |
| 193 compiler->AddCurrentDescriptor(PcDescriptors::kDeopt, |
| 194 cid(), |
| 195 token_index(), |
| 196 try_index()); |
| 197 compiler->EmitInstanceCall(cid(), |
| 198 token_index(), |
| 199 try_index(), |
| 200 function_name(), |
| 201 ArgumentCount(), |
| 202 argument_names(), |
| 203 checked_argument_count()); |
98 } | 204 } |
99 | 205 |
100 | 206 |
101 LocationSummary* StaticCallComp::MakeLocationSummary() const { | 207 LocationSummary* StaticCallComp::MakeLocationSummary() const { |
102 return NULL; | 208 return MakeCallSummary(); |
103 } | 209 } |
104 | 210 |
105 | 211 |
106 void StaticCallComp::EmitNativeCode(FlowGraphCompiler* compile) { | 212 void StaticCallComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
107 UNIMPLEMENTED(); | 213 ASSERT(VerifyCallComputation(this)); |
| 214 compiler->EmitStaticCall(token_index(), |
| 215 try_index(), |
| 216 function(), |
| 217 ArgumentCount(), |
| 218 argument_names()); |
108 } | 219 } |
109 | 220 |
110 | 221 |
111 LocationSummary* LoadLocalComp::MakeLocationSummary() const { | 222 LocationSummary* LoadLocalComp::MakeLocationSummary() const { |
112 return NULL; | 223 return LocationSummary::Make(0, Location::RequiresRegister()); |
113 } | 224 } |
114 | 225 |
115 | 226 |
116 void LoadLocalComp::EmitNativeCode(FlowGraphCompiler* compile) { | 227 void LoadLocalComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
117 UNIMPLEMENTED(); | 228 Register result = locs()->out().reg(); |
| 229 __ movl(result, Address(EBP, local().index() * kWordSize)); |
118 } | 230 } |
119 | 231 |
120 | 232 |
121 LocationSummary* StoreLocalComp::MakeLocationSummary() const { | 233 LocationSummary* StoreLocalComp::MakeLocationSummary() const { |
122 return NULL; | 234 return LocationSummary::Make(1, Location::SameAsFirstInput()); |
123 } | 235 } |
124 | 236 |
125 | 237 |
126 void StoreLocalComp::EmitNativeCode(FlowGraphCompiler* compile) { | 238 void StoreLocalComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
127 UNIMPLEMENTED(); | 239 Register value = locs()->in(0).reg(); |
| 240 Register result = locs()->out().reg(); |
| 241 ASSERT(result == value); // Assert that register assignment is correct. |
| 242 __ movl(Address(EBP, local().index() * kWordSize), value); |
128 } | 243 } |
129 | 244 |
130 | 245 |
131 LocationSummary* ConstantVal::MakeLocationSummary() const { | 246 LocationSummary* ConstantVal::MakeLocationSummary() const { |
132 return NULL; | 247 return LocationSummary::Make(0, Location::RequiresRegister()); |
133 } | 248 } |
134 | 249 |
135 | 250 |
136 void ConstantVal::EmitNativeCode(FlowGraphCompiler* compile) { | 251 void ConstantVal::EmitNativeCode(FlowGraphCompiler* compiler) { |
137 UNIMPLEMENTED(); | 252 Register result = locs()->out().reg(); |
| 253 if (value().IsSmi()) { |
| 254 int32_t imm = reinterpret_cast<int32_t>(value().raw()); |
| 255 __ movl(result, Immediate(imm)); |
| 256 } else { |
| 257 __ LoadObject(result, value()); |
| 258 } |
138 } | 259 } |
139 | 260 |
140 | 261 |
141 LocationSummary* UseVal::MakeLocationSummary() const { | 262 LocationSummary* UseVal::MakeLocationSummary() const { |
142 return NULL; | 263 return NULL; |
143 } | 264 } |
144 | 265 |
145 | 266 |
146 void UseVal::EmitNativeCode(FlowGraphCompiler* compile) { | 267 void UseVal::EmitNativeCode(FlowGraphCompiler* compiler) { |
147 UNIMPLEMENTED(); | 268 UNIMPLEMENTED(); |
148 } | 269 } |
149 | 270 |
150 | 271 |
151 LocationSummary* AssertAssignableComp::MakeLocationSummary() const { | 272 LocationSummary* AssertAssignableComp::MakeLocationSummary() const { |
152 return NULL; | 273 return NULL; |
153 } | 274 } |
154 | 275 |
155 | 276 |
156 void AssertAssignableComp::EmitNativeCode(FlowGraphCompiler* compile) { | 277 void AssertAssignableComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
157 UNIMPLEMENTED(); | 278 UNIMPLEMENTED(); |
158 } | 279 } |
159 | 280 |
160 | 281 |
161 LocationSummary* AssertBooleanComp::MakeLocationSummary() const { | 282 LocationSummary* AssertBooleanComp::MakeLocationSummary() const { |
162 return NULL; | 283 return NULL; |
163 } | 284 } |
164 | 285 |
165 | 286 |
166 void AssertBooleanComp::EmitNativeCode(FlowGraphCompiler* compile) { | 287 void AssertBooleanComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
167 UNIMPLEMENTED(); | 288 UNIMPLEMENTED(); |
168 } | 289 } |
169 | 290 |
170 | 291 |
171 LocationSummary* EqualityCompareComp::MakeLocationSummary() const { | 292 LocationSummary* EqualityCompareComp::MakeLocationSummary() const { |
172 return NULL; | 293 return NULL; |
173 } | 294 } |
174 | 295 |
175 | 296 |
176 void EqualityCompareComp::EmitNativeCode(FlowGraphCompiler* compile) { | 297 void EqualityCompareComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
177 UNIMPLEMENTED(); | 298 UNIMPLEMENTED(); |
178 } | 299 } |
179 | 300 |
180 | 301 |
181 LocationSummary* NativeCallComp::MakeLocationSummary() const { | 302 LocationSummary* NativeCallComp::MakeLocationSummary() const { |
182 return NULL; | 303 LocationSummary* locs = new LocationSummary(0, 3); |
| 304 locs->set_temp(0, Location::RegisterLocation(EAX)); |
| 305 locs->set_temp(1, Location::RegisterLocation(ECX)); |
| 306 locs->set_temp(2, Location::RegisterLocation(EDX)); |
| 307 locs->set_out(Location::RequiresRegister()); |
| 308 return locs; |
183 } | 309 } |
184 | 310 |
185 | 311 |
186 void NativeCallComp::EmitNativeCode(FlowGraphCompiler* compile) { | 312 void NativeCallComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
187 UNIMPLEMENTED(); | 313 ASSERT(locs()->temp(0).reg() == EAX); |
| 314 ASSERT(locs()->temp(1).reg() == ECX); |
| 315 ASSERT(locs()->temp(2).reg() == EDX); |
| 316 Register result = locs()->out().reg(); |
| 317 // Push the result place holder initialized to NULL. |
| 318 __ PushObject(Object::ZoneHandle()); |
| 319 // Pass a pointer to the first argument in EAX. |
| 320 if (!has_optional_parameters()) { |
| 321 __ leal(EAX, Address(EBP, (1 + argument_count()) * kWordSize)); |
| 322 } else { |
| 323 __ leal(EAX, |
| 324 Address(EBP, ParsedFunction::kFirstLocalSlotIndex * kWordSize)); |
| 325 } |
| 326 __ movl(ECX, Immediate(reinterpret_cast<uword>(native_c_function()))); |
| 327 __ movl(EDX, Immediate(argument_count())); |
| 328 compiler->GenerateCall(token_index(), |
| 329 try_index(), |
| 330 &StubCode::CallNativeCFunctionLabel(), |
| 331 PcDescriptors::kOther); |
| 332 __ popl(result); |
188 } | 333 } |
189 | 334 |
190 | 335 |
191 LocationSummary* StoreIndexedComp::MakeLocationSummary() const { | 336 LocationSummary* StoreIndexedComp::MakeLocationSummary() const { |
192 return NULL; | 337 return NULL; |
193 } | 338 } |
194 | 339 |
195 | 340 |
196 void StoreIndexedComp::EmitNativeCode(FlowGraphCompiler* compile) { | 341 void StoreIndexedComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
197 UNIMPLEMENTED(); | 342 UNIMPLEMENTED(); |
198 } | 343 } |
199 | 344 |
200 | 345 |
201 LocationSummary* InstanceSetterComp::MakeLocationSummary() const { | 346 LocationSummary* InstanceSetterComp::MakeLocationSummary() const { |
202 return NULL; | 347 return NULL; |
203 } | 348 } |
204 | 349 |
205 | 350 |
206 void InstanceSetterComp::EmitNativeCode(FlowGraphCompiler* compile) { | 351 void InstanceSetterComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
207 UNIMPLEMENTED(); | 352 UNIMPLEMENTED(); |
208 } | 353 } |
209 | 354 |
210 | 355 |
211 LocationSummary* StaticSetterComp::MakeLocationSummary() const { | 356 LocationSummary* StaticSetterComp::MakeLocationSummary() const { |
212 return NULL; | 357 return NULL; |
213 } | 358 } |
214 | 359 |
215 | 360 |
216 void StaticSetterComp::EmitNativeCode(FlowGraphCompiler* compile) { | 361 void StaticSetterComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
217 UNIMPLEMENTED(); | 362 UNIMPLEMENTED(); |
218 } | 363 } |
219 | 364 |
220 | 365 |
221 LocationSummary* LoadInstanceFieldComp::MakeLocationSummary() const { | 366 LocationSummary* LoadInstanceFieldComp::MakeLocationSummary() const { |
222 return NULL; | 367 return NULL; |
223 } | 368 } |
224 | 369 |
225 | 370 |
226 void LoadInstanceFieldComp::EmitNativeCode(FlowGraphCompiler* compile) { | 371 void LoadInstanceFieldComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
227 UNIMPLEMENTED(); | 372 UNIMPLEMENTED(); |
228 } | 373 } |
229 | 374 |
230 | 375 |
231 LocationSummary* StoreInstanceFieldComp::MakeLocationSummary() const { | 376 LocationSummary* StoreInstanceFieldComp::MakeLocationSummary() const { |
232 return NULL; | 377 return NULL; |
233 } | 378 } |
234 | 379 |
235 | 380 |
236 void StoreInstanceFieldComp::EmitNativeCode(FlowGraphCompiler* compile) { | 381 void StoreInstanceFieldComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
237 UNIMPLEMENTED(); | 382 UNIMPLEMENTED(); |
238 } | 383 } |
239 | 384 |
240 | 385 |
241 LocationSummary* LoadStaticFieldComp::MakeLocationSummary() const { | 386 LocationSummary* LoadStaticFieldComp::MakeLocationSummary() const { |
242 return NULL; | 387 return NULL; |
243 } | 388 } |
244 | 389 |
245 | 390 |
246 void LoadStaticFieldComp::EmitNativeCode(FlowGraphCompiler* compile) { | 391 void LoadStaticFieldComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
247 UNIMPLEMENTED(); | 392 UNIMPLEMENTED(); |
248 } | 393 } |
249 | 394 |
250 | 395 |
251 LocationSummary* StoreStaticFieldComp::MakeLocationSummary() const { | 396 LocationSummary* StoreStaticFieldComp::MakeLocationSummary() const { |
252 return NULL; | 397 return NULL; |
253 } | 398 } |
254 | 399 |
255 | 400 |
256 void StoreStaticFieldComp::EmitNativeCode(FlowGraphCompiler* compile) { | 401 void StoreStaticFieldComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
257 UNIMPLEMENTED(); | 402 UNIMPLEMENTED(); |
258 } | 403 } |
259 | 404 |
260 | 405 |
261 LocationSummary* BooleanNegateComp::MakeLocationSummary() const { | 406 LocationSummary* BooleanNegateComp::MakeLocationSummary() const { |
262 return NULL; | 407 return NULL; |
263 } | 408 } |
264 | 409 |
265 | 410 |
266 void BooleanNegateComp::EmitNativeCode(FlowGraphCompiler* compile) { | 411 void BooleanNegateComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
267 UNIMPLEMENTED(); | 412 UNIMPLEMENTED(); |
268 } | 413 } |
269 | 414 |
270 | 415 |
271 LocationSummary* InstanceOfComp::MakeLocationSummary() const { | 416 LocationSummary* InstanceOfComp::MakeLocationSummary() const { |
272 return NULL; | 417 return NULL; |
273 } | 418 } |
274 | 419 |
275 | 420 |
276 void InstanceOfComp::EmitNativeCode(FlowGraphCompiler* compile) { | 421 void InstanceOfComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
277 UNIMPLEMENTED(); | 422 UNIMPLEMENTED(); |
278 } | 423 } |
279 | 424 |
280 | 425 |
281 LocationSummary* CreateArrayComp::MakeLocationSummary() const { | 426 LocationSummary* CreateArrayComp::MakeLocationSummary() const { |
282 return NULL; | 427 return NULL; |
283 } | 428 } |
284 | 429 |
285 | 430 |
286 void CreateArrayComp::EmitNativeCode(FlowGraphCompiler* compile) { | 431 void CreateArrayComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
287 UNIMPLEMENTED(); | 432 UNIMPLEMENTED(); |
288 } | 433 } |
289 | 434 |
290 | 435 |
291 LocationSummary* CreateClosureComp::MakeLocationSummary() const { | 436 LocationSummary* CreateClosureComp::MakeLocationSummary() const { |
292 return NULL; | 437 return NULL; |
293 } | 438 } |
294 | 439 |
295 | 440 |
296 void CreateClosureComp::EmitNativeCode(FlowGraphCompiler* compile) { | 441 void CreateClosureComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
297 UNIMPLEMENTED(); | 442 UNIMPLEMENTED(); |
298 } | 443 } |
299 | 444 |
300 | 445 |
301 LocationSummary* AllocateObjectComp::MakeLocationSummary() const { | 446 LocationSummary* AllocateObjectComp::MakeLocationSummary() const { |
302 return NULL; | 447 return NULL; |
303 } | 448 } |
304 | 449 |
305 | 450 |
306 void AllocateObjectComp::EmitNativeCode(FlowGraphCompiler* compile) { | 451 void AllocateObjectComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
307 UNIMPLEMENTED(); | 452 UNIMPLEMENTED(); |
308 } | 453 } |
309 | 454 |
310 | 455 |
311 LocationSummary* | 456 LocationSummary* |
312 AllocateObjectWithBoundsCheckComp::MakeLocationSummary() const { | 457 AllocateObjectWithBoundsCheckComp::MakeLocationSummary() const { |
313 return NULL; | 458 return NULL; |
314 } | 459 } |
315 | 460 |
316 | 461 |
317 void AllocateObjectWithBoundsCheckComp::EmitNativeCode( | 462 void AllocateObjectWithBoundsCheckComp::EmitNativeCode( |
318 FlowGraphCompiler* compile) { | 463 FlowGraphCompiler* compiler) { |
319 UNIMPLEMENTED(); | 464 UNIMPLEMENTED(); |
320 } | 465 } |
321 | 466 |
322 | 467 |
323 LocationSummary* LoadVMFieldComp::MakeLocationSummary() const { | 468 LocationSummary* LoadVMFieldComp::MakeLocationSummary() const { |
324 return NULL; | 469 return NULL; |
325 } | 470 } |
326 | 471 |
327 | 472 |
328 void LoadVMFieldComp::EmitNativeCode(FlowGraphCompiler* compile) { | 473 void LoadVMFieldComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
329 UNIMPLEMENTED(); | 474 UNIMPLEMENTED(); |
330 } | 475 } |
331 | 476 |
332 | 477 |
333 LocationSummary* StoreVMFieldComp::MakeLocationSummary() const { | 478 LocationSummary* StoreVMFieldComp::MakeLocationSummary() const { |
334 return NULL; | 479 return NULL; |
335 } | 480 } |
336 | 481 |
337 | 482 |
338 void StoreVMFieldComp::EmitNativeCode(FlowGraphCompiler* compile) { | 483 void StoreVMFieldComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
339 UNIMPLEMENTED(); | 484 UNIMPLEMENTED(); |
340 } | 485 } |
341 | 486 |
342 | 487 |
343 LocationSummary* InstantiateTypeArgumentsComp::MakeLocationSummary() const { | 488 LocationSummary* InstantiateTypeArgumentsComp::MakeLocationSummary() const { |
344 return NULL; | 489 return NULL; |
345 } | 490 } |
346 | 491 |
347 | 492 |
348 void InstantiateTypeArgumentsComp::EmitNativeCode( | 493 void InstantiateTypeArgumentsComp::EmitNativeCode( |
349 FlowGraphCompiler* compile) { | 494 FlowGraphCompiler* compiler) { |
350 UNIMPLEMENTED(); | 495 UNIMPLEMENTED(); |
351 } | 496 } |
352 | 497 |
353 | 498 |
354 LocationSummary* | 499 LocationSummary* |
355 ExtractConstructorTypeArgumentsComp::MakeLocationSummary() const { | 500 ExtractConstructorTypeArgumentsComp::MakeLocationSummary() const { |
356 return NULL; | 501 return NULL; |
357 } | 502 } |
358 | 503 |
359 | 504 |
360 void ExtractConstructorTypeArgumentsComp::EmitNativeCode( | 505 void ExtractConstructorTypeArgumentsComp::EmitNativeCode( |
361 FlowGraphCompiler* compile) { | 506 FlowGraphCompiler* compiler) { |
362 UNIMPLEMENTED(); | 507 UNIMPLEMENTED(); |
363 } | 508 } |
364 | 509 |
365 | 510 |
366 LocationSummary* | 511 LocationSummary* |
367 ExtractConstructorInstantiatorComp::MakeLocationSummary() const { | 512 ExtractConstructorInstantiatorComp::MakeLocationSummary() const { |
368 return NULL; | 513 return NULL; |
369 } | 514 } |
370 | 515 |
371 | 516 |
372 void ExtractConstructorInstantiatorComp::EmitNativeCode( | 517 void ExtractConstructorInstantiatorComp::EmitNativeCode( |
373 FlowGraphCompiler* compile) { | 518 FlowGraphCompiler* compiler) { |
374 UNIMPLEMENTED(); | 519 UNIMPLEMENTED(); |
375 } | 520 } |
376 | 521 |
377 | 522 |
378 LocationSummary* AllocateContextComp::MakeLocationSummary() const { | 523 LocationSummary* AllocateContextComp::MakeLocationSummary() const { |
379 return NULL; | 524 return NULL; |
380 } | 525 } |
381 | 526 |
382 | 527 |
383 void AllocateContextComp::EmitNativeCode(FlowGraphCompiler* compile) { | 528 void AllocateContextComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
384 UNIMPLEMENTED(); | 529 UNIMPLEMENTED(); |
385 } | 530 } |
386 | 531 |
387 | 532 |
388 LocationSummary* ChainContextComp::MakeLocationSummary() const { | 533 LocationSummary* ChainContextComp::MakeLocationSummary() const { |
389 return NULL; | 534 return NULL; |
390 } | 535 } |
391 | 536 |
392 | 537 |
393 void ChainContextComp::EmitNativeCode(FlowGraphCompiler* compile) { | 538 void ChainContextComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
394 UNIMPLEMENTED(); | 539 UNIMPLEMENTED(); |
395 } | 540 } |
396 | 541 |
397 | 542 |
398 LocationSummary* CloneContextComp::MakeLocationSummary() const { | 543 LocationSummary* CloneContextComp::MakeLocationSummary() const { |
399 return NULL; | 544 return NULL; |
400 } | 545 } |
401 | 546 |
402 | 547 |
403 void CloneContextComp::EmitNativeCode(FlowGraphCompiler* compile) { | 548 void CloneContextComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
404 UNIMPLEMENTED(); | 549 UNIMPLEMENTED(); |
405 } | 550 } |
406 | 551 |
407 | 552 |
408 LocationSummary* CatchEntryComp::MakeLocationSummary() const { | 553 LocationSummary* CatchEntryComp::MakeLocationSummary() const { |
409 return NULL; | 554 return NULL; |
410 } | 555 } |
411 | 556 |
412 | 557 |
413 void CatchEntryComp::EmitNativeCode(FlowGraphCompiler* compile) { | 558 void CatchEntryComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
414 UNIMPLEMENTED(); | 559 UNIMPLEMENTED(); |
415 } | 560 } |
416 | 561 |
417 | 562 |
418 LocationSummary* BinaryOpComp::MakeLocationSummary() const { | 563 LocationSummary* BinaryOpComp::MakeLocationSummary() const { |
419 return NULL; | 564 const intptr_t kNumInputs = 2; |
| 565 const intptr_t kNumTemps = 0; |
| 566 LocationSummary* summary = new LocationSummary(kNumInputs, kNumTemps); |
| 567 summary->set_in(0, Location::RequiresRegister()); |
| 568 summary->set_in(1, Location::RequiresRegister()); |
| 569 summary->set_out(Location::SameAsFirstInput()); |
| 570 return summary; |
420 } | 571 } |
421 | 572 |
422 | 573 |
423 void BinaryOpComp::EmitNativeCode(FlowGraphCompiler* compile) { | 574 void BinaryOpComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
424 UNIMPLEMENTED(); | 575 // TODO(srdjan): Remove this code once BinaryOpComp has been implemeneted |
| 576 // for all intended operations. |
| 577 Register left = locs()->in(0).reg(); |
| 578 Register right = locs()->in(1).reg(); |
| 579 __ pushl(left); |
| 580 __ pushl(right); |
| 581 InstanceCallComp* instance_call_comp = instance_call(); |
| 582 instance_call_comp->EmitNativeCode(compiler); |
| 583 if (locs()->out().reg() != EAX) { |
| 584 __ movl(locs()->out().reg(), EAX); |
| 585 } |
425 } | 586 } |
426 | 587 |
427 | 588 |
428 } // namespace dart | 589 } // namespace dart |
429 | 590 |
430 #undef __ | 591 #undef __ |
431 | 592 |
432 #endif // defined TARGET_ARCH_X64 | 593 #endif // defined TARGET_ARCH_X64 |
OLD | NEW |