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 // TODO(fschneider): Handle test instructions uniformly like |
Søren Thygesen Gjesse
2011/01/24 08:08:40
Username -> issue number
fschneider
2011/01/24 09:40:16
I removed the todo since it really is part of our
| |
902 // other instructions. This requires us to generate the right | |
903 // branch instruction already at the HIR level. | |
904 ASSERT(instr->IsControl()); | |
905 HTest* test = HTest::cast(current); | |
906 instr->set_hydrogen_value(test->value()); | |
907 HBasicBlock* first = test->FirstSuccessor(); | |
908 HBasicBlock* second = test->SecondSuccessor(); | |
909 ASSERT(first != NULL && second != NULL); | |
910 instr->SetBranchTargets(first->block_id(), second->block_id()); | |
887 } else { | 911 } else { |
888 instr->set_hydrogen_value(current); | 912 instr->set_hydrogen_value(current); |
889 } | 913 } |
890 | 914 |
891 int index = chunk_->AddInstruction(instr, current_block_); | 915 int index = chunk_->AddInstruction(instr, current_block_); |
892 allocator_->SummarizeInstruction(index); | 916 allocator_->SummarizeInstruction(index); |
893 } else { | 917 } else { |
894 // This instruction should be omitted. | 918 // This instruction should be omitted. |
895 allocator_->OmitInstruction(); | 919 allocator_->OmitInstruction(); |
896 } | 920 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
932 LInstruction* LChunkBuilder::DoGoto(HGoto* instr) { | 956 LInstruction* LChunkBuilder::DoGoto(HGoto* instr) { |
933 LInstruction* result = new LGoto(instr->FirstSuccessor()->block_id(), | 957 LInstruction* result = new LGoto(instr->FirstSuccessor()->block_id(), |
934 instr->include_stack_check()); | 958 instr->include_stack_check()); |
935 if (instr->include_stack_check()) result = AssignPointerMap(result); | 959 if (instr->include_stack_check()) result = AssignPointerMap(result); |
936 return result; | 960 return result; |
937 } | 961 } |
938 | 962 |
939 | 963 |
940 LInstruction* LChunkBuilder::DoTest(HTest* instr) { | 964 LInstruction* LChunkBuilder::DoTest(HTest* instr) { |
941 HValue* v = instr->value(); | 965 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()) { | 966 if (v->EmitAtUses()) { |
949 if (v->IsClassOfTest()) { | 967 if (v->IsClassOfTest()) { |
950 HClassOfTest* compare = HClassOfTest::cast(v); | 968 HClassOfTest* compare = HClassOfTest::cast(v); |
951 ASSERT(compare->value()->representation().IsTagged()); | 969 ASSERT(compare->value()->representation().IsTagged()); |
952 | 970 |
953 return new LClassOfTestAndBranch(UseTempRegister(compare->value()), | 971 return new LClassOfTestAndBranch(UseTempRegister(compare->value()), |
954 TempRegister(), | 972 TempRegister()); |
955 first_id, | |
956 second_id); | |
957 } else if (v->IsCompare()) { | 973 } else if (v->IsCompare()) { |
958 HCompare* compare = HCompare::cast(v); | 974 HCompare* compare = HCompare::cast(v); |
959 Token::Value op = compare->token(); | 975 Token::Value op = compare->token(); |
960 HValue* left = compare->left(); | 976 HValue* left = compare->left(); |
961 HValue* right = compare->right(); | 977 HValue* right = compare->right(); |
962 Representation r = compare->GetInputRepresentation(); | 978 Representation r = compare->GetInputRepresentation(); |
963 if (r.IsInteger32()) { | 979 if (r.IsInteger32()) { |
964 ASSERT(left->representation().IsInteger32()); | 980 ASSERT(left->representation().IsInteger32()); |
965 ASSERT(right->representation().IsInteger32()); | 981 ASSERT(right->representation().IsInteger32()); |
966 return new LCmpIDAndBranch(UseRegisterAtStart(left), | 982 return new LCmpIDAndBranch(UseRegisterAtStart(left), |
967 UseOrConstantAtStart(right), | 983 UseOrConstantAtStart(right)); |
968 first_id, | |
969 second_id); | |
970 } else if (r.IsDouble()) { | 984 } else if (r.IsDouble()) { |
971 ASSERT(left->representation().IsDouble()); | 985 ASSERT(left->representation().IsDouble()); |
972 ASSERT(right->representation().IsDouble()); | 986 ASSERT(right->representation().IsDouble()); |
973 return new LCmpIDAndBranch(UseRegisterAtStart(left), | 987 return new LCmpIDAndBranch(UseRegisterAtStart(left), |
974 UseRegisterAtStart(right), | 988 UseRegisterAtStart(right)); |
975 first_id, | |
976 second_id); | |
977 } else { | 989 } else { |
978 ASSERT(left->representation().IsTagged()); | 990 ASSERT(left->representation().IsTagged()); |
979 ASSERT(right->representation().IsTagged()); | 991 ASSERT(right->representation().IsTagged()); |
980 bool reversed = op == Token::GT || op == Token::LTE; | 992 bool reversed = op == Token::GT || op == Token::LTE; |
981 LOperand* left_operand = UseFixed(left, reversed ? r0 : r1); | 993 LOperand* left_operand = UseFixed(left, reversed ? r0 : r1); |
982 LOperand* right_operand = UseFixed(right, reversed ? r1 : r0); | 994 LOperand* right_operand = UseFixed(right, reversed ? r1 : r0); |
983 LInstruction* result = new LCmpTAndBranch(left_operand, | 995 LInstruction* result = new LCmpTAndBranch(left_operand, |
984 right_operand, | 996 right_operand); |
985 first_id, | |
986 second_id); | |
987 return MarkAsCall(result, instr); | 997 return MarkAsCall(result, instr); |
988 } | 998 } |
989 } else if (v->IsIsSmi()) { | 999 } else if (v->IsIsSmi()) { |
990 HIsSmi* compare = HIsSmi::cast(v); | 1000 HIsSmi* compare = HIsSmi::cast(v); |
991 ASSERT(compare->value()->representation().IsTagged()); | 1001 ASSERT(compare->value()->representation().IsTagged()); |
992 | 1002 |
993 return new LIsSmiAndBranch(Use(compare->value()), | 1003 return new LIsSmiAndBranch(Use(compare->value())); |
994 first_id, | |
995 second_id); | |
996 } else if (v->IsHasInstanceType()) { | 1004 } else if (v->IsHasInstanceType()) { |
997 HHasInstanceType* compare = HHasInstanceType::cast(v); | 1005 HHasInstanceType* compare = HHasInstanceType::cast(v); |
998 ASSERT(compare->value()->representation().IsTagged()); | 1006 ASSERT(compare->value()->representation().IsTagged()); |
999 | 1007 return new LHasInstanceTypeAndBranch( |
1000 return new LHasInstanceTypeAndBranch(UseRegisterAtStart(compare->value()), | 1008 UseRegisterAtStart(compare->value())); |
1001 first_id, | |
1002 second_id); | |
1003 } else if (v->IsHasCachedArrayIndex()) { | 1009 } else if (v->IsHasCachedArrayIndex()) { |
1004 HHasCachedArrayIndex* compare = HHasCachedArrayIndex::cast(v); | 1010 HHasCachedArrayIndex* compare = HHasCachedArrayIndex::cast(v); |
1005 ASSERT(compare->value()->representation().IsTagged()); | 1011 ASSERT(compare->value()->representation().IsTagged()); |
1006 | 1012 |
1007 return new LHasCachedArrayIndexAndBranch( | 1013 return new LHasCachedArrayIndexAndBranch( |
1008 UseRegisterAtStart(compare->value()), first_id, second_id); | 1014 UseRegisterAtStart(compare->value())); |
1009 } else if (v->IsIsNull()) { | 1015 } else if (v->IsIsNull()) { |
1010 HIsNull* compare = HIsNull::cast(v); | 1016 HIsNull* compare = HIsNull::cast(v); |
1011 ASSERT(compare->value()->representation().IsTagged()); | 1017 ASSERT(compare->value()->representation().IsTagged()); |
1012 | 1018 |
1013 return new LIsNullAndBranch(UseRegisterAtStart(compare->value()), | 1019 return new LIsNullAndBranch(UseRegisterAtStart(compare->value())); |
1014 first_id, | |
1015 second_id); | |
1016 } else if (v->IsIsObject()) { | 1020 } else if (v->IsIsObject()) { |
1017 HIsObject* compare = HIsObject::cast(v); | 1021 HIsObject* compare = HIsObject::cast(v); |
1018 ASSERT(compare->value()->representation().IsTagged()); | 1022 ASSERT(compare->value()->representation().IsTagged()); |
1019 | 1023 |
1020 LOperand* temp1 = TempRegister(); | 1024 LOperand* temp1 = TempRegister(); |
1021 LOperand* temp2 = TempRegister(); | 1025 LOperand* temp2 = TempRegister(); |
1022 return new LIsObjectAndBranch(UseRegisterAtStart(compare->value()), | 1026 return new LIsObjectAndBranch(UseRegisterAtStart(compare->value()), |
1023 temp1, | 1027 temp1, |
1024 temp2, | 1028 temp2); |
1025 first_id, | |
1026 second_id); | |
1027 } else if (v->IsCompareJSObjectEq()) { | 1029 } else if (v->IsCompareJSObjectEq()) { |
1028 HCompareJSObjectEq* compare = HCompareJSObjectEq::cast(v); | 1030 HCompareJSObjectEq* compare = HCompareJSObjectEq::cast(v); |
1029 return new LCmpJSObjectEqAndBranch(UseRegisterAtStart(compare->left()), | 1031 return new LCmpJSObjectEqAndBranch(UseRegisterAtStart(compare->left()), |
1030 UseRegisterAtStart(compare->right()), | 1032 UseRegisterAtStart(compare->right())); |
1031 first_id, | |
1032 second_id); | |
1033 } else if (v->IsInstanceOf()) { | 1033 } else if (v->IsInstanceOf()) { |
1034 HInstanceOf* instance_of = HInstanceOf::cast(v); | 1034 HInstanceOf* instance_of = HInstanceOf::cast(v); |
1035 LInstruction* result = | 1035 LInstruction* result = |
1036 new LInstanceOfAndBranch(Use(instance_of->left()), | 1036 new LInstanceOfAndBranch(Use(instance_of->left()), |
1037 Use(instance_of->right()), | 1037 Use(instance_of->right())); |
1038 first_id, | |
1039 second_id); | |
1040 return MarkAsCall(result, instr); | 1038 return MarkAsCall(result, instr); |
1041 } else if (v->IsTypeofIs()) { | 1039 } else if (v->IsTypeofIs()) { |
1042 HTypeofIs* typeof_is = HTypeofIs::cast(v); | 1040 HTypeofIs* typeof_is = HTypeofIs::cast(v); |
1043 return new LTypeofIsAndBranch(UseTempRegister(typeof_is->value()), | 1041 return new LTypeofIsAndBranch(UseTempRegister(typeof_is->value())); |
1044 first_id, | |
1045 second_id); | |
1046 } else { | 1042 } else { |
1047 if (v->IsConstant()) { | 1043 if (v->IsConstant()) { |
1048 if (HConstant::cast(v)->handle()->IsTrue()) { | 1044 if (HConstant::cast(v)->handle()->IsTrue()) { |
1049 return new LGoto(first_id); | 1045 return new LGoto(instr->FirstSuccessor()->block_id()); |
1050 } else if (HConstant::cast(v)->handle()->IsFalse()) { | 1046 } else if (HConstant::cast(v)->handle()->IsFalse()) { |
1051 return new LGoto(second_id); | 1047 return new LGoto(instr->SecondSuccessor()->block_id()); |
1052 } | 1048 } |
1053 } | 1049 } |
1054 Abort("Undefined compare before branch"); | 1050 Abort("Undefined compare before branch"); |
1055 return NULL; | 1051 return NULL; |
1056 } | 1052 } |
1057 } | 1053 } |
1058 return new LBranch(UseRegisterAtStart(v), first_id, second_id); | 1054 return new LBranch(UseRegisterAtStart(v)); |
1059 } | 1055 } |
1060 | 1056 |
1061 | 1057 |
1062 LInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { | 1058 LInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { |
1063 ASSERT(instr->value()->representation().IsTagged()); | 1059 ASSERT(instr->value()->representation().IsTagged()); |
1064 LOperand* value = UseRegisterAtStart(instr->value()); | 1060 LOperand* value = UseRegisterAtStart(instr->value()); |
1065 LOperand* temp = TempRegister(); | 1061 LOperand* temp = TempRegister(); |
1066 return new LCmpMapAndBranch(value, temp); | 1062 return new LCmpMapAndBranch(value, temp); |
1067 } | 1063 } |
1068 | 1064 |
1069 | 1065 |
1070 LInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) { | 1066 LInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) { |
1071 return DefineAsRegister(new LArgumentsLength(UseRegister(length->value()))); | 1067 return DefineAsRegister(new LArgumentsLength(UseRegister(length->value()))); |
1072 } | 1068 } |
1073 | 1069 |
1074 | 1070 |
1075 LInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { | 1071 LInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { |
1076 return DefineAsRegister(new LArgumentsElements); | 1072 return DefineAsRegister(new LArgumentsElements); |
1077 } | 1073 } |
1078 | 1074 |
1079 | 1075 |
1080 LInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { | 1076 LInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { |
1081 LInstruction* result = | 1077 LInstanceOf* result = |
1082 new LInstanceOf(UseFixed(instr->left(), r0), | 1078 new LInstanceOf(UseFixed(instr->left(), r0), |
1083 UseFixed(instr->right(), r1)); | 1079 UseFixed(instr->right(), r1)); |
1084 return MarkAsCall(DefineFixed(result, r0), instr); | 1080 return MarkAsCall(DefineFixed(result, r0), instr); |
1085 } | 1081 } |
1086 | 1082 |
1087 | 1083 |
1088 LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal( | 1084 LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal( |
1089 HInstanceOfKnownGlobal* instr) { | 1085 HInstanceOfKnownGlobal* instr) { |
1090 LInstruction* result = | 1086 LInstanceOfKnownGlobal* result = |
1091 new LInstanceOfKnownGlobal(UseFixed(instr->value(), r0), FixedTemp(r4)); | 1087 new LInstanceOfKnownGlobal(UseFixed(instr->value(), r0), FixedTemp(r4)); |
1092 MarkAsSaveDoubles(result); | 1088 MarkAsSaveDoubles(result); |
1093 return AssignEnvironment(AssignPointerMap(DefineFixed(result, r0))); | 1089 return AssignEnvironment(AssignPointerMap(DefineFixed(result, r0))); |
1094 } | 1090 } |
1095 | 1091 |
1096 | 1092 |
1097 LInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) { | 1093 LInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) { |
1098 LOperand* function = UseFixed(instr->function(), r1); | 1094 LOperand* function = UseFixed(instr->function(), r1); |
1099 LOperand* receiver = UseFixed(instr->receiver(), r0); | 1095 LOperand* receiver = UseFixed(instr->receiver(), r0); |
1100 LOperand* length = UseRegisterAtStart(instr->length()); | 1096 LOperand* length = UseRegisterAtStart(instr->length()); |
1101 LOperand* elements = UseRegisterAtStart(instr->elements()); | 1097 LOperand* elements = UseRegisterAtStart(instr->elements()); |
1102 LInstruction* result = new LApplyArguments(function, | 1098 LApplyArguments* result = new LApplyArguments(function, |
1103 receiver, | 1099 receiver, |
1104 length, | 1100 length, |
1105 elements); | 1101 elements); |
1106 return MarkAsCall(DefineFixed(result, r0), instr, CAN_DEOPTIMIZE_EAGERLY); | 1102 return MarkAsCall(DefineFixed(result, r0), instr, CAN_DEOPTIMIZE_EAGERLY); |
1107 } | 1103 } |
1108 | 1104 |
1109 | 1105 |
1110 LInstruction* LChunkBuilder::DoPushArgument(HPushArgument* instr) { | 1106 LInstruction* LChunkBuilder::DoPushArgument(HPushArgument* instr) { |
1111 ++argument_count_; | 1107 ++argument_count_; |
1112 LOperand* argument = Use(instr->argument()); | 1108 LOperand* argument = Use(instr->argument()); |
1113 return new LPushArgument(argument); | 1109 return new LPushArgument(argument); |
1114 } | 1110 } |
1115 | 1111 |
(...skipping 12 matching lines...) Expand all Loading... | |
1128 HCallConstantFunction* instr) { | 1124 HCallConstantFunction* instr) { |
1129 argument_count_ -= instr->argument_count(); | 1125 argument_count_ -= instr->argument_count(); |
1130 return MarkAsCall(DefineFixed(new LCallConstantFunction, r0), instr); | 1126 return MarkAsCall(DefineFixed(new LCallConstantFunction, r0), instr); |
1131 } | 1127 } |
1132 | 1128 |
1133 | 1129 |
1134 LInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { | 1130 LInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { |
1135 BuiltinFunctionId op = instr->op(); | 1131 BuiltinFunctionId op = instr->op(); |
1136 LOperand* input = UseRegisterAtStart(instr->value()); | 1132 LOperand* input = UseRegisterAtStart(instr->value()); |
1137 LOperand* temp = (op == kMathFloor) ? TempRegister() : NULL; | 1133 LOperand* temp = (op == kMathFloor) ? TempRegister() : NULL; |
1138 LInstruction* result = new LUnaryMathOperation(input, temp); | 1134 LUnaryMathOperation* result = new LUnaryMathOperation(input, temp); |
1139 switch (op) { | 1135 switch (op) { |
1140 case kMathAbs: | 1136 case kMathAbs: |
1141 return AssignEnvironment(AssignPointerMap(DefineSameAsFirst(result))); | 1137 return AssignEnvironment(AssignPointerMap(DefineSameAsFirst(result))); |
1142 case kMathFloor: | 1138 case kMathFloor: |
1143 return AssignEnvironment(DefineAsRegister(result)); | 1139 return AssignEnvironment(DefineAsRegister(result)); |
1144 case kMathSqrt: | 1140 case kMathSqrt: |
1145 return DefineSameAsFirst(result); | 1141 return DefineSameAsFirst(result); |
1146 case kMathRound: | 1142 case kMathRound: |
1147 Abort("MathRound LUnaryMathOperation not implemented"); | 1143 Abort("MathRound LUnaryMathOperation not implemented"); |
1148 return NULL; | 1144 return NULL; |
(...skipping 12 matching lines...) Expand all Loading... | |
1161 default: | 1157 default: |
1162 UNREACHABLE(); | 1158 UNREACHABLE(); |
1163 return NULL; | 1159 return NULL; |
1164 } | 1160 } |
1165 } | 1161 } |
1166 | 1162 |
1167 | 1163 |
1168 LInstruction* LChunkBuilder::DoCallKeyed(HCallKeyed* instr) { | 1164 LInstruction* LChunkBuilder::DoCallKeyed(HCallKeyed* instr) { |
1169 ASSERT(instr->key()->representation().IsTagged()); | 1165 ASSERT(instr->key()->representation().IsTagged()); |
1170 argument_count_ -= instr->argument_count(); | 1166 argument_count_ -= instr->argument_count(); |
1171 UseFixed(instr->key(), r2); | 1167 LOperand* key = UseFixed(instr->key(), r2); |
1172 return MarkAsCall(DefineFixed(new LCallKeyed, r0), instr); | 1168 return MarkAsCall(DefineFixed(new LCallKeyed(key), r0), instr); |
1173 } | 1169 } |
1174 | 1170 |
1175 | 1171 |
1176 LInstruction* LChunkBuilder::DoCallNamed(HCallNamed* instr) { | 1172 LInstruction* LChunkBuilder::DoCallNamed(HCallNamed* instr) { |
1177 argument_count_ -= instr->argument_count(); | 1173 argument_count_ -= instr->argument_count(); |
1178 return MarkAsCall(DefineFixed(new LCallNamed, r0), instr); | 1174 return MarkAsCall(DefineFixed(new LCallNamed, r0), instr); |
1179 } | 1175 } |
1180 | 1176 |
1181 | 1177 |
1182 LInstruction* LChunkBuilder::DoCallGlobal(HCallGlobal* instr) { | 1178 LInstruction* LChunkBuilder::DoCallGlobal(HCallGlobal* instr) { |
1183 argument_count_ -= instr->argument_count(); | 1179 argument_count_ -= instr->argument_count(); |
1184 return MarkAsCall(DefineFixed(new LCallGlobal, r0), instr); | 1180 return MarkAsCall(DefineFixed(new LCallGlobal, r0), instr); |
1185 } | 1181 } |
1186 | 1182 |
1187 | 1183 |
1188 LInstruction* LChunkBuilder::DoCallKnownGlobal(HCallKnownGlobal* instr) { | 1184 LInstruction* LChunkBuilder::DoCallKnownGlobal(HCallKnownGlobal* instr) { |
1189 argument_count_ -= instr->argument_count(); | 1185 argument_count_ -= instr->argument_count(); |
1190 return MarkAsCall(DefineFixed(new LCallKnownGlobal, r0), instr); | 1186 return MarkAsCall(DefineFixed(new LCallKnownGlobal, r0), instr); |
1191 } | 1187 } |
1192 | 1188 |
1193 | 1189 |
1194 LInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { | 1190 LInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { |
1195 LOperand* constructor = UseFixed(instr->constructor(), r1); | 1191 LOperand* constructor = UseFixed(instr->constructor(), r1); |
1196 argument_count_ -= instr->argument_count(); | 1192 argument_count_ -= instr->argument_count(); |
1197 LInstruction* result = new LCallNew(constructor); | 1193 LCallNew* result = new LCallNew(constructor); |
1198 return MarkAsCall(DefineFixed(result, r0), instr); | 1194 return MarkAsCall(DefineFixed(result, r0), instr); |
1199 } | 1195 } |
1200 | 1196 |
1201 | 1197 |
1202 LInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) { | 1198 LInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) { |
1203 argument_count_ -= instr->argument_count(); | 1199 argument_count_ -= instr->argument_count(); |
1204 return MarkAsCall(DefineFixed(new LCallFunction, r0), instr); | 1200 return MarkAsCall(DefineFixed(new LCallFunction, r0), instr); |
1205 } | 1201 } |
1206 | 1202 |
1207 | 1203 |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1377 ASSERT(instr->right()->representation().IsDouble()); | 1373 ASSERT(instr->right()->representation().IsDouble()); |
1378 LOperand* left = UseRegisterAtStart(instr->left()); | 1374 LOperand* left = UseRegisterAtStart(instr->left()); |
1379 LOperand* right = UseRegisterAtStart(instr->right()); | 1375 LOperand* right = UseRegisterAtStart(instr->right()); |
1380 return DefineAsRegister(new LCmpID(left, right)); | 1376 return DefineAsRegister(new LCmpID(left, right)); |
1381 } else { | 1377 } else { |
1382 ASSERT(instr->left()->representation().IsTagged()); | 1378 ASSERT(instr->left()->representation().IsTagged()); |
1383 ASSERT(instr->right()->representation().IsTagged()); | 1379 ASSERT(instr->right()->representation().IsTagged()); |
1384 bool reversed = (op == Token::GT || op == Token::LTE); | 1380 bool reversed = (op == Token::GT || op == Token::LTE); |
1385 LOperand* left = UseFixed(instr->left(), reversed ? r0 : r1); | 1381 LOperand* left = UseFixed(instr->left(), reversed ? r0 : r1); |
1386 LOperand* right = UseFixed(instr->right(), reversed ? r1 : r0); | 1382 LOperand* right = UseFixed(instr->right(), reversed ? r1 : r0); |
1387 LInstruction* result = new LCmpT(left, right); | 1383 LCmpT* result = new LCmpT(left, right); |
1388 return MarkAsCall(DefineFixed(result, r0), instr); | 1384 return MarkAsCall(DefineFixed(result, r0), instr); |
1389 } | 1385 } |
1390 } | 1386 } |
1391 | 1387 |
1392 | 1388 |
1393 LInstruction* LChunkBuilder::DoCompareJSObjectEq( | 1389 LInstruction* LChunkBuilder::DoCompareJSObjectEq( |
1394 HCompareJSObjectEq* instr) { | 1390 HCompareJSObjectEq* instr) { |
1395 LOperand* left = UseRegisterAtStart(instr->left()); | 1391 LOperand* left = UseRegisterAtStart(instr->left()); |
1396 LOperand* right = UseRegisterAtStart(instr->right()); | 1392 LOperand* right = UseRegisterAtStart(instr->right()); |
1397 LInstruction* result = new LCmpJSObjectEq(left, right); | 1393 LCmpJSObjectEq* result = new LCmpJSObjectEq(left, right); |
1398 return DefineAsRegister(result); | 1394 return DefineAsRegister(result); |
1399 } | 1395 } |
1400 | 1396 |
1401 | 1397 |
1402 LInstruction* LChunkBuilder::DoIsNull(HIsNull* instr) { | 1398 LInstruction* LChunkBuilder::DoIsNull(HIsNull* instr) { |
1403 ASSERT(instr->value()->representation().IsTagged()); | 1399 ASSERT(instr->value()->representation().IsTagged()); |
1404 LOperand* value = UseRegisterAtStart(instr->value()); | 1400 LOperand* value = UseRegisterAtStart(instr->value()); |
1405 | 1401 |
1406 return DefineAsRegister(new LIsNull(value)); | 1402 return DefineAsRegister(new LIsNull(value)); |
1407 } | 1403 } |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1454 | 1450 |
1455 | 1451 |
1456 LInstruction* LChunkBuilder::DoFixedArrayLength(HFixedArrayLength* instr) { | 1452 LInstruction* LChunkBuilder::DoFixedArrayLength(HFixedArrayLength* instr) { |
1457 LOperand* array = UseRegisterAtStart(instr->value()); | 1453 LOperand* array = UseRegisterAtStart(instr->value()); |
1458 return DefineAsRegister(new LFixedArrayLength(array)); | 1454 return DefineAsRegister(new LFixedArrayLength(array)); |
1459 } | 1455 } |
1460 | 1456 |
1461 | 1457 |
1462 LInstruction* LChunkBuilder::DoValueOf(HValueOf* instr) { | 1458 LInstruction* LChunkBuilder::DoValueOf(HValueOf* instr) { |
1463 LOperand* object = UseRegister(instr->value()); | 1459 LOperand* object = UseRegister(instr->value()); |
1464 LInstruction* result = new LValueOf(object, TempRegister()); | 1460 LValueOf* result = new LValueOf(object, TempRegister()); |
1465 return AssignEnvironment(DefineSameAsFirst(result)); | 1461 return AssignEnvironment(DefineSameAsFirst(result)); |
1466 } | 1462 } |
1467 | 1463 |
1468 | 1464 |
1469 LInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) { | 1465 LInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) { |
1470 return AssignEnvironment(new LBoundsCheck(UseRegisterAtStart(instr->index()), | 1466 return AssignEnvironment(new LBoundsCheck(UseRegisterAtStart(instr->index()), |
1471 UseRegister(instr->length()))); | 1467 UseRegister(instr->length()))); |
1472 } | 1468 } |
1473 | 1469 |
1474 | 1470 |
1475 LInstruction* LChunkBuilder::DoThrow(HThrow* instr) { | 1471 LInstruction* LChunkBuilder::DoThrow(HThrow* instr) { |
1476 LOperand* value = UseFixed(instr->value(), r0); | 1472 LOperand* value = UseFixed(instr->value(), r0); |
1477 return MarkAsCall(new LThrow(value), instr); | 1473 return MarkAsCall(new LThrow(value), instr); |
1478 } | 1474 } |
1479 | 1475 |
1480 | 1476 |
1481 LInstruction* LChunkBuilder::DoChange(HChange* instr) { | 1477 LInstruction* LChunkBuilder::DoChange(HChange* instr) { |
1482 Representation from = instr->from(); | 1478 Representation from = instr->from(); |
1483 Representation to = instr->to(); | 1479 Representation to = instr->to(); |
1484 if (from.IsTagged()) { | 1480 if (from.IsTagged()) { |
1485 if (to.IsDouble()) { | 1481 if (to.IsDouble()) { |
1486 LOperand* value = UseRegister(instr->value()); | 1482 LOperand* value = UseRegister(instr->value()); |
1487 LInstruction* res = new LNumberUntagD(value); | 1483 LNumberUntagD* res = new LNumberUntagD(value); |
1488 return AssignEnvironment(DefineAsRegister(res)); | 1484 return AssignEnvironment(DefineAsRegister(res)); |
1489 } else { | 1485 } else { |
1490 ASSERT(to.IsInteger32()); | 1486 ASSERT(to.IsInteger32()); |
1491 LOperand* value = UseRegister(instr->value()); | 1487 LOperand* value = UseRegister(instr->value()); |
1492 bool needs_check = !instr->value()->type().IsSmi(); | 1488 bool needs_check = !instr->value()->type().IsSmi(); |
1493 LInstruction* res = NULL; | 1489 LInstruction* res = NULL; |
1494 if (needs_check) { | 1490 if (needs_check) { |
1495 res = DefineSameAsFirst(new LTaggedToI(value, FixedTemp(d1))); | 1491 res = DefineSameAsFirst(new LTaggedToI(value, FixedTemp(d1))); |
1496 } else { | 1492 } else { |
1497 res = DefineSameAsFirst(new LSmiUntag(value, needs_check)); | 1493 res = DefineSameAsFirst(new LSmiUntag(value, needs_check)); |
1498 } | 1494 } |
1499 if (needs_check) { | 1495 if (needs_check) { |
1500 res = AssignEnvironment(res); | 1496 res = AssignEnvironment(res); |
1501 } | 1497 } |
1502 return res; | 1498 return res; |
1503 } | 1499 } |
1504 } else if (from.IsDouble()) { | 1500 } else if (from.IsDouble()) { |
1505 if (to.IsTagged()) { | 1501 if (to.IsTagged()) { |
1506 LOperand* value = UseRegister(instr->value()); | 1502 LOperand* value = UseRegister(instr->value()); |
1507 LOperand* temp1 = TempRegister(); | 1503 LOperand* temp1 = TempRegister(); |
1508 LOperand* temp2 = TempRegister(); | 1504 LOperand* temp2 = TempRegister(); |
1509 | 1505 |
1510 // Make sure that the temp and result_temp registers are | 1506 // Make sure that the temp and result_temp registers are |
1511 // different. | 1507 // different. |
1512 LUnallocated* result_temp = TempRegister(); | 1508 LUnallocated* result_temp = TempRegister(); |
1513 LInstruction* result = new LNumberTagD(value, temp1, temp2); | 1509 LNumberTagD* result = new LNumberTagD(value, temp1, temp2); |
1514 Define(result, result_temp); | 1510 Define(result, result_temp); |
1515 return AssignPointerMap(result); | 1511 return AssignPointerMap(result); |
1516 } else { | 1512 } else { |
1517 ASSERT(to.IsInteger32()); | 1513 ASSERT(to.IsInteger32()); |
1518 LOperand* value = UseRegister(instr->value()); | 1514 LOperand* value = UseRegister(instr->value()); |
1519 LInstruction* res = new LDoubleToI(value); | 1515 LDoubleToI* res = new LDoubleToI(value); |
1520 return AssignEnvironment(DefineAsRegister(res)); | 1516 return AssignEnvironment(DefineAsRegister(res)); |
1521 } | 1517 } |
1522 } else if (from.IsInteger32()) { | 1518 } else if (from.IsInteger32()) { |
1523 if (to.IsTagged()) { | 1519 if (to.IsTagged()) { |
1524 HValue* val = instr->value(); | 1520 HValue* val = instr->value(); |
1525 LOperand* value = UseRegister(val); | 1521 LOperand* value = UseRegister(val); |
1526 if (val->HasRange() && val->range()->IsInSmiRange()) { | 1522 if (val->HasRange() && val->range()->IsInSmiRange()) { |
1527 return DefineSameAsFirst(new LSmiTag(value)); | 1523 return DefineSameAsFirst(new LSmiTag(value)); |
1528 } else { | 1524 } else { |
1529 LInstruction* result = new LNumberTagI(value); | 1525 LNumberTagI* result = new LNumberTagI(value); |
1530 return AssignEnvironment(AssignPointerMap(DefineSameAsFirst(result))); | 1526 return AssignEnvironment(AssignPointerMap(DefineSameAsFirst(result))); |
1531 } | 1527 } |
1532 } else { | 1528 } else { |
1533 ASSERT(to.IsDouble()); | 1529 ASSERT(to.IsDouble()); |
1534 LOperand* value = Use(instr->value()); | 1530 LOperand* value = Use(instr->value()); |
1535 return DefineAsRegister(new LInteger32ToDouble(value)); | 1531 return DefineAsRegister(new LInteger32ToDouble(value)); |
1536 } | 1532 } |
1537 } | 1533 } |
1538 UNREACHABLE(); | 1534 UNREACHABLE(); |
1539 return NULL; | 1535 return NULL; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1596 } else if (r.IsTagged()) { | 1592 } else if (r.IsTagged()) { |
1597 return DefineAsRegister(new LConstantT(instr->handle())); | 1593 return DefineAsRegister(new LConstantT(instr->handle())); |
1598 } else { | 1594 } else { |
1599 UNREACHABLE(); | 1595 UNREACHABLE(); |
1600 return NULL; | 1596 return NULL; |
1601 } | 1597 } |
1602 } | 1598 } |
1603 | 1599 |
1604 | 1600 |
1605 LInstruction* LChunkBuilder::DoLoadGlobal(HLoadGlobal* instr) { | 1601 LInstruction* LChunkBuilder::DoLoadGlobal(HLoadGlobal* instr) { |
1606 LInstruction* result = new LLoadGlobal(); | 1602 LLoadGlobal* result = new LLoadGlobal(); |
1607 return instr->check_hole_value() | 1603 return instr->check_hole_value() |
1608 ? AssignEnvironment(DefineAsRegister(result)) | 1604 ? AssignEnvironment(DefineAsRegister(result)) |
1609 : DefineAsRegister(result); | 1605 : DefineAsRegister(result); |
1610 } | 1606 } |
1611 | 1607 |
1612 | 1608 |
1613 LInstruction* LChunkBuilder::DoStoreGlobal(HStoreGlobal* instr) { | 1609 LInstruction* LChunkBuilder::DoStoreGlobal(HStoreGlobal* instr) { |
1614 return new LStoreGlobal(UseRegisterAtStart(instr->value())); | 1610 return new LStoreGlobal(UseRegisterAtStart(instr->value())); |
1615 } | 1611 } |
1616 | 1612 |
(...skipping 28 matching lines...) Expand all Loading... | |
1645 return DefineSameAsFirst(new LLoadElements(input)); | 1641 return DefineSameAsFirst(new LLoadElements(input)); |
1646 } | 1642 } |
1647 | 1643 |
1648 | 1644 |
1649 LInstruction* LChunkBuilder::DoLoadKeyedFastElement( | 1645 LInstruction* LChunkBuilder::DoLoadKeyedFastElement( |
1650 HLoadKeyedFastElement* instr) { | 1646 HLoadKeyedFastElement* instr) { |
1651 ASSERT(instr->representation().IsTagged()); | 1647 ASSERT(instr->representation().IsTagged()); |
1652 ASSERT(instr->key()->representation().IsInteger32()); | 1648 ASSERT(instr->key()->representation().IsInteger32()); |
1653 LOperand* obj = UseRegisterAtStart(instr->object()); | 1649 LOperand* obj = UseRegisterAtStart(instr->object()); |
1654 LOperand* key = UseRegisterAtStart(instr->key()); | 1650 LOperand* key = UseRegisterAtStart(instr->key()); |
1655 LInstruction* result = new LLoadKeyedFastElement(obj, key); | 1651 LLoadKeyedFastElement* result = new LLoadKeyedFastElement(obj, key); |
1656 return AssignEnvironment(DefineSameAsFirst(result)); | 1652 return AssignEnvironment(DefineSameAsFirst(result)); |
1657 } | 1653 } |
1658 | 1654 |
1659 | 1655 |
1660 LInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) { | 1656 LInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) { |
1661 LOperand* object = UseFixed(instr->object(), r1); | 1657 LOperand* object = UseFixed(instr->object(), r1); |
1662 LOperand* key = UseFixed(instr->key(), r0); | 1658 LOperand* key = UseFixed(instr->key(), r0); |
1663 | 1659 |
1664 LInstruction* result = | 1660 LInstruction* result = |
1665 DefineFixed(new LLoadKeyedGeneric(object, key), r0); | 1661 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); | 1715 LOperand* val = UseFixed(instr->value(), r0); |
1720 | 1716 |
1721 LInstruction* result = new LStoreNamedGeneric(obj, val); | 1717 LInstruction* result = new LStoreNamedGeneric(obj, val); |
1722 return MarkAsCall(result, instr); | 1718 return MarkAsCall(result, instr); |
1723 } | 1719 } |
1724 | 1720 |
1725 | 1721 |
1726 LInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) { | 1722 LInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) { |
1727 LOperand* string = UseRegister(instr->string()); | 1723 LOperand* string = UseRegister(instr->string()); |
1728 LOperand* index = UseRegisterOrConstant(instr->index()); | 1724 LOperand* index = UseRegisterOrConstant(instr->index()); |
1729 LInstruction* result = new LStringCharCodeAt(string, index); | 1725 LStringCharCodeAt* result = new LStringCharCodeAt(string, index); |
1730 return AssignEnvironment(AssignPointerMap(DefineAsRegister(result))); | 1726 return AssignEnvironment(AssignPointerMap(DefineAsRegister(result))); |
1731 } | 1727 } |
1732 | 1728 |
1733 | 1729 |
1734 LInstruction* LChunkBuilder::DoStringLength(HStringLength* instr) { | 1730 LInstruction* LChunkBuilder::DoStringLength(HStringLength* instr) { |
1735 LOperand* string = UseRegisterAtStart(instr->value()); | 1731 LOperand* string = UseRegisterAtStart(instr->value()); |
1736 return DefineAsRegister(new LStringLength(string)); | 1732 return DefineAsRegister(new LStringLength(string)); |
1737 } | 1733 } |
1738 | 1734 |
1739 | 1735 |
(...skipping 13 matching lines...) Expand all Loading... | |
1753 | 1749 |
1754 | 1750 |
1755 LInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) { | 1751 LInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) { |
1756 return MarkAsCall(DefineFixed(new LFunctionLiteral, r0), instr); | 1752 return MarkAsCall(DefineFixed(new LFunctionLiteral, r0), instr); |
1757 } | 1753 } |
1758 | 1754 |
1759 | 1755 |
1760 LInstruction* LChunkBuilder::DoDeleteProperty(HDeleteProperty* instr) { | 1756 LInstruction* LChunkBuilder::DoDeleteProperty(HDeleteProperty* instr) { |
1761 LOperand* object = UseRegisterAtStart(instr->object()); | 1757 LOperand* object = UseRegisterAtStart(instr->object()); |
1762 LOperand* key = UseRegisterAtStart(instr->key()); | 1758 LOperand* key = UseRegisterAtStart(instr->key()); |
1763 LInstruction* result = new LDeleteProperty(object, key); | 1759 LDeleteProperty* result = new LDeleteProperty(object, key); |
1764 return MarkAsCall(DefineFixed(result, r0), instr); | 1760 return MarkAsCall(DefineFixed(result, r0), instr); |
1765 } | 1761 } |
1766 | 1762 |
1767 | 1763 |
1768 LInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) { | 1764 LInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) { |
1769 allocator_->MarkAsOsrEntry(); | 1765 allocator_->MarkAsOsrEntry(); |
1770 current_block_->last_environment()->set_ast_id(instr->ast_id()); | 1766 current_block_->last_environment()->set_ast_id(instr->ast_id()); |
1771 return AssignEnvironment(new LOsrEntry); | 1767 return AssignEnvironment(new LOsrEntry); |
1772 } | 1768 } |
1773 | 1769 |
(...skipping 20 matching lines...) Expand all Loading... | |
1794 // There are no real uses of the arguments object (we bail out in all other | 1790 // There are no real uses of the arguments object (we bail out in all other |
1795 // cases). | 1791 // cases). |
1796 return NULL; | 1792 return NULL; |
1797 } | 1793 } |
1798 | 1794 |
1799 | 1795 |
1800 LInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) { | 1796 LInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) { |
1801 LOperand* arguments = UseRegister(instr->arguments()); | 1797 LOperand* arguments = UseRegister(instr->arguments()); |
1802 LOperand* length = UseTempRegister(instr->length()); | 1798 LOperand* length = UseTempRegister(instr->length()); |
1803 LOperand* index = UseRegister(instr->index()); | 1799 LOperand* index = UseRegister(instr->index()); |
1804 LInstruction* result = new LAccessArgumentsAt(arguments, length, index); | 1800 LAccessArgumentsAt* result = new LAccessArgumentsAt(arguments, length, index); |
1805 return DefineAsRegister(AssignEnvironment(result)); | 1801 return AssignEnvironment(DefineAsRegister(result)); |
1806 } | 1802 } |
1807 | 1803 |
1808 | 1804 |
1809 LInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { | 1805 LInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { |
1810 LInstruction* result = new LTypeof(UseRegisterAtStart(instr->value())); | 1806 LTypeof* result = new LTypeof(UseRegisterAtStart(instr->value())); |
1811 return MarkAsCall(DefineFixed(result, r0), instr); | 1807 return MarkAsCall(DefineFixed(result, r0), instr); |
1812 } | 1808 } |
1813 | 1809 |
1814 | 1810 |
1815 LInstruction* LChunkBuilder::DoTypeofIs(HTypeofIs* instr) { | 1811 LInstruction* LChunkBuilder::DoTypeofIs(HTypeofIs* instr) { |
1816 return DefineSameAsFirst(new LTypeofIs(UseRegister(instr->value()))); | 1812 return DefineSameAsFirst(new LTypeofIs(UseRegister(instr->value()))); |
1817 } | 1813 } |
1818 | 1814 |
1819 LInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) { | 1815 LInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) { |
1820 HEnvironment* env = current_block_->last_environment(); | 1816 HEnvironment* env = current_block_->last_environment(); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1868 | 1864 |
1869 | 1865 |
1870 LInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) { | 1866 LInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) { |
1871 HEnvironment* outer = current_block_->last_environment()->outer(); | 1867 HEnvironment* outer = current_block_->last_environment()->outer(); |
1872 current_block_->UpdateEnvironment(outer); | 1868 current_block_->UpdateEnvironment(outer); |
1873 return NULL; | 1869 return NULL; |
1874 } | 1870 } |
1875 | 1871 |
1876 | 1872 |
1877 } } // namespace v8::internal | 1873 } } // namespace v8::internal |
OLD | NEW |