Annotation of sys/arch/hppa/spmath/dfcmp.c, Revision 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