-ldivu:\r
- move.l 4(%a7),%d0\r
- move.l 8(%a7),%d1\r
- bsr i_ldiv\r
- rts\r
-\r
-lmulu:\r
- move.l 4(%a7),%d0\r
- move.l 8(%a7),%d1\r
- bsr i_lmul\r
- rts\r
-\r
-lremu:\r
- move.l 4(%a7),%d0\r
- move.l 8(%a7),%d1\r
- bsr i_ldiv\r
- move.l %d1,%d0\r
- rts\r
-*\r
-* A in d0, B in d1, return A*B in d0\r
-*\r
-i_lmul:\r
- move.l %d3,%a2 /* save d3 */\r
- move.w %d1,%d2\r
- mulu %d0,%d2 /* d2 = Al * Bl */\r
-\r
- move.l %d1,%d3\r
- swap %d3\r
- mulu %d0,%d3 /* d3 = Al * Bh */\r
-\r
- swap %d0\r
- mulu %d1,%d0 /* d0 = Ah * Bl */\r
-\r
- add.l %d3,%d0 /* d0 = (Ah*Bl + Al*Bh) */\r
- swap %d0\r
- clr.w %d0 /* d0 = (Ah*Bl + Al*Bh) << 16 */\r
-\r
- add.l %d2,%d0 /* d0 = A*B */\r
- move.l %a2,%d3 /* restore d3 */\r
- rts\r
-*\r
-*A in d0, B in d1, return A/B in d0, A%B in d1\r
-*\r
-i_ldiv:\r
- tst.l %d1\r
- bne nz1\r
-\r
-* divide by zero\r
-* divu #0,%d0 /* cause trap */\r
- move.l #0x80000000,%d0\r
- move.l %d0,%d1\r
- rts\r
-nz1:\r
- move.l %d3,%a2 /* save d3 */\r
- cmp.l %d1,%d0\r
- bhi norm\r
- beq is1\r
-* A<B, so ret 0, rem A\r
- move.l %d0,%d1\r
- clr.l %d0\r
- move.l %a2,%d3 /* restore d3 */\r
- rts\r
-* A==B, so ret 1, rem 0\r
-is1:\r
- moveq.l #1,%d0\r
- clr.l %d1\r
- move.l %a2,%d3 /* restore d3 */\r
- rts\r
-* A>B and B is not 0\r
-norm:\r
- cmp.l #1,%d1\r
- bne not1\r
-* B==1, so ret A, rem 0\r
- clr.l %d1\r
- move.l %a2,%d3 /* restore d3 */\r
- rts\r
-* check for A short (implies B short also)\r
-not1:\r
- cmp.l #0xffff,%d0\r
- bhi slow\r
-* A short and B short -- use 'divu'\r
- divu %d1,%d0 /* d0 = REM:ANS */\r
- swap %d0 /* d0 = ANS:REM */\r
- clr.l %d1\r
- move.w %d0,%d1 /* d1 = REM */\r
- clr.w %d0\r
- swap %d0\r
- move.l %a2,%d3 /* restore d3 */\r
- rts\r
-* check for B short\r
-slow:\r
- cmp.l #0xffff,%d1\r
- bhi slower\r
-* A long and B short -- use special stuff from gnu\r
- move.l %d0,%d2\r
- clr.w %d2\r
- swap %d2\r
- divu %d1,%d2 /* d2 = REM:ANS of Ahi/B */\r
- clr.l %d3\r
- move.w %d2,%d3 /* d3 = Ahi/B */\r
- swap %d3\r
-\r
- move.w %d0,%d2 /* d2 = REM << 16 + Alo */\r
- divu %d1,%d2 /* d2 = REM:ANS of stuff/B */\r
-\r
- move.l %d2,%d1\r
- clr.w %d1\r
- swap %d1 /* d1 = REM */\r
-\r
- clr.l %d0\r
- move.w %d2,%d0\r
- add.l %d3,%d0 /* d0 = ANS */\r
- move.l %a2,%d3 /* restore d3 */\r
- rts\r
-* A>B, B > 1\r
-slower:\r
- move.l #1,%d2\r
- clr.l %d3\r
-moreadj:\r
- cmp.l %d0,%d1\r
- bhs adj\r
- add.l %d2,%d2\r
- add.l %d1,%d1\r
- bpl moreadj\r
-* we shifted B until its >A or sign bit set\r
-* we shifted #1 (d2) along with it\r
-adj:\r
- cmp.l %d0,%d1\r
- bhi ltuns\r
- or.l %d2,%d3\r
- sub.l %d1,%d0\r
-ltuns:\r
- lsr.l #1,%d1\r
- lsr.l #1,%d2\r
- bne adj\r
-* d3=answer, d0=rem\r
- move.l %d0,%d1\r
- move.l %d3,%d0\r
- move.l %a2,%d3 /* restore d3 */\r
- rts\r