diff options
Diffstat (limited to 'chromium/v8/src/compiler/effect-control-linearizer.cc')
-rw-r--r-- | chromium/v8/src/compiler/effect-control-linearizer.cc | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/chromium/v8/src/compiler/effect-control-linearizer.cc b/chromium/v8/src/compiler/effect-control-linearizer.cc index 3e0ac820dd3..d886fda97a8 100644 --- a/chromium/v8/src/compiler/effect-control-linearizer.cc +++ b/chromium/v8/src/compiler/effect-control-linearizer.cc @@ -718,6 +718,9 @@ bool EffectControlLinearizer::TryWireInStateEffect(Node* node, case IrOpcode::kObjectIsCallable: result = LowerObjectIsCallable(node); break; + case IrOpcode::kObjectIsConstructor: + result = LowerObjectIsConstructor(node); + break; case IrOpcode::kObjectIsDetectableCallable: result = LowerObjectIsDetectableCallable(node); break; @@ -1931,6 +1934,31 @@ Node* EffectControlLinearizer::LowerObjectIsCallable(Node* node) { return done.PhiAt(0); } +Node* EffectControlLinearizer::LowerObjectIsConstructor(Node* node) { + Node* value = node->InputAt(0); + + auto if_smi = __ MakeDeferredLabel(); + auto done = __ MakeLabel(MachineRepresentation::kBit); + + Node* check = ObjectIsSmi(value); + __ GotoIf(check, &if_smi); + + Node* value_map = __ LoadField(AccessBuilder::ForMap(), value); + Node* value_bit_field = + __ LoadField(AccessBuilder::ForMapBitField(), value_map); + Node* vfalse = + __ Word32Equal(__ Int32Constant(1 << Map::kIsConstructor), + __ Word32And(value_bit_field, + __ Int32Constant(1 << Map::kIsConstructor))); + __ Goto(&done, vfalse); + + __ Bind(&if_smi); + __ Goto(&done, __ Int32Constant(0)); + + __ Bind(&done); + return done.PhiAt(0); +} + Node* EffectControlLinearizer::LowerObjectIsDetectableCallable(Node* node) { Node* value = node->InputAt(0); |