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      * Jumbo 64-bit instance field get.
      8      */
      9     /* iget-wide/jumbo vBBBB, vCCCC, field@AAAA */
     10     movl    rSELF,%ecx
     11     SPILL(rIBASE)                               # preserve 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)               # for dvmResolveInstField
     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 objpointer 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                           # 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      *   rINST holds BBBB
     39      */
     40     movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
     41     testl   %ecx,%ecx                           # object null?
     42     je      common_errNullObject                # object was null
     43     leal    (%ecx,%eax,1),%eax                  # eax<- address of field
     44     movl    (%eax),%ecx                         # ecx<- lsw
     45     movl    4(%eax),%eax                        # eax<- msw
     46     SET_VREG_WORD %ecx rINST 0
     47     FETCH_INST_OPCODE 5 %ecx
     48     UNSPILL(rIBASE)                             # restore rIBASE
     49     SET_VREG_WORD %eax rINST 1
     50     ADVANCE_PC 5
     51     GOTO_NEXT_R %ecx
     52