summaryrefslogtreecommitdiffstats
path: root/vm/mterp/mips/OP_APUT_OBJECT.S
blob: 1d5b06e50e4570834108d53d5d1219fe68512015 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
%verify "executed"
    /*
     * Store an object into an array.  vBB[vCC] <- vAA.
     *
     */
    /* op vAA, vBB, vCC */
    FETCH(a0, 1)                           #  a0 <- CCBB
    GET_OPA(t1)                            #  t1 <- AA
    and       a2, a0, 255                  #  a2 <- BB
    srl       a3, a0, 8                    #  a3 <- CC
    GET_VREG(rINST, a2)                    #  rINST <- vBB (array object)
    GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
    GET_VREG(rBIX, t1)                     #  rBIX <- vAA
    # null array object?
    beqz      rINST, common_errNullObject  #  yes, bail

    LOAD_base_offArrayObject_length(a3, rINST) #  a3 <- arrayObj->length
    EAS2(rOBJ, rINST, a1)                  #  rOBJ <- arrayObj + index*width
    # compare unsigned index, length
    bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
    /*
     * On entry:
     *  rINST = vBB (arrayObj)
     *  rBIX = vAA (obj)
     *  rOBJ = offset into array (vBB + vCC * width)
     */
    bnez      rBIX, .L${opcode}_checks     #  yes, skip type checks
.L${opcode}_finish:
    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
    sw        rBIX, offArrayObject_contents(rOBJ) #  vBB[vCC] <- vAA
    GOTO_OPCODE(t0)                        #  jump to next instruction

%break
.L${opcode}_checks:
    LOAD_base_offObject_clazz(a0, rBIX)    #  a0 <- obj->clazz
    LOAD_base_offObject_clazz(a1, rINST)   #  a1 <- arrayObj->clazz
    JAL(dvmCanPutArrayElement)             #  test object type vs. array type
    beqz      v0, .L${opcode}_throw        #  okay ?
    lw        a2, offThread_cardTable(rSELF)
    srl       t1, rINST, GC_CARD_SHIFT
    addu      t2, a2, t1
    sb        a2, (t2)
    b         .L${opcode}_finish           #  yes, skip type checks
.L${opcode}_throw:
    LOAD_base_offObject_clazz(a0, rBIX)    #  a0 <- obj->clazz
    LOAD_base_offObject_clazz(a1, rINST)   #  a1 <- arrayObj->clazz
    EXPORT_PC()
    JAL(dvmThrowArrayStoreExceptionIncompatibleElement)
    b         common_exceptionThrown