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