sp_simple.c 891 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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. union ieee754sp ieee754sp_neg(union ieee754sp x)
  11. {
  12. union ieee754sp y;
  13. if (ieee754_csr.abs2008) {
  14. y = x;
  15. SPSIGN(y) = !SPSIGN(x);
  16. } else {
  17. unsigned int oldrm;
  18. oldrm = ieee754_csr.rm;
  19. ieee754_csr.rm = FPU_CSR_RD;
  20. y = ieee754sp_sub(ieee754sp_zero(0), x);
  21. ieee754_csr.rm = oldrm;
  22. }
  23. return y;
  24. }
  25. union ieee754sp ieee754sp_abs(union ieee754sp x)
  26. {
  27. union ieee754sp y;
  28. if (ieee754_csr.abs2008) {
  29. y = x;
  30. SPSIGN(y) = 0;
  31. } else {
  32. unsigned int oldrm;
  33. oldrm = ieee754_csr.rm;
  34. ieee754_csr.rm = FPU_CSR_RD;
  35. if (SPSIGN(x))
  36. y = ieee754sp_sub(ieee754sp_zero(0), x);
  37. else
  38. y = ieee754sp_add(ieee754sp_zero(0), x);
  39. ieee754_csr.rm = oldrm;
  40. }
  41. return y;
  42. }