1*9d5a6349SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 21da177e4SLinus Torvalds /* IEEE754 floating point arithmetic 31da177e4SLinus Torvalds * double precision: common utilities 41da177e4SLinus Torvalds */ 51da177e4SLinus Torvalds /* 61da177e4SLinus Torvalds * MIPS floating point support 71da177e4SLinus Torvalds * Copyright (C) 1994-2000 Algorithmics Ltd. 81da177e4SLinus Torvalds */ 91da177e4SLinus Torvalds 101da177e4SLinus Torvalds #include "ieee754dp.h" 111da177e4SLinus Torvalds ieee754dp_cmp(union ieee754dp x,union ieee754dp y,int cmp,int sig)122209bcb1SRalf Baechleint ieee754dp_cmp(union ieee754dp x, union ieee754dp y, int cmp, int sig) 131da177e4SLinus Torvalds { 143f7cac41SRalf Baechle s64 vx; 153f7cac41SRalf Baechle s64 vy; 163f7cac41SRalf Baechle 171da177e4SLinus Torvalds COMPXDP; 181da177e4SLinus Torvalds COMPYDP; 191da177e4SLinus Torvalds 201da177e4SLinus Torvalds EXPLODEXDP; 211da177e4SLinus Torvalds EXPLODEYDP; 221da177e4SLinus Torvalds FLUSHXDP; 231da177e4SLinus Torvalds FLUSHYDP; 249e8bad1fSRalf Baechle ieee754_clearcx(); /* Even clear inexact flag here */ 251da177e4SLinus Torvalds 26c9a10845SMaciej W. Rozycki if (ieee754_class_nan(xc) || ieee754_class_nan(yc)) { 27b844bc78SMaciej W. Rozycki if (sig || 28b844bc78SMaciej W. Rozycki xc == IEEE754_CLASS_SNAN || yc == IEEE754_CLASS_SNAN) 299e8bad1fSRalf Baechle ieee754_setcx(IEEE754_INVALID_OPERATION); 30bd267a53SMaciej W. Rozycki return (cmp & IEEE754_CUN) != 0; 311da177e4SLinus Torvalds } else { 323f7cac41SRalf Baechle vx = x.bits; 333f7cac41SRalf Baechle vy = y.bits; 341da177e4SLinus Torvalds 351da177e4SLinus Torvalds if (vx < 0) 361da177e4SLinus Torvalds vx = -vx ^ DP_SIGN_BIT; 371da177e4SLinus Torvalds if (vy < 0) 381da177e4SLinus Torvalds vy = -vy ^ DP_SIGN_BIT; 391da177e4SLinus Torvalds 401da177e4SLinus Torvalds if (vx < vy) 411da177e4SLinus Torvalds return (cmp & IEEE754_CLT) != 0; 421da177e4SLinus Torvalds else if (vx == vy) 431da177e4SLinus Torvalds return (cmp & IEEE754_CEQ) != 0; 441da177e4SLinus Torvalds else 451da177e4SLinus Torvalds return (cmp & IEEE754_CGT) != 0; 461da177e4SLinus Torvalds } 471da177e4SLinus Torvalds } 48