Motorola DSP96002 User Manual
Page 678
MOTOROLA
DSP96002 USER’S MANUAL
B-159
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 ; "