Index: src/arm/ic-arm.cc |
=================================================================== |
--- src/arm/ic-arm.cc (revision 6456) |
+++ src/arm/ic-arm.cc (working copy) |
@@ -1374,6 +1374,48 @@ |
} |
+void KeyedLoadIC::GeneratePixelArray(MacroAssembler* masm) { |
+ // ---------- S t a t e -------------- |
+ // -- lr : return address |
+ // -- r0 : key |
+ // -- r1 : receiver |
+ // ----------------------------------- |
+ |
+ // Register usage. |
+ Register key = r0; |
+ Register receiver = r1; |
+ Register elements = r2; |
+ Register elements_map = r3; |
+ Register index = r4; |
+ |
+ Label slow; |
+ |
+ // Receiver must not be smi and its element map must be a pixel array. |
+ __ BranchOnSmi(receiver, &slow); |
+ __ ldr(elements, FieldMemOperand(r1, JSObject::kElementsOffset)); |
Mads Ager (chromium)
2011/01/25 14:49:17
We need to check that the receiver is a JSObject b
danno
2011/01/25 20:56:29
Done.
|
+ __ LoadRoot(ip, Heap::kPixelArrayMapRootIndex); |
+ __ ldr(elements_map, FieldMemOperand(elements, JSObject::kMapOffset)); |
+ __ cmp(elements_map, ip); |
+ __ b(ne, &slow); |
+ |
+ // Key must be a smi that is in range of the pixel array. |
+ __ BranchOnNotSmi(key, &slow); |
+ __ ldr(ip, FieldMemOperand(elements, PixelArray::kLengthOffset)); |
Mads Ager (chromium)
2011/01/25 14:49:17
Since we have enough register here, I would prefer
danno
2011/01/25 20:56:29
Done.
|
+ __ mov(index, Operand(key, ASR, kSmiTagSize)); |
+ __ cmp(index, ip); |
+ __ b(hs, &slow); |
+ |
+ // Perform the indexed load and tag it as a smi. |
+ __ ldr(ip, FieldMemOperand(elements, PixelArray::kExternalPointerOffset)); |
Mads Ager (chromium)
2011/01/25 14:49:17
Ditto for using ip.
danno
2011/01/25 20:56:29
Done.
|
+ __ ldrb(r2, MemOperand(ip, index)); |
+ __ mov(r0, Operand(r2, LSL, kSmiTagSize)); // Tag result as smi. |
+ __ Ret(); |
+ |
+ __ bind(&slow); |
+ GenerateMiss(masm); |
+} |
+ |
+ |
void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) { |
// ---------- S t a t e -------------- |
// -- r0 : value |