/ SCCSID: @(#)ulrem.s 3.0 4/22/86 / ////////////////////////////////////////////////////////////////////// / Copyright (c) Digital Equipment Corporation 1984, 1985, 1986. / / All Rights Reserved. / / Reference "/usr/src/COPYRIGHT" for applicable restrictions. / ////////////////////////////////////////////////////////////////////// / / Unsigned long remainder / / Based on: (System V) ulrem.s 1.3 .globl ulrem .globl csv, cret ulrem: jsr r5,csv tst 8.(r5) bne hardlrem mov 10.(r5),r3 bmi hardlrem mov 6.(r5),r2 mov 4.(r5),r1 bmi hardest clr r0 div r3,r0 mov r1,r0 mov r2,r1 mov r0,r4 div r3,r0 bvc 1f mov r4,r0 mov r2,r1 sub r3,r0 / this is the clever part div r3,r0 tst r1 beq 1f add r3,r1 1: clr r0 jmp cret / The divisor is known to be >= 2^15 so only 16 cycles are needed. hardlrem: mov 6.(r5),r2 mov 4.(r5),r1 clr r0 mov 8.(r5),r3 mov $16.,r4 1: clc rol r2 rol r1 rol r0 cmp r3,r0 bhi 3f blo 2f cmp 10.(r5),r1 blos 2f 3: sob r4,1b br 1f 2: sub 10.(r5),r1 sbc r0 sub r3,r0 sob r4,1b 1: jmp cret / The dividend is known to be >= 2^31 so 32 cycles are needed. hardest: mov 6.(r5),r3 mov 4.(r5),r2 clr r1 clr r0 mov $32.,r4 1: clc rol r3 rol r2 rol r1 rol r0 cmp 8.(r5),r0 bhi 3f blo 2f cmp 10.(r5),r1 blos 2f 3: sob r4,1b br 1f 2: sub 10.(r5),r1 sbc r0 sub 8.(r5),r0 sob r4,1b 1: jmp cret