Path: blob/master/thirdparty/jolt_physics/Jolt/Core/FPException.h
9906 views
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)1// SPDX-FileCopyrightText: 2021 Jorrit Rouwe2// SPDX-License-Identifier: MIT34#pragma once56#include <Jolt/Core/FPControlWord.h>78JPH_NAMESPACE_BEGIN910#ifdef JPH_FLOATING_POINT_EXCEPTIONS_ENABLED1112#if defined(JPH_CPU_WASM)1314// Not supported15class FPExceptionsEnable { };16class FPExceptionDisableInvalid { };17class FPExceptionDisableDivByZero { };18class FPExceptionDisableOverflow { };1920#elif defined(JPH_USE_SSE)2122/// Enable floating point divide by zero exception, overflow exceptions and exceptions on invalid numbers23class FPExceptionsEnable : public FPControlWord<0, _MM_MASK_DIV_ZERO | _MM_MASK_INVALID | _MM_MASK_OVERFLOW> { };2425/// Disable invalid floating point value exceptions26class FPExceptionDisableInvalid : public FPControlWord<_MM_MASK_INVALID, _MM_MASK_INVALID> { };2728/// Disable division by zero floating point exceptions29class FPExceptionDisableDivByZero : public FPControlWord<_MM_MASK_DIV_ZERO, _MM_MASK_DIV_ZERO> { };3031/// Disable floating point overflow exceptions32class FPExceptionDisableOverflow : public FPControlWord<_MM_MASK_OVERFLOW, _MM_MASK_OVERFLOW> { };3334#elif defined(JPH_CPU_ARM) && defined(JPH_COMPILER_MSVC)3536/// Enable floating point divide by zero exception, overflow exceptions and exceptions on invalid numbers37class FPExceptionsEnable : public FPControlWord<0, _EM_INVALID | _EM_ZERODIVIDE | _EM_OVERFLOW> { };3839/// Disable invalid floating point value exceptions40class FPExceptionDisableInvalid : public FPControlWord<_EM_INVALID, _EM_INVALID> { };4142/// Disable division by zero floating point exceptions43class FPExceptionDisableDivByZero : public FPControlWord<_EM_ZERODIVIDE, _EM_ZERODIVIDE> { };4445/// Disable floating point overflow exceptions46class FPExceptionDisableOverflow : public FPControlWord<_EM_OVERFLOW, _EM_OVERFLOW> { };4748#elif defined(JPH_CPU_ARM)4950/// Invalid operation exception bit51static constexpr uint64 FP_IOE = 1 << 8;5253/// Enable divide by zero exception bit54static constexpr uint64 FP_DZE = 1 << 9;5556/// Enable floating point overflow bit57static constexpr uint64 FP_OFE = 1 << 10;5859/// Enable floating point divide by zero exception, overflow exceptions and exceptions on invalid numbers60class FPExceptionsEnable : public FPControlWord<FP_IOE | FP_DZE | FP_OFE, FP_IOE | FP_DZE | FP_OFE> { };6162/// Disable invalid floating point value exceptions63class FPExceptionDisableInvalid : public FPControlWord<0, FP_IOE> { };6465/// Disable division by zero floating point exceptions66class FPExceptionDisableDivByZero : public FPControlWord<0, FP_DZE> { };6768/// Disable floating point overflow exceptions69class FPExceptionDisableOverflow : public FPControlWord<0, FP_OFE> { };7071#elif defined(JPH_CPU_RISCV)7273#error "RISC-V only implements manually checking if exceptions occurred by reading the fcsr register. It doesn't generate exceptions. JPH_FLOATING_POINT_EXCEPTIONS_ENABLED must be disabled."7475#elif defined(JPH_CPU_PPC)7677#error PowerPC floating point exception handling to be implemented. JPH_FLOATING_POINT_EXCEPTIONS_ENABLED must be disabled.7879#else8081#error Unsupported CPU architecture8283#endif8485#else8687/// Dummy implementations88class FPExceptionsEnable { };89class FPExceptionDisableInvalid { };90class FPExceptionDisableDivByZero { };91class FPExceptionDisableOverflow { };9293#endif9495JPH_NAMESPACE_END969798