From 160c6acb8519bc34ef2b707aad94adfad086b79f Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Wed, 28 Apr 2021 12:43:46 +0200 Subject: [PATCH] Properly handle move semantics in the scoped FTZ --- src/common/utils.cpp | 16 +++++++++++++++- src/common/utils.h | 5 ++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/common/utils.cpp b/src/common/utils.cpp index 25680d61..9f1d439e 100644 --- a/src/common/utils.cpp +++ b/src/common/utils.cpp @@ -54,5 +54,19 @@ 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; } diff --git a/src/common/utils.h b/src/common/utils.h index 0e654138..9a9a6660 100644 --- a/src/common/utils.h +++ b/src/common/utils.h @@ -97,6 +97,9 @@ class ScopedFlushToZero { ScopedFlushToZero(const ScopedFlushToZero&) = delete; ScopedFlushToZero& operator=(const ScopedFlushToZero&) = delete; + ScopedFlushToZero(ScopedFlushToZero&&); + ScopedFlushToZero& operator=(ScopedFlushToZero&&); + private: /** * 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 * enabled. */ - unsigned int old_ftz_mode; + std::optional old_ftz_mode; };