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