Home | History | Annotate | Download | only in x86
      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 get.
      8      *
      9      */
     10     /* op vA, vB, field@CCCC */
     11     movl    rSELF,%ecx
     12     SPILL(rIBASE)                               # preserve 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)               # for dvmResolveInstField
     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 objpointer across call
     29     movl    rPC,OUT_ARG0(%esp)                  # pass in method->clazz
     30     call    dvmResolveInstField                 #  ... to dvmResolveInstField
     31     UNSPILL_TMP1(%ecx)
     32     testl   %eax,%eax                           # 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      *   rINST holds A
     42      */
     43     movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
     44     testl   %ecx,%ecx                           # object null?
     45     je      common_errNullObject                # object was null
     46     leal    (%ecx,%eax,1),%eax                  # eax<- address of field
     47     movl    (%eax),%ecx                         # ecx<- lsw
     48     movl    4(%eax),%eax                        # eax<- msw
     49     SET_VREG_WORD %ecx rINST 0
     50     FETCH_INST_OPCODE 2 %ecx
     51     UNSPILL(rIBASE)                             # restore rIBASE
     52     SET_VREG_WORD %eax rINST 1
     53     ADVANCE_PC 2
     54     GOTO_NEXT_R %ecx
     55