[BACK]Return to dfcmp.c CVS log [TXT][DIR] Up to [local] / sys / arch / hppa / spmath

Annotation of sys/arch/hppa/spmath/dfcmp.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: dfcmp.c,v 1.6 2002/09/20 19:26:59 mickey Exp $        */
                      2: /*
                      3:   (c) Copyright 1986 HEWLETT-PACKARD COMPANY
                      4:   To anyone who acknowledges that this file is provided "AS IS"
                      5:   without any express or implied warranty:
                      6:       permission to use, copy, modify, and distribute this file
                      7:   for any purpose is hereby granted without fee, provided that
                      8:   the above copyright notice and this notice appears in all
                      9:   copies, and that the name of Hewlett-Packard Company not be
                     10:   used in advertising or publicity pertaining to distribution
                     11:   of the software without specific, written prior permission.
                     12:   Hewlett-Packard Company makes no representations about the
                     13:   suitability of this software for any purpose.
                     14: */
                     15: /* @(#)dfcmp.c: Revision: 1.7.88.2 Date: 93/12/08 13:26:38 */
                     16:
                     17: #include "float.h"
                     18: #include "dbl_float.h"
                     19:
                     20: /*
                     21:  * dbl_cmp: compare two values
                     22:  */
                     23: int
                     24: dbl_fcmp(leftptr, rightptr, cond, status)
                     25:     dbl_floating_point *leftptr, *rightptr;
                     26:     unsigned int cond; /* The predicate to be tested */
                     27:     unsigned int *status;
                     28: {
                     29:     register unsigned int leftp1, leftp2, rightp1, rightp2;
                     30:     register int xorresult;
                     31:
                     32:     /* Create local copies of the numbers */
                     33:     Dbl_copyfromptr(leftptr,leftp1,leftp2);
                     34:     Dbl_copyfromptr(rightptr,rightp1,rightp2);
                     35:     /*
                     36:      * Test for NaN
                     37:      */
                     38:     if(    (Dbl_exponent(leftp1) == DBL_INFINITY_EXPONENT)
                     39:        || (Dbl_exponent(rightp1) == DBL_INFINITY_EXPONENT) )
                     40:        {
                     41:        /* Check if a NaN is involved.  Signal an invalid exception when
                     42:         * comparing a signaling NaN or when comparing quiet NaNs and the
                     43:         * low bit of the condition is set */
                     44:        if( ((Dbl_exponent(leftp1) == DBL_INFINITY_EXPONENT)
                     45:            && Dbl_isnotzero_mantissa(leftp1,leftp2)
                     46:            && (Exception(cond) || Dbl_isone_signaling(leftp1)))
                     47:           ||
                     48:            ((Dbl_exponent(rightp1) == DBL_INFINITY_EXPONENT)
                     49:            && Dbl_isnotzero_mantissa(rightp1,rightp2)
                     50:            && (Exception(cond) || Dbl_isone_signaling(rightp1))) )
                     51:            {
                     52:            if( Is_invalidtrap_enabled() ) {
                     53:                Set_status_cbit(Unordered(cond));
                     54:                return(INVALIDEXCEPTION);
                     55:            }
                     56:            else Set_invalidflag();
                     57:            Set_status_cbit(Unordered(cond));
                     58:            return(NOEXCEPTION);
                     59:            }
                     60:        /* All the exceptional conditions are handled, now special case
                     61:           NaN compares */
                     62:        else if( ((Dbl_exponent(leftp1) == DBL_INFINITY_EXPONENT)
                     63:            && Dbl_isnotzero_mantissa(leftp1,leftp2))
                     64:           ||
                     65:            ((Dbl_exponent(rightp1) == DBL_INFINITY_EXPONENT)
                     66:            && Dbl_isnotzero_mantissa(rightp1,rightp2)) )
                     67:            {
                     68:            /* NaNs always compare unordered. */
                     69:            Set_status_cbit(Unordered(cond));
                     70:            return(NOEXCEPTION);
                     71:            }
                     72:        /* infinities will drop down to the normal compare mechanisms */
                     73:        }
                     74:     /* First compare for unequal signs => less or greater or
                     75:      * special equal case */
                     76:     Dbl_xortointp1(leftp1,rightp1,xorresult);
                     77:     if( xorresult < 0 )
                     78:        {
                     79:        /* left negative => less, left positive => greater.
                     80:         * equal is possible if both operands are zeros. */
                     81:        if( Dbl_iszero_exponentmantissa(leftp1,leftp2)
                     82:          && Dbl_iszero_exponentmantissa(rightp1,rightp2) )
                     83:            {
                     84:            Set_status_cbit(Equal(cond));
                     85:            }
                     86:        else if( Dbl_isone_sign(leftp1) )
                     87:            {
                     88:            Set_status_cbit(Lessthan(cond));
                     89:            }
                     90:        else
                     91:            {
                     92:            Set_status_cbit(Greaterthan(cond));
                     93:            }
                     94:        }
                     95:     /* Signs are the same.  Treat negative numbers separately
                     96:      * from the positives because of the reversed sense.  */
                     97:     else if(Dbl_isequal(leftp1,leftp2,rightp1,rightp2))
                     98:        {
                     99:        Set_status_cbit(Equal(cond));
                    100:        }
                    101:     else if( Dbl_iszero_sign(leftp1) )
                    102:        {
                    103:        /* Positive compare */
                    104:        if( Dbl_allp1(leftp1) < Dbl_allp1(rightp1) )
                    105:            {
                    106:            Set_status_cbit(Lessthan(cond));
                    107:            }
                    108:        else if( Dbl_allp1(leftp1) > Dbl_allp1(rightp1) )
                    109:            {
                    110:            Set_status_cbit(Greaterthan(cond));
                    111:            }
                    112:        else
                    113:            {
                    114:            /* Equal first parts.  Now we must use unsigned compares to
                    115:             * resolve the two possibilities. */
                    116:            if( Dbl_allp2(leftp2) < Dbl_allp2(rightp2) )
                    117:                {
                    118:                Set_status_cbit(Lessthan(cond));
                    119:                }
                    120:            else
                    121:                {
                    122:                Set_status_cbit(Greaterthan(cond));
                    123:                }
                    124:            }
                    125:        }
                    126:     else
                    127:        {
                    128:        /* Negative compare.  Signed or unsigned compares
                    129:         * both work the same.  That distinction is only
                    130:         * important when the sign bits differ. */
                    131:        if( Dbl_allp1(leftp1) > Dbl_allp1(rightp1) )
                    132:            {
                    133:            Set_status_cbit(Lessthan(cond));
                    134:            }
                    135:        else if( Dbl_allp1(leftp1) < Dbl_allp1(rightp1) )
                    136:            {
                    137:            Set_status_cbit(Greaterthan(cond));
                    138:            }
                    139:        else
                    140:            {
                    141:            /* Equal first parts.  Now we must use unsigned compares to
                    142:             * resolve the two possibilities. */
                    143:            if( Dbl_allp2(leftp2) > Dbl_allp2(rightp2) )
                    144:                {
                    145:                Set_status_cbit(Lessthan(cond));
                    146:                }
                    147:            else
                    148:                {
                    149:                Set_status_cbit(Greaterthan(cond));
                    150:                }
                    151:            }
                    152:        }
                    153:        return(NOEXCEPTION);
                    154: }

CVSweb