| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/bit-vector.h" | 5 #include "src/bit-vector.h" |
| 6 #include "src/compiler/instruction.h" | 6 #include "src/compiler/instruction.h" |
| 7 #include "src/compiler/register-allocator-verifier.h" | 7 #include "src/compiler/register-allocator-verifier.h" |
| 8 | 8 |
| 9 namespace v8 { | 9 namespace v8 { |
| 10 namespace internal { | 10 namespace internal { |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 } | 112 } |
| 113 } | 113 } |
| 114 | 114 |
| 115 | 115 |
| 116 void RegisterAllocatorVerifier::BuildConstraint(const InstructionOperand* op, | 116 void RegisterAllocatorVerifier::BuildConstraint(const InstructionOperand* op, |
| 117 OperandConstraint* constraint) { | 117 OperandConstraint* constraint) { |
| 118 constraint->value_ = kMinInt; | 118 constraint->value_ = kMinInt; |
| 119 constraint->virtual_register_ = InstructionOperand::kInvalidVirtualRegister; | 119 constraint->virtual_register_ = InstructionOperand::kInvalidVirtualRegister; |
| 120 if (op->IsConstant()) { | 120 if (op->IsConstant()) { |
| 121 constraint->type_ = kConstant; | 121 constraint->type_ = kConstant; |
| 122 constraint->value_ = ConstantOperand::cast(op)->index(); | 122 constraint->value_ = ConstantOperand::cast(op)->virtual_register(); |
| 123 constraint->virtual_register_ = constraint->value_; | 123 constraint->virtual_register_ = constraint->value_; |
| 124 } else if (op->IsImmediate()) { | 124 } else if (op->IsImmediate()) { |
| 125 constraint->type_ = kImmediate; | 125 constraint->type_ = kImmediate; |
| 126 constraint->value_ = ImmediateOperand::cast(op)->index(); | 126 constraint->value_ = ImmediateOperand::cast(op)->index(); |
| 127 } else { | 127 } else { |
| 128 CHECK(op->IsUnallocated()); | 128 CHECK(op->IsUnallocated()); |
| 129 const auto* unallocated = UnallocatedOperand::cast(op); | 129 const auto* unallocated = UnallocatedOperand::cast(op); |
| 130 int vreg = unallocated->virtual_register(); | 130 int vreg = unallocated->virtual_register(); |
| 131 constraint->virtual_register_ = vreg; | 131 constraint->virtual_register_ = vreg; |
| 132 if (unallocated->basic_policy() == UnallocatedOperand::FIXED_SLOT) { | 132 if (unallocated->basic_policy() == UnallocatedOperand::FIXED_SLOT) { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 173 } | 173 } |
| 174 } | 174 } |
| 175 } | 175 } |
| 176 | 176 |
| 177 | 177 |
| 178 void RegisterAllocatorVerifier::CheckConstraint( | 178 void RegisterAllocatorVerifier::CheckConstraint( |
| 179 const InstructionOperand* op, const OperandConstraint* constraint) { | 179 const InstructionOperand* op, const OperandConstraint* constraint) { |
| 180 switch (constraint->type_) { | 180 switch (constraint->type_) { |
| 181 case kConstant: | 181 case kConstant: |
| 182 CHECK(op->IsConstant()); | 182 CHECK(op->IsConstant()); |
| 183 CHECK_EQ(op->index(), constraint->value_); | 183 CHECK_EQ(ConstantOperand::cast(op)->virtual_register(), |
| 184 constraint->value_); |
| 184 return; | 185 return; |
| 185 case kImmediate: | 186 case kImmediate: |
| 186 CHECK(op->IsImmediate()); | 187 CHECK(op->IsImmediate()); |
| 187 CHECK_EQ(op->index(), constraint->value_); | 188 CHECK_EQ(ImmediateOperand::cast(op)->index(), constraint->value_); |
| 188 return; | 189 return; |
| 189 case kRegister: | 190 case kRegister: |
| 190 CHECK(op->IsRegister()); | 191 CHECK(op->IsRegister()); |
| 191 return; | 192 return; |
| 192 case kFixedRegister: | 193 case kFixedRegister: |
| 193 CHECK(op->IsRegister()); | 194 CHECK(op->IsRegister()); |
| 194 CHECK_EQ(op->index(), constraint->value_); | 195 CHECK_EQ(RegisterOperand::cast(op)->index(), constraint->value_); |
| 195 return; | 196 return; |
| 196 case kDoubleRegister: | 197 case kDoubleRegister: |
| 197 CHECK(op->IsDoubleRegister()); | 198 CHECK(op->IsDoubleRegister()); |
| 198 return; | 199 return; |
| 199 case kFixedDoubleRegister: | 200 case kFixedDoubleRegister: |
| 200 CHECK(op->IsDoubleRegister()); | 201 CHECK(op->IsDoubleRegister()); |
| 201 CHECK_EQ(op->index(), constraint->value_); | 202 CHECK_EQ(DoubleRegisterOperand::cast(op)->index(), constraint->value_); |
| 202 return; | 203 return; |
| 203 case kFixedSlot: | 204 case kFixedSlot: |
| 204 CHECK(op->IsStackSlot()); | 205 CHECK(op->IsStackSlot()); |
| 205 CHECK_EQ(op->index(), constraint->value_); | 206 CHECK_EQ(StackSlotOperand::cast(op)->index(), constraint->value_); |
| 206 return; | 207 return; |
| 207 case kSlot: | 208 case kSlot: |
| 208 CHECK(op->IsStackSlot()); | 209 CHECK(op->IsStackSlot()); |
| 209 return; | 210 return; |
| 210 case kDoubleSlot: | 211 case kDoubleSlot: |
| 211 CHECK(op->IsDoubleStackSlot()); | 212 CHECK(op->IsDoubleStackSlot()); |
| 212 return; | 213 return; |
| 213 case kNone: | 214 case kNone: |
| 214 CHECK(op->IsRegister() || op->IsStackSlot()); | 215 CHECK(op->IsRegister() || op->IsStackSlot()); |
| 215 return; | 216 return; |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 336 } | 337 } |
| 337 } | 338 } |
| 338 | 339 |
| 339 void Drop(const InstructionOperand* op) { | 340 void Drop(const InstructionOperand* op) { |
| 340 auto it = map().find(op); | 341 auto it = map().find(op); |
| 341 if (it != map().end()) map().erase(it); | 342 if (it != map().end()) map().erase(it); |
| 342 } | 343 } |
| 343 | 344 |
| 344 void DropRegisters(const RegisterConfiguration* config) { | 345 void DropRegisters(const RegisterConfiguration* config) { |
| 345 for (int i = 0; i < config->num_general_registers(); ++i) { | 346 for (int i = 0; i < config->num_general_registers(); ++i) { |
| 346 InstructionOperand op(InstructionOperand::REGISTER, i); | 347 RegisterOperand op(i); |
| 347 Drop(&op); | 348 Drop(&op); |
| 348 } | 349 } |
| 349 for (int i = 0; i < config->num_double_registers(); ++i) { | 350 for (int i = 0; i < config->num_double_registers(); ++i) { |
| 350 InstructionOperand op(InstructionOperand::DOUBLE_REGISTER, i); | 351 DoubleRegisterOperand op(i); |
| 351 Drop(&op); | 352 Drop(&op); |
| 352 } | 353 } |
| 353 } | 354 } |
| 354 | 355 |
| 355 void Define(Zone* zone, const InstructionOperand* op, int virtual_register) { | 356 void Define(Zone* zone, const InstructionOperand* op, int virtual_register) { |
| 356 auto value = new (zone) MapValue(); | 357 auto value = new (zone) MapValue(); |
| 357 value->define_vreg = virtual_register; | 358 value->define_vreg = virtual_register; |
| 358 auto res = map().insert(std::make_pair(op, value)); | 359 auto res = map().insert(std::make_pair(op, value)); |
| 359 if (!res.second) res.first->second = value; | 360 if (!res.second) res.first->second = value; |
| 360 } | 361 } |
| (...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 669 int virtual_register = op_constraints[count].virtual_register_; | 670 int virtual_register = op_constraints[count].virtual_register_; |
| 670 current->Define(zone(), instr->OutputAt(i), virtual_register); | 671 current->Define(zone(), instr->OutputAt(i), virtual_register); |
| 671 } | 672 } |
| 672 } | 673 } |
| 673 } | 674 } |
| 674 } | 675 } |
| 675 | 676 |
| 676 } // namespace compiler | 677 } // namespace compiler |
| 677 } // namespace internal | 678 } // namespace internal |
| 678 } // namespace v8 | 679 } // namespace v8 |
| OLD | NEW |