Annotation of sys/arch/hppa/spmath/sfcmp.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: sfcmp.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: /* @(#)sfcmp.c: Revision: 1.7.88.2 Date: 93/12/08 13:28:43 */
16:
17: #include "float.h"
18: #include "sgl_float.h"
19:
20: /*
21: * sgl_cmp: compare two values
22: */
23: int
24: sgl_fcmp(leftptr, rightptr, cond, status)
25: sgl_floating_point *leftptr, *rightptr;
26: unsigned int cond; /* The predicate to be tested */
27: unsigned int *status;
28: {
29: register unsigned int left, right;
30: register int xorresult;
31:
32: /* Create local copies of the numbers */
33: left = *leftptr;
34: right = *rightptr;
35: /*
36: * Test for NaN
37: */
38: if( (Sgl_exponent(left) == SGL_INFINITY_EXPONENT)
39: || (Sgl_exponent(right) == SGL_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( ( (Sgl_exponent(left) == SGL_INFINITY_EXPONENT)
45: && Sgl_isnotzero_mantissa(left)
46: && (Exception(cond) || Sgl_isone_signaling(left)))
47: ||
48: ( (Sgl_exponent(right) == SGL_INFINITY_EXPONENT)
49: && Sgl_isnotzero_mantissa(right)
50: && (Exception(cond) || Sgl_isone_signaling(right)) ) )
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( ((Sgl_exponent(left) == SGL_INFINITY_EXPONENT)
63: && Sgl_isnotzero_mantissa(left))
64: ||
65: ((Sgl_exponent(right) == SGL_INFINITY_EXPONENT)
66: && Sgl_isnotzero_mantissa(right)) )
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: Sgl_xortointp1(left,right,xorresult);
77: if( xorresult < 0 )
78: {
79: /* left negative => less, left positive => greater.
80: * equal is possible if both operands are zeros. */
81: if( Sgl_iszero_exponentmantissa(left)
82: && Sgl_iszero_exponentmantissa(right) )
83: {
84: Set_status_cbit(Equal(cond));
85: }
86: else if( Sgl_isone_sign(left) )
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( Sgl_all(left) == Sgl_all(right) )
98: {
99: Set_status_cbit(Equal(cond));
100: }
101: else if( Sgl_iszero_sign(left) )
102: {
103: /* Positive compare */
104: if( Sgl_all(left) < Sgl_all(right) )
105: {
106: Set_status_cbit(Lessthan(cond));
107: }
108: else
109: {
110: Set_status_cbit(Greaterthan(cond));
111: }
112: }
113: else
114: {
115: /* Negative compare. Signed or unsigned compares
116: * both work the same. That distinction is only
117: * important when the sign bits differ. */
118: if( Sgl_all(left) > Sgl_all(right) )
119: {
120: Set_status_cbit(Lessthan(cond));
121: }
122: else
123: {
124: Set_status_cbit(Greaterthan(cond));
125: }
126: }
127: return(NOEXCEPTION);
128: }
CVSweb