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