1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "executed" 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Store an object into an array. vBB[vCC] <- vAA. 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instructions. We use a pair of FETCH_Bs instead. 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, vBB, vCC */ 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r2) @ r1<- vBB (array object) 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r0, r3) @ r0<- vCC (requested index) 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r1, #0 @ null array object? 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r9) @ r9<- vAA 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [r1, #offArrayObject_length] @ r3<- arrayObj->length 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r10, r1, r0, lsl #2 @ r10<- arrayObj + index*width 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, r3 @ compare unsigned index, length 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcc .L${opcode}_finish @ we're okay, continue on 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_errArrayIndex @ index >= length, bail 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%break 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r1 = vBB (arrayObj) 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 = vAA (obj) 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r10 = offset into array (vBB + vCC * width) 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_finish: 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ storing null reference? 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .L${opcode}_skip_check @ yes, skip type checks 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r9, #offObject_clazz] @ r0<- obj->clazz 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [r1, #offObject_clazz] @ r1<- arrayObj->clazz 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmCanPutArrayElement @ test object type vs. array type 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ okay? 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errArrayStore @ no 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_skip_check: 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r9, [r10, #offArrayObject_contents] @ vBB[vCC]<- vAA 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 45