aboutsummaryrefslogtreecommitdiff
path: root/libvpx/test/register_state_check.h
diff options
context:
space:
mode:
Diffstat (limited to 'libvpx/test/register_state_check.h')
-rw-r--r--libvpx/test/register_state_check.h36
1 files changed, 27 insertions, 9 deletions
diff --git a/libvpx/test/register_state_check.h b/libvpx/test/register_state_check.h
index 436646637..0b837dd04 100644
--- a/libvpx/test/register_state_check.h
+++ b/libvpx/test/register_state_check.h
@@ -35,6 +35,7 @@
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
+#include <intrin.h>
#include <windows.h>
#include <winnt.h>
@@ -55,7 +56,7 @@ class RegisterStateCheck {
private:
static bool StoreRegisters(CONTEXT *const context) {
const HANDLE this_thread = GetCurrentThread();
- EXPECT_TRUE(this_thread != NULL);
+ EXPECT_NE(this_thread, nullptr);
context->ContextFlags = CONTEXT_FLOATING_POINT;
const bool context_saved = GetThreadContext(this_thread, context) == TRUE;
EXPECT_TRUE(context_saved) << "GetLastError: " << GetLastError();
@@ -81,10 +82,13 @@ class RegisterStateCheck {
CONTEXT pre_context_;
};
-#define ASM_REGISTER_STATE_CHECK(statement) \
- do { \
- libvpx_test::RegisterStateCheck reg_check; \
- statement; \
+#define ASM_REGISTER_STATE_CHECK(statement) \
+ do { \
+ { \
+ libvpx_test::RegisterStateCheck reg_check; \
+ statement; \
+ } \
+ _ReadWriteBarrier(); \
} while (false)
} // namespace libvpx_test
@@ -121,11 +125,22 @@ class RegisterStateCheck {
int64_t pre_store_[8];
};
+#if defined(__GNUC__)
+#define ASM_REGISTER_STATE_CHECK(statement) \
+ do { \
+ { \
+ libvpx_test::RegisterStateCheck reg_check; \
+ statement; \
+ } \
+ __asm__ volatile("" ::: "memory"); \
+ } while (false)
+#else
#define ASM_REGISTER_STATE_CHECK(statement) \
do { \
libvpx_test::RegisterStateCheck reg_check; \
statement; \
} while (false)
+#endif
} // namespace libvpx_test
@@ -169,10 +184,13 @@ class RegisterStateCheckMMX {
uint16_t pre_fpu_env_[14];
};
-#define API_REGISTER_STATE_CHECK(statement) \
- do { \
- libvpx_test::RegisterStateCheckMMX reg_check; \
- ASM_REGISTER_STATE_CHECK(statement); \
+#define API_REGISTER_STATE_CHECK(statement) \
+ do { \
+ { \
+ libvpx_test::RegisterStateCheckMMX reg_check; \
+ ASM_REGISTER_STATE_CHECK(statement); \
+ } \
+ __asm__ volatile("" ::: "memory"); \
} while (false)
} // namespace libvpx_test