OP_INVOKE_STATIC.S revision a8b91c52fd8a90b784835dfe1f8898035266c4dd
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