Chromium Code Reviews| 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..5886ea8057dbdf8729ab6dee0daa0d12aba6e2b0 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* vfalse = __ Word32Equal( |
|
Jarin
2017/01/19 12:30:27
The vfalse name is pretty confusing here - it is c
Benedikt Meurer
2017/01/19 12:50:32
Done.
|
| + __ Int32Constant(0), |
| + __ Word32And(value_bit_field, __ Int32Constant(1 << Map::kIsCallable))); |
| + __ Goto(&done, vfalse); |
| + |
| + __ Bind(&if_primitive); |
| + __ Goto(&done, __ Int32Constant(0)); |
| + |
| + __ Bind(&done); |
| + return done.PhiAt(0); |
| +} |
| + |
| Node* EffectControlLinearizer::LowerObjectIsNumber(Node* node) { |
| Node* value = node->InputAt(0); |