Index: src/register-allocator.cc |
=================================================================== |
--- src/register-allocator.cc (revision 1960) |
+++ src/register-allocator.cc (working copy) |
@@ -35,42 +35,27 @@ |
// ------------------------------------------------------------------------- |
// Result implementation. |
-Result::Result(Register reg, CodeGenerator* cgen) |
- : static_type_(), |
- type_(REGISTER), |
- cgen_(cgen) { |
- data_.reg_ = reg; |
+CodeGenerator* Result::cgen_ = NULL; |
+ |
+ |
+Result::Result(Register reg) { |
ASSERT(reg.is_valid()); |
cgen_->allocator()->Use(reg); |
+ value_ = StaticTypeField::encode(StaticType::UNKNOWN_TYPE) |
+ | TypeField::encode(REGISTER) |
+ | DataField::encode(reg.code_); |
} |
-Result::Result(Register reg, CodeGenerator* cgen, StaticType static_type) |
- : static_type_(static_type), |
- type_(REGISTER), |
- cgen_(cgen) { |
- data_.reg_ = reg; |
+Result::Result(Register reg, StaticType type) { |
ASSERT(reg.is_valid()); |
cgen_->allocator()->Use(reg); |
+ value_ = StaticTypeField::encode(type.static_type_) |
+ | TypeField::encode(REGISTER) |
+ | DataField::encode(reg.code_); |
} |
-void Result::CopyTo(Result* destination) const { |
- destination->static_type_ = static_type_; |
- destination->type_ = type(); |
- destination->cgen_ = cgen_; |
- |
- if (is_register()) { |
- destination->data_.reg_ = reg(); |
- cgen_->allocator()->Use(reg()); |
- } else if (is_constant()) { |
- destination->data_.handle_ = data_.handle_; |
- } else { |
- ASSERT(!is_valid()); |
- } |
-} |
- |
- |
// ------------------------------------------------------------------------- |
// RegisterAllocator implementation. |
@@ -80,9 +65,9 @@ |
int free_reg = registers_.ScanForFreeRegister(); |
if (free_reg < kNumRegisters) { |
Register free_result = { free_reg }; |
- return Result(free_result, cgen_); |
+ return Result(free_result); |
} |
- return Result(cgen_); |
+ return Result(); |
} |
@@ -94,7 +79,7 @@ |
Register free_reg = cgen_->frame()->SpillAnyRegister(); |
if (free_reg.is_valid()) { |
ASSERT(!is_used(free_reg)); |
- return Result(free_reg, cgen_); |
+ return Result(free_reg); |
} |
} |
return result; |
@@ -104,7 +89,7 @@ |
Result RegisterAllocator::Allocate(Register target) { |
// If the target is not referenced, it can simply be allocated. |
if (!is_used(target)) { |
- return Result(target, cgen_); |
+ return Result(target); |
} |
// If the target is only referenced in the frame, it can be spilled and |
// then allocated. |
@@ -112,10 +97,10 @@ |
if (cgen_->frame()->is_used(target) && count(target) == 1) { |
cgen_->frame()->Spill(target); |
ASSERT(!is_used(target)); |
- return Result(target, cgen_); |
+ return Result(target); |
} |
// Otherwise (if it's referenced outside the frame) we cannot allocate it. |
- return Result(cgen_); |
+ return Result(); |
} |