sfcmp.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:4k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Linux/PA-RISC Project (http://www.parisc-linux.org/)
  3.  *
  4.  * Floating-point emulation code
  5.  *  Copyright (C) 2001 Hewlett-Packard (Paul Bame) <bame@debian.org>
  6.  *
  7.  *    This program is free software; you can redistribute it and/or modify
  8.  *    it under the terms of the GNU General Public License as published by
  9.  *    the Free Software Foundation; either version 2, or (at your option)
  10.  *    any later version.
  11.  *
  12.  *    This program is distributed in the hope that it will be useful,
  13.  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  *    GNU General Public License for more details.
  16.  *
  17.  *    You should have received a copy of the GNU General Public License
  18.  *    along with this program; if not, write to the Free Software
  19.  *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  */
  21. /*
  22.  * BEGIN_DESC
  23.  *
  24.  *  File:
  25.  * @(#) pa/spmath/sfcmp.c $Revision: 1.1 $
  26.  *
  27.  *  Purpose:
  28.  * sgl_cmp: compare two values
  29.  *
  30.  *  External Interfaces:
  31.  * sgl_fcmp(leftptr, rightptr, cond, status)
  32.  *
  33.  *  Internal Interfaces:
  34.  *
  35.  *  Theory:
  36.  * <<please update with a overview of the operation of this file>>
  37.  *
  38.  * END_DESC
  39. */
  40. #include "float.h"
  41. #include "sgl_float.h"
  42.     
  43. /*
  44.  * sgl_cmp: compare two values
  45.  */
  46. int
  47. sgl_fcmp (sgl_floating_point * leftptr, sgl_floating_point * rightptr,
  48.   unsigned int cond, unsigned int *status)
  49.                                            
  50.                        /* The predicate to be tested */
  51.                          
  52.     {
  53.     register unsigned int left, right;
  54.     register int xorresult;
  55.         
  56.     /* Create local copies of the numbers */
  57.     left = *leftptr;
  58.     right = *rightptr;
  59.     /*
  60.      * Test for NaN
  61.      */
  62.     if(    (Sgl_exponent(left) == SGL_INFINITY_EXPONENT)
  63.         || (Sgl_exponent(right) == SGL_INFINITY_EXPONENT) )
  64. {
  65. /* Check if a NaN is involved.  Signal an invalid exception when 
  66.  * comparing a signaling NaN or when comparing quiet NaNs and the
  67.  * low bit of the condition is set */
  68.         if( (  (Sgl_exponent(left) == SGL_INFINITY_EXPONENT)
  69.     && Sgl_isnotzero_mantissa(left) 
  70.     && (Exception(cond) || Sgl_isone_signaling(left)))
  71.    ||
  72.     (  (Sgl_exponent(right) == SGL_INFINITY_EXPONENT)
  73.     && Sgl_isnotzero_mantissa(right) 
  74.     && (Exception(cond) || Sgl_isone_signaling(right)) ) )
  75.     {
  76.     if( Is_invalidtrap_enabled() ) {
  77.      Set_status_cbit(Unordered(cond));
  78. return(INVALIDEXCEPTION);
  79.     }
  80.     else Set_invalidflag();
  81.     Set_status_cbit(Unordered(cond));
  82.     return(NOEXCEPTION);
  83.     }
  84. /* All the exceptional conditions are handled, now special case
  85.    NaN compares */
  86.         else if( ((Sgl_exponent(left) == SGL_INFINITY_EXPONENT)
  87.     && Sgl_isnotzero_mantissa(left))
  88.    ||
  89.     ((Sgl_exponent(right) == SGL_INFINITY_EXPONENT)
  90.     && Sgl_isnotzero_mantissa(right)) )
  91.     {
  92.     /* NaNs always compare unordered. */
  93.     Set_status_cbit(Unordered(cond));
  94.     return(NOEXCEPTION);
  95.     }
  96. /* infinities will drop down to the normal compare mechanisms */
  97. }
  98.     /* First compare for unequal signs => less or greater or
  99.      * special equal case */
  100.     Sgl_xortointp1(left,right,xorresult);
  101.     if( xorresult < 0 )
  102.         {
  103.         /* left negative => less, left positive => greater.
  104.          * equal is possible if both operands are zeros. */
  105.         if( Sgl_iszero_exponentmantissa(left) 
  106.   && Sgl_iszero_exponentmantissa(right) )
  107.             {
  108.     Set_status_cbit(Equal(cond));
  109.     }
  110. else if( Sgl_isone_sign(left) )
  111.     {
  112.     Set_status_cbit(Lessthan(cond));
  113.     }
  114. else
  115.     {
  116.     Set_status_cbit(Greaterthan(cond));
  117.     }
  118.         }
  119.     /* Signs are the same.  Treat negative numbers separately
  120.      * from the positives because of the reversed sense.  */
  121.     else if( Sgl_all(left) == Sgl_all(right) )
  122.         {
  123.         Set_status_cbit(Equal(cond));
  124.         }
  125.     else if( Sgl_iszero_sign(left) )
  126.         {
  127.         /* Positive compare */
  128.         if( Sgl_all(left) < Sgl_all(right) )
  129.     {
  130.     Set_status_cbit(Lessthan(cond));
  131.     }
  132. else
  133.     {
  134.     Set_status_cbit(Greaterthan(cond));
  135.     }
  136. }
  137.     else
  138.         {
  139.         /* Negative compare.  Signed or unsigned compares
  140.          * both work the same.  That distinction is only
  141.          * important when the sign bits differ. */
  142.         if( Sgl_all(left) > Sgl_all(right) )
  143.     {
  144.     Set_status_cbit(Lessthan(cond));
  145.     }
  146.         else
  147.     {
  148.     Set_status_cbit(Greaterthan(cond));
  149.     }
  150.         }
  151. return(NOEXCEPTION);
  152.     }