Restore emms usage on x86_64 after 726b021a12

Even on x86_64, emms has to be called if the x87 state has
been clobbered - the calling code (either within libvpx or
in a caller outside of libvpx) may be using the x87 instructions,
even though use of them isn't all that common on x86_64.

This fixes builds with clang for mingw/x86_64.

Change-Id: I1f6072835590b862bad156f17331ba65c813ddd9
This commit is contained in:
Martin Storsjo 2018-03-23 12:48:42 +02:00 committed by Martin Storsjö
parent 99e1784525
commit a6fdfda44c
4 changed files with 26 additions and 4 deletions

View File

@ -140,7 +140,7 @@ class RegisterStateCheck {};
#endif // _WIN64 #endif // _WIN64
#if ARCH_X86 #if ARCH_X86 || ARCH_X86_64
#if defined(__GNUC__) #if defined(__GNUC__)
namespace libvpx_test { namespace libvpx_test {
@ -178,7 +178,7 @@ class RegisterStateCheckMMX {
} // namespace libvpx_test } // namespace libvpx_test
#endif // __GNUC__ #endif // __GNUC__
#endif // ARCH_X86 #endif // ARCH_X86 || ARCH_X86_64
#ifndef API_REGISTER_STATE_CHECK #ifndef API_REGISTER_STATE_CHECK
#define API_REGISTER_STATE_CHECK ASM_REGISTER_STATE_CHECK #define API_REGISTER_STATE_CHECK ASM_REGISTER_STATE_CHECK

18
vpx_ports/emms_mmx.asm Normal file
View File

@ -0,0 +1,18 @@
;
; Copyright (c) 2010 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 "vpx_ports/x86_abi_support.asm"
section .text
global sym(vpx_clear_system_state) PRIVATE
sym(vpx_clear_system_state):
emms
ret

View File

@ -17,11 +17,11 @@
extern "C" { extern "C" {
#endif #endif
#if ARCH_X86 && HAVE_MMX #if (ARCH_X86 || ARCH_X86_64) && HAVE_MMX
extern void vpx_clear_system_state(); extern void vpx_clear_system_state();
#else #else
#define vpx_clear_system_state() #define vpx_clear_system_state()
#endif // ARCH_X86 && HAVE_MMX #endif // (ARCH_X86 || ARCH_X86_64) && HAVE_MMX
#ifdef __cplusplus #ifdef __cplusplus
} // extern "C" } // extern "C"

View File

@ -20,6 +20,10 @@ PORTS_SRCS-yes += vpx_timer.h
ifeq ($(ARCH_X86),yes) ifeq ($(ARCH_X86),yes)
PORTS_SRCS-$(HAVE_MMX) += emms_mmx.c PORTS_SRCS-$(HAVE_MMX) += emms_mmx.c
endif endif
ifeq ($(ARCH_X86_64),yes)
# Visual Studio x64 does not support the _mm_empty() intrinsic.
PORTS_SRCS-$(HAVE_MMX) += emms_mmx.asm
endif
ifeq ($(ARCH_X86_64),yes) ifeq ($(ARCH_X86_64),yes)
PORTS_SRCS-$(CONFIG_MSVS) += float_control_word.asm PORTS_SRCS-$(CONFIG_MSVS) += float_control_word.asm