Commit 833618d9 authored by bmeurer's avatar bmeurer Committed by Commit bot

[full-codegen] Reload context register after intrinsic call.

Previously all code stubs (i.e. both platform and Crankshaft code stubs)
preserved the context register for full-codegen (neither Ignition, nor
TurboFan nor Crankshaft require this or would benefit from this), but
the newly introduced TurboFanCodeStubs no longer do this and there's no
need to, so we have to make sure in full-codegen that we restore the
context register after intrinsic calls, which potentially call
TurboFanCodeStubs.

Drive-by-fix: VisitThisFunction can be made platform independent.

R=verwaest@chromium.org

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

Cr-Commit-Position: refs/heads/master@{#35154}
parent f2a58593
......@@ -3927,12 +3927,6 @@ void FullCodeGenerator::EmitLiteralCompareNil(CompareOperation* expr,
}
void FullCodeGenerator::VisitThisFunction(ThisFunction* expr) {
__ ldr(r0, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
context()->Plug(r0);
}
Register FullCodeGenerator::result_register() {
return r0;
}
......@@ -3942,6 +3936,10 @@ Register FullCodeGenerator::context_register() {
return cp;
}
void FullCodeGenerator::LoadFromFrameField(int frame_offset, Register value) {
DCHECK_EQ(POINTER_SIZE_ALIGN(frame_offset), frame_offset);
__ ldr(value, MemOperand(fp, frame_offset));
}
void FullCodeGenerator::StoreToFrameField(int frame_offset, Register value) {
DCHECK_EQ(POINTER_SIZE_ALIGN(frame_offset), frame_offset);
......
......@@ -3749,12 +3749,6 @@ void FullCodeGenerator::EmitLiteralCompareNil(CompareOperation* expr,
}
void FullCodeGenerator::VisitThisFunction(ThisFunction* expr) {
__ Ldr(x0, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
context()->Plug(x0);
}
void FullCodeGenerator::VisitYield(Yield* expr) {
Comment cmnt(masm_, "[ Yield");
SetExpressionPosition(expr);
......@@ -3995,6 +3989,10 @@ Register FullCodeGenerator::context_register() {
return cp;
}
void FullCodeGenerator::LoadFromFrameField(int frame_offset, Register value) {
DCHECK(POINTER_SIZE_ALIGN(frame_offset) == frame_offset);
__ Ldr(value, MemOperand(fp, frame_offset));
}
void FullCodeGenerator::StoreToFrameField(int frame_offset, Register value) {
DCHECK(POINTER_SIZE_ALIGN(frame_offset) == frame_offset);
......
......@@ -4,8 +4,8 @@
#include "src/full-codegen/full-codegen.h"
#include "src/ast/ast.h"
#include "src/ast/ast-numbering.h"
#include "src/ast/ast.h"
#include "src/ast/prettyprinter.h"
#include "src/ast/scopeinfo.h"
#include "src/ast/scopes.h"
......@@ -14,6 +14,7 @@
#include "src/compiler.h"
#include "src/debug/debug.h"
#include "src/debug/liveedit.h"
#include "src/frames-inl.h"
#include "src/isolate-inl.h"
#include "src/macro-assembler.h"
#include "src/snapshot/snapshot.h"
......@@ -559,6 +560,11 @@ void FullCodeGenerator::EmitIntrinsicAsStubCall(CallRuntime* expr,
}
}
__ Call(callable.code(), RelocInfo::CODE_TARGET);
// Reload the context register after the call as i.e. TurboFan code stubs
// won't preserve the context register.
LoadFromFrameField(StandardFrameConstants::kContextOffset,
context_register());
context()->Plug(result_register());
}
......@@ -1269,6 +1275,11 @@ void FullCodeGenerator::VisitForOfStatement(ForOfStatement* stmt) {
decrement_loop_depth();
}
void FullCodeGenerator::VisitThisFunction(ThisFunction* expr) {
LoadFromFrameField(JavaScriptFrameConstants::kFunctionOffset,
result_register());
context()->Plug(result_register());
}
void FullCodeGenerator::VisitTryCatchStatement(TryCatchStatement* stmt) {
Comment cmnt(masm_, "[ TryCatchStatement");
......
......@@ -719,6 +719,9 @@ class FullCodeGenerator: public AstVisitor {
static Register context_register();
// Get fields from the stack frame. Offsets are the frame pointer relative
// offsets defined in, e.g., StandardFrameConstants.
void LoadFromFrameField(int frame_offset, Register value);
// Set fields in the stack frame. Offsets are the frame pointer relative
// offsets defined in, e.g., StandardFrameConstants.
void StoreToFrameField(int frame_offset, Register value);
......
......@@ -3825,12 +3825,6 @@ void FullCodeGenerator::EmitLiteralCompareNil(CompareOperation* expr,
}
void FullCodeGenerator::VisitThisFunction(ThisFunction* expr) {
__ mov(eax, Operand(ebp, JavaScriptFrameConstants::kFunctionOffset));
context()->Plug(eax);
}
Register FullCodeGenerator::result_register() {
return eax;
}
......@@ -3840,6 +3834,10 @@ Register FullCodeGenerator::context_register() {
return esi;
}
void FullCodeGenerator::LoadFromFrameField(int frame_offset, Register value) {
DCHECK_EQ(POINTER_SIZE_ALIGN(frame_offset), frame_offset);
__ mov(value, Operand(ebp, frame_offset));
}
void FullCodeGenerator::StoreToFrameField(int frame_offset, Register value) {
DCHECK_EQ(POINTER_SIZE_ALIGN(frame_offset), frame_offset);
......
......@@ -3938,12 +3938,6 @@ void FullCodeGenerator::EmitLiteralCompareNil(CompareOperation* expr,
}
void FullCodeGenerator::VisitThisFunction(ThisFunction* expr) {
__ lw(v0, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
context()->Plug(v0);
}
Register FullCodeGenerator::result_register() {
return v0;
}
......@@ -3953,6 +3947,10 @@ Register FullCodeGenerator::context_register() {
return cp;
}
void FullCodeGenerator::LoadFromFrameField(int frame_offset, Register value) {
DCHECK_EQ(POINTER_SIZE_ALIGN(frame_offset), frame_offset);
__ lw(value, MemOperand(fp, frame_offset));
}
void FullCodeGenerator::StoreToFrameField(int frame_offset, Register value) {
DCHECK_EQ(POINTER_SIZE_ALIGN(frame_offset), frame_offset);
......
......@@ -3941,12 +3941,6 @@ void FullCodeGenerator::EmitLiteralCompareNil(CompareOperation* expr,
}
void FullCodeGenerator::VisitThisFunction(ThisFunction* expr) {
__ ld(v0, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
context()->Plug(v0);
}
Register FullCodeGenerator::result_register() {
return v0;
}
......@@ -3956,6 +3950,12 @@ Register FullCodeGenerator::context_register() {
return cp;
}
void FullCodeGenerator::LoadFromFrameField(int frame_offset, Register value) {
// DCHECK_EQ(POINTER_SIZE_ALIGN(frame_offset), frame_offset);
DCHECK(IsAligned(frame_offset, kPointerSize));
// __ sw(value, MemOperand(fp, frame_offset));
__ ld(value, MemOperand(fp, frame_offset));
}
void FullCodeGenerator::StoreToFrameField(int frame_offset, Register value) {
// DCHECK_EQ(POINTER_SIZE_ALIGN(frame_offset), frame_offset);
......
......@@ -3918,17 +3918,15 @@ void FullCodeGenerator::EmitLiteralCompareNil(CompareOperation* expr,
}
void FullCodeGenerator::VisitThisFunction(ThisFunction* expr) {
__ LoadP(r3, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
context()->Plug(r3);
}
Register FullCodeGenerator::result_register() { return r3; }
Register FullCodeGenerator::context_register() { return cp; }
void FullCodeGenerator::LoadFromFrameField(int frame_offset, Register value) {
DCHECK_EQ(static_cast<int>(POINTER_SIZE_ALIGN(frame_offset)), frame_offset);
__ LoadP(value, MemOperand(fp, frame_offset), r0);
}
void FullCodeGenerator::StoreToFrameField(int frame_offset, Register value) {
DCHECK_EQ(static_cast<int>(POINTER_SIZE_ALIGN(frame_offset)), frame_offset);
......
......@@ -3815,16 +3815,15 @@ void FullCodeGenerator::EmitLiteralCompareNil(CompareOperation* expr,
}
context()->Plug(if_true, if_false);
}
void FullCodeGenerator::VisitThisFunction(ThisFunction* expr) {
__ LoadP(r2, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
context()->Plug(r2);
}
Register FullCodeGenerator::result_register() { return r2; }
Register FullCodeGenerator::context_register() { return cp; }
void FullCodeGenerator::LoadFromFrameField(int frame_offset, Register value) {
DCHECK_EQ(static_cast<int>(POINTER_SIZE_ALIGN(frame_offset)), frame_offset);
__ LoadP(value, MemOperand(fp, frame_offset));
}
void FullCodeGenerator::StoreToFrameField(int frame_offset, Register value) {
DCHECK_EQ(static_cast<int>(POINTER_SIZE_ALIGN(frame_offset)), frame_offset);
__ StoreP(value, MemOperand(fp, frame_offset));
......
......@@ -3810,12 +3810,6 @@ void FullCodeGenerator::EmitLiteralCompareNil(CompareOperation* expr,
}
void FullCodeGenerator::VisitThisFunction(ThisFunction* expr) {
__ movp(rax, Operand(rbp, JavaScriptFrameConstants::kFunctionOffset));
context()->Plug(rax);
}
Register FullCodeGenerator::result_register() {
return rax;
}
......@@ -3825,6 +3819,10 @@ Register FullCodeGenerator::context_register() {
return rsi;
}
void FullCodeGenerator::LoadFromFrameField(int frame_offset, Register value) {
DCHECK(IsAligned(frame_offset, kPointerSize));
__ movp(value, Operand(rbp, frame_offset));
}
void FullCodeGenerator::StoreToFrameField(int frame_offset, Register value) {
DCHECK(IsAligned(frame_offset, kPointerSize));
......
......@@ -3817,12 +3817,6 @@ void FullCodeGenerator::EmitLiteralCompareNil(CompareOperation* expr,
}
void FullCodeGenerator::VisitThisFunction(ThisFunction* expr) {
__ mov(eax, Operand(ebp, JavaScriptFrameConstants::kFunctionOffset));
context()->Plug(eax);
}
Register FullCodeGenerator::result_register() {
return eax;
}
......@@ -3832,6 +3826,10 @@ Register FullCodeGenerator::context_register() {
return esi;
}
void FullCodeGenerator::LoadFromFrameField(int frame_offset, Register value) {
DCHECK_EQ(POINTER_SIZE_ALIGN(frame_offset), frame_offset);
__ mov(value, Operand(ebp, frame_offset));
}
void FullCodeGenerator::StoreToFrameField(int frame_offset, Register value) {
DCHECK_EQ(POINTER_SIZE_ALIGN(frame_offset), frame_offset);
......
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