1a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham%verify "executed"
2a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    /*
3a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham     * Store an object into an array.  vBB[vCC] <- vAA.
4a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham     *
5a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham     */
6a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    /* op vAA, vBB, vCC */
7a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    FETCH(a0, 1)                           #  a0 <- CCBB
8a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    GET_OPA(t1)                            #  t1 <- AA
9a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    and       a2, a0, 255                  #  a2 <- BB
10a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    srl       a3, a0, 8                    #  a3 <- CC
11a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    GET_VREG(rINST, a2)                    #  rINST <- vBB (array object)
12a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
13a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    GET_VREG(rBIX, t1)                     #  rBIX <- vAA
14a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    # null array object?
15a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    beqz      rINST, common_errNullObject  #  yes, bail
16a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham
17a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    LOAD_base_offArrayObject_length(a3, rINST) #  a3 <- arrayObj->length
18a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    EAS2(rOBJ, rINST, a1)                  #  rOBJ <- arrayObj + index*width
19a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    # compare unsigned index, length
20a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
21a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    /*
22a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham     * On entry:
23a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham     *  rINST = vBB (arrayObj)
24a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham     *  rBIX = vAA (obj)
25a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham     *  rOBJ = offset into array (vBB + vCC * width)
26a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham     */
27a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    bnez      rBIX, .L${opcode}_checks     #  yes, skip type checks
28a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham.L${opcode}_finish:
29a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
30a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
31a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    sw        rBIX, offArrayObject_contents(rOBJ) #  vBB[vCC] <- vAA
32a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    GOTO_OPCODE(t0)                        #  jump to next instruction
33a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham
34a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham%break
35a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham.L${opcode}_checks:
36a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    LOAD_base_offObject_clazz(a0, rBIX)    #  a0 <- obj->clazz
37a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    LOAD_base_offObject_clazz(a1, rINST)   #  a1 <- arrayObj->clazz
38a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    JAL(dvmCanPutArrayElement)             #  test object type vs. array type
39a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    beqz      v0, .L${opcode}_throw        #  okay ?
40a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    lw        a2, offThread_cardTable(rSELF)
41a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    srl       t1, rINST, GC_CARD_SHIFT
42a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    addu      t2, a2, t1
43a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    sb        a2, (t2)
44a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    b         .L${opcode}_finish           #  yes, skip type checks
45a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham.L${opcode}_throw:
46a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    LOAD_base_offObject_clazz(a0, rBIX)    #  a0 <- obj->clazz
47a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    LOAD_base_offObject_clazz(a1, rINST)   #  a1 <- arrayObj->clazz
48a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    EXPORT_PC()
49a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    JAL(dvmThrowArrayStoreExceptionIncompatibleElement)
50a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    b         common_exceptionThrown
51