Home | History | Annotate | Download | only in x86
      1 %default { "func":"dvmInterpHandlePackedSwitch" }
      2 %verify executed
      3     /*
      4      * Handle a packed-switch or sparse-switch instruction.  In both cases
      5      * we decode it and hand it off to a helper function.
      6      *
      7      * We don't really expect backward branches in a switch statement, but
      8      * they're perfectly legal, so we check for them here.
      9      *
     10      * for: packed-switch, sparse-switch
     11      */
     12     /* op vAA, +BBBB */
     13     movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
     14     movl    2(rPC),%ecx                 # ecx<- BBBBbbbb
     15     GET_VREG(%eax,rINST_FULL)           # eax<- vAA
     16     leal    (rPC,%ecx,2),%ecx           # ecx<- PC + BBBBbbbb*2
     17     movl    %eax,OUT_ARG1(%esp)         # ARG1<- vAA
     18     movl    %ecx,OUT_ARG0(%esp)         # ARG0<- switchData
     19     SPILL(rPC)
     20     call    $func
     21     UNSPILL(rPC)
     22     testl   %eax,%eax
     23     movl    %eax,rINST_FULL             # set up word offset
     24     jle     common_backwardBranch       # check on special actions
     25     ADVANCE_PC_INDEXED(rINST_FULL)
     26     FETCH_INST()
     27     GOTO_NEXT
     28