.global dvu4 .global dvi4 .global mathdvi4 EIDIVZ=6 dvi4: ! %o0' = %o0 / %o1 ! %o1' = %o0 % %o1 tst %o1 be 0f clr %o5 tst %o0 bge 1f nop neg %o0 xor %o5, 1, %o5 1: tst %o1 bge 3f nop neg %o1 xor %o5, 2, %o5 3: /* div common */ clr %o2 mov %o1, %o3 clr %o4 4: cmp %o1, %o0 bgeu 5f nop inc %o4 sll %o1, 1, %o1 b 4b nop 5: sll %o2, 1, %o2 subcc %o0, %o1, %o0 bgeu 3f nop add %o0, %o1, %o0 b 4f nop 3: inc %o2 4: srl %o1, 1, %o1 tst %o4 bz 5f nop dec %o4 b 5b nop 5: andcc %o5, 1, %g0 bz 6f nop neg %o0 neg %o2 6: andcc %o5, 2, %g0 bz 8f nop neg %o2 8: mov %o0, %o1 mov %o2, %o0 retl nop dvu4: ! %o0' = %o0 / %o1 ! %o1' = %o0 % %o1 tst %o1 be 0f nop clr %o5 tst %o0 bge 3f /* jump if msb clear */ nop clr %o2 mov %o1, %o3 clr %o4 1: tst %o1 bl 5f /* jump if msb set */ nop sll %o1, 1, %o1 inc %o4 b 1b nop mathdvi4: ! %o0' = %o0 / %o1 ! %o1' = %o0 % %o1 tst %o1 be 0f clr %o5 tst %o0 bge 1f nop neg %o0 xor %o5, 1, %o5 1: tst %o1 bge 3f nop neg %o1 xor %o5, 3, %o5 3: /* div common */ clr %o2 mov %o1, %o3 clr %o4 4: cmp %o1, %o0 bgeu 5f nop inc %o4 sll %o1, 1, %o1 b 4b nop 5: /* div common for dvu4 && ( %o0 & 0x80000000) */ sll %o2, 1, %o2 subcc %o0, %o1, %o0 bgeu 3f nop add %o0, %o1, %o0 b 4f nop 3: inc %o2 4: srl %o1, 1, %o1 tst %o4 bz 5f nop dec %o4 b 5b nop 5: andcc %o5, 1, %g0 bz 6f nop tst %o0 bz 7f nop inc %o2 sub %o3, %o0, %o0 7: neg %o2 6: andcc %o5, 2, %g0 bz 8f nop neg %o0 8: mov %o0, %o1 mov %o2, %o0 retl nop 0: /* divide by zero */ set EIDIVZ, %o0 call trp nop retl nop