Index: src/arm/lithium-codegen-arm.cc |
diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc |
index 057ac241c599653b53ff2ba5036fc4d032f32976..7ed258eb914876c377c0006923750264bdfb87eb 100644 |
--- a/src/arm/lithium-codegen-arm.cc |
+++ b/src/arm/lithium-codegen-arm.cc |
@@ -1897,13 +1897,32 @@ void LCodeGen::DoHasInstanceTypeAndBranch(LHasInstanceTypeAndBranch* instr) { |
void LCodeGen::DoHasCachedArrayIndex(LHasCachedArrayIndex* instr) { |
- Abort("DoHasCachedArrayIndex unimplemented."); |
+ Register input = ToRegister(instr->InputAt(0)); |
+ Register result = ToRegister(instr->result()); |
+ Register scratch = scratch0(); |
+ |
+ ASSERT(instr->hydrogen()->value()->representation().IsTagged()); |
+ __ ldr(scratch, |
+ FieldMemOperand(input, String::kContainsCachedArrayIndexMask)); |
+ __ tst(scratch, Operand(String::kContainsCachedArrayIndexMask)); |
+ __ LoadRoot(result, Heap::kTrueValueRootIndex, ne); |
+ __ LoadRoot(result, Heap::kFalseValueRootIndex, eq); |
} |
void LCodeGen::DoHasCachedArrayIndexAndBranch( |
LHasCachedArrayIndexAndBranch* instr) { |
- Abort("DoHasCachedArrayIndexAndBranch unimplemented."); |
+ Register input = ToRegister(instr->InputAt(0)); |
+ Register scratch = scratch0(); |
+ |
+ int true_block = chunk_->LookupDestination(instr->true_block_id()); |
+ int false_block = chunk_->LookupDestination(instr->false_block_id()); |
+ |
+ ASSERT(instr->hydrogen()->value()->representation().IsTagged()); |
+ __ ldr(scratch, |
+ FieldMemOperand(input, String::kContainsCachedArrayIndexMask)); |
+ __ tst(scratch, Operand(String::kContainsCachedArrayIndexMask)); |
+ EmitBranch(true_block, false_block, ne); |
} |