Chromium Code Reviews| Index: src/mips/lithium-codegen-mips.cc |
| diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc |
| index 986921fef551fa68a52a0615b8513d2dc54ddba7..bebd5c24062fa2ebcc906a6801fdd701217b5505 100644 |
| --- a/src/mips/lithium-codegen-mips.cc |
| +++ b/src/mips/lithium-codegen-mips.cc |
| @@ -2447,8 +2447,10 @@ void LCodeGen::DoLoadElements(LLoadElements* instr) { |
| __ lbu(scratch, FieldMemOperand(scratch, Map::kBitField2Offset)); |
| __ Ext(scratch, scratch, Map::kElementsKindShift, |
| Map::kElementsKindBitCount); |
| - __ Branch(&done, eq, scratch, |
| - Operand(FAST_ELEMENTS)); |
| + __ Branch(&fail, lt, scratch, |
| + Operand(GetInitialFastElementsKind())); |
| + __ Branch(&done, le, scratch, |
| + Operand(TERMINAL_FAST_ELEMENTS_KIND)); |
| __ Branch(&fail, lt, scratch, |
| Operand(FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND)); |
| __ Branch(&done, le, scratch, |
| @@ -2541,8 +2543,10 @@ void LCodeGen::DoLoadKeyedFastDoubleElement( |
| Operand(FixedDoubleArray::kHeaderSize - kHeapObjectTag)); |
| } |
| - __ lw(scratch, MemOperand(elements, sizeof(kHoleNanLower32))); |
| - DeoptimizeIf(eq, instr->environment(), scratch, Operand(kHoleNanUpper32)); |
| + if (instr->hydrogen()->RequiresHoleCheck()) { |
| + __ lw(scratch, MemOperand(elements, sizeof(kHoleNanLower32))); |
| + DeoptimizeIf(eq, instr->environment(), scratch, Operand(kHoleNanUpper32)); |
| + } |
| __ ldc1(result, MemOperand(elements)); |
| } |
| @@ -2622,7 +2626,10 @@ void LCodeGen::DoLoadKeyedSpecializedArrayElement( |
| case EXTERNAL_DOUBLE_ELEMENTS: |
| case FAST_DOUBLE_ELEMENTS: |
| case FAST_ELEMENTS: |
| - case FAST_SMI_ONLY_ELEMENTS: |
| + case FAST_SMI_ELEMENTS: |
| + case FAST_HOLEY_DOUBLE_ELEMENTS: |
| + case FAST_HOLEY_ELEMENTS: |
| + case FAST_HOLEY_SMI_ELEMENTS: |
| case DICTIONARY_ELEMENTS: |
| case NON_STRICT_ARGUMENTS_ELEMENTS: |
| UNREACHABLE(); |
| @@ -3640,7 +3647,10 @@ void LCodeGen::DoStoreKeyedSpecializedArrayElement( |
| case EXTERNAL_DOUBLE_ELEMENTS: |
| case FAST_DOUBLE_ELEMENTS: |
| case FAST_ELEMENTS: |
| - case FAST_SMI_ONLY_ELEMENTS: |
| + case FAST_SMI_ELEMENTS: |
| + case FAST_HOLEY_DOUBLE_ELEMENTS: |
| + case FAST_HOLEY_ELEMENTS: |
| + case FAST_HOLEY_SMI_ELEMENTS: |
| case DICTIONARY_ELEMENTS: |
| case NON_STRICT_ARGUMENTS_ELEMENTS: |
| UNREACHABLE(); |
| @@ -3678,20 +3688,21 @@ void LCodeGen::DoTransitionElementsKind(LTransitionElementsKind* instr) { |
| __ Branch(¬_applicable, ne, scratch, Operand(from_map)); |
| __ li(new_map_reg, Operand(to_map)); |
| - if (from_kind == FAST_SMI_ONLY_ELEMENTS && to_kind == FAST_ELEMENTS) { |
| + if (IsFastSmiElementsKind(from_kind) && IsFastObjectElementsKind(to_kind)) { |
| __ sw(new_map_reg, FieldMemOperand(object_reg, HeapObject::kMapOffset)); |
| // Write barrier. |
| __ RecordWriteField(object_reg, HeapObject::kMapOffset, new_map_reg, |
| scratch, kRAHasBeenSaved, kDontSaveFPRegs); |
| - } else if (from_kind == FAST_SMI_ONLY_ELEMENTS && |
| - to_kind == FAST_DOUBLE_ELEMENTS) { |
| + } else if (IsFastSmiElementsKind(from_kind) && |
| + IsFastDoubleElementsKind(to_kind)) { |
| Register fixed_object_reg = ToRegister(instr->temp_reg()); |
| ASSERT(fixed_object_reg.is(a2)); |
| ASSERT(new_map_reg.is(a3)); |
| __ mov(fixed_object_reg, object_reg); |
| CallCode(isolate()->builtins()->TransitionElementsSmiToDouble(), |
| RelocInfo::CODE_TARGET, instr); |
| - } else if (from_kind == FAST_DOUBLE_ELEMENTS && to_kind == FAST_ELEMENTS) { |
| + } else if (IsFastDoubleElementsKind(from_kind) && |
| + IsFastElementsKind(to_kind)) { |
|
Jakob Kummerow
2012/05/22 17:36:49
IsFastObjectElementsKind(to_kind) ?
danno
2012/05/23 14:25:36
Done.
|
| Register fixed_object_reg = ToRegister(instr->temp_reg()); |
| ASSERT(fixed_object_reg.is(a2)); |
| ASSERT(new_map_reg.is(a3)); |
| @@ -4446,8 +4457,8 @@ void LCodeGen::DoArrayLiteral(LArrayLiteral* instr) { |
| // Deopt if the array literal boilerplate ElementsKind is of a type different |
| // than the expected one. The check isn't necessary if the boilerplate has |
| - // already been converted to FAST_ELEMENTS. |
| - if (boilerplate_elements_kind != FAST_ELEMENTS) { |
| + // already been converted to TERMINAL_FAST_ELEMENTS_KIND. |
| + if (boilerplate_elements_kind != TERMINAL_FAST_ELEMENTS_KIND) { |
|
Jakob Kummerow
2012/05/22 17:36:49
Other arches ask "if (CanTransitionToMoreGeneralFa
danno
2012/05/23 14:25:36
Done.
|
| __ LoadHeapObject(a1, instr->hydrogen()->boilerplate_object()); |
| // Load map into a2. |
| __ lw(a2, FieldMemOperand(a1, HeapObject::kMapOffset)); |