home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GEMini Atari
/
GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso
/
zip
/
gnu
/
mntlib16.lzh
/
MNTLIB16
/
_FIXUDFS.S
< prev
next >
Wrap
Text File
|
1993-07-29
|
2KB
|
78 lines
| double float to unsigned long conversion routine
|
| written by Kai-Uwe Bloem (I5110401@dbstu1.bitnet).
| Based on a 80x86 floating point packet from comp.os.minix, written by P.Housel
|
|
| Revision 1.3, kub 01-90 :
| added support for denormalized numbers
|
| Revision 1.2, kub 01-90 :
| replace far shifts by swaps to gain speed
|
| Revision 1.1, kub 12-89 :
| Ported over to 68k assembler
|
| Revision 1.0:
| original 8088 code from P.S.Housel
BIAS8 = 0x3FF-1
.text
.even
.globl __fixunsdfsi, ___fixunsdfsi
__fixunsdfsi:
___fixunsdfsi:
lea sp@(4),a0 | pointer to parameters
moveml d4/d5,sp@- | save registers
moveml a0@,d4-d5 | get the number
movew a0@,d0 | extract exp
lsrw #4,d0
andw #0x07ff,d0 | kill sign bit
andl #0x0fffff,d4 | remove exponent from mantissa
orl #0x100000,d4 | restore implied leading "1"
cmpw #BIAS8,d0 | check exponent
blt zero | strictly factional, no integer part ?
cmpw #BIAS8+32,d0 | is it too big to fit in a 32-bit integer ?
bgt toobig
subw #BIAS8+21,d0 | adjust exponent
bgt 2f | shift up
beq 3f | no shift
cmpw #-8,d0 | replace far shifts by swap
bgt 1f
movew d4,d5 | shift fast, 16 bits
swap d5
clrw d4
swap d4
addw #16,d0 | account for swap
bgt 2f
beq 3f
1: lsrl #1,d4 | shift down to align radix point;
addw #1,d0 | extra bits fall off the end (no rounding)
blt 1b | shifted all the way down yet ?
bra 3f
2: addl d5,d5 | shift up to align radix point
addxl d4,d4
subw #1,d0
bgt 2b
3:
movel d4,d0 | put integer into result register
7:
moveml sp@+,d4/d5
rts
zero:
clrl d0 | make the whole thing zero
bra 7b
toobig:
movel #0x7fffffff,d0 | ugh. Should cause a trap here.
bra 7b