OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 | 57 |
58 | 58 |
59 void LOsrEntry::MarkSpilledDoubleRegister(int allocation_index, | 59 void LOsrEntry::MarkSpilledDoubleRegister(int allocation_index, |
60 LOperand* spill_operand) { | 60 LOperand* spill_operand) { |
61 ASSERT(spill_operand->IsDoubleStackSlot()); | 61 ASSERT(spill_operand->IsDoubleStackSlot()); |
62 ASSERT(double_register_spills_[allocation_index] == NULL); | 62 ASSERT(double_register_spills_[allocation_index] == NULL); |
63 double_register_spills_[allocation_index] = spill_operand; | 63 double_register_spills_[allocation_index] = spill_operand; |
64 } | 64 } |
65 | 65 |
66 | 66 |
67 void LInstruction::PrintTo(StringStream* stream) const { | 67 void LInstruction::PrintTo(StringStream* stream) { |
68 stream->Add("%s ", this->Mnemonic()); | 68 stream->Add("%s ", this->Mnemonic()); |
69 if (HasResult()) { | 69 if (HasResult()) { |
70 result()->PrintTo(stream); | 70 PrintOutputOperandTo(stream); |
71 stream->Add(" "); | |
72 } | 71 } |
| 72 |
73 PrintDataTo(stream); | 73 PrintDataTo(stream); |
74 | 74 |
75 if (HasEnvironment()) { | 75 if (HasEnvironment()) { |
76 stream->Add(" "); | 76 stream->Add(" "); |
77 environment()->PrintTo(stream); | 77 environment()->PrintTo(stream); |
78 } | 78 } |
79 | 79 |
80 if (HasPointerMap()) { | 80 if (HasPointerMap()) { |
81 stream->Add(" "); | 81 stream->Add(" "); |
82 pointer_map()->PrintTo(stream); | 82 pointer_map()->PrintTo(stream); |
83 } | 83 } |
84 } | 84 } |
85 | 85 |
86 | 86 |
87 void LLabel::PrintDataTo(StringStream* stream) const { | 87 template<int R, int I, int T> |
| 88 void LTemplateInstruction<R, I, T>::PrintDataTo(StringStream* stream) { |
| 89 stream->Add("= "); |
| 90 inputs_.PrintOperandsTo(stream); |
| 91 } |
| 92 |
| 93 |
| 94 template<int R, int I, int T> |
| 95 void LTemplateInstruction<R, I, T>::PrintOutputOperandTo(StringStream* stream) { |
| 96 results_.PrintOperandsTo(stream); |
| 97 } |
| 98 |
| 99 |
| 100 template<typename T, int N> |
| 101 void OperandContainer<T, N>::PrintOperandsTo(StringStream* stream) { |
| 102 for (int i = 0; i < N; i++) { |
| 103 if (i > 0) stream->Add(" "); |
| 104 elems_[i]->PrintTo(stream); |
| 105 } |
| 106 } |
| 107 |
| 108 |
| 109 void LLabel::PrintDataTo(StringStream* stream) { |
88 LGap::PrintDataTo(stream); | 110 LGap::PrintDataTo(stream); |
89 LLabel* rep = replacement(); | 111 LLabel* rep = replacement(); |
90 if (rep != NULL) { | 112 if (rep != NULL) { |
91 stream->Add(" Dead block replaced with B%d", rep->block_id()); | 113 stream->Add(" Dead block replaced with B%d", rep->block_id()); |
92 } | 114 } |
93 } | 115 } |
94 | 116 |
95 | 117 |
96 bool LGap::IsRedundant() const { | 118 bool LGap::IsRedundant() const { |
97 for (int i = 0; i < 4; i++) { | 119 for (int i = 0; i < 4; i++) { |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 case Token::MUL: return "mul-t"; | 158 case Token::MUL: return "mul-t"; |
137 case Token::MOD: return "mod-t"; | 159 case Token::MOD: return "mod-t"; |
138 case Token::DIV: return "div-t"; | 160 case Token::DIV: return "div-t"; |
139 default: | 161 default: |
140 UNREACHABLE(); | 162 UNREACHABLE(); |
141 return NULL; | 163 return NULL; |
142 } | 164 } |
143 } | 165 } |
144 | 166 |
145 | 167 |
146 | 168 void LGoto::PrintDataTo(StringStream* stream) { |
147 void LBinaryOperation::PrintDataTo(StringStream* stream) const { | |
148 stream->Add("= "); | |
149 left()->PrintTo(stream); | |
150 stream->Add(" "); | |
151 right()->PrintTo(stream); | |
152 } | |
153 | |
154 | |
155 void LGoto::PrintDataTo(StringStream* stream) const { | |
156 stream->Add("B%d", block_id()); | 169 stream->Add("B%d", block_id()); |
157 } | 170 } |
158 | 171 |
159 | 172 |
160 void LBranch::PrintDataTo(StringStream* stream) const { | 173 void LBranch::PrintDataTo(StringStream* stream) { |
161 stream->Add("B%d | B%d on ", true_block_id(), false_block_id()); | 174 stream->Add("B%d | B%d on ", true_block_id(), false_block_id()); |
162 input()->PrintTo(stream); | 175 InputAt(0)->PrintTo(stream); |
163 } | 176 } |
164 | 177 |
165 | 178 |
166 void LCmpIDAndBranch::PrintDataTo(StringStream* stream) const { | 179 void LCmpIDAndBranch::PrintDataTo(StringStream* stream) { |
167 stream->Add("if "); | 180 stream->Add("if "); |
168 left()->PrintTo(stream); | 181 InputAt(0)->PrintTo(stream); |
169 stream->Add(" %s ", Token::String(op())); | 182 stream->Add(" %s ", Token::String(op())); |
170 right()->PrintTo(stream); | 183 InputAt(1)->PrintTo(stream); |
171 stream->Add(" then B%d else B%d", true_block_id(), false_block_id()); | 184 stream->Add(" then B%d else B%d", true_block_id(), false_block_id()); |
172 } | 185 } |
173 | 186 |
174 | 187 |
175 void LIsNullAndBranch::PrintDataTo(StringStream* stream) const { | 188 void LIsNullAndBranch::PrintDataTo(StringStream* stream) { |
176 stream->Add("if "); | 189 stream->Add("if "); |
177 input()->PrintTo(stream); | 190 InputAt(0)->PrintTo(stream); |
178 stream->Add(is_strict() ? " === null" : " == null"); | 191 stream->Add(is_strict() ? " === null" : " == null"); |
179 stream->Add(" then B%d else B%d", true_block_id(), false_block_id()); | 192 stream->Add(" then B%d else B%d", true_block_id(), false_block_id()); |
180 } | 193 } |
181 | 194 |
182 | 195 |
183 void LIsObjectAndBranch::PrintDataTo(StringStream* stream) const { | 196 void LIsObjectAndBranch::PrintDataTo(StringStream* stream) { |
184 stream->Add("if is_object("); | 197 stream->Add("if is_object("); |
185 input()->PrintTo(stream); | 198 InputAt(0)->PrintTo(stream); |
186 stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); | 199 stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); |
187 } | 200 } |
188 | 201 |
189 | 202 |
190 void LIsSmiAndBranch::PrintDataTo(StringStream* stream) const { | 203 void LIsSmiAndBranch::PrintDataTo(StringStream* stream) { |
191 stream->Add("if is_smi("); | 204 stream->Add("if is_smi("); |
192 input()->PrintTo(stream); | 205 InputAt(0)->PrintTo(stream); |
193 stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); | 206 stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); |
194 } | 207 } |
195 | 208 |
196 | 209 |
197 void LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) const { | 210 void LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) { |
198 stream->Add("if has_instance_type("); | 211 stream->Add("if has_instance_type("); |
199 input()->PrintTo(stream); | 212 InputAt(0)->PrintTo(stream); |
200 stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); | 213 stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); |
201 } | 214 } |
202 | 215 |
203 | 216 |
204 void LHasCachedArrayIndexAndBranch::PrintDataTo(StringStream* stream) const { | 217 void LHasCachedArrayIndexAndBranch::PrintDataTo(StringStream* stream) { |
205 stream->Add("if has_cached_array_index("); | 218 stream->Add("if has_cached_array_index("); |
206 input()->PrintTo(stream); | 219 InputAt(0)->PrintTo(stream); |
207 stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); | 220 stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); |
208 } | 221 } |
209 | 222 |
210 | 223 |
211 void LClassOfTestAndBranch::PrintDataTo(StringStream* stream) const { | 224 void LClassOfTestAndBranch::PrintDataTo(StringStream* stream) { |
212 stream->Add("if class_of_test("); | 225 stream->Add("if class_of_test("); |
213 input()->PrintTo(stream); | 226 InputAt(0)->PrintTo(stream); |
214 stream->Add(", \"%o\") then B%d else B%d", | 227 stream->Add(", \"%o\") then B%d else B%d", |
215 *hydrogen()->class_name(), | 228 *hydrogen()->class_name(), |
216 true_block_id(), | 229 true_block_id(), |
217 false_block_id()); | 230 false_block_id()); |
218 } | 231 } |
219 | 232 |
220 | 233 |
221 void LTypeofIs::PrintDataTo(StringStream* stream) const { | 234 void LTypeofIs::PrintDataTo(StringStream* stream) { |
222 input()->PrintTo(stream); | 235 InputAt(0)->PrintTo(stream); |
223 stream->Add(" == \"%s\"", *hydrogen()->type_literal()->ToCString()); | 236 stream->Add(" == \"%s\"", *hydrogen()->type_literal()->ToCString()); |
224 } | 237 } |
225 | 238 |
226 | 239 |
227 void LTypeofIsAndBranch::PrintDataTo(StringStream* stream) const { | 240 void LTypeofIsAndBranch::PrintDataTo(StringStream* stream) { |
228 stream->Add("if typeof "); | 241 stream->Add("if typeof "); |
229 input()->PrintTo(stream); | 242 InputAt(0)->PrintTo(stream); |
230 stream->Add(" == \"%s\" then B%d else B%d", | 243 stream->Add(" == \"%s\" then B%d else B%d", |
231 *hydrogen()->type_literal()->ToCString(), | 244 *hydrogen()->type_literal()->ToCString(), |
232 true_block_id(), false_block_id()); | 245 true_block_id(), false_block_id()); |
233 } | 246 } |
234 | 247 |
235 | 248 |
236 void LCallConstantFunction::PrintDataTo(StringStream* stream) const { | 249 void LCallConstantFunction::PrintDataTo(StringStream* stream) { |
237 stream->Add("#%d / ", arity()); | 250 stream->Add("#%d / ", arity()); |
238 } | 251 } |
239 | 252 |
240 | 253 |
241 void LUnaryMathOperation::PrintDataTo(StringStream* stream) const { | 254 void LUnaryMathOperation::PrintDataTo(StringStream* stream) { |
242 stream->Add("/%s ", hydrogen()->OpName()); | 255 stream->Add("/%s ", hydrogen()->OpName()); |
243 input()->PrintTo(stream); | 256 InputAt(0)->PrintTo(stream); |
244 } | 257 } |
245 | 258 |
246 | 259 |
247 void LLoadContextSlot::PrintDataTo(StringStream* stream) { | 260 void LLoadContextSlot::PrintDataTo(StringStream* stream) { |
248 stream->Add("(%d, %d)", context_chain_length(), slot_index()); | 261 stream->Add("(%d, %d)", context_chain_length(), slot_index()); |
249 } | 262 } |
250 | 263 |
251 | 264 |
252 void LCallKeyed::PrintDataTo(StringStream* stream) const { | 265 void LCallKeyed::PrintDataTo(StringStream* stream) { |
253 stream->Add("[r2] #%d / ", arity()); | 266 stream->Add("[r2] #%d / ", arity()); |
254 } | 267 } |
255 | 268 |
256 | 269 |
257 void LCallNamed::PrintDataTo(StringStream* stream) const { | 270 void LCallNamed::PrintDataTo(StringStream* stream) { |
258 SmartPointer<char> name_string = name()->ToCString(); | 271 SmartPointer<char> name_string = name()->ToCString(); |
259 stream->Add("%s #%d / ", *name_string, arity()); | 272 stream->Add("%s #%d / ", *name_string, arity()); |
260 } | 273 } |
261 | 274 |
262 | 275 |
263 void LCallGlobal::PrintDataTo(StringStream* stream) const { | 276 void LCallGlobal::PrintDataTo(StringStream* stream) { |
264 SmartPointer<char> name_string = name()->ToCString(); | 277 SmartPointer<char> name_string = name()->ToCString(); |
265 stream->Add("%s #%d / ", *name_string, arity()); | 278 stream->Add("%s #%d / ", *name_string, arity()); |
266 } | 279 } |
267 | 280 |
268 | 281 |
269 void LCallKnownGlobal::PrintDataTo(StringStream* stream) const { | 282 void LCallKnownGlobal::PrintDataTo(StringStream* stream) { |
270 stream->Add("#%d / ", arity()); | 283 stream->Add("#%d / ", arity()); |
271 } | 284 } |
272 | 285 |
273 | 286 |
274 void LCallNew::PrintDataTo(StringStream* stream) const { | 287 void LCallNew::PrintDataTo(StringStream* stream) { |
275 LUnaryOperation::PrintDataTo(stream); | 288 stream->Add("= "); |
| 289 InputAt(0)->PrintTo(stream); |
276 stream->Add(" #%d / ", arity()); | 290 stream->Add(" #%d / ", arity()); |
277 } | 291 } |
278 | 292 |
279 | 293 |
280 void LClassOfTest::PrintDataTo(StringStream* stream) const { | 294 void LClassOfTest::PrintDataTo(StringStream* stream) { |
281 stream->Add("= class_of_test("); | 295 stream->Add("= class_of_test("); |
282 input()->PrintTo(stream); | 296 InputAt(0)->PrintTo(stream); |
283 stream->Add(", \"%o\")", *hydrogen()->class_name()); | 297 stream->Add(", \"%o\")", *hydrogen()->class_name()); |
284 } | 298 } |
285 | 299 |
286 | 300 |
287 void LUnaryOperation::PrintDataTo(StringStream* stream) const { | 301 void LAccessArgumentsAt::PrintDataTo(StringStream* stream) { |
288 stream->Add("= "); | |
289 input()->PrintTo(stream); | |
290 } | |
291 | |
292 | |
293 void LAccessArgumentsAt::PrintDataTo(StringStream* stream) const { | |
294 arguments()->PrintTo(stream); | 302 arguments()->PrintTo(stream); |
295 | 303 |
296 stream->Add(" length "); | 304 stream->Add(" length "); |
297 length()->PrintTo(stream); | 305 length()->PrintTo(stream); |
298 | 306 |
299 stream->Add(" index "); | 307 stream->Add(" index "); |
300 index()->PrintTo(stream); | 308 index()->PrintTo(stream); |
301 } | 309 } |
302 | 310 |
303 | 311 |
| 312 void LStoreNamed::PrintDataTo(StringStream* stream) { |
| 313 object()->PrintTo(stream); |
| 314 stream->Add("."); |
| 315 stream->Add(*String::cast(*name())->ToCString()); |
| 316 stream->Add(" <- "); |
| 317 value()->PrintTo(stream); |
| 318 } |
| 319 |
| 320 |
| 321 void LStoreKeyed::PrintDataTo(StringStream* stream) { |
| 322 object()->PrintTo(stream); |
| 323 stream->Add("["); |
| 324 key()->PrintTo(stream); |
| 325 stream->Add("] <- "); |
| 326 value()->PrintTo(stream); |
| 327 } |
| 328 |
| 329 |
304 LChunk::LChunk(HGraph* graph) | 330 LChunk::LChunk(HGraph* graph) |
305 : spill_slot_count_(0), | 331 : spill_slot_count_(0), |
306 graph_(graph), | 332 graph_(graph), |
307 instructions_(32), | 333 instructions_(32), |
308 pointer_maps_(8), | 334 pointer_maps_(8), |
309 inlined_closures_(1) { | 335 inlined_closures_(1) { |
310 } | 336 } |
311 | 337 |
312 | 338 |
313 void LChunk::Verify() const { | |
314 // TODO(twuerthinger): Implement verification for chunk. | |
315 } | |
316 | |
317 | |
318 int LChunk::GetNextSpillIndex(bool is_double) { | 339 int LChunk::GetNextSpillIndex(bool is_double) { |
319 // Skip a slot if for a double-width slot. | 340 // Skip a slot if for a double-width slot. |
320 if (is_double) spill_slot_count_++; | 341 if (is_double) spill_slot_count_++; |
321 return spill_slot_count_++; | 342 return spill_slot_count_++; |
322 } | 343 } |
323 | 344 |
324 | 345 |
325 LOperand* LChunk::GetNextSpillSlot(bool is_double) { | 346 LOperand* LChunk::GetNextSpillSlot(bool is_double) { |
326 int index = GetNextSpillIndex(is_double); | 347 int index = GetNextSpillIndex(is_double); |
327 if (is_double) { | 348 if (is_double) { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
362 | 383 |
363 if (can_eliminate) { | 384 if (can_eliminate) { |
364 label->set_replacement(GetLabel(goto_instr->block_id())); | 385 label->set_replacement(GetLabel(goto_instr->block_id())); |
365 } | 386 } |
366 } | 387 } |
367 } | 388 } |
368 } | 389 } |
369 } | 390 } |
370 | 391 |
371 | 392 |
372 void LStoreNamed::PrintDataTo(StringStream* stream) const { | |
373 object()->PrintTo(stream); | |
374 stream->Add("."); | |
375 stream->Add(*String::cast(*name())->ToCString()); | |
376 stream->Add(" <- "); | |
377 value()->PrintTo(stream); | |
378 } | |
379 | |
380 | |
381 void LStoreKeyed::PrintDataTo(StringStream* stream) const { | |
382 object()->PrintTo(stream); | |
383 stream->Add("["); | |
384 key()->PrintTo(stream); | |
385 stream->Add("] <- "); | |
386 value()->PrintTo(stream); | |
387 } | |
388 | |
389 | |
390 int LChunk::AddInstruction(LInstruction* instr, HBasicBlock* block) { | 393 int LChunk::AddInstruction(LInstruction* instr, HBasicBlock* block) { |
391 LGap* gap = new LGap(block); | 394 LGap* gap = new LGap(block); |
392 int index = -1; | 395 int index = -1; |
393 if (instr->IsControl()) { | 396 if (instr->IsControl()) { |
394 instructions_.Add(gap); | 397 instructions_.Add(gap); |
395 index = instructions_.length(); | 398 index = instructions_.length(); |
396 instructions_.Add(instr); | 399 instructions_.Add(instr); |
397 } else { | 400 } else { |
398 index = instructions_.length(); | 401 index = instructions_.length(); |
399 instructions_.Add(instr); | 402 instructions_.Add(instr); |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
586 LOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) { | 589 LOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) { |
587 if (value->EmitAtUses()) { | 590 if (value->EmitAtUses()) { |
588 HInstruction* instr = HInstruction::cast(value); | 591 HInstruction* instr = HInstruction::cast(value); |
589 VisitInstruction(instr); | 592 VisitInstruction(instr); |
590 } | 593 } |
591 allocator_->RecordUse(value, operand); | 594 allocator_->RecordUse(value, operand); |
592 return operand; | 595 return operand; |
593 } | 596 } |
594 | 597 |
595 | 598 |
596 LInstruction* LChunkBuilder::Define(LInstruction* instr) { | 599 template<int I, int T> |
| 600 LInstruction* LChunkBuilder::Define(LTemplateInstruction<1, I, T>* instr, |
| 601 LUnallocated* result) { |
| 602 allocator_->RecordDefinition(current_instruction_, result); |
| 603 instr->set_result(result); |
| 604 return instr; |
| 605 } |
| 606 |
| 607 |
| 608 template<int I, int T> |
| 609 LInstruction* LChunkBuilder::Define(LTemplateInstruction<1, I, T>* instr) { |
597 return Define(instr, new LUnallocated(LUnallocated::NONE)); | 610 return Define(instr, new LUnallocated(LUnallocated::NONE)); |
598 } | 611 } |
599 | 612 |
600 | 613 |
601 LInstruction* LChunkBuilder::DefineAsRegister(LInstruction* instr) { | 614 template<int I, int T> |
| 615 LInstruction* LChunkBuilder::DefineAsRegister( |
| 616 LTemplateInstruction<1, I, T>* instr) { |
602 return Define(instr, new LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); | 617 return Define(instr, new LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); |
603 } | 618 } |
604 | 619 |
605 | 620 |
606 LInstruction* LChunkBuilder::DefineAsSpilled(LInstruction* instr, int index) { | 621 template<int I, int T> |
| 622 LInstruction* LChunkBuilder::DefineAsSpilled( |
| 623 LTemplateInstruction<1, I, T>* instr, int index) { |
607 return Define(instr, new LUnallocated(LUnallocated::FIXED_SLOT, index)); | 624 return Define(instr, new LUnallocated(LUnallocated::FIXED_SLOT, index)); |
608 } | 625 } |
609 | 626 |
610 | 627 |
611 LInstruction* LChunkBuilder::DefineSameAsFirst(LInstruction* instr) { | 628 template<int I, int T> |
| 629 LInstruction* LChunkBuilder::DefineSameAsFirst( |
| 630 LTemplateInstruction<1, I, T>* instr) { |
612 return Define(instr, new LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT)); | 631 return Define(instr, new LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT)); |
613 } | 632 } |
614 | 633 |
615 | 634 |
616 LInstruction* LChunkBuilder::DefineFixed(LInstruction* instr, Register reg) { | 635 template<int I, int T> |
| 636 LInstruction* LChunkBuilder::DefineFixed( |
| 637 LTemplateInstruction<1, I, T>* instr, Register reg) { |
617 return Define(instr, ToUnallocated(reg)); | 638 return Define(instr, ToUnallocated(reg)); |
618 } | 639 } |
619 | 640 |
620 | 641 |
621 LInstruction* LChunkBuilder::DefineFixedDouble(LInstruction* instr, | 642 template<int I, int T> |
622 DoubleRegister reg) { | 643 LInstruction* LChunkBuilder::DefineFixedDouble( |
| 644 LTemplateInstruction<1, I, T>* instr, DoubleRegister reg) { |
623 return Define(instr, ToUnallocated(reg)); | 645 return Define(instr, ToUnallocated(reg)); |
624 } | 646 } |
625 | 647 |
626 | 648 |
627 LInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { | 649 LInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { |
628 HEnvironment* hydrogen_env = current_block_->last_environment(); | 650 HEnvironment* hydrogen_env = current_block_->last_environment(); |
629 instr->set_environment(CreateEnvironment(hydrogen_env)); | 651 instr->set_environment(CreateEnvironment(hydrogen_env)); |
630 return instr; | 652 return instr; |
631 } | 653 } |
632 | 654 |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
680 } | 702 } |
681 | 703 |
682 | 704 |
683 LInstruction* LChunkBuilder::AssignPointerMap(LInstruction* instr) { | 705 LInstruction* LChunkBuilder::AssignPointerMap(LInstruction* instr) { |
684 ASSERT(!instr->HasPointerMap()); | 706 ASSERT(!instr->HasPointerMap()); |
685 instr->set_pointer_map(new LPointerMap(position_)); | 707 instr->set_pointer_map(new LPointerMap(position_)); |
686 return instr; | 708 return instr; |
687 } | 709 } |
688 | 710 |
689 | 711 |
690 LInstruction* LChunkBuilder::Define(LInstruction* instr, LUnallocated* result) { | |
691 allocator_->RecordDefinition(current_instruction_, result); | |
692 instr->set_result(result); | |
693 return instr; | |
694 } | |
695 | |
696 | |
697 LUnallocated* LChunkBuilder::TempRegister() { | 712 LUnallocated* LChunkBuilder::TempRegister() { |
698 LUnallocated* operand = new LUnallocated(LUnallocated::MUST_HAVE_REGISTER); | 713 LUnallocated* operand = new LUnallocated(LUnallocated::MUST_HAVE_REGISTER); |
699 allocator_->RecordTemporary(operand); | 714 allocator_->RecordTemporary(operand); |
700 return operand; | 715 return operand; |
701 } | 716 } |
702 | 717 |
703 | 718 |
704 LOperand* LChunkBuilder::FixedTemp(Register reg) { | 719 LOperand* LChunkBuilder::FixedTemp(Register reg) { |
705 LUnallocated* operand = ToUnallocated(reg); | 720 LUnallocated* operand = ToUnallocated(reg); |
706 allocator_->RecordTemporary(operand); | 721 allocator_->RecordTemporary(operand); |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
794 op == Token::DIV || | 809 op == Token::DIV || |
795 op == Token::MOD || | 810 op == Token::MOD || |
796 op == Token::MUL || | 811 op == Token::MUL || |
797 op == Token::SUB); | 812 op == Token::SUB); |
798 HValue* left = instr->left(); | 813 HValue* left = instr->left(); |
799 HValue* right = instr->right(); | 814 HValue* right = instr->right(); |
800 ASSERT(left->representation().IsTagged()); | 815 ASSERT(left->representation().IsTagged()); |
801 ASSERT(right->representation().IsTagged()); | 816 ASSERT(right->representation().IsTagged()); |
802 LOperand* left_operand = UseFixed(left, r1); | 817 LOperand* left_operand = UseFixed(left, r1); |
803 LOperand* right_operand = UseFixed(right, r0); | 818 LOperand* right_operand = UseFixed(right, r0); |
804 LInstruction* result = new LArithmeticT(op, left_operand, right_operand); | 819 LArithmeticT* result = new LArithmeticT(op, left_operand, right_operand); |
805 return MarkAsCall(DefineFixed(result, r0), instr); | 820 return MarkAsCall(DefineFixed(result, r0), instr); |
806 } | 821 } |
807 | 822 |
808 void LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) { | 823 void LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) { |
809 ASSERT(is_building()); | 824 ASSERT(is_building()); |
810 current_block_ = block; | 825 current_block_ = block; |
811 next_block_ = next_block; | 826 next_block_ = next_block; |
812 if (block->IsStartBlock()) { | 827 if (block->IsStartBlock()) { |
813 block->UpdateEnvironment(graph_->start_environment()); | 828 block->UpdateEnvironment(graph_->start_environment()); |
814 argument_count_ = 0; | 829 argument_count_ = 0; |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
875 if (current->has_position()) position_ = current->position(); | 890 if (current->has_position()) position_ = current->position(); |
876 LInstruction* instr = current->CompileToLithium(this); | 891 LInstruction* instr = current->CompileToLithium(this); |
877 | 892 |
878 if (instr != NULL) { | 893 if (instr != NULL) { |
879 if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) { | 894 if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) { |
880 instr = AssignPointerMap(instr); | 895 instr = AssignPointerMap(instr); |
881 } | 896 } |
882 if (FLAG_stress_environments && !instr->HasEnvironment()) { | 897 if (FLAG_stress_environments && !instr->HasEnvironment()) { |
883 instr = AssignEnvironment(instr); | 898 instr = AssignEnvironment(instr); |
884 } | 899 } |
885 if (current->IsTest()) { | 900 if (current->IsTest() && !instr->IsGoto()) { |
886 instr->set_hydrogen_value(HTest::cast(current)->value()); | 901 ASSERT(instr->IsControl()); |
| 902 HTest* test = HTest::cast(current); |
| 903 instr->set_hydrogen_value(test->value()); |
| 904 HBasicBlock* first = test->FirstSuccessor(); |
| 905 HBasicBlock* second = test->SecondSuccessor(); |
| 906 ASSERT(first != NULL && second != NULL); |
| 907 instr->SetBranchTargets(first->block_id(), second->block_id()); |
887 } else { | 908 } else { |
888 instr->set_hydrogen_value(current); | 909 instr->set_hydrogen_value(current); |
889 } | 910 } |
890 | 911 |
891 int index = chunk_->AddInstruction(instr, current_block_); | 912 int index = chunk_->AddInstruction(instr, current_block_); |
892 allocator_->SummarizeInstruction(index); | 913 allocator_->SummarizeInstruction(index); |
893 } else { | 914 } else { |
894 // This instruction should be omitted. | 915 // This instruction should be omitted. |
895 allocator_->OmitInstruction(); | 916 allocator_->OmitInstruction(); |
896 } | 917 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
932 LInstruction* LChunkBuilder::DoGoto(HGoto* instr) { | 953 LInstruction* LChunkBuilder::DoGoto(HGoto* instr) { |
933 LInstruction* result = new LGoto(instr->FirstSuccessor()->block_id(), | 954 LInstruction* result = new LGoto(instr->FirstSuccessor()->block_id(), |
934 instr->include_stack_check()); | 955 instr->include_stack_check()); |
935 if (instr->include_stack_check()) result = AssignPointerMap(result); | 956 if (instr->include_stack_check()) result = AssignPointerMap(result); |
936 return result; | 957 return result; |
937 } | 958 } |
938 | 959 |
939 | 960 |
940 LInstruction* LChunkBuilder::DoTest(HTest* instr) { | 961 LInstruction* LChunkBuilder::DoTest(HTest* instr) { |
941 HValue* v = instr->value(); | 962 HValue* v = instr->value(); |
942 HBasicBlock* first = instr->FirstSuccessor(); | |
943 HBasicBlock* second = instr->SecondSuccessor(); | |
944 ASSERT(first != NULL && second != NULL); | |
945 int first_id = first->block_id(); | |
946 int second_id = second->block_id(); | |
947 | |
948 if (v->EmitAtUses()) { | 963 if (v->EmitAtUses()) { |
949 if (v->IsClassOfTest()) { | 964 if (v->IsClassOfTest()) { |
950 HClassOfTest* compare = HClassOfTest::cast(v); | 965 HClassOfTest* compare = HClassOfTest::cast(v); |
951 ASSERT(compare->value()->representation().IsTagged()); | 966 ASSERT(compare->value()->representation().IsTagged()); |
952 | 967 |
953 return new LClassOfTestAndBranch(UseTempRegister(compare->value()), | 968 return new LClassOfTestAndBranch(UseTempRegister(compare->value()), |
954 TempRegister(), | 969 TempRegister()); |
955 first_id, | |
956 second_id); | |
957 } else if (v->IsCompare()) { | 970 } else if (v->IsCompare()) { |
958 HCompare* compare = HCompare::cast(v); | 971 HCompare* compare = HCompare::cast(v); |
959 Token::Value op = compare->token(); | 972 Token::Value op = compare->token(); |
960 HValue* left = compare->left(); | 973 HValue* left = compare->left(); |
961 HValue* right = compare->right(); | 974 HValue* right = compare->right(); |
962 Representation r = compare->GetInputRepresentation(); | 975 Representation r = compare->GetInputRepresentation(); |
963 if (r.IsInteger32()) { | 976 if (r.IsInteger32()) { |
964 ASSERT(left->representation().IsInteger32()); | 977 ASSERT(left->representation().IsInteger32()); |
965 ASSERT(right->representation().IsInteger32()); | 978 ASSERT(right->representation().IsInteger32()); |
966 return new LCmpIDAndBranch(UseRegisterAtStart(left), | 979 return new LCmpIDAndBranch(UseRegisterAtStart(left), |
967 UseOrConstantAtStart(right), | 980 UseOrConstantAtStart(right)); |
968 first_id, | |
969 second_id); | |
970 } else if (r.IsDouble()) { | 981 } else if (r.IsDouble()) { |
971 ASSERT(left->representation().IsDouble()); | 982 ASSERT(left->representation().IsDouble()); |
972 ASSERT(right->representation().IsDouble()); | 983 ASSERT(right->representation().IsDouble()); |
973 return new LCmpIDAndBranch(UseRegisterAtStart(left), | 984 return new LCmpIDAndBranch(UseRegisterAtStart(left), |
974 UseRegisterAtStart(right), | 985 UseRegisterAtStart(right)); |
975 first_id, | |
976 second_id); | |
977 } else { | 986 } else { |
978 ASSERT(left->representation().IsTagged()); | 987 ASSERT(left->representation().IsTagged()); |
979 ASSERT(right->representation().IsTagged()); | 988 ASSERT(right->representation().IsTagged()); |
980 bool reversed = op == Token::GT || op == Token::LTE; | 989 bool reversed = op == Token::GT || op == Token::LTE; |
981 LOperand* left_operand = UseFixed(left, reversed ? r0 : r1); | 990 LOperand* left_operand = UseFixed(left, reversed ? r0 : r1); |
982 LOperand* right_operand = UseFixed(right, reversed ? r1 : r0); | 991 LOperand* right_operand = UseFixed(right, reversed ? r1 : r0); |
983 LInstruction* result = new LCmpTAndBranch(left_operand, | 992 LInstruction* result = new LCmpTAndBranch(left_operand, |
984 right_operand, | 993 right_operand); |
985 first_id, | |
986 second_id); | |
987 return MarkAsCall(result, instr); | 994 return MarkAsCall(result, instr); |
988 } | 995 } |
989 } else if (v->IsIsSmi()) { | 996 } else if (v->IsIsSmi()) { |
990 HIsSmi* compare = HIsSmi::cast(v); | 997 HIsSmi* compare = HIsSmi::cast(v); |
991 ASSERT(compare->value()->representation().IsTagged()); | 998 ASSERT(compare->value()->representation().IsTagged()); |
992 | 999 |
993 return new LIsSmiAndBranch(Use(compare->value()), | 1000 return new LIsSmiAndBranch(Use(compare->value())); |
994 first_id, | |
995 second_id); | |
996 } else if (v->IsHasInstanceType()) { | 1001 } else if (v->IsHasInstanceType()) { |
997 HHasInstanceType* compare = HHasInstanceType::cast(v); | 1002 HHasInstanceType* compare = HHasInstanceType::cast(v); |
998 ASSERT(compare->value()->representation().IsTagged()); | 1003 ASSERT(compare->value()->representation().IsTagged()); |
999 | 1004 return new LHasInstanceTypeAndBranch( |
1000 return new LHasInstanceTypeAndBranch(UseRegisterAtStart(compare->value()), | 1005 UseRegisterAtStart(compare->value())); |
1001 first_id, | |
1002 second_id); | |
1003 } else if (v->IsHasCachedArrayIndex()) { | 1006 } else if (v->IsHasCachedArrayIndex()) { |
1004 HHasCachedArrayIndex* compare = HHasCachedArrayIndex::cast(v); | 1007 HHasCachedArrayIndex* compare = HHasCachedArrayIndex::cast(v); |
1005 ASSERT(compare->value()->representation().IsTagged()); | 1008 ASSERT(compare->value()->representation().IsTagged()); |
1006 | 1009 |
1007 return new LHasCachedArrayIndexAndBranch( | 1010 return new LHasCachedArrayIndexAndBranch( |
1008 UseRegisterAtStart(compare->value()), first_id, second_id); | 1011 UseRegisterAtStart(compare->value())); |
1009 } else if (v->IsIsNull()) { | 1012 } else if (v->IsIsNull()) { |
1010 HIsNull* compare = HIsNull::cast(v); | 1013 HIsNull* compare = HIsNull::cast(v); |
1011 ASSERT(compare->value()->representation().IsTagged()); | 1014 ASSERT(compare->value()->representation().IsTagged()); |
1012 | 1015 |
1013 return new LIsNullAndBranch(UseRegisterAtStart(compare->value()), | 1016 return new LIsNullAndBranch(UseRegisterAtStart(compare->value())); |
1014 first_id, | |
1015 second_id); | |
1016 } else if (v->IsIsObject()) { | 1017 } else if (v->IsIsObject()) { |
1017 HIsObject* compare = HIsObject::cast(v); | 1018 HIsObject* compare = HIsObject::cast(v); |
1018 ASSERT(compare->value()->representation().IsTagged()); | 1019 ASSERT(compare->value()->representation().IsTagged()); |
1019 | 1020 |
1020 LOperand* temp1 = TempRegister(); | 1021 LOperand* temp1 = TempRegister(); |
1021 LOperand* temp2 = TempRegister(); | 1022 LOperand* temp2 = TempRegister(); |
1022 return new LIsObjectAndBranch(UseRegisterAtStart(compare->value()), | 1023 return new LIsObjectAndBranch(UseRegisterAtStart(compare->value()), |
1023 temp1, | 1024 temp1, |
1024 temp2, | 1025 temp2); |
1025 first_id, | |
1026 second_id); | |
1027 } else if (v->IsCompareJSObjectEq()) { | 1026 } else if (v->IsCompareJSObjectEq()) { |
1028 HCompareJSObjectEq* compare = HCompareJSObjectEq::cast(v); | 1027 HCompareJSObjectEq* compare = HCompareJSObjectEq::cast(v); |
1029 return new LCmpJSObjectEqAndBranch(UseRegisterAtStart(compare->left()), | 1028 return new LCmpJSObjectEqAndBranch(UseRegisterAtStart(compare->left()), |
1030 UseRegisterAtStart(compare->right()), | 1029 UseRegisterAtStart(compare->right())); |
1031 first_id, | |
1032 second_id); | |
1033 } else if (v->IsInstanceOf()) { | 1030 } else if (v->IsInstanceOf()) { |
1034 HInstanceOf* instance_of = HInstanceOf::cast(v); | 1031 HInstanceOf* instance_of = HInstanceOf::cast(v); |
1035 LInstruction* result = | 1032 LInstruction* result = |
1036 new LInstanceOfAndBranch(Use(instance_of->left()), | 1033 new LInstanceOfAndBranch(Use(instance_of->left()), |
1037 Use(instance_of->right()), | 1034 Use(instance_of->right())); |
1038 first_id, | |
1039 second_id); | |
1040 return MarkAsCall(result, instr); | 1035 return MarkAsCall(result, instr); |
1041 } else if (v->IsTypeofIs()) { | 1036 } else if (v->IsTypeofIs()) { |
1042 HTypeofIs* typeof_is = HTypeofIs::cast(v); | 1037 HTypeofIs* typeof_is = HTypeofIs::cast(v); |
1043 return new LTypeofIsAndBranch(UseTempRegister(typeof_is->value()), | 1038 return new LTypeofIsAndBranch(UseTempRegister(typeof_is->value())); |
1044 first_id, | |
1045 second_id); | |
1046 } else { | 1039 } else { |
1047 if (v->IsConstant()) { | 1040 if (v->IsConstant()) { |
1048 if (HConstant::cast(v)->handle()->IsTrue()) { | 1041 if (HConstant::cast(v)->handle()->IsTrue()) { |
1049 return new LGoto(first_id); | 1042 return new LGoto(instr->FirstSuccessor()->block_id()); |
1050 } else if (HConstant::cast(v)->handle()->IsFalse()) { | 1043 } else if (HConstant::cast(v)->handle()->IsFalse()) { |
1051 return new LGoto(second_id); | 1044 return new LGoto(instr->SecondSuccessor()->block_id()); |
1052 } | 1045 } |
1053 } | 1046 } |
1054 Abort("Undefined compare before branch"); | 1047 Abort("Undefined compare before branch"); |
1055 return NULL; | 1048 return NULL; |
1056 } | 1049 } |
1057 } | 1050 } |
1058 return new LBranch(UseRegisterAtStart(v), first_id, second_id); | 1051 return new LBranch(UseRegisterAtStart(v)); |
1059 } | 1052 } |
1060 | 1053 |
1061 | 1054 |
1062 LInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { | 1055 LInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { |
1063 ASSERT(instr->value()->representation().IsTagged()); | 1056 ASSERT(instr->value()->representation().IsTagged()); |
1064 LOperand* value = UseRegisterAtStart(instr->value()); | 1057 LOperand* value = UseRegisterAtStart(instr->value()); |
1065 LOperand* temp = TempRegister(); | 1058 LOperand* temp = TempRegister(); |
1066 return new LCmpMapAndBranch(value, temp); | 1059 return new LCmpMapAndBranch(value, temp); |
1067 } | 1060 } |
1068 | 1061 |
1069 | 1062 |
1070 LInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) { | 1063 LInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) { |
1071 return DefineAsRegister(new LArgumentsLength(UseRegister(length->value()))); | 1064 return DefineAsRegister(new LArgumentsLength(UseRegister(length->value()))); |
1072 } | 1065 } |
1073 | 1066 |
1074 | 1067 |
1075 LInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { | 1068 LInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { |
1076 return DefineAsRegister(new LArgumentsElements); | 1069 return DefineAsRegister(new LArgumentsElements); |
1077 } | 1070 } |
1078 | 1071 |
1079 | 1072 |
1080 LInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { | 1073 LInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { |
1081 LInstruction* result = | 1074 LInstanceOf* result = |
1082 new LInstanceOf(UseFixed(instr->left(), r0), | 1075 new LInstanceOf(UseFixed(instr->left(), r0), |
1083 UseFixed(instr->right(), r1)); | 1076 UseFixed(instr->right(), r1)); |
1084 return MarkAsCall(DefineFixed(result, r0), instr); | 1077 return MarkAsCall(DefineFixed(result, r0), instr); |
1085 } | 1078 } |
1086 | 1079 |
1087 | 1080 |
1088 LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal( | 1081 LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal( |
1089 HInstanceOfKnownGlobal* instr) { | 1082 HInstanceOfKnownGlobal* instr) { |
1090 LInstruction* result = | 1083 LInstanceOfKnownGlobal* result = |
1091 new LInstanceOfKnownGlobal(UseFixed(instr->value(), r0), FixedTemp(r4)); | 1084 new LInstanceOfKnownGlobal(UseFixed(instr->value(), r0), FixedTemp(r4)); |
1092 MarkAsSaveDoubles(result); | 1085 MarkAsSaveDoubles(result); |
1093 return AssignEnvironment(AssignPointerMap(DefineFixed(result, r0))); | 1086 return AssignEnvironment(AssignPointerMap(DefineFixed(result, r0))); |
1094 } | 1087 } |
1095 | 1088 |
1096 | 1089 |
1097 LInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) { | 1090 LInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) { |
1098 LOperand* function = UseFixed(instr->function(), r1); | 1091 LOperand* function = UseFixed(instr->function(), r1); |
1099 LOperand* receiver = UseFixed(instr->receiver(), r0); | 1092 LOperand* receiver = UseFixed(instr->receiver(), r0); |
1100 LOperand* length = UseRegisterAtStart(instr->length()); | 1093 LOperand* length = UseRegisterAtStart(instr->length()); |
1101 LOperand* elements = UseRegisterAtStart(instr->elements()); | 1094 LOperand* elements = UseRegisterAtStart(instr->elements()); |
1102 LInstruction* result = new LApplyArguments(function, | 1095 LApplyArguments* result = new LApplyArguments(function, |
1103 receiver, | 1096 receiver, |
1104 length, | 1097 length, |
1105 elements); | 1098 elements); |
1106 return MarkAsCall(DefineFixed(result, r0), instr, CAN_DEOPTIMIZE_EAGERLY); | 1099 return MarkAsCall(DefineFixed(result, r0), instr, CAN_DEOPTIMIZE_EAGERLY); |
1107 } | 1100 } |
1108 | 1101 |
1109 | 1102 |
1110 LInstruction* LChunkBuilder::DoPushArgument(HPushArgument* instr) { | 1103 LInstruction* LChunkBuilder::DoPushArgument(HPushArgument* instr) { |
1111 ++argument_count_; | 1104 ++argument_count_; |
1112 LOperand* argument = Use(instr->argument()); | 1105 LOperand* argument = Use(instr->argument()); |
1113 return new LPushArgument(argument); | 1106 return new LPushArgument(argument); |
1114 } | 1107 } |
1115 | 1108 |
(...skipping 12 matching lines...) Expand all Loading... |
1128 HCallConstantFunction* instr) { | 1121 HCallConstantFunction* instr) { |
1129 argument_count_ -= instr->argument_count(); | 1122 argument_count_ -= instr->argument_count(); |
1130 return MarkAsCall(DefineFixed(new LCallConstantFunction, r0), instr); | 1123 return MarkAsCall(DefineFixed(new LCallConstantFunction, r0), instr); |
1131 } | 1124 } |
1132 | 1125 |
1133 | 1126 |
1134 LInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { | 1127 LInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { |
1135 BuiltinFunctionId op = instr->op(); | 1128 BuiltinFunctionId op = instr->op(); |
1136 LOperand* input = UseRegisterAtStart(instr->value()); | 1129 LOperand* input = UseRegisterAtStart(instr->value()); |
1137 LOperand* temp = (op == kMathFloor) ? TempRegister() : NULL; | 1130 LOperand* temp = (op == kMathFloor) ? TempRegister() : NULL; |
1138 LInstruction* result = new LUnaryMathOperation(input, temp); | 1131 LUnaryMathOperation* result = new LUnaryMathOperation(input, temp); |
1139 switch (op) { | 1132 switch (op) { |
1140 case kMathAbs: | 1133 case kMathAbs: |
1141 return AssignEnvironment(AssignPointerMap(DefineSameAsFirst(result))); | 1134 return AssignEnvironment(AssignPointerMap(DefineSameAsFirst(result))); |
1142 case kMathFloor: | 1135 case kMathFloor: |
1143 return AssignEnvironment(DefineAsRegister(result)); | 1136 return AssignEnvironment(DefineAsRegister(result)); |
1144 case kMathSqrt: | 1137 case kMathSqrt: |
1145 return DefineSameAsFirst(result); | 1138 return DefineSameAsFirst(result); |
1146 case kMathRound: | 1139 case kMathRound: |
1147 Abort("MathRound LUnaryMathOperation not implemented"); | 1140 Abort("MathRound LUnaryMathOperation not implemented"); |
1148 return NULL; | 1141 return NULL; |
(...skipping 12 matching lines...) Expand all Loading... |
1161 default: | 1154 default: |
1162 UNREACHABLE(); | 1155 UNREACHABLE(); |
1163 return NULL; | 1156 return NULL; |
1164 } | 1157 } |
1165 } | 1158 } |
1166 | 1159 |
1167 | 1160 |
1168 LInstruction* LChunkBuilder::DoCallKeyed(HCallKeyed* instr) { | 1161 LInstruction* LChunkBuilder::DoCallKeyed(HCallKeyed* instr) { |
1169 ASSERT(instr->key()->representation().IsTagged()); | 1162 ASSERT(instr->key()->representation().IsTagged()); |
1170 argument_count_ -= instr->argument_count(); | 1163 argument_count_ -= instr->argument_count(); |
1171 UseFixed(instr->key(), r2); | 1164 LOperand* key = UseFixed(instr->key(), r2); |
1172 return MarkAsCall(DefineFixed(new LCallKeyed, r0), instr); | 1165 return MarkAsCall(DefineFixed(new LCallKeyed(key), r0), instr); |
1173 } | 1166 } |
1174 | 1167 |
1175 | 1168 |
1176 LInstruction* LChunkBuilder::DoCallNamed(HCallNamed* instr) { | 1169 LInstruction* LChunkBuilder::DoCallNamed(HCallNamed* instr) { |
1177 argument_count_ -= instr->argument_count(); | 1170 argument_count_ -= instr->argument_count(); |
1178 return MarkAsCall(DefineFixed(new LCallNamed, r0), instr); | 1171 return MarkAsCall(DefineFixed(new LCallNamed, r0), instr); |
1179 } | 1172 } |
1180 | 1173 |
1181 | 1174 |
1182 LInstruction* LChunkBuilder::DoCallGlobal(HCallGlobal* instr) { | 1175 LInstruction* LChunkBuilder::DoCallGlobal(HCallGlobal* instr) { |
1183 argument_count_ -= instr->argument_count(); | 1176 argument_count_ -= instr->argument_count(); |
1184 return MarkAsCall(DefineFixed(new LCallGlobal, r0), instr); | 1177 return MarkAsCall(DefineFixed(new LCallGlobal, r0), instr); |
1185 } | 1178 } |
1186 | 1179 |
1187 | 1180 |
1188 LInstruction* LChunkBuilder::DoCallKnownGlobal(HCallKnownGlobal* instr) { | 1181 LInstruction* LChunkBuilder::DoCallKnownGlobal(HCallKnownGlobal* instr) { |
1189 argument_count_ -= instr->argument_count(); | 1182 argument_count_ -= instr->argument_count(); |
1190 return MarkAsCall(DefineFixed(new LCallKnownGlobal, r0), instr); | 1183 return MarkAsCall(DefineFixed(new LCallKnownGlobal, r0), instr); |
1191 } | 1184 } |
1192 | 1185 |
1193 | 1186 |
1194 LInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { | 1187 LInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { |
1195 LOperand* constructor = UseFixed(instr->constructor(), r1); | 1188 LOperand* constructor = UseFixed(instr->constructor(), r1); |
1196 argument_count_ -= instr->argument_count(); | 1189 argument_count_ -= instr->argument_count(); |
1197 LInstruction* result = new LCallNew(constructor); | 1190 LCallNew* result = new LCallNew(constructor); |
1198 return MarkAsCall(DefineFixed(result, r0), instr); | 1191 return MarkAsCall(DefineFixed(result, r0), instr); |
1199 } | 1192 } |
1200 | 1193 |
1201 | 1194 |
1202 LInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) { | 1195 LInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) { |
1203 argument_count_ -= instr->argument_count(); | 1196 argument_count_ -= instr->argument_count(); |
1204 return MarkAsCall(DefineFixed(new LCallFunction, r0), instr); | 1197 return MarkAsCall(DefineFixed(new LCallFunction, r0), instr); |
1205 } | 1198 } |
1206 | 1199 |
1207 | 1200 |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1377 ASSERT(instr->right()->representation().IsDouble()); | 1370 ASSERT(instr->right()->representation().IsDouble()); |
1378 LOperand* left = UseRegisterAtStart(instr->left()); | 1371 LOperand* left = UseRegisterAtStart(instr->left()); |
1379 LOperand* right = UseRegisterAtStart(instr->right()); | 1372 LOperand* right = UseRegisterAtStart(instr->right()); |
1380 return DefineAsRegister(new LCmpID(left, right)); | 1373 return DefineAsRegister(new LCmpID(left, right)); |
1381 } else { | 1374 } else { |
1382 ASSERT(instr->left()->representation().IsTagged()); | 1375 ASSERT(instr->left()->representation().IsTagged()); |
1383 ASSERT(instr->right()->representation().IsTagged()); | 1376 ASSERT(instr->right()->representation().IsTagged()); |
1384 bool reversed = (op == Token::GT || op == Token::LTE); | 1377 bool reversed = (op == Token::GT || op == Token::LTE); |
1385 LOperand* left = UseFixed(instr->left(), reversed ? r0 : r1); | 1378 LOperand* left = UseFixed(instr->left(), reversed ? r0 : r1); |
1386 LOperand* right = UseFixed(instr->right(), reversed ? r1 : r0); | 1379 LOperand* right = UseFixed(instr->right(), reversed ? r1 : r0); |
1387 LInstruction* result = new LCmpT(left, right); | 1380 LCmpT* result = new LCmpT(left, right); |
1388 return MarkAsCall(DefineFixed(result, r0), instr); | 1381 return MarkAsCall(DefineFixed(result, r0), instr); |
1389 } | 1382 } |
1390 } | 1383 } |
1391 | 1384 |
1392 | 1385 |
1393 LInstruction* LChunkBuilder::DoCompareJSObjectEq( | 1386 LInstruction* LChunkBuilder::DoCompareJSObjectEq( |
1394 HCompareJSObjectEq* instr) { | 1387 HCompareJSObjectEq* instr) { |
1395 LOperand* left = UseRegisterAtStart(instr->left()); | 1388 LOperand* left = UseRegisterAtStart(instr->left()); |
1396 LOperand* right = UseRegisterAtStart(instr->right()); | 1389 LOperand* right = UseRegisterAtStart(instr->right()); |
1397 LInstruction* result = new LCmpJSObjectEq(left, right); | 1390 LCmpJSObjectEq* result = new LCmpJSObjectEq(left, right); |
1398 return DefineAsRegister(result); | 1391 return DefineAsRegister(result); |
1399 } | 1392 } |
1400 | 1393 |
1401 | 1394 |
1402 LInstruction* LChunkBuilder::DoIsNull(HIsNull* instr) { | 1395 LInstruction* LChunkBuilder::DoIsNull(HIsNull* instr) { |
1403 ASSERT(instr->value()->representation().IsTagged()); | 1396 ASSERT(instr->value()->representation().IsTagged()); |
1404 LOperand* value = UseRegisterAtStart(instr->value()); | 1397 LOperand* value = UseRegisterAtStart(instr->value()); |
1405 | 1398 |
1406 return DefineAsRegister(new LIsNull(value)); | 1399 return DefineAsRegister(new LIsNull(value)); |
1407 } | 1400 } |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1454 | 1447 |
1455 | 1448 |
1456 LInstruction* LChunkBuilder::DoFixedArrayLength(HFixedArrayLength* instr) { | 1449 LInstruction* LChunkBuilder::DoFixedArrayLength(HFixedArrayLength* instr) { |
1457 LOperand* array = UseRegisterAtStart(instr->value()); | 1450 LOperand* array = UseRegisterAtStart(instr->value()); |
1458 return DefineAsRegister(new LFixedArrayLength(array)); | 1451 return DefineAsRegister(new LFixedArrayLength(array)); |
1459 } | 1452 } |
1460 | 1453 |
1461 | 1454 |
1462 LInstruction* LChunkBuilder::DoValueOf(HValueOf* instr) { | 1455 LInstruction* LChunkBuilder::DoValueOf(HValueOf* instr) { |
1463 LOperand* object = UseRegister(instr->value()); | 1456 LOperand* object = UseRegister(instr->value()); |
1464 LInstruction* result = new LValueOf(object, TempRegister()); | 1457 LValueOf* result = new LValueOf(object, TempRegister()); |
1465 return AssignEnvironment(DefineSameAsFirst(result)); | 1458 return AssignEnvironment(DefineSameAsFirst(result)); |
1466 } | 1459 } |
1467 | 1460 |
1468 | 1461 |
1469 LInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) { | 1462 LInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) { |
1470 return AssignEnvironment(new LBoundsCheck(UseRegisterAtStart(instr->index()), | 1463 return AssignEnvironment(new LBoundsCheck(UseRegisterAtStart(instr->index()), |
1471 UseRegister(instr->length()))); | 1464 UseRegister(instr->length()))); |
1472 } | 1465 } |
1473 | 1466 |
1474 | 1467 |
1475 LInstruction* LChunkBuilder::DoThrow(HThrow* instr) { | 1468 LInstruction* LChunkBuilder::DoThrow(HThrow* instr) { |
1476 LOperand* value = UseFixed(instr->value(), r0); | 1469 LOperand* value = UseFixed(instr->value(), r0); |
1477 return MarkAsCall(new LThrow(value), instr); | 1470 return MarkAsCall(new LThrow(value), instr); |
1478 } | 1471 } |
1479 | 1472 |
1480 | 1473 |
1481 LInstruction* LChunkBuilder::DoChange(HChange* instr) { | 1474 LInstruction* LChunkBuilder::DoChange(HChange* instr) { |
1482 Representation from = instr->from(); | 1475 Representation from = instr->from(); |
1483 Representation to = instr->to(); | 1476 Representation to = instr->to(); |
1484 if (from.IsTagged()) { | 1477 if (from.IsTagged()) { |
1485 if (to.IsDouble()) { | 1478 if (to.IsDouble()) { |
1486 LOperand* value = UseRegister(instr->value()); | 1479 LOperand* value = UseRegister(instr->value()); |
1487 LInstruction* res = new LNumberUntagD(value); | 1480 LNumberUntagD* res = new LNumberUntagD(value); |
1488 return AssignEnvironment(DefineAsRegister(res)); | 1481 return AssignEnvironment(DefineAsRegister(res)); |
1489 } else { | 1482 } else { |
1490 ASSERT(to.IsInteger32()); | 1483 ASSERT(to.IsInteger32()); |
1491 LOperand* value = UseRegister(instr->value()); | 1484 LOperand* value = UseRegister(instr->value()); |
1492 bool needs_check = !instr->value()->type().IsSmi(); | 1485 bool needs_check = !instr->value()->type().IsSmi(); |
1493 LInstruction* res = NULL; | 1486 LInstruction* res = NULL; |
1494 if (needs_check) { | 1487 if (needs_check) { |
1495 res = DefineSameAsFirst(new LTaggedToI(value, FixedTemp(d1))); | 1488 res = DefineSameAsFirst(new LTaggedToI(value, FixedTemp(d1))); |
1496 } else { | 1489 } else { |
1497 res = DefineSameAsFirst(new LSmiUntag(value, needs_check)); | 1490 res = DefineSameAsFirst(new LSmiUntag(value, needs_check)); |
1498 } | 1491 } |
1499 if (needs_check) { | 1492 if (needs_check) { |
1500 res = AssignEnvironment(res); | 1493 res = AssignEnvironment(res); |
1501 } | 1494 } |
1502 return res; | 1495 return res; |
1503 } | 1496 } |
1504 } else if (from.IsDouble()) { | 1497 } else if (from.IsDouble()) { |
1505 if (to.IsTagged()) { | 1498 if (to.IsTagged()) { |
1506 LOperand* value = UseRegister(instr->value()); | 1499 LOperand* value = UseRegister(instr->value()); |
1507 LOperand* temp1 = TempRegister(); | 1500 LOperand* temp1 = TempRegister(); |
1508 LOperand* temp2 = TempRegister(); | 1501 LOperand* temp2 = TempRegister(); |
1509 | 1502 |
1510 // Make sure that the temp and result_temp registers are | 1503 // Make sure that the temp and result_temp registers are |
1511 // different. | 1504 // different. |
1512 LUnallocated* result_temp = TempRegister(); | 1505 LUnallocated* result_temp = TempRegister(); |
1513 LInstruction* result = new LNumberTagD(value, temp1, temp2); | 1506 LNumberTagD* result = new LNumberTagD(value, temp1, temp2); |
1514 Define(result, result_temp); | 1507 Define(result, result_temp); |
1515 return AssignPointerMap(result); | 1508 return AssignPointerMap(result); |
1516 } else { | 1509 } else { |
1517 ASSERT(to.IsInteger32()); | 1510 ASSERT(to.IsInteger32()); |
1518 LOperand* value = UseRegister(instr->value()); | 1511 LOperand* value = UseRegister(instr->value()); |
1519 LInstruction* res = new LDoubleToI(value); | 1512 LDoubleToI* res = new LDoubleToI(value); |
1520 return AssignEnvironment(DefineAsRegister(res)); | 1513 return AssignEnvironment(DefineAsRegister(res)); |
1521 } | 1514 } |
1522 } else if (from.IsInteger32()) { | 1515 } else if (from.IsInteger32()) { |
1523 if (to.IsTagged()) { | 1516 if (to.IsTagged()) { |
1524 HValue* val = instr->value(); | 1517 HValue* val = instr->value(); |
1525 LOperand* value = UseRegister(val); | 1518 LOperand* value = UseRegister(val); |
1526 if (val->HasRange() && val->range()->IsInSmiRange()) { | 1519 if (val->HasRange() && val->range()->IsInSmiRange()) { |
1527 return DefineSameAsFirst(new LSmiTag(value)); | 1520 return DefineSameAsFirst(new LSmiTag(value)); |
1528 } else { | 1521 } else { |
1529 LInstruction* result = new LNumberTagI(value); | 1522 LNumberTagI* result = new LNumberTagI(value); |
1530 return AssignEnvironment(AssignPointerMap(DefineSameAsFirst(result))); | 1523 return AssignEnvironment(AssignPointerMap(DefineSameAsFirst(result))); |
1531 } | 1524 } |
1532 } else { | 1525 } else { |
1533 ASSERT(to.IsDouble()); | 1526 ASSERT(to.IsDouble()); |
1534 LOperand* value = Use(instr->value()); | 1527 LOperand* value = Use(instr->value()); |
1535 return DefineAsRegister(new LInteger32ToDouble(value)); | 1528 return DefineAsRegister(new LInteger32ToDouble(value)); |
1536 } | 1529 } |
1537 } | 1530 } |
1538 UNREACHABLE(); | 1531 UNREACHABLE(); |
1539 return NULL; | 1532 return NULL; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1596 } else if (r.IsTagged()) { | 1589 } else if (r.IsTagged()) { |
1597 return DefineAsRegister(new LConstantT(instr->handle())); | 1590 return DefineAsRegister(new LConstantT(instr->handle())); |
1598 } else { | 1591 } else { |
1599 UNREACHABLE(); | 1592 UNREACHABLE(); |
1600 return NULL; | 1593 return NULL; |
1601 } | 1594 } |
1602 } | 1595 } |
1603 | 1596 |
1604 | 1597 |
1605 LInstruction* LChunkBuilder::DoLoadGlobal(HLoadGlobal* instr) { | 1598 LInstruction* LChunkBuilder::DoLoadGlobal(HLoadGlobal* instr) { |
1606 LInstruction* result = new LLoadGlobal(); | 1599 LLoadGlobal* result = new LLoadGlobal(); |
1607 return instr->check_hole_value() | 1600 return instr->check_hole_value() |
1608 ? AssignEnvironment(DefineAsRegister(result)) | 1601 ? AssignEnvironment(DefineAsRegister(result)) |
1609 : DefineAsRegister(result); | 1602 : DefineAsRegister(result); |
1610 } | 1603 } |
1611 | 1604 |
1612 | 1605 |
1613 LInstruction* LChunkBuilder::DoStoreGlobal(HStoreGlobal* instr) { | 1606 LInstruction* LChunkBuilder::DoStoreGlobal(HStoreGlobal* instr) { |
1614 return new LStoreGlobal(UseRegisterAtStart(instr->value())); | 1607 return new LStoreGlobal(UseRegisterAtStart(instr->value())); |
1615 } | 1608 } |
1616 | 1609 |
(...skipping 28 matching lines...) Expand all Loading... |
1645 return DefineSameAsFirst(new LLoadElements(input)); | 1638 return DefineSameAsFirst(new LLoadElements(input)); |
1646 } | 1639 } |
1647 | 1640 |
1648 | 1641 |
1649 LInstruction* LChunkBuilder::DoLoadKeyedFastElement( | 1642 LInstruction* LChunkBuilder::DoLoadKeyedFastElement( |
1650 HLoadKeyedFastElement* instr) { | 1643 HLoadKeyedFastElement* instr) { |
1651 ASSERT(instr->representation().IsTagged()); | 1644 ASSERT(instr->representation().IsTagged()); |
1652 ASSERT(instr->key()->representation().IsInteger32()); | 1645 ASSERT(instr->key()->representation().IsInteger32()); |
1653 LOperand* obj = UseRegisterAtStart(instr->object()); | 1646 LOperand* obj = UseRegisterAtStart(instr->object()); |
1654 LOperand* key = UseRegisterAtStart(instr->key()); | 1647 LOperand* key = UseRegisterAtStart(instr->key()); |
1655 LInstruction* result = new LLoadKeyedFastElement(obj, key); | 1648 LLoadKeyedFastElement* result = new LLoadKeyedFastElement(obj, key); |
1656 return AssignEnvironment(DefineSameAsFirst(result)); | 1649 return AssignEnvironment(DefineSameAsFirst(result)); |
1657 } | 1650 } |
1658 | 1651 |
1659 | 1652 |
1660 LInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) { | 1653 LInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) { |
1661 LOperand* object = UseFixed(instr->object(), r1); | 1654 LOperand* object = UseFixed(instr->object(), r1); |
1662 LOperand* key = UseFixed(instr->key(), r0); | 1655 LOperand* key = UseFixed(instr->key(), r0); |
1663 | 1656 |
1664 LInstruction* result = | 1657 LInstruction* result = |
1665 DefineFixed(new LLoadKeyedGeneric(object, key), r0); | 1658 DefineFixed(new LLoadKeyedGeneric(object, key), r0); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1719 LOperand* val = UseFixed(instr->value(), r0); | 1712 LOperand* val = UseFixed(instr->value(), r0); |
1720 | 1713 |
1721 LInstruction* result = new LStoreNamedGeneric(obj, val); | 1714 LInstruction* result = new LStoreNamedGeneric(obj, val); |
1722 return MarkAsCall(result, instr); | 1715 return MarkAsCall(result, instr); |
1723 } | 1716 } |
1724 | 1717 |
1725 | 1718 |
1726 LInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) { | 1719 LInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) { |
1727 LOperand* string = UseRegister(instr->string()); | 1720 LOperand* string = UseRegister(instr->string()); |
1728 LOperand* index = UseRegisterOrConstant(instr->index()); | 1721 LOperand* index = UseRegisterOrConstant(instr->index()); |
1729 LInstruction* result = new LStringCharCodeAt(string, index); | 1722 LStringCharCodeAt* result = new LStringCharCodeAt(string, index); |
1730 return AssignEnvironment(AssignPointerMap(DefineAsRegister(result))); | 1723 return AssignEnvironment(AssignPointerMap(DefineAsRegister(result))); |
1731 } | 1724 } |
1732 | 1725 |
1733 | 1726 |
1734 LInstruction* LChunkBuilder::DoStringLength(HStringLength* instr) { | 1727 LInstruction* LChunkBuilder::DoStringLength(HStringLength* instr) { |
1735 LOperand* string = UseRegisterAtStart(instr->value()); | 1728 LOperand* string = UseRegisterAtStart(instr->value()); |
1736 return DefineAsRegister(new LStringLength(string)); | 1729 return DefineAsRegister(new LStringLength(string)); |
1737 } | 1730 } |
1738 | 1731 |
1739 | 1732 |
(...skipping 13 matching lines...) Expand all Loading... |
1753 | 1746 |
1754 | 1747 |
1755 LInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) { | 1748 LInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) { |
1756 return MarkAsCall(DefineFixed(new LFunctionLiteral, r0), instr); | 1749 return MarkAsCall(DefineFixed(new LFunctionLiteral, r0), instr); |
1757 } | 1750 } |
1758 | 1751 |
1759 | 1752 |
1760 LInstruction* LChunkBuilder::DoDeleteProperty(HDeleteProperty* instr) { | 1753 LInstruction* LChunkBuilder::DoDeleteProperty(HDeleteProperty* instr) { |
1761 LOperand* object = UseRegisterAtStart(instr->object()); | 1754 LOperand* object = UseRegisterAtStart(instr->object()); |
1762 LOperand* key = UseRegisterAtStart(instr->key()); | 1755 LOperand* key = UseRegisterAtStart(instr->key()); |
1763 LInstruction* result = new LDeleteProperty(object, key); | 1756 LDeleteProperty* result = new LDeleteProperty(object, key); |
1764 return MarkAsCall(DefineFixed(result, r0), instr); | 1757 return MarkAsCall(DefineFixed(result, r0), instr); |
1765 } | 1758 } |
1766 | 1759 |
1767 | 1760 |
1768 LInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) { | 1761 LInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) { |
1769 allocator_->MarkAsOsrEntry(); | 1762 allocator_->MarkAsOsrEntry(); |
1770 current_block_->last_environment()->set_ast_id(instr->ast_id()); | 1763 current_block_->last_environment()->set_ast_id(instr->ast_id()); |
1771 return AssignEnvironment(new LOsrEntry); | 1764 return AssignEnvironment(new LOsrEntry); |
1772 } | 1765 } |
1773 | 1766 |
(...skipping 20 matching lines...) Expand all Loading... |
1794 // There are no real uses of the arguments object (we bail out in all other | 1787 // There are no real uses of the arguments object (we bail out in all other |
1795 // cases). | 1788 // cases). |
1796 return NULL; | 1789 return NULL; |
1797 } | 1790 } |
1798 | 1791 |
1799 | 1792 |
1800 LInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) { | 1793 LInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) { |
1801 LOperand* arguments = UseRegister(instr->arguments()); | 1794 LOperand* arguments = UseRegister(instr->arguments()); |
1802 LOperand* length = UseTempRegister(instr->length()); | 1795 LOperand* length = UseTempRegister(instr->length()); |
1803 LOperand* index = UseRegister(instr->index()); | 1796 LOperand* index = UseRegister(instr->index()); |
1804 LInstruction* result = new LAccessArgumentsAt(arguments, length, index); | 1797 LAccessArgumentsAt* result = new LAccessArgumentsAt(arguments, length, index); |
1805 return DefineAsRegister(AssignEnvironment(result)); | 1798 return AssignEnvironment(DefineAsRegister(result)); |
1806 } | 1799 } |
1807 | 1800 |
1808 | 1801 |
1809 LInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { | 1802 LInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { |
1810 LInstruction* result = new LTypeof(UseRegisterAtStart(instr->value())); | 1803 LTypeof* result = new LTypeof(UseRegisterAtStart(instr->value())); |
1811 return MarkAsCall(DefineFixed(result, r0), instr); | 1804 return MarkAsCall(DefineFixed(result, r0), instr); |
1812 } | 1805 } |
1813 | 1806 |
1814 | 1807 |
1815 LInstruction* LChunkBuilder::DoTypeofIs(HTypeofIs* instr) { | 1808 LInstruction* LChunkBuilder::DoTypeofIs(HTypeofIs* instr) { |
1816 return DefineSameAsFirst(new LTypeofIs(UseRegister(instr->value()))); | 1809 return DefineSameAsFirst(new LTypeofIs(UseRegister(instr->value()))); |
1817 } | 1810 } |
1818 | 1811 |
1819 LInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) { | 1812 LInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) { |
1820 HEnvironment* env = current_block_->last_environment(); | 1813 HEnvironment* env = current_block_->last_environment(); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1868 | 1861 |
1869 | 1862 |
1870 LInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) { | 1863 LInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) { |
1871 HEnvironment* outer = current_block_->last_environment()->outer(); | 1864 HEnvironment* outer = current_block_->last_environment()->outer(); |
1872 current_block_->UpdateEnvironment(outer); | 1865 current_block_->UpdateEnvironment(outer); |
1873 return NULL; | 1866 return NULL; |
1874 } | 1867 } |
1875 | 1868 |
1876 | 1869 |
1877 } } // namespace v8::internal | 1870 } } // namespace v8::internal |
OLD | NEW |