mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 00:14:25 +00:00
61 lines
2.5 KiB
ArmAsm
61 lines
2.5 KiB
ArmAsm
ttl ffp transcendental normalize internal routine (ffptnorm)
|
||
ffptnorm idnt 1,2 ffp transcendental internal normalize
|
||
|
||
xdef ffptnorm
|
||
section 9
|
||
|
||
***************************************
|
||
* (c) copyright 1981 by motorola inc. *
|
||
***************************************
|
||
|
||
******************************
|
||
* ffptnorm *
|
||
* normalize bin(29,31) value *
|
||
* and convert to float *
|
||
* *
|
||
* input: d6 - internal fixed *
|
||
* output: d6 - ffp float *
|
||
* cc - reflect value *
|
||
* notes: *
|
||
* 1) d4 is destroyed. *
|
||
* *
|
||
* time: (8mhz no wait state) *
|
||
* zero 4.0 microsec. *
|
||
* avg else 17.0 microsec. *
|
||
* *
|
||
******************************
|
||
|
||
|
||
ffptnorm move.l #$42,d4 setup initial exponent
|
||
tst.l d6 test for non-negative
|
||
beq.s fsfrtn return if zero
|
||
bpl.s fsfpls branch is >= 0
|
||
neg.l d6 absolutize input
|
||
move.b #$c2,d4 setup initial negative exponent
|
||
fsfpls cmp.l #$00007fff,d6 test for a small number
|
||
bhi.s fsfcont branch if not small
|
||
swap.w d6 swap halves
|
||
sub.b #16,d4 offset by 16 shifts
|
||
fsfcont add.l d6,d6 shift another bit
|
||
dbmi d4,fsfcont shift left until normalized
|
||
tst.b d6 ? should we round up
|
||
bpl.s fsfnrm no, branch rounded
|
||
add.l #$100,d6 round up
|
||
bcc.s fsfnrm branch no overflow
|
||
roxr.l #1,d6 adjust back for bit in 31
|
||
add.b #1,d4 make up for last shift right
|
||
fsfnrm move.b d4,d6 insert sign+exponent
|
||
fsfrtn rts return to caller
|
||
|
||
|
||
end
|
||
|
||
|