Home | History | Annotate | Download | only in x86
      1 %verify "executed"
      2     /*
      3      * Signed 64-bit integer multiply.
      4      *
      5      * We could definately use more free registers for
      6      * this code.   We spill rINSTw (ebx),
      7      * giving us eax, ebc, ecx and edx as computational
      8      * temps.  On top of that, we'll spill edi (rFP)
      9      * for use as the vB pointer and esi (rPC) for use
     10      * as the vC pointer.  Yuck.
     11      */
     12     /* mul-long vAA, vBB, vCC */
     13     movzbl    2(rPC),%eax              # eax<- B
     14     movzbl    3(rPC),%ecx              # ecx<- C
     15     SPILL_TMP2(%esi)                   # save Dalvik PC
     16     SPILL(rFP)
     17     SPILL(rINST)
     18     SPILL(rIBASE)
     19     leal      (rFP,%eax,4),%esi        # esi<- &v[B]
     20     leal      (rFP,%ecx,4),rFP         # rFP<- &v[C]
     21     movl      4(%esi),%ecx             # ecx<- Bmsw
     22     imull     (rFP),%ecx               # ecx<- (Bmsw*Clsw)
     23     movl      4(rFP),%eax              # eax<- Cmsw
     24     imull     (%esi),%eax              # eax<- (Cmsw*Blsw)
     25     addl      %eax,%ecx                # ecx<- (Bmsw*Clsw)+(Cmsw*Blsw)
     26     movl      (rFP),%eax               # eax<- Clsw
     27     mull      (%esi)                   # eax<- (Clsw*Alsw)
     28     UNSPILL(rINST)
     29     UNSPILL(rFP)
     30     leal      (%ecx,rIBASE),rIBASE # full result now in rIBASE:%eax
     31     UNSPILL_TMP2(%esi)             # Restore Dalvik PC
     32     FETCH_INST_OPCODE 2 %ecx       # Fetch next instruction
     33     movl      rIBASE,4(rFP,rINST,4)# v[B+1]<- rIBASE
     34     UNSPILL(rIBASE)
     35     movl      %eax,(rFP,rINST,4)   # v[B]<- %eax
     36     ADVANCE_PC 2
     37     GOTO_NEXT_R %ecx
     38