0001
0002
0003
0004
0005
0006
0007
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();
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 }