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