Index: src/lithium-allocator.h |
diff --git a/src/lithium-allocator.h b/src/lithium-allocator.h |
index 3ec984e262f9e397801f98bbfcb11430d2b3f4b1..5587961f2043a6e4dd10055c05dfc8de7d10e272 100644 |
--- a/src/lithium-allocator.h |
+++ b/src/lithium-allocator.h |
@@ -30,6 +30,7 @@ |
#include "v8.h" |
+#include "data-flow.h" |
#include "zone.h" |
namespace v8 { |
@@ -754,6 +755,40 @@ class LiveRange: public ZoneObject { |
}; |
+class FlexibleBitVector BASE_EMBEDDED { |
Kevin Millikin (Chromium)
2011/01/03 16:44:46
Maybe GrowableBitVector is more descriptive? It n
|
+ public: |
+ FlexibleBitVector() : bits_(NULL) { } |
+ |
+ bool Contains(int value) const { |
Kevin Millikin (Chromium)
2011/01/03 16:44:46
Maybe it's too cute, but you could make this class
|
+ if (!InBitsRange(value)) return false; |
+ return bits_->Contains(value); |
+ } |
+ |
+ void Add(int value) { |
+ EnsureCapacity(value); |
+ bits_->Add(value); |
+ } |
+ |
+ private: |
+ static const int kInitialLength = 1024; |
Kevin Millikin (Chromium)
2011/01/03 16:44:46
This seems like a big initial length.
|
+ |
+ bool InBitsRange(int value) const { |
+ return bits_ != NULL && bits_->length() > value; |
+ } |
+ |
+ void EnsureCapacity(int value) { |
+ if (InBitsRange(value)) return; |
+ int new_length = bits_ == NULL ? kInitialLength : bits_->length(); |
+ while (new_length <= value) new_length *= 2; |
+ BitVector* new_bits = new BitVector(new_length); |
+ if (bits_ != NULL) new_bits->CopyFrom(*bits_); |
+ bits_ = new_bits; |
+ } |
+ |
+ BitVector* bits_; |
+}; |
+ |
+ |
class LAllocator BASE_EMBEDDED { |
public: |
explicit LAllocator(int first_virtual_register, HGraph* graph) |
@@ -972,6 +1007,8 @@ class LAllocator BASE_EMBEDDED { |
// Next virtual register number to be assigned to temporaries. |
int next_virtual_register_; |
+ int first_artificial_register_; |
Kevin Millikin (Chromium)
2011/01/03 16:44:46
I'd be more comfortable with an initial value, eve
|
+ FlexibleBitVector double_artificial_registers_; |
RegisterKind mode_; |
int num_registers_; |