dp_simple.c 909 B

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