Commit 8157b6c9 authored by balazs.kilvady's avatar balazs.kilvady Committed by Commit bot

MIPS: [turbofan] Materialize JSFunction from frame if possible.

Port 725cdc53

Original commit message:
This reduces the overhead of recursive calls when context specialization
is enabled. Based on this it might be possible to further reduce the
overhead by also specializing the call itself.

As a drive-by-fix, port the fast context materialization optimization to
arm and arm64, that was previously only supported on x64 and ia32.

BUG=

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

Cr-Commit-Position: refs/heads/master@{#27700}
parent 63eeab12
......@@ -1138,9 +1138,24 @@ void CodeGenerator::AssembleMove(InstructionOperand* source,
case Constant::kExternalReference:
__ li(dst, Operand(src.ToExternalReference()));
break;
case Constant::kHeapObject:
__ li(dst, src.ToHeapObject());
case Constant::kHeapObject: {
Handle<HeapObject> src_object = src.ToHeapObject();
if (info()->IsOptimizing() &&
src_object.is_identical_to(info()->context())) {
// Loading the context from the frame is way cheaper than
// materializing the actual context heap object address.
__ lw(dst, MemOperand(fp, StandardFrameConstants::kContextOffset));
} else if (info()->IsOptimizing() &&
src_object.is_identical_to(info()->closure())) {
// Loading the JSFunction from the frame is way cheaper than
// materializing the actual JSFunction heap object address.
__ lw(dst,
MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
} else {
__ li(dst, src_object);
}
break;
}
case Constant::kRpoNumber:
UNREACHABLE(); // TODO(titzer): loading RPO numbers on mips.
break;
......
......@@ -1204,9 +1204,24 @@ void CodeGenerator::AssembleMove(InstructionOperand* source,
case Constant::kExternalReference:
__ li(dst, Operand(src.ToExternalReference()));
break;
case Constant::kHeapObject:
__ li(dst, src.ToHeapObject());
case Constant::kHeapObject: {
Handle<HeapObject> src_object = src.ToHeapObject();
if (info()->IsOptimizing() &&
src_object.is_identical_to(info()->context())) {
// Loading the context from the frame is way cheaper than
// materializing the actual context heap object address.
__ ld(dst, MemOperand(fp, StandardFrameConstants::kContextOffset));
} else if (info()->IsOptimizing() &&
src_object.is_identical_to(info()->closure())) {
// Loading the JSFunction from the frame is way cheaper than
// materializing the actual JSFunction heap object address.
__ ld(dst,
MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
} else {
__ li(dst, src_object);
}
break;
}
case Constant::kRpoNumber:
UNREACHABLE(); // TODO(titzer): loading RPO numbers on mips64.
break;
......
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