beautypg.com

Motorola DSP96002 User Manual

Page 687

background image

B-168

DSP96002 USER’S MANUAL

MOTOROLA

rol d3 ; shift mantr.h left

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

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

jmp _st1 ; jump if sticky bit = 1

;

; *** Cases: 1) Addend 0 is Negative,

; Addend 1 is Negative

; 2) Addend 0 is Positive,

; Addend 1 is Positive ***

;

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

_fadd add d0,d1 ; add for case: a0-,a1-

addc d2,d3 ; and case: a0+,a1+

jcc _rnd ; jump if number normalized

lsr d3 ; shift right mantr.h

ror d1 ; shift right mantr.low

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

bset #8,d1.l ; set sticky bit

_cclr4 bset #31,d3.l ; set bit 31 of mantr.high

inc d6 ; increment expr

;

; Check if Result is Infinity

;

move #emsk,d7.l ; get exp mask

move d6.l,d5.l ; get expr

and d7,d5 ; delete tags

cmp d7,d5 ; check max exp

jne _rnd ; jump if no overflow

jset #31,d6.l,_ninf ; jump if result is -infinity

;

; Positive Infinity

;

jset #22,sr,_rmchk ; jump if rounding bit r1 = 1

jclr #21,sr,_setinf ; jump if rounding bit r0 = 0

jmp _setbig ; round toward zero case

;

; Negative Infinity

;

_ninf jclr #21,sr,_setinf ; jump if rounding bit r0 = 0

;

; Result is Largest Number Less Than Infinity

;

_setbig dec d6 ; get big exponent

move #qnanml,d1.m ; get mantr.high

move #maxnum,d1.l ; get mantr.low

ori #$09,ier ; set OVF and INX bits in IER

ori #$09,er ; set OVF and INX bits in ER

jmp _emove ; get expr

_rmchk jclr #21,sr,_setbig ; round toward -inf case

;

; Result is Infinity

;

_setinf move #0,d1.l ; set result to infinity

move #0,d1.m ; "