2
0

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_USE_SSE)
  9. /// Enable floating point divide by zero exception and exceptions on invalid numbers
  10. class FPExceptionsEnable : public FPControlWord<0, _MM_MASK_DIV_ZERO | _MM_MASK_INVALID> { };
  11. /// Disable invalid floating point value exceptions
  12. class FPExceptionDisableInvalid : public FPControlWord<_MM_MASK_INVALID, _MM_MASK_INVALID> { };
  13. /// Disable division by zero floating point exceptions
  14. class FPExceptionDisableDivByZero : public FPControlWord<_MM_MASK_DIV_ZERO, _MM_MASK_DIV_ZERO> { };
  15. #elif defined(JPH_CPU_ARM) && defined(JPH_COMPILER_MSVC)
  16. /// Enable floating point divide by zero exception and exceptions on invalid numbers
  17. class FPExceptionsEnable : public FPControlWord<0, _EM_INVALID | _EM_ZERODIVIDE> { };
  18. /// Disable invalid floating point value exceptions
  19. class FPExceptionDisableInvalid : public FPControlWord<_EM_INVALID, _EM_INVALID> { };
  20. /// Disable division by zero floating point exceptions
  21. class FPExceptionDisableDivByZero : public FPControlWord<_EM_ZERODIVIDE, _EM_ZERODIVIDE> { };
  22. #elif defined(JPH_CPU_ARM)
  23. /// Invalid operation exception bit
  24. static constexpr uint64 FP_IOE = 1 << 8;
  25. /// Enable divide by zero exception bit
  26. static constexpr uint64 FP_DZE = 1 << 9;
  27. /// Enable floating point divide by zero exception and exceptions on invalid numbers
  28. class FPExceptionsEnable : public FPControlWord<FP_IOE | FP_DZE, FP_IOE | FP_DZE> { };
  29. /// Disable invalid floating point value exceptions
  30. class FPExceptionDisableInvalid : public FPControlWord<0, FP_IOE> { };
  31. /// Disable division by zero floating point exceptions
  32. class FPExceptionDisableDivByZero : public FPControlWord<0, FP_DZE> { };
  33. #elif defined(JPH_CPU_WASM)
  34. // Not supported
  35. class FPExceptionsEnable { };
  36. class FPExceptionDisableInvalid { };
  37. class FPExceptionDisableDivByZero { };
  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