Index: src/compiler/effect-control-linearizer.cc |
diff --git a/src/compiler/effect-control-linearizer.cc b/src/compiler/effect-control-linearizer.cc |
index 5be185236c7d3ef13fc4163918919352ddc8a609..1c882517970b89d03d8bf4a4e2fd978b2dc8705b 100644 |
--- a/src/compiler/effect-control-linearizer.cc |
+++ b/src/compiler/effect-control-linearizer.cc |
@@ -717,6 +717,9 @@ bool EffectControlLinearizer::TryWireInStateEffect(Node* node, |
case IrOpcode::kObjectIsCallable: |
result = LowerObjectIsCallable(node); |
break; |
+ case IrOpcode::kObjectIsNonCallable: |
+ result = LowerObjectIsNonCallable(node); |
+ break; |
case IrOpcode::kObjectIsNumber: |
result = LowerObjectIsNumber(node); |
break; |
@@ -1688,6 +1691,37 @@ Node* EffectControlLinearizer::LowerObjectIsCallable(Node* node) { |
return done.PhiAt(0); |
} |
+Node* EffectControlLinearizer::LowerObjectIsNonCallable(Node* node) { |
+ Node* value = node->InputAt(0); |
+ |
+ auto if_primitive = __ MakeDeferredLabel<2>(); |
+ auto done = __ MakeLabel<2>(MachineRepresentation::kBit); |
+ |
+ Node* check0 = ObjectIsSmi(value); |
+ __ GotoIf(check0, &if_primitive); |
+ |
+ Node* value_map = __ LoadField(AccessBuilder::ForMap(), value); |
+ Node* value_instance_type = |
+ __ LoadField(AccessBuilder::ForMapInstanceType(), value_map); |
+ STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE); |
+ Node* check1 = __ Uint32LessThanOrEqual( |
+ __ Uint32Constant(FIRST_JS_RECEIVER_TYPE), value_instance_type); |
+ __ GotoUnless(check1, &if_primitive); |
+ |
+ Node* value_bit_field = |
+ __ LoadField(AccessBuilder::ForMapBitField(), value_map); |
+ Node* check2 = __ Word32Equal( |
+ __ Int32Constant(0), |
+ __ Word32And(value_bit_field, __ Int32Constant(1 << Map::kIsCallable))); |
+ __ Goto(&done, check2); |
+ |
+ __ Bind(&if_primitive); |
+ __ Goto(&done, __ Int32Constant(0)); |
+ |
+ __ Bind(&done); |
+ return done.PhiAt(0); |
+} |
+ |
Node* EffectControlLinearizer::LowerObjectIsNumber(Node* node) { |
Node* value = node->InputAt(0); |