Motorola DSP96002 User Manual
Page 713
B-194
DSP96002 USER’S MANUAL
MOTOROLA
; Entry point: dp_scale: c(r0)
←
c(r0) * 2**r1
;
; Inputs: r0 contains the lowest address of a 4-word internal
; extended precision number
; r1 contains an integer number
;
; Outputs: r0 contains the lowest address of a 4-word internal
; extended precision number
;
; Alters: D0.L,D1.L
;
; NOTE: r1 contains an integer. (It does NOT point to an address.)
;
dp_scale move r1,d0.l ;put scale factor in data register
move x:(r0),d1.l ;get exponent
add d0,d1 #$3fffffff,d0.l ;scale the number
jvc scle ;scale if no overflow
move d0.l,x:(r0) ; if overflow,
move #$ffffffff,d0.l ; set the result
move d0.l,x:(r0+ms) ; to the maximum
move d0.l,x:(r0+ls) ; number achievable
rts
scle move d1.l,x:(r0) ;save scaled exponent
rts
page
;
; MOTOROLA DSP96002 DPLIB - VERSION 1.0
;
; DP_SQRT - Find the square root of a double precision number.
;
; Entry point: dp_sqrt: c(r0)
←
sqrt(c(r0))
;
; Inputs: r0 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
;
; Alters: D0.L,D1.L,D2.L,D3.L,D4.L,D5.L,D6.L,D7.L
;
dp_sqrt move x:(r0+ms),d0.l ;get most significant
tst d0 x:(r0),d1.l ;check, get exponent
jne _ok ;not zero
tst d1 ;check ls
jne _ok ;not zero
rts ;if already 0, return
_ok
move x:(r0+sign),d0.l ;get sign
tst d0 ;check for negative
jne uflow ;return 0
move #bias,d2.l ;get bias
sub d2,d1 #1,d0.l ;unbias exponent
lsr d1 ;square root of exponent