FPException.h 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #pragma once
  4. #include <Jolt/Core/FPControlWord.h>
  5. namespace JPH {
  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. #else
  26. #error Unsupported CPU architecture
  27. #endif
  28. #else
  29. /// Dummy implementations
  30. class FPExceptionsEnable { };
  31. class FPExceptionDisableInvalid { };
  32. class FPExceptionDisableDivByZero { };
  33. #endif
  34. } // JPH