home *** CD-ROM | disk | FTP | other *** search
/ Atari FTP / ATARI_FTP_0693.zip / ATARI_FTP_0693 / Mint / mntlib32.zoo / _cmpdf2.cpp < prev    next >
Text File  |  1993-06-06  |  4KB  |  217 lines

  1. | double floating point compare routine
  2. |
  3. | written by Olaf Flebbe (flebbe@tat.physik.uni-tuebingen.de)
  4. | Based on a 68k floating point packet from Kai-Uwe Bloem, itself based
  5. | on a 80x86 floating point packet from comp.os.minix, written by P.Housel
  6. |
  7. | Revision 2.0: olaf 12-92.
  8. | Revision 2.1: michal 05-93 allow for splitting in separate objects in make
  9.  
  10. #ifdef __DEF_ALL__    /* this def'ed when making on the ST */
  11.  
  12. /* gcc-2.0 stuff */
  13. #define L_eqdf2
  14. #define L_gtdf2
  15. #define L_ledf2
  16. #define L_gedf2
  17. #define L_ltdf2
  18.  
  19. #endif /* __DEF_ALL__ */
  20.  
  21. #ifdef L_eqdf2
  22.     .text
  23.     .even
  24.     .globl    ___eqdf2, ___nedf2
  25.     .globl    __cmpdf2, ___cmpdf2
  26.  
  27. __cmpdf2:
  28. ___cmpdf2:
  29. ___eqdf2:
  30. ___nedf2:
  31.     moveml    sp@(4),d0-d1/a0-a1        | get numbers to compare with
  32.     tstl    d0        | check sign bit
  33.     bpl    1f
  34.     negl    d1        | negate
  35.     negxl    d0
  36.     bchg    #31,d0        | toggle sign bit
  37.  
  38. 1:    exg    a0,d0
  39.     exg    a1,d1
  40.     tstl    d0        | check sign bit
  41.     bpl    2f
  42.     negl    d1        | negate
  43.     negxl    d0
  44.     bchg    #31,d0        | toggle sign bit
  45.  
  46. 2:    cmpl    d1,a1
  47.     bne    4f
  48.     cmpl    d0,a0
  49.     bne    4f
  50.     bclr    #31,d0
  51.     cmpl    #0x7ff00000,d0        | NaN is not equal NaN !
  52.     bgt    4f
  53.     blt    3f
  54.     tstl    d1
  55.     bne    4f
  56. 3:    moveq    #0,d0
  57.     rts
  58.  
  59. 4:    moveql    #1,d0
  60.     rts
  61. #endif /* L_eqdf2 */
  62.  
  63. #ifdef L_gtdf2
  64.     .text
  65.     .even
  66.     .globl    ___gtdf2
  67. ___gtdf2:
  68.     moveml    sp@(4),d0-d1/a0-a1        | get numbers to compare with
  69.     tstl    d0        | check sign bit
  70.     bpl    1f
  71.     negl    d1        | negate
  72.     negxl    d0
  73.     bchg    #31,d0        | toggle sign bit
  74.  
  75. 1:    exg    a0,d0
  76.     exg    a1,d1
  77.     tstl    d0        | check sign bit
  78.     bpl    2f
  79.     negl    d1        | negate
  80.     negxl    d0
  81.     bchg    #31,d0        | toggle sign bit
  82.  
  83. 2:    exg    a0,d0
  84.     exg    a1,d1
  85.     cmpl    a0,d0
  86.     bgt    4f        | d0 > a0 Test if NaN (should be false!)
  87.     blt    3f        |
  88.     cmpl    a1,d1
  89.     bhi    4f
  90. 3:    moveq    #0,d0        | Test is false.
  91.     rts
  92. 4:    bclr    #31,d0
  93.     cmpl    #0x7ff00000,d0    | First operand == NaN =?
  94.     bgt    3b
  95.     blt    5f        | It is finite!
  96.     tstl    d1
  97.     bne    3b        | It *is* a NaN
  98. 5:    moveql    #1,d0        | Test True
  99.     rts
  100. #endif /* L_gtdf2 */
  101.  
  102. #ifdef L_ledf2
  103.     .text
  104.     .even
  105.     .globl    ___ledf2
  106. ___ledf2:
  107.     moveml    sp@(4),d0-d1/a0-a1        | get numbers to compare with
  108.     tstl    d0        | check sign bit
  109.     bpl    1f
  110.     negl    d1        | negate
  111.     negxl    d0
  112.     bchg    #31,d0        | toggle sign bit
  113.  
  114. 1:    exg    a0,d0
  115.     exg    a1,d1
  116.     tstl    d0        | check sign bit
  117.     bpl    2f
  118.     negl    d1        | negate
  119.     negxl    d0
  120.     bchg    #31,d0        | toggle sign bit
  121.  
  122. 2:    cmpl    d0,a0
  123.     blt    4f
  124.     bgt    3f
  125.     cmpl    d1,a1
  126.     bls    4f            | <= !
  127. 3:    moveql    #1,d0        | Test is false
  128.     rts
  129. 4:    bclr    #31,d0
  130.     cmpl    #0x7ff00000,d0    | First operand == NaN =?
  131.     bgt    3b
  132.     blt    5f        | It is finite!
  133.     tstl    d1
  134.     bne    3b        | It *is* a NaN
  135. 5:    moveq    #0,d0        | Test true
  136.     rts
  137. #endif /* L_ledf2 */
  138.  
  139.  
  140. #ifdef L_gedf2
  141.     .text
  142.     .even
  143.     .globl    ___gedf2
  144. ___gedf2:
  145.     moveml    sp@(4),d0-d1/a0-a1        | get numbers to compare with
  146.     tstl    d0        | check sign bit
  147.     bpl    1f
  148.     negl    d1        | negate
  149.     negxl    d0
  150.     bchg    #31,d0        | toggle sign bit
  151.  
  152. 1:    exg    a0,d0
  153.     exg    a1,d1
  154.     tstl    d0        | check sign bit
  155.     bpl    2f
  156.     negl    d1        | negate
  157.     negxl    d0
  158.     bchg    #31,d0        | toggle sign bit
  159.  
  160. 2:    exg    a0,d0
  161.     exg    a1,d1
  162.     cmpl    a0,d0
  163.     bgt    4f
  164.     blt    3f
  165.     cmpl    a1,d1
  166.     beq    4f        | >= !
  167.     bhi    4f
  168. 3:    moveql    #-1,d0        | False
  169.     rts
  170. 4:    bclr    #31,d0
  171.     cmpl    #0x7ff00000,d0    | First operand == NaN =?
  172.     bgt    3b
  173.     blt    5f        | It is finite!
  174.     tstl    d1
  175.     bne    3b        | It *is* a NaN
  176. 5:    moveq    #0,d0        | Test True
  177.     rts
  178. #endif /* L_gedf2 */
  179.  
  180. #ifdef L_ltdf2
  181.     .text
  182.     .even
  183.     .globl    ___ltdf2
  184. ___ltdf2:
  185.     moveml    sp@(4),d0-d1/a0-a1        | get numbers to compare with
  186.     tstl    d0        | check sign bit
  187.     bpl    1f
  188.     negl    d1        | negate
  189.     negxl    d0
  190.     bchg    #31,d0        | toggle sign bit
  191.  
  192. 1:    exg    a0,d0
  193.     exg    a1,d1
  194.     tstl    d0        | check sign bit
  195.     bpl    2f
  196.     negl    d1        | negate
  197.     negxl    d0
  198.     bchg    #31,d0        | toggle sign bit
  199.  
  200. 2:    cmpl    d0,a0
  201.     blt    4f
  202.     bgt    3f
  203.     cmpl    d1,a1
  204.     beq    3f
  205.     bls    4f
  206. 3:    moveq    #0,d0
  207.     rts
  208. 4:    bclr    #31,d0
  209.     cmpl    #0x7ff00000,d0    | First operand == NaN =?
  210.     bgt    3b
  211.     blt    5f        | It is finite!
  212.     tstl    d1
  213.     bne    3b        | It *is* a NaN
  214. 5:    moveql    #-1,d0        | Test True
  215.     rts
  216. #endif /* L_ltdf2 */
  217.