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