FPException.h 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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_USE_NEON)
  15. /// Invalid operation exception bit
  16. static constexpr uint64 FP_IOE = 1 << 8;
  17. /// Enable divide by zero exception bit
  18. static constexpr uint64 FP_DZE = 1 << 9;
  19. /// Enable floating point divide by zero exception and exceptions on invalid numbers
  20. class FPExceptionsEnable : public FPControlWord<FP_IOE | FP_DZE, FP_IOE | FP_DZE> { };
  21. /// Disable invalid floating point value exceptions
  22. class FPExceptionDisableInvalid : public FPControlWord<0, FP_IOE> { };
  23. /// Disable division by zero floating point exceptions
  24. class FPExceptionDisableDivByZero : public FPControlWord<0, FP_DZE> { };
  25. #elif defined(JPH_CPU_WASM)
  26. // Not supported
  27. class FPExceptionsEnable { };
  28. class FPExceptionDisableInvalid { };
  29. class FPExceptionDisableDivByZero { };
  30. #else
  31. #error Unsupported CPU architecture
  32. #endif
  33. #else
  34. /// Dummy implementations
  35. class FPExceptionsEnable { };
  36. class FPExceptionDisableInvalid { };
  37. class FPExceptionDisableDivByZero { };
  38. #endif
  39. JPH_NAMESPACE_END