| Index: src/compiler/effect-control-linearizer.cc
|
| diff --git a/src/compiler/effect-control-linearizer.cc b/src/compiler/effect-control-linearizer.cc
|
| index 768ac93242a1a8449939215e425cdeef5bc27b0f..4d94d833319e5245cbe93ba399338974e5d47a7e 100644
|
| --- a/src/compiler/effect-control-linearizer.cc
|
| +++ b/src/compiler/effect-control-linearizer.cc
|
| @@ -639,6 +639,9 @@ bool EffectControlLinearizer::TryWireInStateEffect(Node* node,
|
| case IrOpcode::kTruncateTaggedToBit:
|
| result = LowerTruncateTaggedToBit(node);
|
| break;
|
| + case IrOpcode::kTruncateTaggedPointerToBit:
|
| + result = LowerTruncateTaggedPointerToBit(node);
|
| + break;
|
| case IrOpcode::kTruncateTaggedToFloat64:
|
| result = LowerTruncateTaggedToFloat64(node);
|
| break;
|
| @@ -983,6 +986,53 @@ Node* EffectControlLinearizer::LowerTruncateTaggedToBit(Node* node) {
|
| return done.PhiAt(0);
|
| }
|
|
|
| +Node* EffectControlLinearizer::LowerTruncateTaggedPointerToBit(Node* node) {
|
| + Node* value = node->InputAt(0);
|
| +
|
| + auto if_heapnumber = __ MakeDeferredLabel<1>();
|
| + auto done = __ MakeLabel<5>(MachineRepresentation::kBit);
|
| +
|
| + Node* zero = __ Int32Constant(0);
|
| + Node* fzero = __ Float64Constant(0.0);
|
| +
|
| + // Check if {value} is false.
|
| + __ GotoIf(__ WordEqual(value, __ FalseConstant()), &done, zero);
|
| +
|
| + // Check if {value} is the empty string.
|
| + __ GotoIf(__ WordEqual(value, __ EmptyStringConstant()), &done, zero);
|
| +
|
| + // Load the map of {value}.
|
| + Node* value_map = __ LoadField(AccessBuilder::ForMap(), value);
|
| +
|
| + // Check if the {value} is undetectable and immediately return false.
|
| + Node* value_map_bitfield =
|
| + __ LoadField(AccessBuilder::ForMapBitField(), value_map);
|
| + __ GotoUnless(
|
| + __ Word32Equal(__ Word32And(value_map_bitfield,
|
| + __ Int32Constant(1 << Map::kIsUndetectable)),
|
| + zero),
|
| + &done, zero);
|
| +
|
| + // Check if {value} is a HeapNumber.
|
| + __ GotoIf(__ WordEqual(value_map, __ HeapNumberMapConstant()),
|
| + &if_heapnumber);
|
| +
|
| + // All other values that reach here are true.
|
| + __ Goto(&done, __ Int32Constant(1));
|
| +
|
| + __ Bind(&if_heapnumber);
|
| + {
|
| + // For HeapNumber {value}, just check that its value is not 0.0, -0.0 or
|
| + // NaN.
|
| + Node* value_value =
|
| + __ LoadField(AccessBuilder::ForHeapNumberValue(), value);
|
| + __ Goto(&done, __ Float64LessThan(fzero, __ Float64Abs(value_value)));
|
| + }
|
| +
|
| + __ Bind(&done);
|
| + return done.PhiAt(0);
|
| +}
|
| +
|
| Node* EffectControlLinearizer::LowerChangeTaggedToInt32(Node* node) {
|
| Node* value = node->InputAt(0);
|
|
|
|
|