Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /* IEEE754 floating point arithmetic
0003  * double precision: common utilities
0004  */
0005 /*
0006  * MIPS floating point support
0007  * Copyright (C) 1994-2000 Algorithmics Ltd.
0008  */
0009 
0010 #include "ieee754dp.h"
0011 
0012 int ieee754dp_cmp(union ieee754dp x, union ieee754dp y, int cmp, int sig)
0013 {
0014     s64 vx;
0015     s64 vy;
0016 
0017     COMPXDP;
0018     COMPYDP;
0019 
0020     EXPLODEXDP;
0021     EXPLODEYDP;
0022     FLUSHXDP;
0023     FLUSHYDP;
0024     ieee754_clearcx();  /* Even clear inexact flag here */
0025 
0026     if (ieee754_class_nan(xc) || ieee754_class_nan(yc)) {
0027         if (sig ||
0028             xc == IEEE754_CLASS_SNAN || yc == IEEE754_CLASS_SNAN)
0029             ieee754_setcx(IEEE754_INVALID_OPERATION);
0030         return (cmp & IEEE754_CUN) != 0;
0031     } else {
0032         vx = x.bits;
0033         vy = y.bits;
0034 
0035         if (vx < 0)
0036             vx = -vx ^ DP_SIGN_BIT;
0037         if (vy < 0)
0038             vy = -vy ^ DP_SIGN_BIT;
0039 
0040         if (vx < vy)
0041             return (cmp & IEEE754_CLT) != 0;
0042         else if (vx == vy)
0043             return (cmp & IEEE754_CEQ) != 0;
0044         else
0045             return (cmp & IEEE754_CGT) != 0;
0046     }
0047 }