dp_cmp.c (936B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* IEEE754 floating point arithmetic 3 * double precision: common utilities 4 */ 5/* 6 * MIPS floating point support 7 * Copyright (C) 1994-2000 Algorithmics Ltd. 8 */ 9 10#include "ieee754dp.h" 11 12int ieee754dp_cmp(union ieee754dp x, union ieee754dp y, int cmp, int sig) 13{ 14 s64 vx; 15 s64 vy; 16 17 COMPXDP; 18 COMPYDP; 19 20 EXPLODEXDP; 21 EXPLODEYDP; 22 FLUSHXDP; 23 FLUSHYDP; 24 ieee754_clearcx(); /* Even clear inexact flag here */ 25 26 if (ieee754_class_nan(xc) || ieee754_class_nan(yc)) { 27 if (sig || 28 xc == IEEE754_CLASS_SNAN || yc == IEEE754_CLASS_SNAN) 29 ieee754_setcx(IEEE754_INVALID_OPERATION); 30 return (cmp & IEEE754_CUN) != 0; 31 } else { 32 vx = x.bits; 33 vy = y.bits; 34 35 if (vx < 0) 36 vx = -vx ^ DP_SIGN_BIT; 37 if (vy < 0) 38 vy = -vy ^ DP_SIGN_BIT; 39 40 if (vx < vy) 41 return (cmp & IEEE754_CLT) != 0; 42 else if (vx == vy) 43 return (cmp & IEEE754_CEQ) != 0; 44 else 45 return (cmp & IEEE754_CGT) != 0; 46 } 47}