Sindbad~EG File Manager

Current Path : /usr/home/beeson/MathXpert/bignums/
Upload File :
Current File : /usr/home/beeson/MathXpert/bignums/ppc.asm

/* 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