beautypg.com

Motorola DSP96002 User Manual

Page 713

background image

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