Sindbad~EG File Manager
/* PPC assembly code by Nick Burgoyne
Given to me November 1998 for use in Mac Mathpert
*/
void MulA(ulong X,ulong Y,ulong* L,ulong* H);
void DivA(ulong H,ulong L,ulong D,ulong* Q,ulong* R);
/* -------------------------------------------------------- */
asm void MulA() {
mullw r8,r4,r3 // lo(X*Y)
stw r8,0(r5) // store at &L
mulhwu r9,r4,r3 // hi(X*Y)
stw r9,0(r6) // store at &H
blr // return
}
/* -------------------------------------------------------- */
asm void DivA() {
cmplwi r3,0 // compare H to 0
bgt @d1 // branch if H > 0
divwu r8,r4,r5 // Q = L/D
stw r8,0(r6) // store Q
mullw r9,r5,r8 // D*Q
subf r9,r9,r4 // R = L-Q*D
stw r9,0(r7) // store R
blr // exit (case H = 0)
@d1 cntlzw r0,r5 // c counts leading 0's in D
cmplwi r0,0 // branch if c is 0
beq @d2 // else shift D and H,L
slw r3,r3,r0 // H <<= c
subfic r9,r0,32 // d = 32-c (temp)
mr r8,r4 // t = L (temp)
slw r5,r5,r0 // D <<= c
srw r8,r8,r9 // t >>= d
slw r4,r4,r0 // L <<= c
add r3,r3,r8 // H += t
@d2 rlwinm r9,r5,16,16,31 // d = D>>16 (16 bit div)
lis r8,1 // t = 0x10000 (temp)
andi. r10,r5,0xFFFF // e = D&0xffff
addi r9,r9,1 // d += 1
subf r10,r10,r8 // e = t-e
divwu r11,r3,r9 // q = H/d (first divide)
mullw r8,r11,r9 // t = q*d
subf r3,r8,r3 // H -= t
rlwinm r3,r3,16,0,15 // H <<= 16
rlwimi r3,r4,16,16,31 // insert hi part of L in H
mullw r8,r11,r10 // t = q*e
add r3,r3,r8 // H += t
cmplw r3,r8 // if (H � t) branch
bge @d3 // else adjust H = R
addi r11,r11,1 // q += 1
subf r3,r5,r3 // H -= D
@d3 cmplw r3,r5 // if (H < D) branch
blt @d4 // else adjust H = R
addi r11,r11,1 // q += 1
subf r3,r5,r3 // H -= D
@d4 rlwinm r12,r11,16,0,15 // Q = q << 16 (hi part)
divwu r11,r3,r9 // q = H/d (second divide)
mullw r8,r11,r9
subf r3,r8,r3
rlwinm r3,r3,16,0,15
rlwimi r3,r4,0,16,31 // insert lo part of L in H
mullw r8,r11,r10
add r3,r3,r8
cmplw r3,r8
bge @d5
addi r11,r11,1
subf r3,r5,r3
@d5 cmplw r3,r5
blt @d6
addi r11,r11,1
subf r3,r5,r3
@d6 add r12,r12,r11 // Q += q
stw r12,0(r6) // store Q in &Q
srw r9,r3,r0 // R = H>>c
stw r9,0(r7) // store R in &R
blr // return
}
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists