2005-04-16 15:20:36 -07:00
/* IEEE754 floating point arithmetic
* double precision : common utilities
*/
/*
* MIPS floating point support
* Copyright ( C ) 1994 - 2000 Algorithmics Ltd .
*
* This program is free software ; you can distribute it and / or modify it
* under the terms of the GNU General Public License ( Version 2 ) as
* published by the Free Software Foundation .
*
* This program is distributed in the hope it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE . See the GNU General Public License
* for more details .
*
* You should have received a copy of the GNU General Public License along
* with this program ; if not , write to the Free Software Foundation , Inc . ,
2014-04-26 01:49:14 +02:00
* 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA .
2005-04-16 15:20:36 -07:00
*/
# include "ieee754dp.h"
2014-04-16 01:31:11 +02:00
int ieee754dp_cmp ( union ieee754dp x , union ieee754dp y , int cmp , int sig )
2005-04-16 15:20:36 -07:00
{
2014-04-26 01:49:14 +02:00
s64 vx ;
s64 vy ;
2005-04-16 15:20:36 -07:00
COMPXDP ;
COMPYDP ;
EXPLODEXDP ;
EXPLODEYDP ;
FLUSHXDP ;
FLUSHYDP ;
2014-04-19 00:36:32 +02:00
ieee754_clearcx ( ) ; /* Even clear inexact flag here */
2005-04-16 15:20:36 -07:00
2015-04-03 23:25:38 +01:00
if ( ieee754_class_nan ( xc ) | | ieee754_class_nan ( yc ) ) {
2015-04-03 23:24:35 +01:00
if ( sig | |
xc = = IEEE754_CLASS_SNAN | | yc = = IEEE754_CLASS_SNAN )
2014-04-19 00:36:32 +02:00
ieee754_setcx ( IEEE754_INVALID_OPERATION ) ;
2015-04-03 23:25:43 +01:00
return ( cmp & IEEE754_CUN ) ! = 0 ;
2005-04-16 15:20:36 -07:00
} else {
2014-04-26 01:49:14 +02:00
vx = x . bits ;
vy = y . bits ;
2005-04-16 15:20:36 -07:00
if ( vx < 0 )
vx = - vx ^ DP_SIGN_BIT ;
if ( vy < 0 )
vy = - vy ^ DP_SIGN_BIT ;
if ( vx < vy )
return ( cmp & IEEE754_CLT ) ! = 0 ;
else if ( vx = = vy )
return ( cmp & IEEE754_CEQ ) ! = 0 ;
else
return ( cmp & IEEE754_CGT ) ! = 0 ;
}
}