Home | History | Annotate | Download | only in x86
      1 /*
      2  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
      3  * any interesting requests and then jump to the real instruction
      4  * handler.  Unlike the Arm handler, we can't do this as a tail call
      5  * because rIBASE is caller save and we need to reload it.
      6  *
      7  * Note that unlike in the Arm implementation, we should never arrive
      8  * here with a zero breakFlag because we always refresh rIBASE on
      9  * return.
     10  */
     11     EXPORT_PC
     12     movl   rSELF, %eax
     13     movl   rPC, OUT_ARG0(%esp)
     14     cmpb   $$0,offThread_breakFlags(%eax)    # anything to do?
     15     movl   rFP, OUT_ARG1(%esp)
     16     je     1f                                # reload rIBASE & resume if not
     17     movl   %eax, OUT_ARG2(%esp)
     18     call   dvmCheckBefore                    # (dPC, dFP, self)
     19     movl   rSELF, %eax
     20 1:
     21     movl   offThread_curHandlerTable(%eax), rIBASE # reload rIBASE
     22     jmp    *dvmAsmInstructionStart+(${opnum}*4)
     23