Index: src/interpreter/bytecode-array-builder.cc |
diff --git a/src/interpreter/bytecode-array-builder.cc b/src/interpreter/bytecode-array-builder.cc |
index 225c96cdc9c5c9d4460c988d5dd650c8f0c81751..c0de7c0bb1303f76f4cbb893d55efdd497a4b2df 100644 |
--- a/src/interpreter/bytecode-array-builder.cc |
+++ b/src/interpreter/bytecode-array-builder.cc |
@@ -288,6 +288,13 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::LoadAccumulatorWithRegister( |
BytecodeArrayBuilder& BytecodeArrayBuilder::StoreAccumulatorInRegister( |
Register reg) { |
+ // TODO(oth): Avoid storing the accumulator in the register if the |
+ // previous bytecode loaded the accumulator with the same register. |
+ // |
+ // TODO(oth): If the previous bytecode is a MOV into this register, |
+ // the previous instruction can be removed. The logic for determining |
+ // these redundant MOVs appears complex. |
+ Output(Bytecode::kStar, reg.ToOperand()); |
if (!IsRegisterInAccumulator(reg)) { |
Output(Bytecode::kStar, reg.ToOperand()); |
} |
@@ -295,6 +302,14 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::StoreAccumulatorInRegister( |
} |
+BytecodeArrayBuilder& BytecodeArrayBuilder::MoveRegister(Register from, |
+ Register to) { |
+ DCHECK(from != to); |
+ Output(Bytecode::kMov, from.ToOperand(), to.ToOperand()); |
+ return *this; |
+} |
+ |
+ |
BytecodeArrayBuilder& BytecodeArrayBuilder::LoadGlobal( |
size_t name_index, int feedback_slot, LanguageMode language_mode, |
TypeofMode typeof_mode) { |