FPException.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #pragma once
  5. #include <Jolt/Core/FPControlWord.h>
  6. JPH_NAMESPACE_BEGIN
  7. #ifdef JPH_FLOATING_POINT_EXCEPTIONS_ENABLED
  8. #if defined(JPH_CPU_WASM)
  9. // Not supported
  10. class FPExceptionsEnable { };
  11. class FPExceptionDisableInvalid { };
  12. class FPExceptionDisableDivByZero { };
  13. class FPExceptionDisableOverflow { };
  14. #elif defined(JPH_USE_SSE)
  15. /// Enable floating point divide by zero exception, overflow exceptions and exceptions on invalid numbers
  16. class FPExceptionsEnable : public FPControlWord<0, _MM_MASK_DIV_ZERO | _MM_MASK_INVALID | _MM_MASK_OVERFLOW> { };
  17. /// Disable invalid floating point value exceptions
  18. class FPExceptionDisableInvalid : public FPControlWord<_MM_MASK_INVALID, _MM_MASK_INVALID> { };
  19. /// Disable division by zero floating point exceptions
  20. class FPExceptionDisableDivByZero : public FPControlWord<_MM_MASK_DIV_ZERO, _MM_MASK_DIV_ZERO> { };
  21. /// Disable floating point overflow exceptions
  22. class FPExceptionDisableOverflow : public FPControlWord<_MM_MASK_OVERFLOW, _MM_MASK_OVERFLOW> { };
  23. #elif defined(JPH_CPU_ARM) && defined(JPH_COMPILER_MSVC)
  24. /// Enable floating point divide by zero exception, overflow exceptions and exceptions on invalid numbers
  25. class FPExceptionsEnable : public FPControlWord<0, _EM_INVALID | _EM_ZERODIVIDE | _EM_OVERFLOW> { };
  26. /// Disable invalid floating point value exceptions
  27. class FPExceptionDisableInvalid : public FPControlWord<_EM_INVALID, _EM_INVALID> { };
  28. /// Disable division by zero floating point exceptions
  29. class FPExceptionDisableDivByZero : public FPControlWord<_EM_ZERODIVIDE, _EM_ZERODIVIDE> { };
  30. /// Disable floating point overflow exceptions
  31. class FPExceptionDisableOverflow : public FPControlWord<_EM_OVERFLOW, _EM_OVERFLOW> { };
  32. #elif defined(JPH_CPU_ARM)
  33. /// Invalid operation exception bit
  34. static constexpr uint64 FP_IOE = 1 << 8;
  35. /// Enable divide by zero exception bit
  36. static constexpr uint64 FP_DZE = 1 << 9;
  37. /// Enable floating point overflow bit
  38. static constexpr uint64 FP_OFE = 1 << 10;
  39. /// Enable floating point divide by zero exception, overflow exceptions and exceptions on invalid numbers
  40. class FPExceptionsEnable : public FPControlWord<FP_IOE | FP_DZE | FP_OFE, FP_IOE | FP_DZE | FP_OFE> { };
  41. /// Disable invalid floating point value exceptions
  42. class FPExceptionDisableInvalid : public FPControlWord<0, FP_IOE> { };
  43. /// Disable division by zero floating point exceptions
  44. class FPExceptionDisableDivByZero : public FPControlWord<0, FP_DZE> { };
  45. /// Disable floating point overflow exceptions
  46. class FPExceptionDisableOverflow : public FPControlWord<0, FP_OFE> { };
  47. #elif defined(JPH_CPU_RISCV)
  48. #error "RISC-V only implements manually checking if exceptions occurred by reading the fcsr register. It doesn't generate exceptions. JPH_FLOATING_POINT_EXCEPTIONS_ENABLED must be disabled."
  49. #elif defined(JPH_CPU_PPC)
  50. #error PowerPC floating point exception handling to be implemented. JPH_FLOATING_POINT_EXCEPTIONS_ENABLED must be disabled.
  51. #else
  52. #error Unsupported CPU architecture
  53. #endif
  54. #else
  55. /// Dummy implementations
  56. class FPExceptionsEnable { };
  57. class FPExceptionDisableInvalid { };
  58. class FPExceptionDisableDivByZero { };
  59. class FPExceptionDisableOverflow { };
  60. #endif
  61. JPH_NAMESPACE_END