| Index: src/code-stub-assembler.cc
|
| diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc
|
| index c715471a39f449def3dfa84a5af68f37e07f6807..93e98713fb7509165afef9be23af0f07808f3c9d 100644
|
| --- a/src/code-stub-assembler.cc
|
| +++ b/src/code-stub-assembler.cc
|
| @@ -1139,12 +1139,28 @@ Node* CodeStubAssembler::LoadAndUntagToWord32FixedArrayElement(
|
|
|
| Node* CodeStubAssembler::LoadFixedDoubleArrayElement(
|
| Node* object, Node* index_node, MachineType machine_type,
|
| - int additional_offset, ParameterMode parameter_mode) {
|
| + int additional_offset, ParameterMode parameter_mode, Label* if_hole) {
|
| int32_t header_size =
|
| FixedDoubleArray::kHeaderSize + additional_offset - kHeapObjectTag;
|
| Node* offset = ElementOffsetFromIndex(index_node, FAST_HOLEY_DOUBLE_ELEMENTS,
|
| parameter_mode, header_size);
|
| - return Load(machine_type, object, offset);
|
| + return LoadDoubleWithHoleCheck(object, offset, if_hole, machine_type);
|
| +}
|
| +
|
| +Node* CodeStubAssembler::LoadDoubleWithHoleCheck(Node* base, Node* offset,
|
| + Label* if_hole,
|
| + MachineType machine_type) {
|
| + if (if_hole) {
|
| + Node* element_upper =
|
| + Load(MachineType::Uint32(), base,
|
| + IntPtrAdd(offset, IntPtrConstant(kIeeeDoubleExponentWordOffset)));
|
| + GotoIf(Word32Equal(element_upper, Int32Constant(kHoleNanUpper32)), if_hole);
|
| + }
|
| + if (machine_type.IsNone()) {
|
| + // This means the actual value is not needed.
|
| + return nullptr;
|
| + }
|
| + return Load(machine_type, base, offset);
|
| }
|
|
|
| Node* CodeStubAssembler::LoadNativeContext(Node* context) {
|
| @@ -1414,7 +1430,7 @@ void CodeStubAssembler::FillFixedArrayWithValue(
|
| Is64() ? Int64Constant(kHoleNanInt64) : Int32Constant(kHoleNanLower32);
|
| Node* value = LoadRoot(value_root_index);
|
|
|
| - int const first_element_offset = FixedArray::kHeaderSize - kHeapObjectTag;
|
| + const int first_element_offset = FixedArray::kHeaderSize - kHeapObjectTag;
|
| int32_t to;
|
| bool constant_to = ToInt32Constant(to_node, to);
|
| int32_t from;
|
| @@ -2896,18 +2912,10 @@ void CodeStubAssembler::TryLookupElement(Node* object, Node* map,
|
|
|
| GotoUnless(UintPtrLessThan(intptr_index, length), &if_oob);
|
|
|
| - if (Is64()) {
|
| - Node* element = LoadFixedDoubleArrayElement(
|
| - elements, intptr_index, MachineType::Uint64(), 0, INTPTR_PARAMETERS);
|
| - Node* the_hole = Int64Constant(kHoleNanInt64);
|
| - Branch(Word64Equal(element, the_hole), if_not_found, if_found);
|
| - } else {
|
| - Node* element_upper = LoadFixedDoubleArrayElement(
|
| - elements, intptr_index, MachineType::Uint32(),
|
| - kIeeeDoubleExponentWordOffset, INTPTR_PARAMETERS);
|
| - Branch(Word32Equal(element_upper, Int32Constant(kHoleNanUpper32)),
|
| - if_not_found, if_found);
|
| - }
|
| + // Check if the element is a double hole, but don't load it.
|
| + LoadFixedDoubleArrayElement(elements, intptr_index, MachineType::None(), 0,
|
| + INTPTR_PARAMETERS, if_not_found);
|
| + Goto(if_found);
|
| }
|
| Bind(&if_isdictionary);
|
| {
|
| @@ -3593,20 +3601,10 @@ void CodeStubAssembler::EmitElementLoad(Node* object, Node* elements,
|
| Bind(&if_fast_holey_double);
|
| {
|
| Comment("holey double elements");
|
| - if (kPointerSize == kDoubleSize) {
|
| - Node* raw_element = LoadFixedDoubleArrayElement(
|
| - elements, intptr_index, MachineType::Uint64(), 0, INTPTR_PARAMETERS);
|
| - Node* the_hole = Int64Constant(kHoleNanInt64);
|
| - GotoIf(Word64Equal(raw_element, the_hole), if_hole);
|
| - } else {
|
| - Node* element_upper = LoadFixedDoubleArrayElement(
|
| - elements, intptr_index, MachineType::Uint32(),
|
| - kIeeeDoubleExponentWordOffset, INTPTR_PARAMETERS);
|
| - GotoIf(Word32Equal(element_upper, Int32Constant(kHoleNanUpper32)),
|
| - if_hole);
|
| - }
|
| - var_double_value->Bind(LoadFixedDoubleArrayElement(
|
| - elements, intptr_index, MachineType::Float64(), 0, INTPTR_PARAMETERS));
|
| + Node* value = LoadFixedDoubleArrayElement(elements, intptr_index,
|
| + MachineType::Float64(), 0,
|
| + INTPTR_PARAMETERS, if_hole);
|
| + var_double_value->Bind(value);
|
| Goto(rebox_double);
|
| }
|
|
|
|
|