sp_cmp.c 918 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /* IEEE754 floating point arithmetic
  3. * single precision
  4. */
  5. /*
  6. * MIPS floating point support
  7. * Copyright (C) 1994-2000 Algorithmics Ltd.
  8. */
  9. #include "ieee754sp.h"
  10. int ieee754sp_cmp(union ieee754sp x, union ieee754sp y, int cmp, int sig)
  11. {
  12. int vx;
  13. int vy;
  14. COMPXSP;
  15. COMPYSP;
  16. EXPLODEXSP;
  17. EXPLODEYSP;
  18. FLUSHXSP;
  19. FLUSHYSP;
  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 ^ SP_SIGN_BIT;
  31. if (vy < 0)
  32. vy = -vy ^ SP_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. }