Chromium Code Reviews| Index: src/lithium.h |
| diff --git a/src/lithium.h b/src/lithium.h |
| index 4987b5a4cd2dc12b9c6f3a4e4c8f95e782314cf1..d031e8781354fc83ef4588b394c41cedd19df317 100644 |
| --- a/src/lithium.h |
| +++ b/src/lithium.h |
| @@ -30,6 +30,7 @@ |
| #include "allocation.h" |
| #include "hydrogen.h" |
| +#include "once.h" |
| #include "safepoint-table.h" |
| namespace v8 { |
| @@ -76,6 +77,15 @@ class LOperand: public ZoneObject { |
| LOperand(Kind kind, int index) { ConvertTo(kind, index); } |
| unsigned value_; |
| + |
| + // Function used by subclasses to populate their cache. |
| + template <typename T, int Size, LOperand::Kind _Kind> |
| + static void InitCache(T** cache) { |
| + *cache = new T[Size]; |
| + for (int i = 0; i < Size; i++) { |
| + (*cache)[i].ConvertTo(_Kind, i); |
| + } |
| + } |
| }; |
| @@ -246,11 +256,11 @@ class LMoveOperands BASE_EMBEDDED { |
| LOperand* destination_; |
| }; |
|
fschneider
2012/02/28 16:54:48
Accidental edit?
|
| - |
| class LConstantOperand: public LOperand { |
| public: |
| static LConstantOperand* Create(int index) { |
| ASSERT(index >= 0); |
| + SetUpCache(); |
|
fschneider
2012/02/28 16:54:48
Creation of LOperand is a really frequent operatio
Philippe
2012/02/29 10:24:45
Done.
|
| if (index < kNumCachedOperands) return &cache[index]; |
| return new LConstantOperand(index); |
| } |
| @@ -264,10 +274,15 @@ class LConstantOperand: public LOperand { |
| private: |
| static const int kNumCachedOperands = 128; |
| - static LConstantOperand cache[]; |
| + static LConstantOperand* cache; |
| + static OnceType init_cache_once_; |
| LConstantOperand() : LOperand() { } |
| explicit LConstantOperand(int index) : LOperand(CONSTANT_OPERAND, index) { } |
| + |
| + friend void LOperand::InitCache< |
| + LConstantOperand, kNumCachedOperands, CONSTANT_OPERAND>( |
| + LConstantOperand** cache); |
| }; |
| @@ -286,6 +301,7 @@ class LStackSlot: public LOperand { |
| public: |
| static LStackSlot* Create(int index) { |
| ASSERT(index >= 0); |
| + SetUpCache(); |
| if (index < kNumCachedOperands) return &cache[index]; |
| return new LStackSlot(index); |
| } |
| @@ -299,10 +315,14 @@ class LStackSlot: public LOperand { |
| private: |
| static const int kNumCachedOperands = 128; |
| - static LStackSlot cache[]; |
| + static LStackSlot* cache; |
| + static OnceType init_cache_once_; |
| LStackSlot() : LOperand() { } |
| explicit LStackSlot(int index) : LOperand(STACK_SLOT, index) { } |
| + |
| + friend void LOperand::InitCache<LStackSlot, kNumCachedOperands, STACK_SLOT>( |
| + LStackSlot** cache); |
| }; |
| @@ -310,6 +330,7 @@ class LDoubleStackSlot: public LOperand { |
| public: |
| static LDoubleStackSlot* Create(int index) { |
| ASSERT(index >= 0); |
| + SetUpCache(); |
| if (index < kNumCachedOperands) return &cache[index]; |
| return new LDoubleStackSlot(index); |
| } |
| @@ -323,10 +344,15 @@ class LDoubleStackSlot: public LOperand { |
| private: |
| static const int kNumCachedOperands = 128; |
| - static LDoubleStackSlot cache[]; |
| + static LDoubleStackSlot* cache; |
| + static OnceType init_cache_once_; |
| LDoubleStackSlot() : LOperand() { } |
| explicit LDoubleStackSlot(int index) : LOperand(DOUBLE_STACK_SLOT, index) { } |
| + |
| + friend void LOperand::InitCache< |
| + LDoubleStackSlot, kNumCachedOperands, DOUBLE_STACK_SLOT>( |
| + LDoubleStackSlot** cache); |
| }; |
| @@ -334,6 +360,7 @@ class LRegister: public LOperand { |
| public: |
| static LRegister* Create(int index) { |
| ASSERT(index >= 0); |
| + SetUpCache(); |
| if (index < kNumCachedOperands) return &cache[index]; |
| return new LRegister(index); |
| } |
| @@ -347,10 +374,14 @@ class LRegister: public LOperand { |
| private: |
| static const int kNumCachedOperands = 16; |
| - static LRegister cache[]; |
| + static LRegister* cache; |
| + static OnceType init_cache_once_; |
| LRegister() : LOperand() { } |
| explicit LRegister(int index) : LOperand(REGISTER, index) { } |
| + |
| + friend void LOperand::InitCache<LRegister, kNumCachedOperands, REGISTER>( |
| + LRegister** cache); |
| }; |
| @@ -358,6 +389,7 @@ class LDoubleRegister: public LOperand { |
| public: |
| static LDoubleRegister* Create(int index) { |
| ASSERT(index >= 0); |
| + SetUpCache(); |
| if (index < kNumCachedOperands) return &cache[index]; |
| return new LDoubleRegister(index); |
| } |
| @@ -371,10 +403,15 @@ class LDoubleRegister: public LOperand { |
| private: |
| static const int kNumCachedOperands = 16; |
| - static LDoubleRegister cache[]; |
| + static LDoubleRegister* cache; |
| + static OnceType init_cache_once_; |
| LDoubleRegister() : LOperand() { } |
| explicit LDoubleRegister(int index) : LOperand(DOUBLE_REGISTER, index) { } |
| + |
| + friend void LOperand::InitCache< |
| + LDoubleRegister, kNumCachedOperands, DOUBLE_REGISTER>( |
| + LDoubleRegister** cache); |
| }; |