189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project%default { "isrange":"0", "routine":"NoRange" }
289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project%verify "executed"
389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project%verify "unknown method"
489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Handle a "super" method call.
689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: invoke-super, invoke-super/range
889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
119f601a917c8878204482c37aec7005054b6776fabuzbee    movl      rSELF,rINST
1289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
139f601a917c8878204482c37aec7005054b6776fabuzbee    movl      offThread_methodClassDex(rINST),%ecx # ecx<- pDvmDex
14f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    EXPORT_PC
1589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResMethods(%ecx),%ecx # ecx<- pDvmDex->pResMethods
1689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%ecx        # ecx<- resolved baseMethod
179f601a917c8878204482c37aec7005054b6776fabuzbee    movl      offThread_method(rINST),%eax # eax<- method
18f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    movzwl    4(rPC),rINST              # rINST<- GFED or CCCC
1989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if       (!$isrange)
20f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    andl      $$0xf,rINST               # rINST<- D (or stays CCCC)
2189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
220c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    GET_VREG_R  %edx rINST             # %edx<- "this" ptr
230c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    testl     %edx,%edx                # null "this"?
240c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    SPILL_TMP1(%edx)
2589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject      # yes, throw
2689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offMethod_clazz(%eax),%eax # eax<- method->clazz
2789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %ecx,%ecx                 # already resolved?
28a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    je       .L${opcode}_resolve
2989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
3089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * At this point:
3189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  ecx = resolved base method [r0]
3289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  eax = method->clazz [r9]
3389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
3489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L${opcode}_continue:
3589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offClassObject_super(%eax),%eax   # eax<- method->clazz->super
360c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    movzwl  offMethod_methodIndex(%ecx),%edx  # edx<- baseMthod->methodIndex
370c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    cmpl    offClassObject_vtableCount(%eax),%edx # compare(methodIndex,vtableCount)
3889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jae     .L${opcode}_nsm           # method not present in superclass
3989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offClassObject_vtable(%eax),%eax   # eax<- ...clazz->super->vtable
400c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    movl    (%eax,%edx,4),%eax        # eax<- vtable[methodIndex]
410c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    UNSPILL_TMP1(%edx)
420c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    movl    %edx, %ecx
43c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp     common_invokeMethod${routine}
44c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
4589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
4689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* At this point:
4789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * ecx = null (needs to be resolved base method)
4889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * eax = method->clazz
4989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    */
5089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L${opcode}_resolve:
510c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    SPILL_TMP2(%eax)                    # method->clazz
5289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)         # arg0<- method->clazz
5389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  2(rPC),%ecx                 # ecx<- BBBB
5489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $$METHOD_VIRTUAL,OUT_ARG2(%esp)  # arg2<- resolver method type
5589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)         # arg1<- ref
5689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmResolveMethod            # eax<- call(clazz, ref, flags)
5789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                   # got null?
5889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,%ecx                   # ecx<- resolved base method
590c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    UNSPILL_TMP2(%eax)                  # restore method->clazz
6089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .L${opcode}_continue        # good to go - continue
6189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown      # handle exception
6289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
6389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
6489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Throw a NoSuchMethodError with the method name as the message.
6589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  ecx = resolved base method
6689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
6789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L${opcode}_nsm:
6889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offMethod_name(%ecx),%eax
6989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_errNoSuchMethod
70