Home | History | Annotate | Download | only in mips
      1 %default { "routine":"NoRange" }
      2 %verify "executed"
      3 %verify "unknown method"
      4     /*
      5      * Handle a static method call.
      6      *
      7      * for: invoke-static, invoke-static/range
      8      */
      9     # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
     10     # op {vCCCC..v(CCCC+AA-1)}, meth       /* BBBB */
     11     LOAD_rSELF_methodClassDex(a3)          #  a3 <- pDvmDex
     12     FETCH(a1, 1)                           #  a1 <- BBBB
     13     LOAD_base_offDvmDex_pResMethods(a3, a3) #  a3 <- pDvmDex->pResMethods
     14     li      rOBJ, 0                        #  null "this" in delay slot
     15     LOAD_eas2(a0, a3, a1)                  #  a0 <- resolved methodToCall
     16 #if defined(WITH_JIT)
     17     EAS2(rBIX, a3, a1)                     #  rBIX<- &resolved_metherToCall
     18 #endif
     19     EXPORT_PC()                            #  must export for invoke
     20     # already resolved?
     21     bnez      a0, common_invokeMethod${routine} #  yes, continue on
     22     b         .L${opcode}_resolve
     23 %break
     24 
     25 .L${opcode}_resolve:
     26     LOAD_rSELF_method(a3)                  #  a3 <- self->method
     27     LOAD_base_offMethod_clazz(a0, a3)      #  a0 <- method->clazz
     28     li        a2, METHOD_STATIC            #  resolver method type
     29     JAL(dvmResolveMethod)                  #  v0 <- call(clazz, ref, flags)
     30     move      a0, v0
     31 #if defined(WITH_JIT)
     32     /*
     33      * Check to see if we're actively building a trace.  If so,
     34      * we need to keep this instruction out of it.
     35      * rBIX: &resolved_methodToCall
     36      */
     37     lhu       a2, offThread_subMode(rSELF)
     38     beqz      v0, common_exceptionThrown   #  null, handle exception
     39     and       a2, kSubModeJitTraceBuild    #  trace under construction?
     40     beqz      a2, common_invokeMethod${routine} #  no, (a0=method, rOBJ="this")
     41     lw        a1, 0(rBIX)                  #  reload resolved method
     42     # finished resloving?
     43     bnez      a1, common_invokeMethod${routine} #  yes, (a0=method, rOBJ="this")
     44     move      rBIX, a0                     #  preserve method
     45     move      a0, rSELF
     46     move      a1, rPC
     47     JAL(dvmJitEndTraceSelect)              #  (self, pc)
     48     move      a0, rBIX
     49     b         common_invokeMethod${routine} #  whew, finally!
     50 #else
     51     # got null?
     52     bnez      v0, common_invokeMethod${routine} #  (a0=method, rOBJ="this")
     53     b         common_exceptionThrown       #  yes, handle exception
     54 #endif
     55