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 /* op vAA, vBB, vCC */ 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- CCBB 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r9, rINST, lsr #8 @ r9<- AA 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and r2, r0, #255 @ r2<- BB 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, r0, lsr #8 @ r3<- CC 10d3b0a4bf6b2e38e6e9e80e203ca753e941084103buzbee GET_VREG(rINST, r2) @ rINST<- vBB (array object) 11e877cc41c1a5d4f577c5f6fc6bacbe388dfd1d59Elliott Hughes GET_VREG(r1, r3) @ r1<- vCC (requested index) 12d3b0a4bf6b2e38e6e9e80e203ca753e941084103buzbee cmp rINST, #0 @ null array object? 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r9, r9) @ r9<- vAA 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_errNullObject @ yes, bail 15d3b0a4bf6b2e38e6e9e80e203ca753e941084103buzbee ldr r3, [rINST, #offArrayObject_length] @ r3<- arrayObj->length 16e877cc41c1a5d4f577c5f6fc6bacbe388dfd1d59Elliott Hughes add r10, rINST, r1, lsl #2 @ r10<- arrayObj + index*width 17e877cc41c1a5d4f577c5f6fc6bacbe388dfd1d59Elliott Hughes cmp r1, r3 @ compare unsigned index, length 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bcc .L${opcode}_finish @ we're okay, continue on 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b common_errArrayIndex @ index >= length, bail 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%break 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry: 24d3b0a4bf6b2e38e6e9e80e203ca753e941084103buzbee * rINST = vBB (arrayObj) 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r9 = vAA (obj) 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r10 = offset into array (vBB + vCC * width) 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_finish: 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r9, #0 @ storing null reference? 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq .L${opcode}_skip_check @ yes, skip type checks 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [r9, #offObject_clazz] @ r0<- obj->clazz 32d3b0a4bf6b2e38e6e9e80e203ca753e941084103buzbee ldr r1, [rINST, #offObject_clazz] @ r1<- arrayObj->clazz 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl dvmCanPutArrayElement @ test object type vs. array type 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ okay? 3563644657f74e0a5d05f2c5fb56a18872e7ac7427Elliott Hughes beq .L${opcode}_throw @ no 36d3b0a4bf6b2e38e6e9e80e203ca753e941084103buzbee mov r1, rINST @ r1<- arrayObj 37919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 389f601a917c8878204482c37aec7005054b6776fabuzbee ldr r2, [rSELF, #offThread_cardTable] @ get biased CT base 39919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee add r10, #offArrayObject_contents @ r0<- pointer to slot 40919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee GET_INST_OPCODE(ip) @ extract opcode from rINST 41919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee str r9, [r10] @ vBB[vCC]<- vAA 42d3b0a4bf6b2e38e6e9e80e203ca753e941084103buzbee strb r2, [r2, r1, lsr #GC_CARD_SHIFT] @ mark card using object head 43919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee GOTO_OPCODE(ip) @ jump to next instruction 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_skip_check: 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(2) @ advance rPC, load rINST 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project str r9, [r10, #offArrayObject_contents] @ vBB[vCC]<- vAA 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 4963644657f74e0a5d05f2c5fb56a18872e7ac7427Elliott Hughes.L${opcode}_throw: 5063644657f74e0a5d05f2c5fb56a18872e7ac7427Elliott Hughes @ The types don't match. We need to throw an ArrayStoreException. 5163644657f74e0a5d05f2c5fb56a18872e7ac7427Elliott Hughes ldr r0, [r9, #offObject_clazz] 5263644657f74e0a5d05f2c5fb56a18872e7ac7427Elliott Hughes ldr r1, [rINST, #offObject_clazz] 5363644657f74e0a5d05f2c5fb56a18872e7ac7427Elliott Hughes EXPORT_PC() 5461f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornstein bl dvmThrowArrayStoreExceptionIncompatibleElement 5563644657f74e0a5d05f2c5fb56a18872e7ac7427Elliott Hughes b common_exceptionThrown 56