Properly handle move semantics in the scoped FTZ

This commit is contained in:
Robbert van der Helm
2021-04-28 12:43:46 +02:00
parent 93f089eca7
commit 160c6acb85
2 changed files with 19 additions and 2 deletions
+15 -1
View File
@@ -54,5 +54,19 @@ ScopedFlushToZero::ScopedFlushToZero() {
} }
ScopedFlushToZero::~ScopedFlushToZero() { ScopedFlushToZero::~ScopedFlushToZero() {
_MM_SET_FLUSH_ZERO_MODE(old_ftz_mode); if (old_ftz_mode) {
_MM_SET_FLUSH_ZERO_MODE(*old_ftz_mode);
}
}
ScopedFlushToZero::ScopedFlushToZero(ScopedFlushToZero&& o)
: old_ftz_mode(std::move(o.old_ftz_mode)) {
o.old_ftz_mode.reset();
}
ScopedFlushToZero& ScopedFlushToZero::operator=(ScopedFlushToZero&& o) {
old_ftz_mode = std::move(o.old_ftz_mode);
o.old_ftz_mode.reset();
return *this;
} }
+4 -1
View File
@@ -97,6 +97,9 @@ class ScopedFlushToZero {
ScopedFlushToZero(const ScopedFlushToZero&) = delete; ScopedFlushToZero(const ScopedFlushToZero&) = delete;
ScopedFlushToZero& operator=(const ScopedFlushToZero&) = delete; ScopedFlushToZero& operator=(const ScopedFlushToZero&) = delete;
ScopedFlushToZero(ScopedFlushToZero&&);
ScopedFlushToZero& operator=(ScopedFlushToZero&&);
private: private:
/** /**
* The previous FTZ mode. When we use this on the Wine side, this should * The previous FTZ mode. When we use this on the Wine side, this should
@@ -104,5 +107,5 @@ class ScopedFlushToZero {
* don't accidentally end up disabling FTZ somewhere where it should be * don't accidentally end up disabling FTZ somewhere where it should be
* enabled. * enabled.
*/ */
unsigned int old_ftz_mode; std::optional<unsigned int> old_ftz_mode;
}; };