Skip to content

Commit

Permalink
remove fldcw/fstcw from Win64 builds
Browse files Browse the repository at this point in the history
_MCW_PC (Precision control) is not supported on x64:
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/control87-controlfp-control87-2

The x87 FPU is not used on Win64 or ARM so setting the x87 control word
is not necessary. The SSE/SSE2 and ARM FPUs don't have a precision
control - the precision is embedded in each instruction - so the need to
set the control word is also gone.

BUG=webm:1500

Change-Id: I014513282a7dc320d1cdeaec48249d98a66bf09f
  • Loading branch information
Johann committed Mar 23, 2018
1 parent 62c4747 commit 60a3cb9
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 42 deletions.
33 changes: 0 additions & 33 deletions vpx_ports/float_control_word.asm

This file was deleted.

4 changes: 0 additions & 4 deletions vpx_ports/vpx_ports.mk
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,6 @@ 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 += x86.h
PORTS_SRCS-yes += x86_abi_support.asm
Expand Down
21 changes: 16 additions & 5 deletions vpx_ports/x86.h
Original file line number Diff line number Diff line change
Expand Up @@ -295,11 +295,11 @@ static unsigned short x87_get_control_word(void) {
return mode;
}
#elif ARCH_X86_64
/* No fldcw intrinsics on Windows x64, punt to external asm */
extern void vpx_winx64_fldcw(unsigned short mode);
extern unsigned short vpx_winx64_fstcw(void);
#define x87_set_control_word vpx_winx64_fldcw
#define x87_get_control_word vpx_winx64_fstcw
// Unsupported on Win64:
// https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/control87-controlfp-control87-2
// _MCW_PC (Precision control) (Not supported on ARM or x64 platforms.)
static void x87_set_control_word(unsigned int mode) { (void)mode; }
static unsigned int x87_get_control_word(void) { return 0; }
#else
static void x87_set_control_word(unsigned short mode) {
__asm { fldcw mode }
Expand All @@ -313,6 +313,17 @@ static unsigned short x87_get_control_word(void) {

static INLINE unsigned int x87_set_double_precision(void) {
unsigned int mode = x87_get_control_word();
// Intel 64 and IA-32 Architectures Developer's Manual: Vol. 1
// https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-1-manual.pdf
// 8.1.5.2 Precision Control Field
// Bits 8 and 9 (0x300) of the x87 FPU Control Word ("Precision Control")
// determine the number of bits used in floating point calculations. To match
// later SSE instructions restrict x87 operations to Double Precision (0x200).
// Precision PC Field
// Single Precision (24-Bits) 00B
// Reserved 01B
// Double Precision (53-Bits) 10B
// Extended Precision (64-Bits) 11B
x87_set_control_word((mode & ~0x300) | 0x200);
return mode;
}
Expand Down

0 comments on commit 60a3cb9

Please sign in to comment.