diff options
Diffstat (limited to 'deps/v8/src/compiler/representation-change.cc')
-rw-r--r-- | deps/v8/src/compiler/representation-change.cc | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/deps/v8/src/compiler/representation-change.cc b/deps/v8/src/compiler/representation-change.cc index 0439c536de..f15df671cf 100644 --- a/deps/v8/src/compiler/representation-change.cc +++ b/deps/v8/src/compiler/representation-change.cc @@ -364,12 +364,22 @@ Node* RepresentationChanger::GetTaggedPointerRepresentationFor( } op = simplified()->ChangeFloat64ToTaggedPointer(); } else if (output_rep == MachineRepresentation::kFloat32) { - // float32 -> float64 -> tagged - node = InsertChangeFloat32ToFloat64(node); - op = simplified()->ChangeFloat64ToTaggedPointer(); + if (output_type->Is(Type::Number())) { + // float32 -> float64 -> tagged + node = InsertChangeFloat32ToFloat64(node); + op = simplified()->ChangeFloat64ToTaggedPointer(); + } else { + return TypeError(node, output_rep, output_type, + MachineRepresentation::kTaggedPointer); + } } else if (output_rep == MachineRepresentation::kFloat64) { - // float64 -> tagged - op = simplified()->ChangeFloat64ToTaggedPointer(); + if (output_type->Is(Type::Number())) { + // float64 -> tagged + op = simplified()->ChangeFloat64ToTaggedPointer(); + } else { + return TypeError(node, output_rep, output_type, + MachineRepresentation::kTaggedPointer); + } } else if (CanBeTaggedSigned(output_rep) && use_info.type_check() == TypeCheckKind::kHeapObject) { if (!output_type->Maybe(Type::SignedSmall())) { @@ -452,11 +462,14 @@ Node* RepresentationChanger::GetTaggedRepresentationFor( Type::Unsigned32())) { // float64 -> uint32 -> tagged node = InsertChangeFloat64ToUint32(node); op = simplified()->ChangeUint32ToTagged(); - } else { + } else if (output_type->Is(Type::Number())) { op = simplified()->ChangeFloat64ToTagged( output_type->Maybe(Type::MinusZero()) ? CheckForMinusZeroMode::kCheckForMinusZero : CheckForMinusZeroMode::kDontCheckForMinusZero); + } else { + return TypeError(node, output_rep, output_type, + MachineRepresentation::kTagged); } } else { return TypeError(node, output_rep, output_type, @@ -654,7 +667,7 @@ Node* RepresentationChanger::GetWord32RepresentationFor( use_info.type_check() == TypeCheckKind::kSigned32) { op = simplified()->CheckedFloat64ToInt32( output_type->Maybe(Type::MinusZero()) - ? CheckForMinusZeroMode::kCheckForMinusZero + ? use_info.minus_zero_check() : CheckForMinusZeroMode::kDontCheckForMinusZero); } else if (output_type->Is(Type::Unsigned32())) { op = machine()->ChangeFloat64ToUint32(); @@ -686,7 +699,7 @@ Node* RepresentationChanger::GetWord32RepresentationFor( } else if (use_info.type_check() == TypeCheckKind::kSigned32) { op = simplified()->CheckedTaggedToInt32( output_type->Maybe(Type::MinusZero()) - ? CheckForMinusZeroMode::kCheckForMinusZero + ? use_info.minus_zero_check() : CheckForMinusZeroMode::kDontCheckForMinusZero); } else if (output_type->Is(Type::Unsigned32())) { op = simplified()->ChangeTaggedToUint32(); |