1 %verify "executed" 2 %verify "null object" 3 %verify "field already resolved" 4 %verify "field not yet resolved" 5 %verify "field cannot be resolved" 6 /* 7 * Jumbo 64-bit instance field put. 8 */ 9 /* iput-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */ 10 movl rSELF,%ecx 11 SPILL(rIBASE) 12 movl 2(rPC),rIBASE # rIBASE<- AAAAAAAA 13 movl offThread_methodClassDex(%ecx),%eax # eax<- DvmDex 14 movzwl 8(rPC),%ecx # ecx<- CCCC 15 movl offDvmDex_pResFields(%eax),%eax # eax<- pDvmDex->pResFields 16 GET_VREG_R %ecx %ecx # ecx<- fp[CCCC], the object ptr 17 movl (%eax,rIBASE,4),%eax # resolved entry 18 testl %eax,%eax # is resolved entry null? 19 jne .L${opcode}_finish # no, already resolved 20 movl rIBASE,OUT_ARG1(%esp) 21 movl rSELF,rIBASE 22 EXPORT_PC 23 movl offThread_method(rIBASE),rIBASE # rIBASE<- current method 24 movl offMethod_clazz(rIBASE),rIBASE # rIBASE<- method->clazz 25 SPILL_TMP1(%ecx) # save obj pointer across call 26 movl rIBASE,OUT_ARG0(%esp) # pass in method->clazz 27 call dvmResolveInstField # ... to dvmResolveInstField 28 UNSPILL_TMP1(%ecx) 29 testl %eax,%eax # ... which returns InstrField ptr 30 jne .L${opcode}_finish 31 jmp common_exceptionThrown 32 33 .L${opcode}_finish: 34 /* 35 * Currently: 36 * eax holds resolved field 37 * ecx holds object 38 * rIBASE is scratch, but needs to be unspilled 39 * rINST holds BBBB 40 */ 41 movl offInstField_byteOffset(%eax),%eax # eax<- byte offset of field 42 testl %ecx,%ecx # object null? 43 je common_errNullObject # object was null 44 leal (%ecx,%eax,1),%eax # eax<- address of field 45 GET_VREG_WORD %ecx rINST 0 # ecx<- lsw 46 GET_VREG_WORD rINST rINST 1 # rINST<- msw 47 movl rINST,4(%eax) 48 movl %ecx,(%eax) 49 FETCH_INST_OPCODE 5 %ecx 50 UNSPILL(rIBASE) 51 ADVANCE_PC 5 52 GOTO_NEXT_R %ecx 53