/* | |
* Signed 64-bit integer multiply. | |
* | |
* We could definately use more free registers for | |
* this code. We spill rINSTw (ebx), | |
* giving us eax, ebc, ecx and edx as computational | |
* temps. On top of that, we'll spill edi (rFP) | |
* for use as the vB pointer and esi (rPC) for use | |
* as the vC pointer. Yuck. | |
* | |
*/ | |
/* mul-long vAA, vBB, vCC */ | |
movzbl 2(rPC), %eax # eax <- B | |
movzbl 3(rPC), %ecx # ecx <- C | |
mov rPC, LOCAL0(%esp) # save Interpreter PC | |
mov rFP, LOCAL1(%esp) # save FP | |
mov rIBASE, LOCAL2(%esp) # save rIBASE | |
leal (rFP,%eax,4), %esi # esi <- &v[B] | |
leal (rFP,%ecx,4), rFP # rFP <- &v[C] | |
movl 4(%esi), %ecx # ecx <- Bmsw | |
imull (rFP), %ecx # ecx <- (Bmsw*Clsw) | |
movl 4(rFP), %eax # eax <- Cmsw | |
imull (%esi), %eax # eax <- (Cmsw*Blsw) | |
addl %eax, %ecx # ecx <- (Bmsw*Clsw)+(Cmsw*Blsw) | |
movl (rFP), %eax # eax <- Clsw | |
mull (%esi) # eax <- (Clsw*Alsw) | |
mov LOCAL0(%esp), rPC # restore Interpreter PC | |
mov LOCAL1(%esp), rFP # restore FP | |
leal (%ecx,rIBASE), rIBASE # full result now in rIBASE:%eax | |
SET_VREG_HIGH rIBASE, rINST # v[B+1] <- rIBASE | |
mov LOCAL2(%esp), rIBASE # restore IBASE | |
SET_VREG %eax, rINST # v[B] <- eax | |
ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 |