| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 1075 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1086 assigned_double_registers_->Clear(); | 1086 assigned_double_registers_->Clear(); |
| 1087 MeetRegisterConstraints(); | 1087 MeetRegisterConstraints(); |
| 1088 if (!AllocationOk()) return false; | 1088 if (!AllocationOk()) return false; |
| 1089 ResolvePhis(); | 1089 ResolvePhis(); |
| 1090 BuildLiveRanges(); | 1090 BuildLiveRanges(); |
| 1091 AllocateGeneralRegisters(); | 1091 AllocateGeneralRegisters(); |
| 1092 if (!AllocationOk()) return false; | 1092 if (!AllocationOk()) return false; |
| 1093 AllocateDoubleRegisters(); | 1093 AllocateDoubleRegisters(); |
| 1094 if (!AllocationOk()) return false; | 1094 if (!AllocationOk()) return false; |
| 1095 PopulatePointerMaps(); | 1095 PopulatePointerMaps(); |
| 1096 if (has_osr_entry_) ProcessOsrEntry(); | |
| 1097 ConnectRanges(); | 1096 ConnectRanges(); |
| 1098 ResolveControlFlow(); | 1097 ResolveControlFlow(); |
| 1099 return true; | 1098 return true; |
| 1100 } | 1099 } |
| 1101 | 1100 |
| 1102 | 1101 |
| 1103 void LAllocator::MeetRegisterConstraints() { | 1102 void LAllocator::MeetRegisterConstraints() { |
| 1104 LAllocatorPhase phase("L_Register constraints", this); | 1103 LAllocatorPhase phase("L_Register constraints", this); |
| 1105 first_artificial_register_ = next_virtual_register_; | 1104 first_artificial_register_ = next_virtual_register_; |
| 1106 const ZoneList<HBasicBlock*>* blocks = graph_->blocks(); | 1105 const ZoneList<HBasicBlock*>* blocks = graph_->blocks(); |
| (...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1457 cur->id(), cur->Start().Value(), safe_point); | 1456 cur->id(), cur->Start().Value(), safe_point); |
| 1458 LOperand* operand = cur->CreateAssignedOperand(zone_); | 1457 LOperand* operand = cur->CreateAssignedOperand(zone_); |
| 1459 ASSERT(!operand->IsStackSlot()); | 1458 ASSERT(!operand->IsStackSlot()); |
| 1460 map->RecordPointer(operand, zone()); | 1459 map->RecordPointer(operand, zone()); |
| 1461 } | 1460 } |
| 1462 } | 1461 } |
| 1463 } | 1462 } |
| 1464 } | 1463 } |
| 1465 | 1464 |
| 1466 | 1465 |
| 1467 void LAllocator::ProcessOsrEntry() { | |
| 1468 const ZoneList<LInstruction*>* instrs = chunk_->instructions(); | |
| 1469 | |
| 1470 // Linear search for the OSR entry instruction in the chunk. | |
| 1471 int index = -1; | |
| 1472 while (++index < instrs->length() && | |
| 1473 !instrs->at(index)->IsOsrEntry()) { | |
| 1474 } | |
| 1475 ASSERT(index < instrs->length()); | |
| 1476 LOsrEntry* instruction = LOsrEntry::cast(instrs->at(index)); | |
| 1477 | |
| 1478 LifetimePosition position = LifetimePosition::FromInstructionIndex(index); | |
| 1479 for (int i = 0; i < live_ranges()->length(); ++i) { | |
| 1480 LiveRange* range = live_ranges()->at(i); | |
| 1481 if (range != NULL) { | |
| 1482 if (range->Covers(position) && | |
| 1483 range->HasRegisterAssigned() && | |
| 1484 range->TopLevel()->HasAllocatedSpillOperand()) { | |
| 1485 int reg_index = range->assigned_register(); | |
| 1486 LOperand* spill_operand = range->TopLevel()->GetSpillOperand(); | |
| 1487 if (range->IsDouble()) { | |
| 1488 instruction->MarkSpilledDoubleRegister(reg_index, spill_operand); | |
| 1489 } else { | |
| 1490 instruction->MarkSpilledRegister(reg_index, spill_operand); | |
| 1491 } | |
| 1492 } | |
| 1493 } | |
| 1494 } | |
| 1495 } | |
| 1496 | |
| 1497 | |
| 1498 void LAllocator::AllocateGeneralRegisters() { | 1466 void LAllocator::AllocateGeneralRegisters() { |
| 1499 LAllocatorPhase phase("L_Allocate general registers", this); | 1467 LAllocatorPhase phase("L_Allocate general registers", this); |
| 1500 num_registers_ = Register::NumAllocatableRegisters(); | 1468 num_registers_ = Register::NumAllocatableRegisters(); |
| 1501 AllocateRegisters(); | 1469 AllocateRegisters(); |
| 1502 } | 1470 } |
| 1503 | 1471 |
| 1504 | 1472 |
| 1505 void LAllocator::AllocateDoubleRegisters() { | 1473 void LAllocator::AllocateDoubleRegisters() { |
| 1506 LAllocatorPhase phase("L_Allocate double registers", this); | 1474 LAllocatorPhase phase("L_Allocate double registers", this); |
| 1507 num_registers_ = DoubleRegister::NumAllocatableRegisters(); | 1475 num_registers_ = DoubleRegister::NumAllocatableRegisters(); |
| (...skipping 690 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2198 isolate()->GetHTracer()->TraceLiveRanges(name(), allocator_); | 2166 isolate()->GetHTracer()->TraceLiveRanges(name(), allocator_); |
| 2199 } | 2167 } |
| 2200 | 2168 |
| 2201 #ifdef DEBUG | 2169 #ifdef DEBUG |
| 2202 if (allocator_ != NULL) allocator_->Verify(); | 2170 if (allocator_ != NULL) allocator_->Verify(); |
| 2203 #endif | 2171 #endif |
| 2204 } | 2172 } |
| 2205 | 2173 |
| 2206 | 2174 |
| 2207 } } // namespace v8::internal | 2175 } } // namespace v8::internal |
| OLD | NEW |