Commit 293428ee authored by plind44@gmail.com's avatar plind44@gmail.com

MIPS: Preliminary support for block contexts in hydrogen.

Port r21684 (ea35030)

Original commit message:
Patch from Steven Keuchel <keuchel@chromium.org>

BUG=v8:2198
LOG=N
TEST=mjsunit/harmony/block-let-crankshaft.js
R=plind44@gmail.com

Review URL: https://codereview.chromium.org/313183007

Patch from Balazs Kilvady <kilvadyb@homejinni.com>.

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21701 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 335a3a53
...@@ -5874,6 +5874,21 @@ void LCodeGen::DoLoadFieldByIndex(LLoadFieldByIndex* instr) { ...@@ -5874,6 +5874,21 @@ void LCodeGen::DoLoadFieldByIndex(LLoadFieldByIndex* instr) {
} }
void LCodeGen::DoStoreFrameContext(LStoreFrameContext* instr) {
Register context = ToRegister(instr->context());
__ sw(context, MemOperand(fp, StandardFrameConstants::kContextOffset));
}
void LCodeGen::DoAllocateBlockContext(LAllocateBlockContext* instr) {
Handle<ScopeInfo> scope_info = instr->scope_info();
__ li(at, scope_info);
__ Push(at, ToRegister(instr->function()));
CallRuntime(Runtime::kHiddenPushBlockContext, 2, instr);
RecordSafepoint(Safepoint::kNoLazyDeopt);
}
#undef __ #undef __
} } // namespace v8::internal } } // namespace v8::internal
...@@ -2526,4 +2526,20 @@ LInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) { ...@@ -2526,4 +2526,20 @@ LInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) {
} }
LInstruction* LChunkBuilder::DoStoreFrameContext(HStoreFrameContext* instr) {
LOperand* context = UseRegisterAtStart(instr->context());
return new(zone()) LStoreFrameContext(context);
}
LInstruction* LChunkBuilder::DoAllocateBlockContext(
HAllocateBlockContext* instr) {
LOperand* context = UseFixed(instr->context(), cp);
LOperand* function = UseRegisterAtStart(instr->function());
LAllocateBlockContext* result =
new(zone()) LAllocateBlockContext(context, function);
return MarkAsCall(DefineFixed(result, cp), instr);
}
} } // namespace v8::internal } } // namespace v8::internal
...@@ -21,6 +21,7 @@ class LCodeGen; ...@@ -21,6 +21,7 @@ class LCodeGen;
V(AccessArgumentsAt) \ V(AccessArgumentsAt) \
V(AddI) \ V(AddI) \
V(Allocate) \ V(Allocate) \
V(AllocateBlockContext) \
V(ApplyArguments) \ V(ApplyArguments) \
V(ArgumentsElements) \ V(ArgumentsElements) \
V(ArgumentsLength) \ V(ArgumentsLength) \
...@@ -138,6 +139,7 @@ class LCodeGen; ...@@ -138,6 +139,7 @@ class LCodeGen;
V(StackCheck) \ V(StackCheck) \
V(StoreCodeEntry) \ V(StoreCodeEntry) \
V(StoreContextSlot) \ V(StoreContextSlot) \
V(StoreFrameContext) \
V(StoreGlobalCell) \ V(StoreGlobalCell) \
V(StoreKeyed) \ V(StoreKeyed) \
V(StoreKeyedGeneric) \ V(StoreKeyedGeneric) \
...@@ -2626,6 +2628,35 @@ class LLoadFieldByIndex V8_FINAL : public LTemplateInstruction<1, 2, 0> { ...@@ -2626,6 +2628,35 @@ class LLoadFieldByIndex V8_FINAL : public LTemplateInstruction<1, 2, 0> {
}; };
class LStoreFrameContext: public LTemplateInstruction<0, 1, 0> {
public:
explicit LStoreFrameContext(LOperand* context) {
inputs_[0] = context;
}
LOperand* context() { return inputs_[0]; }
DECLARE_CONCRETE_INSTRUCTION(StoreFrameContext, "store-frame-context")
};
class LAllocateBlockContext: public LTemplateInstruction<1, 2, 0> {
public:
LAllocateBlockContext(LOperand* context, LOperand* function) {
inputs_[0] = context;
inputs_[1] = function;
}
LOperand* context() { return inputs_[0]; }
LOperand* function() { return inputs_[1]; }
Handle<ScopeInfo> scope_info() { return hydrogen()->scope_info(); }
DECLARE_CONCRETE_INSTRUCTION(AllocateBlockContext, "allocate-block-context")
DECLARE_HYDROGEN_ACCESSOR(AllocateBlockContext)
};
class LChunkBuilder; class LChunkBuilder;
class LPlatformChunk V8_FINAL : public LChunk { class LPlatformChunk V8_FINAL : public LChunk {
public: public:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment