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);

`