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 put.
      8      */
      9     /* iput-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
     10     movl    rSELF,%ecx
     11     SPILL(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)
     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 obj pointer 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                           #  ... which 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      *   rIBASE is scratch, but needs to be unspilled
     39      *   rINST holds BBBB
     40      */
     41     movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
     42     testl   %ecx,%ecx                           # object null?
     43     je      common_errNullObject                # object was null
     44     leal    (%ecx,%eax,1),%eax                  # eax<- address of field
     45     GET_VREG_WORD %ecx rINST 0                  # ecx<- lsw
     46     GET_VREG_WORD rINST rINST 1                 # rINST<- msw
     47     movl    rINST,4(%eax)
     48     movl    %ecx,(%eax)
     49     FETCH_INST_OPCODE 5 %ecx
     50     UNSPILL(rIBASE)
     51     ADVANCE_PC 5
     52     GOTO_NEXT_R %ecx
     53