Motorola DSP96002 User Manual
Page 677
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