blob: 03b6d3834ec4454f7be72ab59d210538c84a593f [file] [log] [blame]
%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
sw rBIX, offArrayObject_contents(rOBJ) # vBB[vCC] <- vAA
GET_INST_OPCODE(t0) # extract opcode from rINST
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