11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* IEEE754 floating point arithmetic 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * double precision: common utilities 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * MIPS floating point support 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1994-2000 Algorithmics Ltd. 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can distribute it and/or modify it 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * under the terms of the GNU General Public License (Version 2) as 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * published by the Free Software Foundation. 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is distributed in the hope it will be useful, but WITHOUT 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * for more details. 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * You should have received a copy of the GNU General Public License along 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * with this program; if not, write to the Free Software Foundation, Inc., 193f7cac416b5e62d37aa693538729c6c23e9b938bRalf Baechle * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "ieee754dp.h" 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 242209bcb1310ffa9ee1af12573f1413581c712b15Ralf Baechleint ieee754dp_cmp(union ieee754dp x, union ieee754dp y, int cmp, int sig) 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 263f7cac416b5e62d37aa693538729c6c23e9b938bRalf Baechle s64 vx; 273f7cac416b5e62d37aa693538729c6c23e9b938bRalf Baechle s64 vy; 283f7cac416b5e62d37aa693538729c6c23e9b938bRalf Baechle 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds COMPXDP; 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds COMPYDP; 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds EXPLODEXDP; 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds EXPLODEYDP; 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FLUSHXDP; 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FLUSHYDP; 369e8bad1f9c0370b2635175b34d6151b90a53da5cRalf Baechle ieee754_clearcx(); /* Even clear inexact flag here */ 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (ieee754dp_isnan(x) || ieee754dp_isnan(y)) { 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (sig || xc == IEEE754_CLASS_SNAN || yc == IEEE754_CLASS_SNAN) 409e8bad1f9c0370b2635175b34d6151b90a53da5cRalf Baechle ieee754_setcx(IEEE754_INVALID_OPERATION); 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cmp & IEEE754_CUN) 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 1; 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cmp & (IEEE754_CLT | IEEE754_CGT)) { 449e8bad1f9c0370b2635175b34d6151b90a53da5cRalf Baechle if (sig && ieee754_setandtestcx(IEEE754_INVALID_OPERATION)) 4590efba36ed50933c6df92805bd7e5742e9cc0f46Ralf Baechle return 0; 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 493f7cac416b5e62d37aa693538729c6c23e9b938bRalf Baechle vx = x.bits; 503f7cac416b5e62d37aa693538729c6c23e9b938bRalf Baechle vy = y.bits; 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (vx < 0) 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vx = -vx ^ DP_SIGN_BIT; 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (vy < 0) 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vy = -vy ^ DP_SIGN_BIT; 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (vx < vy) 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (cmp & IEEE754_CLT) != 0; 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (vx == vy) 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (cmp & IEEE754_CEQ) != 0; 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (cmp & IEEE754_CGT) != 0; 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 65