1%default {"volatile":"0"} 2%verify "executed" 3%verify "null object" 4%verify "field already resolved" 5%verify "field not yet resolved" 6%verify "field cannot be resolved" 7 /* iput-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */ 8 FETCH(a1, 1) # a1<- aaaa (lo) 9 FETCH(a2, 2) # a2<- AAAA (hi) 10 FETCH(a0, 4) # a0<- CCCC 11 LOAD_rSELF_methodClassDex(a3) # a3 <- DvmDex 12 sll a2,a2,16 13 or a1, a1, a2 # a1<- AAAAaaaa 14 15 LOAD_base_offDvmDex_pResFields(a2, a3) # a2 <- pResFields 16 GET_VREG(rOBJ, a0) # rOBJ <- fp[B], the object pointer 17 LOAD_eas2(a0, a2, a1) # a0 <- resolved InstField ptr 18 # is resolved entry null? 19 bnez a0, .L${opcode}_finish # no, already resolved 20 LOAD_rSELF_method(a2) # a2 <- current method 21 EXPORT_PC() # resolve() could throw 22 LOAD_base_offMethod_clazz(a0, a2) # a0 <- method->clazz 23 JAL(dvmResolveInstField) # v0 <- resolved InstField ptr 24 b .L${opcode}_resolved # resolved, continue 25 26%break 27 28.L${opcode}_resolved: 29 move a0, v0 30 beqz a0, common_exceptionThrown 31 # fall through to ${opcode}_finish 32 /* 33 * Currently: 34 * a0 holds resolved field 35 * rOBJ holds object 36 */ 37.L${opcode}_finish: 38 FETCH(a2, 3) # a1<- BBBB 39 LOAD_base_offInstField_byteOffset(a3, a0) # a3 <- byte offset of field 40 EAS2(a2, rFP, a2) # a2 <- &fp[BBBB] 41 # check object for null 42 beqz rOBJ, common_errNullObject # object was null 43 FETCH_ADVANCE_INST(5) # advance rPC, load rINST 44 LOAD64(a0, a1, a2) # a0/a1 <- fp[BBBB] 45 GET_INST_OPCODE(rBIX) # extract opcode from rINST 46 addu a2, rOBJ, a3 # form address 47 .if $volatile 48 JAL(dvmQuasiAtomicSwap64Sync) # stores r0/r1 into addr r2 49# STORE64(a0, a1, a2) # obj.field (64 bits, aligned) <- a0 a1 50 .else 51 STORE64(a0, a1, a2) # obj.field (64 bits, aligned) <- a0 a1 52 .endif 53 GOTO_OPCODE(rBIX) # jump to next instruction 54 55 56