Index: src/arm/lithium-codegen-arm.cc |
diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc |
index b73b82f1dde7849f665a5ff69cf982ccb99cf647..3a201a80c10f31a1f81ffee6493a8c6e0a7e0d82 100644 |
--- a/src/arm/lithium-codegen-arm.cc |
+++ b/src/arm/lithium-codegen-arm.cc |
@@ -1368,6 +1368,20 @@ void LCodeGen::DoFixedArrayLength(LFixedArrayLength* instr) { |
} |
+void LCodeGen::DoElementsKind(LElementsKind* instr) { |
+ Register result = ToRegister(instr->result()); |
+ Register input = ToRegister(instr->InputAt(0)); |
+ |
+ // Load map into |result|. |
+ __ ldr(result, FieldMemOperand(input, HeapObject::kMapOffset)); |
+ // Load the map's "bit field 2" into |result|. We only need the first byte, |
+ // but the following bit field extraction takes care of that anyway. |
+ __ ldr(result, FieldMemOperand(result, Map::kBitField2Offset)); |
+ // Retrieve elements_kind from bit field 2. |
+ __ ubfx(result, result, Map::kElementsKindShift, Map::kElementsKindBitCount); |
+} |
+ |
+ |
void LCodeGen::DoValueOf(LValueOf* instr) { |
Register input = ToRegister(instr->InputAt(0)); |
Register result = ToRegister(instr->result()); |
@@ -1744,6 +1758,27 @@ void LCodeGen::DoCmpSymbolEqAndBranch(LCmpSymbolEqAndBranch* instr) { |
} |
+void LCodeGen::DoCmpConstantEq(LCmpConstantEq* instr) { |
+ Register left = ToRegister(instr->InputAt(0)); |
+ Register result = ToRegister(instr->result()); |
+ |
+ Label done; |
+ __ cmp(left, Operand(instr->hydrogen()->right())); |
+ __ LoadRoot(result, Heap::kTrueValueRootIndex, eq); |
+ __ LoadRoot(result, Heap::kFalseValueRootIndex, ne); |
+} |
+ |
+ |
+void LCodeGen::DoCmpConstantEqAndBranch(LCmpConstantEqAndBranch* instr) { |
+ Register left = ToRegister(instr->InputAt(0)); |
+ int true_block = chunk_->LookupDestination(instr->true_block_id()); |
+ int false_block = chunk_->LookupDestination(instr->false_block_id()); |
+ |
+ __ cmp(left, Operand(instr->hydrogen()->right())); |
+ EmitBranch(true_block, false_block, eq); |
+} |
+ |
+ |
void LCodeGen::DoIsNull(LIsNull* instr) { |
Register reg = ToRegister(instr->InputAt(0)); |
Register result = ToRegister(instr->result()); |
@@ -2542,7 +2577,7 @@ void LCodeGen::DoLoadElements(LLoadElements* instr) { |
__ ldr(result, FieldMemOperand(input, JSObject::kElementsOffset)); |
if (FLAG_debug_code) { |
- Label done; |
+ Label done, fail; |
__ ldr(scratch, FieldMemOperand(result, HeapObject::kMapOffset)); |
__ LoadRoot(ip, Heap::kFixedArrayMapRootIndex); |
__ cmp(scratch, ip); |
@@ -2550,11 +2585,18 @@ void LCodeGen::DoLoadElements(LLoadElements* instr) { |
__ LoadRoot(ip, Heap::kFixedCOWArrayMapRootIndex); |
__ cmp(scratch, ip); |
__ b(eq, &done); |
- __ ldr(scratch, FieldMemOperand(result, HeapObject::kMapOffset)); |
- __ ldrb(scratch, FieldMemOperand(scratch, Map::kInstanceTypeOffset)); |
- __ sub(scratch, scratch, Operand(FIRST_EXTERNAL_ARRAY_TYPE)); |
- __ cmp(scratch, Operand(kExternalArrayTypeCount)); |
- __ Check(cc, "Check for fast elements failed."); |
+ // |scratch| still contains |input|'s map. |
+ __ ldr(scratch, FieldMemOperand(scratch, Map::kBitField2Offset)); |
+ __ ubfx(scratch, scratch, Map::kElementsKindShift, |
+ Map::kElementsKindBitCount); |
+ __ cmp(scratch, Operand(JSObject::FAST_ELEMENTS)); |
+ __ b(eq, &done); |
+ __ cmp(scratch, Operand(JSObject::FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND)); |
+ __ b(lt, &fail); |
+ __ cmp(scratch, Operand(JSObject::LAST_EXTERNAL_ARRAY_ELEMENTS_KIND)); |
+ __ b(le, &done); |
+ __ bind(&fail); |
+ __ Abort("Check for fast or external elements failed."); |
__ bind(&done); |
} |
} |