buzbee | 1452bee | 2015-03-06 14:43:04 -0800 | [diff] [blame^] | 1 | /* |
| 2 | * Array put, 64 bits. vBB[vCC] <- vAA. |
| 3 | * |
| 4 | * Arrays of long/double are 64-bit aligned, so it's okay to use STRD. |
| 5 | */ |
| 6 | /* aput-wide vAA, vBB, vCC */ |
| 7 | FETCH r0, 1 @ r0<- CCBB |
| 8 | mov r9, rINST, lsr #8 @ r9<- AA |
| 9 | and r2, r0, #255 @ r2<- BB |
| 10 | mov r3, r0, lsr #8 @ r3<- CC |
| 11 | GET_VREG r0, r2 @ r0<- vBB (array object) |
| 12 | GET_VREG r1, r3 @ r1<- vCC (requested index) |
| 13 | cmp r0, #0 @ null array object? |
| 14 | beq common_errNullObject @ yes, bail |
| 15 | ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length |
| 16 | add r0, r0, r1, lsl #3 @ r0<- arrayObj + index*width |
| 17 | cmp r1, r3 @ compare unsigned index, length |
| 18 | add r9, rFP, r9, lsl #2 @ r9<- &fp[AA] |
| 19 | bcs common_errArrayIndex @ index >= length, bail |
| 20 | FETCH_ADVANCE_INST 2 @ advance rPC, load rINST |
| 21 | ldmia r9, {r2-r3} @ r2/r3<- vAA/vAA+1 |
| 22 | GET_INST_OPCODE ip @ extract opcode from rINST |
| 23 | strd r2, [r0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] @ r2/r3<- vBB[vCC] |
| 24 | GOTO_OPCODE ip @ jump to next instruction |