Commit 992ae64d authored by mvstanton's avatar mvstanton Committed by Commit bot

Provide optimized support for the %GetOrdinaryHasInstance intrinsic.

This new intrinsic is used by the desugared ES6 instanceof implementation for
the cases when the F[@@hasInstance] property is null or undefined.

R=mstarzinger@chromium.org

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

Cr-Commit-Position: refs/heads/master@{#34866}
parent 680f50a9
...@@ -97,6 +97,8 @@ Reduction JSIntrinsicLowering::Reduce(Node* node) { ...@@ -97,6 +97,8 @@ Reduction JSIntrinsicLowering::Reduce(Node* node) {
return ReduceCall(node); return ReduceCall(node);
case Runtime::kInlineGetSuperConstructor: case Runtime::kInlineGetSuperConstructor:
return ReduceGetSuperConstructor(node); return ReduceGetSuperConstructor(node);
case Runtime::kInlineGetOrdinaryHasInstance:
return ReduceGetOrdinaryHasInstance(node);
default: default:
break; break;
} }
...@@ -516,6 +518,16 @@ Reduction JSIntrinsicLowering::ReduceGetSuperConstructor(Node* node) { ...@@ -516,6 +518,16 @@ Reduction JSIntrinsicLowering::ReduceGetSuperConstructor(Node* node) {
active_function_map, effect, control); active_function_map, effect, control);
} }
Reduction JSIntrinsicLowering::ReduceGetOrdinaryHasInstance(Node* node) {
Node* effect = NodeProperties::GetEffectInput(node);
Node* context = NodeProperties::GetContextInput(node);
Node* native_context = effect = graph()->NewNode(
javascript()->LoadContext(0, Context::NATIVE_CONTEXT_INDEX, true),
context, context, effect);
return Change(node, javascript()->LoadContext(
0, Context::ORDINARY_HAS_INSTANCE_INDEX, true),
native_context, context, effect);
}
Reduction JSIntrinsicLowering::Change(Node* node, const Operator* op, Node* a, Reduction JSIntrinsicLowering::Change(Node* node, const Operator* op, Node* a,
Node* b) { Node* b) {
......
...@@ -67,6 +67,7 @@ class JSIntrinsicLowering final : public AdvancedReducer { ...@@ -67,6 +67,7 @@ class JSIntrinsicLowering final : public AdvancedReducer {
Reduction ReduceToString(Node* node); Reduction ReduceToString(Node* node);
Reduction ReduceCall(Node* node); Reduction ReduceCall(Node* node);
Reduction ReduceGetSuperConstructor(Node* node); Reduction ReduceGetSuperConstructor(Node* node);
Reduction ReduceGetOrdinaryHasInstance(Node* node);
Reduction Change(Node* node, const Operator* op); Reduction Change(Node* node, const Operator* op);
Reduction Change(Node* node, const Operator* op, Node* a, Node* b); Reduction Change(Node* node, const Operator* op, Node* a, Node* b);
......
...@@ -12885,6 +12885,12 @@ void HOptimizedGraphBuilder::GenerateDebugIsActive(CallRuntime* call) { ...@@ -12885,6 +12885,12 @@ void HOptimizedGraphBuilder::GenerateDebugIsActive(CallRuntime* call) {
return ast_context()->ReturnValue(value); return ast_context()->ReturnValue(value);
} }
void HOptimizedGraphBuilder::GenerateGetOrdinaryHasInstance(CallRuntime* call) {
DCHECK(call->arguments()->length() == 0);
// ordinary_has_instance is immutable so we can treat it as a constant.
HValue* value = Add<HConstant>(isolate()->ordinary_has_instance());
return ast_context()->ReturnValue(value);
}
#undef CHECK_BAILOUT #undef CHECK_BAILOUT
#undef CHECK_ALIVE #undef CHECK_ALIVE
......
...@@ -2230,6 +2230,7 @@ class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor { ...@@ -2230,6 +2230,7 @@ class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor {
F(RegExpSource) \ F(RegExpSource) \
F(NumberToString) \ F(NumberToString) \
F(DebugIsActive) \ F(DebugIsActive) \
F(GetOrdinaryHasInstance) \
/* Typed Arrays */ \ /* Typed Arrays */ \
F(TypedArrayInitialize) \ F(TypedArrayInitialize) \
F(MaxSmi) \ F(MaxSmi) \
......
...@@ -3316,6 +3316,11 @@ void FullCodeGenerator::EmitGetSuperConstructor(CallRuntime* expr) { ...@@ -3316,6 +3316,11 @@ void FullCodeGenerator::EmitGetSuperConstructor(CallRuntime* expr) {
context()->Plug(r0); context()->Plug(r0);
} }
void FullCodeGenerator::EmitGetOrdinaryHasInstance(CallRuntime* expr) {
DCHECK_EQ(0, expr->arguments()->length());
__ LoadNativeContextSlot(Context::ORDINARY_HAS_INSTANCE_INDEX, r0);
context()->Plug(r0);
}
void FullCodeGenerator::EmitDebugIsActive(CallRuntime* expr) { void FullCodeGenerator::EmitDebugIsActive(CallRuntime* expr) {
DCHECK(expr->arguments()->length() == 0); DCHECK(expr->arguments()->length() == 0);
......
...@@ -3121,6 +3121,11 @@ void FullCodeGenerator::EmitGetSuperConstructor(CallRuntime* expr) { ...@@ -3121,6 +3121,11 @@ void FullCodeGenerator::EmitGetSuperConstructor(CallRuntime* expr) {
context()->Plug(x0); context()->Plug(x0);
} }
void FullCodeGenerator::EmitGetOrdinaryHasInstance(CallRuntime* expr) {
DCHECK_EQ(0, expr->arguments()->length());
__ LoadNativeContextSlot(Context::ORDINARY_HAS_INSTANCE_INDEX, x0);
context()->Plug(x0);
}
void FullCodeGenerator::EmitDebugIsActive(CallRuntime* expr) { void FullCodeGenerator::EmitDebugIsActive(CallRuntime* expr) {
DCHECK(expr->arguments()->length() == 0); DCHECK(expr->arguments()->length() == 0);
......
...@@ -530,6 +530,7 @@ class FullCodeGenerator: public AstVisitor { ...@@ -530,6 +530,7 @@ class FullCodeGenerator: public AstVisitor {
F(ToName) \ F(ToName) \
F(ToObject) \ F(ToObject) \
F(DebugIsActive) \ F(DebugIsActive) \
F(GetOrdinaryHasInstance) \
F(CreateIterResultObject) F(CreateIterResultObject)
#define GENERATOR_DECLARATION(Name) void Emit##Name(CallRuntime* call); #define GENERATOR_DECLARATION(Name) void Emit##Name(CallRuntime* call);
......
...@@ -3205,6 +3205,12 @@ void FullCodeGenerator::EmitGetSuperConstructor(CallRuntime* expr) { ...@@ -3205,6 +3205,12 @@ void FullCodeGenerator::EmitGetSuperConstructor(CallRuntime* expr) {
context()->Plug(eax); context()->Plug(eax);
} }
void FullCodeGenerator::EmitGetOrdinaryHasInstance(CallRuntime* expr) {
DCHECK_EQ(0, expr->arguments()->length());
__ mov(eax, NativeContextOperand());
__ mov(eax, ContextOperand(eax, Context::ORDINARY_HAS_INSTANCE_INDEX));
context()->Plug(eax);
}
void FullCodeGenerator::EmitDebugIsActive(CallRuntime* expr) { void FullCodeGenerator::EmitDebugIsActive(CallRuntime* expr) {
DCHECK(expr->arguments()->length() == 0); DCHECK(expr->arguments()->length() == 0);
......
...@@ -3327,6 +3327,11 @@ void FullCodeGenerator::EmitGetSuperConstructor(CallRuntime* expr) { ...@@ -3327,6 +3327,11 @@ void FullCodeGenerator::EmitGetSuperConstructor(CallRuntime* expr) {
context()->Plug(v0); context()->Plug(v0);
} }
void FullCodeGenerator::EmitGetOrdinaryHasInstance(CallRuntime* expr) {
DCHECK_EQ(0, expr->arguments()->length());
__ LoadNativeContextSlot(Context::ORDINARY_HAS_INSTANCE_INDEX, v0);
context()->Plug(v0);
}
void FullCodeGenerator::EmitDebugIsActive(CallRuntime* expr) { void FullCodeGenerator::EmitDebugIsActive(CallRuntime* expr) {
DCHECK(expr->arguments()->length() == 0); DCHECK(expr->arguments()->length() == 0);
......
...@@ -3330,6 +3330,11 @@ void FullCodeGenerator::EmitGetSuperConstructor(CallRuntime* expr) { ...@@ -3330,6 +3330,11 @@ void FullCodeGenerator::EmitGetSuperConstructor(CallRuntime* expr) {
context()->Plug(v0); context()->Plug(v0);
} }
void FullCodeGenerator::EmitGetOrdinaryHasInstance(CallRuntime* expr) {
DCHECK_EQ(0, expr->arguments()->length());
__ LoadNativeContextSlot(Context::ORDINARY_HAS_INSTANCE_INDEX, v0);
context()->Plug(v0);
}
void FullCodeGenerator::EmitDebugIsActive(CallRuntime* expr) { void FullCodeGenerator::EmitDebugIsActive(CallRuntime* expr) {
DCHECK(expr->arguments()->length() == 0); DCHECK(expr->arguments()->length() == 0);
......
...@@ -3193,6 +3193,11 @@ void FullCodeGenerator::EmitGetSuperConstructor(CallRuntime* expr) { ...@@ -3193,6 +3193,11 @@ void FullCodeGenerator::EmitGetSuperConstructor(CallRuntime* expr) {
context()->Plug(rax); context()->Plug(rax);
} }
void FullCodeGenerator::EmitGetOrdinaryHasInstance(CallRuntime* expr) {
DCHECK_EQ(0, expr->arguments()->length());
__ LoadNativeContextSlot(Context::ORDINARY_HAS_INSTANCE_INDEX, rax);
context()->Plug(rax);
}
void FullCodeGenerator::EmitDebugIsActive(CallRuntime* expr) { void FullCodeGenerator::EmitDebugIsActive(CallRuntime* expr) {
DCHECK(expr->arguments()->length() == 0); DCHECK(expr->arguments()->length() == 0);
......
...@@ -277,7 +277,6 @@ TEST_F(JSIntrinsicLoweringTest, InlineMathSqrt) { ...@@ -277,7 +277,6 @@ TEST_F(JSIntrinsicLoweringTest, InlineMathSqrt) {
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// %_MathClz32 // %_MathClz32
TEST_F(JSIntrinsicLoweringTest, InlineMathClz32) { TEST_F(JSIntrinsicLoweringTest, InlineMathClz32) {
Node* const input = Parameter(0); Node* const input = Parameter(0);
Node* const context = Parameter(1); Node* const context = Parameter(1);
...@@ -334,6 +333,23 @@ TEST_F(JSIntrinsicLoweringTest, InlineValueOf) { ...@@ -334,6 +333,23 @@ TEST_F(JSIntrinsicLoweringTest, InlineValueOf) {
AllOf(CaptureEq(&if_false0), IsIfFalse(CaptureEq(&branch0)))))); AllOf(CaptureEq(&if_false0), IsIfFalse(CaptureEq(&branch0))))));
} }
// -----------------------------------------------------------------------------
// %_GetOrdinaryHasInstance
TEST_F(JSIntrinsicLoweringTest, InlineGetOrdinaryHasInstance) {
Node* const context = Parameter(0);
Node* const effect = graph()->start();
Node* const control = graph()->start();
Reduction const r = Reduce(graph()->NewNode(
javascript()->CallRuntime(Runtime::kInlineGetOrdinaryHasInstance, 0),
context, effect, control));
ASSERT_TRUE(r.Changed());
EXPECT_THAT(
r.replacement(),
IsLoadContext(
ContextAccess(0, Context::ORDINARY_HAS_INSTANCE_INDEX, true), _));
}
} // namespace compiler } // namespace compiler
} // namespace internal } // namespace internal
} // namespace v8 } // namespace v8
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