FPException.h 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. #elif defined(JPH_USE_SSE)
  14. /// Enable floating point divide by zero exception and exceptions on invalid numbers
  15. class FPExceptionsEnable : public FPControlWord<0, _MM_MASK_DIV_ZERO | _MM_MASK_INVALID> { };
  16. /// Disable invalid floating point value exceptions
  17. class FPExceptionDisableInvalid : public FPControlWord<_MM_MASK_INVALID, _MM_MASK_INVALID> { };
  18. /// Disable division by zero floating point exceptions
  19. class FPExceptionDisableDivByZero : public FPControlWord<_MM_MASK_DIV_ZERO, _MM_MASK_DIV_ZERO> { };
  20. #elif defined(JPH_CPU_ARM) && defined(JPH_COMPILER_MSVC)
  21. /// Enable floating point divide by zero exception and exceptions on invalid numbers
  22. class FPExceptionsEnable : public FPControlWord<0, _EM_INVALID | _EM_ZERODIVIDE> { };
  23. /// Disable invalid floating point value exceptions
  24. class FPExceptionDisableInvalid : public FPControlWord<_EM_INVALID, _EM_INVALID> { };
  25. /// Disable division by zero floating point exceptions
  26. class FPExceptionDisableDivByZero : public FPControlWord<_EM_ZERODIVIDE, _EM_ZERODIVIDE> { };
  27. #elif defined(JPH_CPU_ARM)
  28. /// Invalid operation exception bit
  29. static constexpr uint64 FP_IOE = 1 << 8;
  30. /// Enable divide by zero exception bit
  31. static constexpr uint64 FP_DZE = 1 << 9;
  32. /// Enable floating point divide by zero exception and exceptions on invalid numbers
  33. class FPExceptionsEnable : public FPControlWord<FP_IOE | FP_DZE, FP_IOE | FP_DZE> { };
  34. /// Disable invalid floating point value exceptions
  35. class FPExceptionDisableInvalid : public FPControlWord<0, FP_IOE> { };
  36. /// Disable division by zero floating point exceptions
  37. class FPExceptionDisableDivByZero : public FPControlWord<0, FP_DZE> { };
  38. #else
  39. #error Unsupported CPU architecture
  40. #endif
  41. #else
  42. /// Dummy implementations
  43. class FPExceptionsEnable { };
  44. class FPExceptionDisableInvalid { };
  45. class FPExceptionDisableDivByZero { };
  46. #endif
  47. JPH_NAMESPACE_END