Index: src/lithium.cc |
diff --git a/src/lithium.cc b/src/lithium.cc |
index 5a44fcec9992ba7ef54eb94aa04cde430b185e45..aefd8b6492c45c7af1859a10dc037a0b507cd26c 100644 |
--- a/src/lithium.cc |
+++ b/src/lithium.cc |
@@ -94,6 +94,31 @@ void LOperand::PrintTo(StringStream* stream) { |
} |
} |
+#define DEFINE_OPERAND_CACHE(name, type) \ |
+ name* name::cache = NULL; \ |
+ void name::SetUpCache() { \ |
+ if (cache) return; \ |
+ cache = new name[kNumCachedOperands]; \ |
+ for (int i = 0; i < kNumCachedOperands; i++) { \ |
+ cache[i].ConvertTo(type, i); \ |
+ } \ |
+ } \ |
+ |
+DEFINE_OPERAND_CACHE(LConstantOperand, CONSTANT_OPERAND) |
+DEFINE_OPERAND_CACHE(LStackSlot, STACK_SLOT) |
+DEFINE_OPERAND_CACHE(LDoubleStackSlot, DOUBLE_STACK_SLOT) |
+DEFINE_OPERAND_CACHE(LRegister, REGISTER) |
+DEFINE_OPERAND_CACHE(LDoubleRegister, DOUBLE_REGISTER) |
+ |
+#undef DEFINE_OPERAND_CACHE |
+ |
+void LOperand::SetUpCaches() { |
+ LConstantOperand::SetUpCache(); |
+ LStackSlot::SetUpCache(); |
+ LDoubleStackSlot::SetUpCache(); |
+ LRegister::SetUpCache(); |
+ LDoubleRegister::SetUpCache(); |
+} |
bool LParallelMove::IsRedundant() const { |
for (int i = 0; i < move_operands_.length(); ++i) { |