1%verify "executed"
2%verify "field already resolved"
3%verify "field not yet resolved"
4%verify "field cannot be resolved"
5    /*
6     * SPUT object handler.
7     */
8    /* op vAA, field@BBBB */
9    movl      rSELF,%ecx
10    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
11    movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
12    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
13#if defined(WITH_JIT)
14    movl      %ecx, TMP_SPILL1(%ebp)
15    lea       (%ecx,%eax,4),%ecx
16    movl      %ecx, TMP_SPILL2(%ebp)
17    movl      TMP_SPILL1(%ebp), %ecx
18#endif
19    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField
20    testl     %eax,%eax                          # resolved entry null?
21    je        .L${opcode}_resolve                # if not, make it so
22.L${opcode}_finish:                              # field ptr in eax
23    movzbl    rINSTbl,%ecx                       # ecx<- AA
24    GET_VREG_R  %ecx %ecx
25    movl      %ecx,offStaticField_value(%eax)    # do the store
26    testl     %ecx,%ecx                          # stored null object ptr?
27    je        1f                                 # skip card mark if null
28    movl      rSELF,%ecx
29    movl      offField_clazz(%eax),%eax          # eax<- method->clazz
30    movl      offThread_cardTable(%ecx),%ecx       # get card table base
31    shrl      $$GC_CARD_SHIFT,%eax               # head to card number
32    movb      %cl,(%ecx,%eax)                    # mark card
331:
34    FETCH_INST_OPCODE 2 %ecx
35    ADVANCE_PC 2
36    GOTO_NEXT_R %ecx
37
38.L${opcode}_resolve:
39    movl     rSELF,%ecx
40    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
41    movl     offThread_method(%ecx),%ecx          # ecx<- current method
42    EXPORT_PC                                   # could throw, need to export
43    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
44    movl     %eax,OUT_ARG1(%esp)
45    movl     %ecx,OUT_ARG0(%esp)
46    SPILL(rIBASE)
47    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
48    UNSPILL(rIBASE)
49    testl    %eax,%eax
50    je      common_exceptionThrown             # no, handle exception
51#if defined(WITH_JIT)
52    movl      TMP_SPILL2(%ebp), %ecx
53    SPILL(rIBASE)
54    call     common_verifyField
55    UNSPILL(rIBASE)
56#endif
57    jmp      .L${opcode}_finish                 # success, continue
58