FPException.h 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #pragma once
  4. #include <Jolt/Core/FPControlWord.h>
  5. JPH_NAMESPACE_BEGIN
  6. #ifdef JPH_FLOATING_POINT_EXCEPTIONS_ENABLED
  7. #if defined(JPH_USE_SSE)
  8. /// Enable floating point divide by zero exception and exceptions on invalid numbers
  9. class FPExceptionsEnable : public FPControlWord<0, _MM_MASK_DIV_ZERO | _MM_MASK_INVALID> { };
  10. /// Disable invalid floating point value exceptions
  11. class FPExceptionDisableInvalid : public FPControlWord<_MM_MASK_INVALID, _MM_MASK_INVALID> { };
  12. /// Disable division by zero floating point exceptions
  13. class FPExceptionDisableDivByZero : public FPControlWord<_MM_MASK_DIV_ZERO, _MM_MASK_DIV_ZERO> { };
  14. #elif defined(JPH_CPU_ARM) && defined(JPH_COMPILER_MSVC)
  15. /// Enable floating point divide by zero exception and exceptions on invalid numbers
  16. class FPExceptionsEnable : public FPControlWord<0, _EM_INVALID | _EM_ZERODIVIDE> { };
  17. /// Disable invalid floating point value exceptions
  18. class FPExceptionDisableInvalid : public FPControlWord<_EM_INVALID, _EM_INVALID> { };
  19. /// Disable division by zero floating point exceptions
  20. class FPExceptionDisableDivByZero : public FPControlWord<_EM_ZERODIVIDE, _EM_ZERODIVIDE> { };
  21. #elif defined(JPH_CPU_ARM)
  22. /// Invalid operation exception bit
  23. static constexpr uint64 FP_IOE = 1 << 8;
  24. /// Enable divide by zero exception bit
  25. static constexpr uint64 FP_DZE = 1 << 9;
  26. /// Enable floating point divide by zero exception and exceptions on invalid numbers
  27. class FPExceptionsEnable : public FPControlWord<FP_IOE | FP_DZE, FP_IOE | FP_DZE> { };
  28. /// Disable invalid floating point value exceptions
  29. class FPExceptionDisableInvalid : public FPControlWord<0, FP_IOE> { };
  30. /// Disable division by zero floating point exceptions
  31. class FPExceptionDisableDivByZero : public FPControlWord<0, FP_DZE> { };
  32. #elif defined(JPH_CPU_WASM)
  33. // Not supported
  34. class FPExceptionsEnable { };
  35. class FPExceptionDisableInvalid { };
  36. class FPExceptionDisableDivByZero { };
  37. #else
  38. #error Unsupported CPU architecture
  39. #endif
  40. #else
  41. /// Dummy implementations
  42. class FPExceptionsEnable { };
  43. class FPExceptionDisableInvalid { };
  44. class FPExceptionDisableDivByZero { };
  45. #endif
  46. JPH_NAMESPACE_END