Motorola DSP96002 User Manual
Page 708
MOTOROLA
DSP96002 USER’S MANUAL
B-189
move d0.l,x:(r0+sign) ;apply to destination
rts
page
;
; MOTOROLA DSP96002 DPLIB - VERSION 1.0
;
; DP_DIV - Divide two double precision numbers.
;
; Entry point: dp_div: c(r0)
←
c(r0)/c(r1)
;
; Inputs: r0 contains the lowest address of a 4-word internal
; extended precision number
; r1 contains the lowest address of a 4-word internal
; extended precision number
;
; Outputs: r0 contains the lowest address of a 4-word internal
; extended precision number
;
; NOTE: Error checking:
; 0/0 returns 0
; finite/0 returns saturated value
;
; Alters: D0.L,D1.L,D4.L,D5.L,D6.L,D7.L
;
dp_div move x:(r1),d0.l ;get divisor exponent
tst d0 x:(r1),d1.l ;test, get ms
jne _notdiv0 ;non-zero
tst d1 ;test
jne _notdiv0
move x:(r0+sign),d0.l ;get sign
move x:(r1+sign),d1.l ;get sign
eor d0,d1 x:(r0),d0.l ;new sign, get dividend exp
move d1.l,x:(r0+sign) ;save new sign
tst d0 x:(r0+ms),d1.l ;test, get ms
jne oflow ;finite/0 => overflow
tst d1 ;test
jne oflow ;finite/0 => overflow
jmp uflow ;0/0 => zero
_notdiv0 move x:(r0),d1.l ;get exponent a
move x:(r1),d0.l ;get exponent x
sub d0,d1 #bias,d0.l ;new exponent, get bias
add d0,d1 ;Add bias back
move x:(r0+ms),d7.l ;a ms
move x:(r0+ls),d6.l ;a ls
move x:(r1+ms),d5.l ;x ms
move x:(r1+ls),d4.l ;x ls
cmp d5,d7 ;compare magnitudes
jhi _startdiv ;dividend>divisor
jlo _adj ;adjust if <
cmp d4,d6 ;extend comparison
jhs _startdiv ;dividend >= divisor
_adj lsr d5 ;scale down divisor
ror d4