reland "use intrinsics for 'emms'"
authorJohann <johannkoenig@google.com>
Wed, 14 Mar 2018 23:57:57 +0000 (16:57 -0700)
committerJohann <johannkoenig@google.com>
Tue, 20 Mar 2018 00:11:55 +0000 (17:11 -0700)
Only target 32bit builds. Visual Studio does not define _mm_empty for
64bit configurations.

Rename emms.asm and remove from 32 bit builds to avoid empty file
warnings.

Don't check register state on 64bit builds.

BUG=webm:1500

This reverts commit 60beb781c140b61c1957abd2a6717d2e9a831933.

Change-Id: I5ac4cf6c67249ff24f7da19792144de20527bfce

test/clear_system_state.h
test/register_state_check.h
vpx_ports/emms_mmx.c [new file with mode: 0644]
vpx_ports/float_control_word.asm [moved from vpx_ports/emms.asm with 90% similarity]
vpx_ports/system_state.h
vpx_ports/vpx_ports.mk
vpx_ports/x86.h

index 044a5c7..609a8b0 100644 (file)
 #define TEST_CLEAR_SYSTEM_STATE_H_
 
 #include "./vpx_config.h"
-#if ARCH_X86 || ARCH_X86_64
-#include "vpx_ports/x86.h"
-#endif
+#include "vpx_ports/system_state.h"
 
 namespace libvpx_test {
 
 // Reset system to a known state. This function should be used for all non-API
 // test cases.
-inline void ClearSystemState() {
-#if ARCH_X86 || ARCH_X86_64
-  vpx_reset_mmx_state();
-#endif
-}
+inline void ClearSystemState() { vpx_clear_system_state(); }
 
 }  // namespace libvpx_test
 #endif  // TEST_CLEAR_SYSTEM_STATE_H_
index a779e5c..b1cb983 100644 (file)
@@ -140,7 +140,7 @@ class RegisterStateCheck {};
 
 #endif  // _WIN64
 
-#if ARCH_X86 || ARCH_X86_64
+#if ARCH_X86
 #if defined(__GNUC__)
 
 namespace libvpx_test {
@@ -178,7 +178,7 @@ class RegisterStateCheckMMX {
 }  // namespace libvpx_test
 
 #endif  // __GNUC__
-#endif  // ARCH_X86 || ARCH_X86_64
+#endif  // ARCH_X86
 
 #ifndef API_REGISTER_STATE_CHECK
 #define API_REGISTER_STATE_CHECK ASM_REGISTER_STATE_CHECK
diff --git a/vpx_ports/emms_mmx.c b/vpx_ports/emms_mmx.c
new file mode 100644 (file)
index 0000000..1b28809
--- /dev/null
@@ -0,0 +1,13 @@
+/*
+ *  Copyright (c) 2018 The WebM project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include <mmintrin.h>
+
+void vpx_clear_system_state() { _mm_empty(); }
similarity index 90%
rename from vpx_ports/emms.asm
rename to vpx_ports/float_control_word.asm
index db8da28..256dae0 100644 (file)
 %include "vpx_ports/x86_abi_support.asm"
 
 section .text
-global sym(vpx_reset_mmx_state) PRIVATE
-sym(vpx_reset_mmx_state):
-    emms
-    ret
-
 
 %if LIBVPX_YASM_WIN64
 global sym(vpx_winx64_fldcw) PRIVATE
index 086c646..0a19c3c 100644 (file)
 
 #include "./vpx_config.h"
 
-#if ARCH_X86 || ARCH_X86_64
-void vpx_reset_mmx_state(void);
-#define vpx_clear_system_state() vpx_reset_mmx_state()
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if ARCH_X86 && HAVE_MMX
+extern void vpx_clear_system_state();
 #else
 #define vpx_clear_system_state()
-#endif  // ARCH_X86 || ARCH_X86_64
+#endif  // ARCH_X86 && HAVE_MMX
+
+#ifdef __cplusplus
+}  // extern "C"
+#endif
+
 #endif  // VPX_PORTS_SYSTEM_STATE_H_
index e17145e..9299fa0 100644 (file)
@@ -17,8 +17,15 @@ PORTS_SRCS-yes += msvc.h
 PORTS_SRCS-yes += system_state.h
 PORTS_SRCS-yes += vpx_timer.h
 
+ifeq ($(ARCH_X86),yes)
+PORTS_SRCS-$(HAVE_MMX) += emms_mmx.c
+endif
+
+ifeq ($(ARCH_X86_64),yes)
+PORTS_SRCS-$(CONFIG_MSVS) += float_control_word.asm
+endif
+
 ifeq ($(ARCH_X86)$(ARCH_X86_64),yes)
-PORTS_SRCS-yes += emms.asm
 PORTS_SRCS-yes += x86.h
 PORTS_SRCS-yes += x86_abi_support.asm
 endif
index ced65ac..60c6257 100644 (file)
@@ -317,8 +317,6 @@ static INLINE unsigned int x87_set_double_precision(void) {
   return mode;
 }
 
-extern void vpx_reset_mmx_state(void);
-
 #ifdef __cplusplus
 }  // extern "C"
 #endif