Home | History | Annotate | Download | only in x86
      1 %verify "executed"
      2 %verify "unknown method"
      3     /*
      4      * Handle a jumbo direct method call.
      5      *
      6      * (We could defer the "is 'this' pointer null" test to the common
      7      * method invocation code, and use a flag to indicate that static
      8      * calls don't count.  If we do this as part of copying the arguments
      9      * out we could avoiding loading the first arg twice.)
     10      */
     11     /* invoke-direct/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
     12     movl      rSELF,%ecx
     13     movl      2(rPC),%eax              # eax<- AAAAAAAA
     14     movl      offThread_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
     15     EXPORT_PC
     16     movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
     17     movzwl    8(rPC),rIBASE            # rIBASE<- CCCC
     18     movl      (%ecx,%eax,4),%eax       # eax<- resolved methodToCall
     19     testl     %eax,%eax                # already resolved?
     20     GET_VREG_R  %ecx rIBASE            # ecx<- "this" ptr
     21     je        .L${opcode}_resolve      # not resolved, do it now
     22 .L${opcode}_finish:
     23     testl     %ecx,%ecx                # null "this"?
     24     jne       common_invokeMethodJumbo # no, continue on
     25     jmp       common_errNullObject
     26 
     27     /*
     28      * On entry:
     29      *   TMP_SPILL  <- "this" register
     30      * Things a bit ugly on this path, but it's the less
     31      * frequent one.  We'll have to do some reloading.
     32      */
     33 .L${opcode}_resolve:
     34      SPILL_TMP1(%ecx)
     35      movl     rSELF,%ecx
     36      movl     offThread_method(%ecx),%ecx  # ecx<- self->method
     37      movl     2(rPC),%eax      # reference AAAAAAAA
     38      movl     offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
     39      movl     $$METHOD_DIRECT,OUT_ARG2(%esp)
     40      movl     %eax,OUT_ARG1(%esp)
     41      movl     %ecx,OUT_ARG0(%esp)
     42      call     dvmResolveMethod # eax<- call(clazz, ref, flags)
     43      UNSPILL_TMP1(%ecx)
     44      testl    %eax,%eax
     45      jne      .L${opcode}_finish
     46      jmp      common_exceptionThrown
     47