home *** CD-ROM | disk | FTP | other *** search
/ Atari FTP / ATARI_FTP_0693.zip / ATARI_FTP_0693 / Mint / mntlib32.zoo / _fxunsd.cpp < prev    next >
C/C++ Source or Header  |  1993-06-17  |  3KB  |  152 lines

  1. |
  2. | double float to unsigned long conversion routine
  3. | does not really return unsigned long: max result is 0x7fffffff
  4. | mjr
  5.     .text
  6.     .even
  7.     .globl    __fixunsdfsi, ___fixunsdfsi
  8.  
  9. #ifdef ERROR_CHECK
  10. #include "errbase.h"
  11. _Overflow:
  12.     .ascii "OVERFLOW\0"
  13. _Negative:
  14.     .ascii "NEGATIVE NUMBER\0"
  15. _Error_String:
  16.     .ascii "_fixunsdfsi: %s error\n\0"
  17. .even
  18. #endif ERROR_CHECK
  19.  
  20. __fixunsdfsi:
  21. ___fixunsdfsi:
  22.  
  23. #ifdef ERROR_CHECK
  24.     tstl    sp@(4)            | negative?
  25.     beq    Continue
  26.     moveq    #Erange,d0
  27.     Emove    d0,Errno
  28.     pea    pc@(_Negative)
  29.     bra    error_exit
  30. Continue:
  31. #endif /* ERROR_CHECK */
  32. #ifdef __M68881__
  33.  
  34.     fintrzd sp@(4),fp0        | convert
  35.     fmovel    fp0,d0
  36.  
  37. #endif __M68881__
  38.  
  39. #ifdef    sfp004
  40. | double float to unsigned long conversion routine
  41. | does not really return unsigned long: max result is 0x7fffffff
  42. | mjr
  43.  
  44. comm =     -6
  45. resp =    -16
  46. zahl =      0
  47.  
  48.     lea    0xfffffa50:w,a0
  49.     movew    #0x5403,a0@(comm)    | fintrz to fp0
  50.     cmpiw    #0x8900,a0@(resp)    | check
  51.     movel    sp@(4),a0@
  52.     movel    sp@(8),a0@
  53.     movew    #0x6000,a0@(comm)    | result to d0
  54.     .long    0x0c688900, 0xfff067f8
  55.     movel    a0@,d0
  56. #endif    sfp004
  57.  
  58. # if !defined (sfp004) && !defined (__M68881__)
  59.  
  60. | double float to unsigned long conversion routine
  61. |
  62. | written by Kai-Uwe Bloem (I5110401@dbstu1.bitnet).
  63. | Based on a 80x86 floating point packet from comp.os.minix, written by P.Housel
  64. |
  65. |
  66. | Revision 1.3, kub 01-90 :
  67. | added support for denormalized numbers
  68. |
  69. | Revision 1.2, kub 01-90 :
  70. | replace far shifts by swaps to gain speed
  71. |
  72. | Revision 1.1, kub 12-89 :
  73. | Ported over to 68k assembler
  74. |
  75. | Revision 1.0:
  76. | original 8088 code from P.S.Housel
  77.  
  78. BIAS8    =    0x3FF-1
  79.  
  80.     lea    sp@(4),a0    | pointer to parameters
  81.     moveml    d4/d5,sp@-    | save registers
  82.     moveml    a0@,d4-d5    | get the number
  83.     movew    a0@,d0        | extract exp
  84.     bclr    #15,d0        | kill sign bit
  85.     lsrw    #4,d0
  86.  
  87.     andl    #0x0fffff,d4    | remove exponent from mantissa
  88.     bset    #20,d4        | restore implied leading "1"
  89.  
  90.     cmpw    #BIAS8,d0    | check exponent
  91.     blt    zero        | strictly fractional, no integer part ?
  92.     cmpw    #BIAS8+32,d0    | is it too big to fit in a 32-bit integer ?
  93.     bgt    toobig
  94.  
  95.     subw    #BIAS8+21,d0    | adjust exponent
  96.     bgt    2f        | shift up
  97.     beq    3f        | no shift
  98.  
  99.     cmpw    #-8,d0        | replace far shifts by swap
  100.     bgt    1f
  101.     movew    d4,d5        | shift fast, 16 bits
  102.     swap    d5
  103.     clrw    d4
  104.     swap    d4
  105.     addw    #16,d0        | account for swap
  106.     bgt    2f
  107.     beq    3f
  108.  
  109. 1:    lsrl    #1,d4        | shift down to align radix point;
  110.     addqw    #1,d0        | extra bits fall off the end (no rounding)
  111.     blt    1b        | shifted all the way down yet ?
  112.     bra    3f
  113.  
  114. 2:    addl    d5,d5        | shift up to align radix point
  115.     addxl    d4,d4
  116.     subqw    #1,d0
  117.     bgt    2b
  118. 3:
  119.     movel    d4,d0        | put integer into result register
  120. 7:
  121.     moveml    sp@+,d4/d5
  122.     rts
  123.  
  124. zero:
  125.     clrl    d0        | make the whole thing zero
  126.     bra    7b
  127.  
  128. toobig:
  129.     moveml    sp@+,d4/d5
  130.     moveq    #-1,d0        | ugh. Should cause a trap here.
  131.     bclr    #31,d0
  132. #endif
  133.  
  134. #ifdef    ERROR_CHECK
  135.     cmpil    #0x7fffffff,d0    | >= long_max
  136.     bge    error_plus    |
  137.     rts
  138. error_plus:
  139.     moveml    d0-d1,sp@-
  140.     moveq    #Erange,d0
  141.     Emove    d0,Errno
  142.     pea    pc@(_Overflow)    | for printf
  143. error_exit:
  144.     pea    pc@(_Error_String)    |
  145.     pea    Stderr
  146.     jbsr    _fprintf    |
  147.     addl    #12,sp        |
  148.     moveml    sp@+,d0-d1
  149. #endif    ERROR_CHECK
  150.     rts
  151.  
  152.