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 >
Text File  |  1993-07-29  |  2KB  |  78 lines

  1. | double float to unsigned long conversion routine
  2. |
  3. | written by Kai-Uwe Bloem (I5110401@dbstu1.bitnet).
  4. | Based on a 80x86 floating point packet from comp.os.minix, written by P.Housel
  5. |
  6. |
  7. | Revision 1.3, kub 01-90 :
  8. | added support for denormalized numbers
  9. |
  10. | Revision 1.2, kub 01-90 :
  11. | replace far shifts by swaps to gain speed
  12. |
  13. | Revision 1.1, kub 12-89 :
  14. | Ported over to 68k assembler
  15. |
  16. | Revision 1.0:
  17. | original 8088 code from P.S.Housel
  18.  
  19. BIAS8    =    0x3FF-1
  20.  
  21.     .text
  22.     .even
  23.     .globl    __fixunsdfsi, ___fixunsdfsi
  24.  
  25. __fixunsdfsi:
  26. ___fixunsdfsi:
  27.     lea    sp@(4),a0    | pointer to parameters
  28.     moveml    d4/d5,sp@-    | save registers
  29.     moveml    a0@,d4-d5    | get the number
  30.     movew    a0@,d0        | extract exp
  31.     lsrw    #4,d0
  32.     andw    #0x07ff,d0    | kill sign bit
  33.  
  34.     andl    #0x0fffff,d4    | remove exponent from mantissa
  35.     orl    #0x100000,d4    | restore implied leading "1"
  36.  
  37.     cmpw    #BIAS8,d0    | check exponent
  38.     blt    zero        | strictly factional, no integer part ?
  39.     cmpw    #BIAS8+32,d0    | is it too big to fit in a 32-bit integer ?
  40.     bgt    toobig
  41.  
  42.     subw    #BIAS8+21,d0    | adjust exponent
  43.     bgt    2f        | shift up
  44.     beq    3f        | no shift
  45.  
  46.     cmpw    #-8,d0        | replace far shifts by swap
  47.     bgt    1f
  48.     movew    d4,d5        | shift fast, 16 bits
  49.     swap    d5
  50.     clrw    d4
  51.     swap    d4
  52.     addw    #16,d0        | account for swap
  53.     bgt    2f
  54.     beq    3f
  55.  
  56. 1:    lsrl    #1,d4        | shift down to align radix point;
  57.     addw    #1,d0        | extra bits fall off the end (no rounding)
  58.     blt    1b        | shifted all the way down yet ?
  59.     bra    3f
  60.  
  61. 2:    addl    d5,d5        | shift up to align radix point
  62.     addxl    d4,d4
  63.     subw    #1,d0
  64.     bgt    2b
  65. 3:
  66.     movel    d4,d0        | put integer into result register
  67. 7:
  68.     moveml    sp@+,d4/d5
  69.     rts
  70.  
  71. zero:
  72.     clrl    d0        | make the whole thing zero
  73.     bra    7b
  74.  
  75. toobig:
  76.     movel    #0x7fffffff,d0    | ugh. Should cause a trap here.
  77.     bra    7b
  78.