• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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