Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/jolt_physics/Jolt/Core/FPException.h
9906 views
1
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
2
// SPDX-FileCopyrightText: 2021 Jorrit Rouwe
3
// SPDX-License-Identifier: MIT
4
5
#pragma once
6
7
#include <Jolt/Core/FPControlWord.h>
8
9
JPH_NAMESPACE_BEGIN
10
11
#ifdef JPH_FLOATING_POINT_EXCEPTIONS_ENABLED
12
13
#if defined(JPH_CPU_WASM)
14
15
// Not supported
16
class FPExceptionsEnable { };
17
class FPExceptionDisableInvalid { };
18
class FPExceptionDisableDivByZero { };
19
class FPExceptionDisableOverflow { };
20
21
#elif defined(JPH_USE_SSE)
22
23
/// Enable floating point divide by zero exception, overflow exceptions and exceptions on invalid numbers
24
class FPExceptionsEnable : public FPControlWord<0, _MM_MASK_DIV_ZERO | _MM_MASK_INVALID | _MM_MASK_OVERFLOW> { };
25
26
/// Disable invalid floating point value exceptions
27
class FPExceptionDisableInvalid : public FPControlWord<_MM_MASK_INVALID, _MM_MASK_INVALID> { };
28
29
/// Disable division by zero floating point exceptions
30
class FPExceptionDisableDivByZero : public FPControlWord<_MM_MASK_DIV_ZERO, _MM_MASK_DIV_ZERO> { };
31
32
/// Disable floating point overflow exceptions
33
class FPExceptionDisableOverflow : public FPControlWord<_MM_MASK_OVERFLOW, _MM_MASK_OVERFLOW> { };
34
35
#elif defined(JPH_CPU_ARM) && defined(JPH_COMPILER_MSVC)
36
37
/// Enable floating point divide by zero exception, overflow exceptions and exceptions on invalid numbers
38
class FPExceptionsEnable : public FPControlWord<0, _EM_INVALID | _EM_ZERODIVIDE | _EM_OVERFLOW> { };
39
40
/// Disable invalid floating point value exceptions
41
class FPExceptionDisableInvalid : public FPControlWord<_EM_INVALID, _EM_INVALID> { };
42
43
/// Disable division by zero floating point exceptions
44
class FPExceptionDisableDivByZero : public FPControlWord<_EM_ZERODIVIDE, _EM_ZERODIVIDE> { };
45
46
/// Disable floating point overflow exceptions
47
class FPExceptionDisableOverflow : public FPControlWord<_EM_OVERFLOW, _EM_OVERFLOW> { };
48
49
#elif defined(JPH_CPU_ARM)
50
51
/// Invalid operation exception bit
52
static constexpr uint64 FP_IOE = 1 << 8;
53
54
/// Enable divide by zero exception bit
55
static constexpr uint64 FP_DZE = 1 << 9;
56
57
/// Enable floating point overflow bit
58
static constexpr uint64 FP_OFE = 1 << 10;
59
60
/// Enable floating point divide by zero exception, overflow exceptions and exceptions on invalid numbers
61
class FPExceptionsEnable : public FPControlWord<FP_IOE | FP_DZE | FP_OFE, FP_IOE | FP_DZE | FP_OFE> { };
62
63
/// Disable invalid floating point value exceptions
64
class FPExceptionDisableInvalid : public FPControlWord<0, FP_IOE> { };
65
66
/// Disable division by zero floating point exceptions
67
class FPExceptionDisableDivByZero : public FPControlWord<0, FP_DZE> { };
68
69
/// Disable floating point overflow exceptions
70
class FPExceptionDisableOverflow : public FPControlWord<0, FP_OFE> { };
71
72
#elif defined(JPH_CPU_RISCV)
73
74
#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."
75
76
#elif defined(JPH_CPU_PPC)
77
78
#error PowerPC floating point exception handling to be implemented. JPH_FLOATING_POINT_EXCEPTIONS_ENABLED must be disabled.
79
80
#else
81
82
#error Unsupported CPU architecture
83
84
#endif
85
86
#else
87
88
/// Dummy implementations
89
class FPExceptionsEnable { };
90
class FPExceptionDisableInvalid { };
91
class FPExceptionDisableDivByZero { };
92
class FPExceptionDisableOverflow { };
93
94
#endif
95
96
JPH_NAMESPACE_END
97
98