Jolt Physics
A multi core friendly Game Physics Engine
Loading...
Searching...
No Matches
FPControlWord.h
Go to the documentation of this file.
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
8
10
11#ifdef JPH_USE_SSE
12
15template <uint Value, uint Mask>
16class FPControlWord : public NonCopyable
17{
18public:
19 FPControlWord()
20 {
21 mPrevState = _mm_getcsr();
22 _mm_setcsr((mPrevState & ~Mask) | Value);
23 }
24
25 ~FPControlWord()
26 {
27 _mm_setcsr((_mm_getcsr() & ~Mask) | (mPrevState & Mask));
28 }
29
30private:
31 uint mPrevState;
32};
33
34#elif defined(JPH_CPU_ARM) && defined(JPH_COMPILER_MSVC)
35
38template <unsigned int Value, unsigned int Mask>
39class FPControlWord : public NonCopyable
40{
41public:
42 FPControlWord()
43 {
44 // Read state before change
45 _controlfp_s(&mPrevState, 0, 0);
46
47 // Update the state
48 unsigned int dummy;
49 _controlfp_s(&dummy, Value, Mask);
50 }
51
52 ~FPControlWord()
53 {
54 // Restore state
55 unsigned int dummy;
56 _controlfp_s(&dummy, mPrevState, Mask);
57 }
58
59private:
60 unsigned int mPrevState;
61};
62
63#elif defined(JPH_CPU_ARM) && defined(JPH_USE_NEON)
64
67template <uint64 Value, uint64 Mask>
68class FPControlWord : public NonCopyable
69{
70public:
71 FPControlWord()
72 {
73 uint64 val;
74 asm volatile("mrs %0, fpcr" : "=r" (val));
75 mPrevState = val;
76 val &= ~Mask;
77 val |= Value;
78 asm volatile("msr fpcr, %0" : /* no output */ : "r" (val));
79 }
80
81 ~FPControlWord()
82 {
83 uint64 val;
84 asm volatile("mrs %0, fpcr" : "=r" (val));
85 val &= ~Mask;
86 val |= mPrevState & Mask;
87 asm volatile("msr fpcr, %0" : /* no output */ : "r" (val));
88 }
89
90private:
91 uint64 mPrevState;
92};
93
94#elif defined(JPH_CPU_ARM)
95
98template <uint32 Value, uint32 Mask>
99class FPControlWord : public NonCopyable
100{
101public:
102 FPControlWord()
103 {
104 uint32 val;
105 asm volatile("vmrs %0, fpscr" : "=r" (val));
106 mPrevState = val;
107 val &= ~Mask;
108 val |= Value;
109 asm volatile("vmsr fpscr, %0" : /* no output */ : "r" (val));
110 }
111
112 ~FPControlWord()
113 {
114 uint32 val;
115 asm volatile("vmrs %0, fpscr" : "=r" (val));
116 val &= ~Mask;
117 val |= mPrevState & Mask;
118 asm volatile("vmsr fpscr, %0" : /* no output */ : "r" (val));
119 }
120
121private:
122 uint32 mPrevState;
123};
124
125#elif defined(JPH_CPU_WASM)
126
127// Not supported
128
129#else
130
131#error Unsupported CPU architecture
132
133#endif
134
uint32_t uint32
Definition: Core.h:312
unsigned int uint
Definition: Core.h:309
#define JPH_NAMESPACE_END
Definition: Core.h:240
uint64_t uint64
Definition: Core.h:313
#define JPH_NAMESPACE_BEGIN
Definition: Core.h:234
Class that makes another class non-copyable. Usage: Inherit from NonCopyable.
Definition: NonCopyable.h:11