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