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

  1. | single 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.  
  11. #ifdef __DEF_ALL__    /* this def'ed when making on the ST */
  12.  
  13. /* gcc-2.0 stuff */
  14. #define L_eqsf2
  15. #define L_gtsf2
  16. #define L_lesf2
  17. #define L_gesf2
  18. #define L_ltsf2
  19.  
  20. #endif /* __DEF_ALL__ */
  21.  
  22. #ifdef L_eqsf2
  23.     .text
  24.     .even
  25.     .globl    ___eqsf2, ___nesf2
  26.     | additional entry points for gcc 1.X
  27.     .globl    __cmpsf2, ___cmpsf2
  28.  
  29. __cmpsf2:
  30. ___cmpsf2:
  31. ___eqsf2:
  32. ___nesf2:
  33.     moveml    sp@(4),d0-d1    | get numbers to compare with
  34.     tstl    d0        | check sign bit
  35.     bpl    1f
  36.     negl    d0
  37.     bchg    #31,d0        | toggle sign bit
  38.  
  39. 1:    tstl    d1        | check sign bit
  40.     bpl    2f
  41.     negl    d1        | negate
  42.     bchg    #31,d1        | toggle sign bit
  43.  
  44. 2:    cmpl    d1,d0
  45.     bne    4f
  46.     bclr    #31,d1
  47.     cmpl    #0x7f800000,d1        | NaN is not equal NaN !
  48.     bgt    4f
  49.     moveq    #0,d0
  50.     rts
  51.  
  52. 4:    moveql    #1,d0
  53.     rts
  54. #endif /* L_eqsf2 */
  55.  
  56. #ifdef L_gtsf2
  57.     .text
  58.     .even
  59.     .globl    ___gtsf2
  60. ___gtsf2:
  61.     moveml    sp@(4),d0-d1    | get numbers to compare with
  62.     tstl    d0        | check sign bit
  63.     bpl    1f
  64.     negl    d0        | negate
  65.     bchg    #31,d0        | toggle sign bit
  66.  
  67. 1:    tstl    d1        | check sign bit
  68.     bpl    2f
  69.     negl    d1        | negate
  70.     bchg    #31,d1        | toggle sign bit
  71.  
  72. 2:    cmpl    d1,d0
  73.     bgt    4f        | d0 > d1 Test if NaN (should be false!)
  74. 3:    moveq    #0,d0        | Test is false.
  75.     rts
  76.  
  77. 4:    bclr    #31,d0
  78.     cmpl    #0x7f800000,d0    | First operand == NaN =?
  79.     bgt    3b
  80.     moveql    #1,d0        | Test True
  81.     rts
  82. #endif /* L_gtsf2 */
  83.  
  84. #ifdef L_lesf2
  85.     .text
  86.     .even
  87.     .globl  ___lesf2
  88. ___lesf2:
  89.     moveml    sp@(4),d0-d1    | get numbers to compare with
  90.     tstl    d0        | check sign bit
  91.     bpl    1f
  92.     negl    d0        | negate
  93.     bchg    #31,d0        | toggle sign bit
  94.  
  95. 1:    tstl    d1        | check sign bit
  96.     bpl    2f
  97.     negl    d1        | negate
  98.     bchg    #31,d1        | toggle sign bit
  99.  
  100. 2:    cmpl    d1,d0
  101.     ble    4f
  102. 3:    moveql    #1,d0        | Test is false
  103.     rts
  104. 4:    bclr    #31,d0
  105.     cmpl    #0x7f800000,d0    | First operand == NaN =?
  106.     bgt    3b
  107.     moveq    #0,d0        | Test true
  108.     rts
  109. #endif /* L_lesf2 */
  110.  
  111. #ifdef L_gesf2
  112.     .text
  113.     .even
  114.     .globl    ___gesf2
  115. ___gesf2:
  116.     moveml    sp@(4),d0-d1    | get numbers to compare with
  117.     tstl    d0        | check sign bit
  118.     bpl    1f
  119.     negl    d0        | negate
  120.     bchg    #31,d0        | toggle sign bit
  121.  
  122. 1:    tstl    d1        | check sign bit
  123.     bpl    2f
  124.     negl    d1        | negate
  125.     bchg    #31,d1        | toggle sign bit
  126.  
  127. 2:    cmpl    d1,d0
  128.     bge    4f
  129. 3:    moveql    #-1,d0        | False
  130.     rts
  131.  
  132. 4:    bclr    #31,d0
  133.     cmpl    #0x7f800000,d0    | First operand == NaN =?
  134.     bgt    3b
  135.     moveq    #0,d0        | Test True
  136.     rts
  137. #endif /* L_gesf2 */
  138.  
  139. #ifdef L_ltsf2
  140.     .text
  141.     .even
  142.     .globl     ___ltsf2
  143. ___ltsf2:
  144.     moveml    sp@(4),d0-d1    | get numbers to compare with
  145.     tstl    d0        | check sign bit
  146.     bpl    1f
  147.     negl    d0        | negate
  148.     bchg    #31,d0        | toggle sign bit
  149.  
  150. 1:    tstl    d1        | check sign bit
  151.     bpl    2f
  152.     negl    d1        | negate
  153.     bchg    #31,d1        | toggle sign bit
  154.  
  155. 2:    cmpl    d1,d0
  156.     blt    4f
  157. 3:    moveq    #0,d0
  158.     rts
  159. 4:    bclr    #31,d0
  160.     cmpl    #0x7f800000,d0    | First operand == NaN =?
  161.     bgt    3b
  162. 5:    moveql    #-1,d0        | Test True
  163.     rts
  164. #endif /* L_ltsf2 */
  165.  
  166.  
  167.  
  168.