Index: src/compiler/bytecode-graph-builder.cc |
diff --git a/src/compiler/bytecode-graph-builder.cc b/src/compiler/bytecode-graph-builder.cc |
index 74120095a4f71b73b406133c6cccaa18fd5c143d..63fbb29b09c3c123abab873291a4ef3f735a0c39 100644 |
--- a/src/compiler/bytecode-graph-builder.cc |
+++ b/src/compiler/bytecode-graph-builder.cc |
@@ -586,6 +586,11 @@ void BytecodeGraphBuilder::VisitLdaUndefined() { |
environment()->BindAccumulator(node); |
} |
+void BytecodeGraphBuilder::VisitLdrUndefined() { |
+ Node* node = jsgraph()->UndefinedConstant(); |
+ environment()->BindRegister(bytecode_iterator().GetRegisterOperand(0), node); |
+} |
+ |
void BytecodeGraphBuilder::VisitLdaNull() { |
Node* node = jsgraph()->NullConstant(); |
environment()->BindAccumulator(node); |
@@ -623,25 +628,32 @@ void BytecodeGraphBuilder::VisitMov() { |
environment()->BindRegister(bytecode_iterator().GetRegisterOperand(1), value); |
} |
-void BytecodeGraphBuilder::BuildLoadGlobal( |
- TypeofMode typeof_mode) { |
- FrameStateBeforeAndAfter states(this); |
+Node* BytecodeGraphBuilder::BuildLoadGlobal(TypeofMode typeof_mode) { |
Handle<Name> name = |
Handle<Name>::cast(bytecode_iterator().GetConstantForIndexOperand(0)); |
VectorSlotPair feedback = |
CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(1)); |
- |
const Operator* op = javascript()->LoadGlobal(name, feedback, typeof_mode); |
- Node* node = NewNode(op, GetFunctionClosure()); |
- environment()->BindAccumulator(node, &states); |
+ return NewNode(op, GetFunctionClosure()); |
} |
void BytecodeGraphBuilder::VisitLdaGlobal() { |
- BuildLoadGlobal(TypeofMode::NOT_INSIDE_TYPEOF); |
+ FrameStateBeforeAndAfter states(this); |
+ Node* node = BuildLoadGlobal(TypeofMode::NOT_INSIDE_TYPEOF); |
+ environment()->BindAccumulator(node, &states); |
+} |
+ |
+void BytecodeGraphBuilder::VisitLdrGlobal() { |
+ FrameStateBeforeAndAfter states(this); |
+ Node* node = BuildLoadGlobal(TypeofMode::NOT_INSIDE_TYPEOF); |
+ environment()->BindRegister(bytecode_iterator().GetRegisterOperand(2), node, |
+ &states); |
} |
void BytecodeGraphBuilder::VisitLdaGlobalInsideTypeof() { |
- BuildLoadGlobal(TypeofMode::INSIDE_TYPEOF); |
+ FrameStateBeforeAndAfter states(this); |
+ Node* node = BuildLoadGlobal(TypeofMode::INSIDE_TYPEOF); |
+ environment()->BindAccumulator(node, &states); |
} |
void BytecodeGraphBuilder::BuildStoreGlobal(LanguageMode language_mode) { |
@@ -665,7 +677,7 @@ void BytecodeGraphBuilder::VisitStaGlobalStrict() { |
BuildStoreGlobal(LanguageMode::STRICT); |
} |
-void BytecodeGraphBuilder::VisitLdaContextSlot() { |
+Node* BytecodeGraphBuilder::BuildLoadContextSlot() { |
// TODO(mythria): LoadContextSlots are unrolled by the required depth when |
// generating bytecode. Hence the value of depth is always 0. Update this |
// code, when the implementation changes. |
@@ -676,10 +688,19 @@ void BytecodeGraphBuilder::VisitLdaContextSlot() { |
0, bytecode_iterator().GetIndexOperand(1), false); |
Node* context = |
environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0)); |
- Node* node = NewNode(op, context); |
+ return NewNode(op, context); |
+} |
+ |
+void BytecodeGraphBuilder::VisitLdaContextSlot() { |
+ Node* node = BuildLoadContextSlot(); |
environment()->BindAccumulator(node); |
} |
+void BytecodeGraphBuilder::VisitLdrContextSlot() { |
+ Node* node = BuildLoadContextSlot(); |
+ environment()->BindRegister(bytecode_iterator().GetRegisterOperand(2), node); |
+} |
+ |
void BytecodeGraphBuilder::VisitStaContextSlot() { |
// TODO(mythria): LoadContextSlots are unrolled by the required depth when |
// generating bytecode. Hence the value of depth is always 0. Update this |
@@ -732,8 +753,7 @@ void BytecodeGraphBuilder::VisitStaLookupSlotStrict() { |
BuildStaLookupSlot(LanguageMode::STRICT); |
} |
-void BytecodeGraphBuilder::BuildNamedLoad() { |
- FrameStateBeforeAndAfter states(this); |
+Node* BytecodeGraphBuilder::BuildNamedLoad() { |
Node* object = |
environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0)); |
Handle<Name> name = |
@@ -742,14 +762,23 @@ void BytecodeGraphBuilder::BuildNamedLoad() { |
CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(2)); |
const Operator* op = javascript()->LoadNamed(name, feedback); |
- Node* node = NewNode(op, object, GetFunctionClosure()); |
- environment()->BindAccumulator(node, &states); |
+ return NewNode(op, object, GetFunctionClosure()); |
} |
-void BytecodeGraphBuilder::VisitLoadIC() { BuildNamedLoad(); } |
+void BytecodeGraphBuilder::VisitLoadIC() { |
+ FrameStateBeforeAndAfter states(this); |
+ Node* node = BuildNamedLoad(); |
+ environment()->BindAccumulator(node, &states); |
+} |
-void BytecodeGraphBuilder::BuildKeyedLoad() { |
+void BytecodeGraphBuilder::VisitLdrNamedProperty() { |
FrameStateBeforeAndAfter states(this); |
+ Node* node = BuildNamedLoad(); |
+ environment()->BindRegister(bytecode_iterator().GetRegisterOperand(3), node, |
+ &states); |
+} |
+ |
+Node* BytecodeGraphBuilder::BuildKeyedLoad() { |
Node* key = environment()->LookupAccumulator(); |
Node* object = |
environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0)); |
@@ -757,11 +786,21 @@ void BytecodeGraphBuilder::BuildKeyedLoad() { |
CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(1)); |
const Operator* op = javascript()->LoadProperty(feedback); |
- Node* node = NewNode(op, object, key, GetFunctionClosure()); |
+ return NewNode(op, object, key, GetFunctionClosure()); |
+} |
+ |
+void BytecodeGraphBuilder::VisitKeyedLoadIC() { |
+ FrameStateBeforeAndAfter states(this); |
+ Node* node = BuildKeyedLoad(); |
environment()->BindAccumulator(node, &states); |
} |
-void BytecodeGraphBuilder::VisitKeyedLoadIC() { BuildKeyedLoad(); } |
+void BytecodeGraphBuilder::VisitLdrKeyedProperty() { |
+ FrameStateBeforeAndAfter states(this); |
+ Node* node = BuildKeyedLoad(); |
+ environment()->BindRegister(bytecode_iterator().GetRegisterOperand(2), node, |
+ &states); |
+} |
void BytecodeGraphBuilder::BuildNamedStore(LanguageMode language_mode) { |
FrameStateBeforeAndAfter states(this); |