dp_cmp.c 936 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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. #include "ieee754dp.h"
  10. int ieee754dp_cmp(union ieee754dp x, union ieee754dp y, int cmp, int sig)
  11. {
  12. s64 vx;
  13. s64 vy;
  14. COMPXDP;
  15. COMPYDP;
  16. EXPLODEXDP;
  17. EXPLODEYDP;
  18. FLUSHXDP;
  19. FLUSHYDP;
  20. ieee754_clearcx(); /* Even clear inexact flag here */
  21. if (ieee754_class_nan(xc) || ieee754_class_nan(yc)) {
  22. if (sig ||
  23. xc == IEEE754_CLASS_SNAN || yc == IEEE754_CLASS_SNAN)
  24. ieee754_setcx(IEEE754_INVALID_OPERATION);
  25. return (cmp & IEEE754_CUN) != 0;
  26. } else {
  27. vx = x.bits;
  28. vy = y.bits;
  29. if (vx < 0)
  30. vx = -vx ^ DP_SIGN_BIT;
  31. if (vy < 0)
  32. vy = -vy ^ DP_SIGN_BIT;
  33. if (vx < vy)
  34. return (cmp & IEEE754_CLT) != 0;
  35. else if (vx == vy)
  36. return (cmp & IEEE754_CEQ) != 0;
  37. else
  38. return (cmp & IEEE754_CGT) != 0;
  39. }
  40. }