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