Motorola DSP96002 User Manual

Page 677

Advertising
background image

B-158

DSP96002 USER’S MANUAL

MOTOROLA

add d7,d1 ; "

jcc _zchk ; "

inc d3 ; "

jmp _zchk ;

;

; *** Case: Addend 0 is Positive,

; Addend 1 is Negative ***

;

_neg2 bclr #31,d6.l ; set result as positive

sub d1,d0 ; subtract for case: a0+,a1-

subc d3,d2 ; "

jcc _cclr3 ; jump if result is positive

bset #31,d6.l ; set result as negative

move #inum,d7.l ; get increment number

not d0 ; get 2’s comp of result

not d2 ; "

add d7,d0 ; "

jcc _cclr3 ; "

inc d2 ; "

_cclr3 move d0.l,d1.l ; get mantr.low and GRS bits

move d2.l,d3.l ; get mantr.high

;

; Check result equal zero (do not want to normalize)

;

_zchk move #smsk,d7.l ; get sticky mask

and d7,d1 ; remove bits right of sticky

tst d3 ; check mantr.high = zero

jne _snrm ; normalize result

tst d1 ; check mantr.low = zero

jne _snrm ; normalize result

move #0,d6.l ; set expr = zero

;

; Check for Special Case (Round toward -infinity)

;

jclr #22,sr,_rnd ; jump if round bit r1 = zero

jset #21,sr,_rnd ; jump if round bit r0 = one

bset #31,d6.l ; set result to negative zero

jmp _rnd ; check rounding mode

;

; Normalize for Opposite Sign Cases

;

_snrm jset #31,d3.l,_rnd ; jump if result normalized

move #emsk,d7.l ; get exp mask

move d6.l,d5.l ; get expr

and d7,d5 ; delete tags

move #eden,d4.l ; get denorm exponent

jclr #8,d1.l,_st0 ; jump if sticky bit = 0

move #onemsk,d7.l ; get one mask

_st1 or d7,d1 ; set bits right of round bit

_st0 cmp d4,d5 ; test expr = zero

jle _rnd ; jump if denormalized number

dec d6 ; decrement expr

dec d5 ; decrement expr copy

lsl d1 ; shift mantr.l left

Advertising