deps: cherry-pick 56f6a76 from upstream V8 · nodejs/node@ddbb7d7 (original) (raw)
`@@ -797,6 +797,9 @@ bool EffectControlLinearizer::TryWireInStateEffect(Node* node,
`
797
797
`case IrOpcode::kObjectIsMinusZero:
`
798
798
` result = LowerObjectIsMinusZero(node);
`
799
799
`break;
`
``
800
`+
case IrOpcode::kNumberIsMinusZero:
`
``
801
`+
result = LowerNumberIsMinusZero(node);
`
``
802
`+
break;
`
800
803
`case IrOpcode::kObjectIsNaN:
`
801
804
` result = LowerObjectIsNaN(node);
`
802
805
`break;
`
`@@ -2543,6 +2546,14 @@ Node* EffectControlLinearizer::LowerObjectIsSafeInteger(Node* node) {
`
2543
2546
`return done.PhiAt(0);
`
2544
2547
`}
`
2545
2548
``
``
2549
`+
namespace {
`
``
2550
+
``
2551
`+
const int64_t kMinusZeroBits = bit_cast(-0.0);
`
``
2552
`+
const int32_t kMinusZeroLoBits = static_cast(kMinusZeroBits);
`
``
2553
`+
const int32_t kMinusZeroHiBits = static_cast(kMinusZeroBits >> 32);
`
``
2554
+
``
2555
`+
} // namespace
`
``
2556
+
2546
2557
`Node* EffectControlLinearizer::LowerObjectIsMinusZero(Node* node) {
`
2547
2558
` Node* value = node->InputAt(0);
`
2548
2559
` Node* zero = __ Int32Constant(0);
`
`@@ -2559,15 +2570,43 @@ Node* EffectControlLinearizer::LowerObjectIsMinusZero(Node* node) {
`
2559
2570
``
2560
2571
`// Check if {value} contains -0.
`
2561
2572
` Node* value_value = __ LoadField(AccessBuilder::ForHeapNumberValue(), value);
`
2562
``
`-
__ Goto(&done,
`
2563
``
`-
__ Float64Equal(
`
2564
``
`-
__ Float64Div(__ Float64Constant(1.0), value_value),
`
2565
``
`-
__ Float64Constant(-std::numeric_limits::infinity())));
`
``
2573
`+
if (machine()->Is64()) {
`
``
2574
`+
Node* value64 = __ BitcastFloat64ToInt64(value_value);
`
``
2575
`+
__ Goto(&done, __ Word64Equal(value64, __ Int64Constant(kMinusZeroBits)));
`
``
2576
`+
} else {
`
``
2577
`+
Node* value_lo = __ Float64ExtractLowWord32(value_value);
`
``
2578
`+
__ GotoIfNot(__ Word32Equal(value_lo, __ Int32Constant(kMinusZeroLoBits)),
`
``
2579
`+
&done, zero);
`
``
2580
`+
Node* value_hi = __ Float64ExtractHighWord32(value_value);
`
``
2581
`+
__ Goto(&done,
`
``
2582
`+
__ Word32Equal(value_hi, __ Int32Constant(kMinusZeroHiBits)));
`
``
2583
`+
}
`
2566
2584
``
2567
2585
` __ Bind(&done);
`
2568
2586
`return done.PhiAt(0);
`
2569
2587
`}
`
2570
2588
``
``
2589
`+
Node* EffectControlLinearizer::LowerNumberIsMinusZero(Node* node) {
`
``
2590
`+
Node* value = node->InputAt(0);
`
``
2591
+
``
2592
`+
if (machine()->Is64()) {
`
``
2593
`+
Node* value64 = __ BitcastFloat64ToInt64(value);
`
``
2594
`+
return __ Word64Equal(value64, __ Int64Constant(kMinusZeroBits));
`
``
2595
`+
} else {
`
``
2596
`+
auto done = __ MakeLabel(MachineRepresentation::kBit);
`
``
2597
+
``
2598
`+
Node* value_lo = __ Float64ExtractLowWord32(value);
`
``
2599
`+
__ GotoIfNot(__ Word32Equal(value_lo, __ Int32Constant(kMinusZeroLoBits)),
`
``
2600
`+
&done, __ Int32Constant(0));
`
``
2601
`+
Node* value_hi = __ Float64ExtractHighWord32(value);
`
``
2602
`+
__ Goto(&done,
`
``
2603
`+
__ Word32Equal(value_hi, __ Int32Constant(kMinusZeroHiBits)));
`
``
2604
+
``
2605
`+
__ Bind(&done);
`
``
2606
`+
return done.PhiAt(0);
`
``
2607
`+
}
`
``
2608
`+
}
`
``
2609
+
2571
2610
`Node* EffectControlLinearizer::LowerObjectIsNaN(Node* node) {
`
2572
2611
` Node* value = node->InputAt(0);
`
2573
2612
` Node* zero = __ Int32Constant(0);
`