mirror of https://github.com/python/cpython
support setting fpu precision on m68k (closes #20904)
Patch from Andreas Schwab.
This commit is contained in:
parent
aedff520ea
commit
8bdeb1672c
|
@ -588,6 +588,25 @@ extern "C" {
|
||||||
} while (0)
|
} while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_GCC_ASM_FOR_MC68881
|
||||||
|
#define HAVE_PY_SET_53BIT_PRECISION 1
|
||||||
|
#define _Py_SET_53BIT_PRECISION_HEADER \
|
||||||
|
unsigned int old_fpcr, new_fpcr
|
||||||
|
#define _Py_SET_53BIT_PRECISION_START \
|
||||||
|
do { \
|
||||||
|
__asm__ ("fmove.l %%fpcr,%0" : "=g" (old_fpcr)); \
|
||||||
|
/* Set double precision / round to nearest. */ \
|
||||||
|
new_fpcr = (old_fpcr & ~0xf0) | 0x80; \
|
||||||
|
if (new_fpcr != old_fpcr) \
|
||||||
|
__asm__ volatile ("fmove.l %0,%%fpcr" : : "g" (new_fpcr)); \
|
||||||
|
} while (0)
|
||||||
|
#define _Py_SET_53BIT_PRECISION_END \
|
||||||
|
do { \
|
||||||
|
if (new_fpcr != old_fpcr) \
|
||||||
|
__asm__ volatile ("fmove.l %0,%%fpcr" : : "g" (old_fpcr)); \
|
||||||
|
} while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* default definitions are empty */
|
/* default definitions are empty */
|
||||||
#ifndef HAVE_PY_SET_53BIT_PRECISION
|
#ifndef HAVE_PY_SET_53BIT_PRECISION
|
||||||
#define _Py_SET_53BIT_PRECISION_HEADER
|
#define _Py_SET_53BIT_PRECISION_HEADER
|
||||||
|
|
|
@ -10,6 +10,8 @@ Release date: TBA
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #20904: Support setting FPU precision on m68k.
|
||||||
|
|
||||||
- Issue #21209: Fix sending tuples to custom generator objects with the yield
|
- Issue #21209: Fix sending tuples to custom generator objects with the yield
|
||||||
from syntax.
|
from syntax.
|
||||||
|
|
||||||
|
|
|
@ -13244,6 +13244,38 @@ $as_echo "#define HAVE_GCC_ASM_FOR_X87 1" >>confdefs.h
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can use gcc inline assembler to get and set mc68881 fpcr" >&5
|
||||||
|
$as_echo_n "checking whether we can use gcc inline assembler to get and set mc68881 fpcr... " >&6; }
|
||||||
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
/* end confdefs.h. */
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
|
||||||
|
unsigned int fpcr;
|
||||||
|
__asm__ __volatile__ ("fmove.l %%fpcr,%0" : "=g" (fpcr));
|
||||||
|
__asm__ __volatile__ ("fmove.l %0,%%fpcr" : : "g" (fpcr));
|
||||||
|
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
if ac_fn_c_try_compile "$LINENO"; then :
|
||||||
|
have_gcc_asm_for_mc68881=yes
|
||||||
|
else
|
||||||
|
have_gcc_asm_for_mc68881=no
|
||||||
|
fi
|
||||||
|
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_gcc_asm_for_mc68881" >&5
|
||||||
|
$as_echo "$have_gcc_asm_for_mc68881" >&6; }
|
||||||
|
if test "$have_gcc_asm_for_mc68881" = yes
|
||||||
|
then
|
||||||
|
|
||||||
|
$as_echo "#define HAVE_GCC_ASM_FOR_MC68881 1" >>confdefs.h
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
# Detect whether system arithmetic is subject to x87-style double
|
# Detect whether system arithmetic is subject to x87-style double
|
||||||
# rounding issues. The result of this test has little meaning on non
|
# rounding issues. The result of this test has little meaning on non
|
||||||
# IEEE 754 platforms. On IEEE 754, test should return 1 if rounding
|
# IEEE 754 platforms. On IEEE 754, test should return 1 if rounding
|
||||||
|
|
13
configure.ac
13
configure.ac
|
@ -3810,6 +3810,19 @@ then
|
||||||
[Define if we can use gcc inline assembler to get and set x87 control word])
|
[Define if we can use gcc inline assembler to get and set x87 control word])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
AC_MSG_CHECKING(whether we can use gcc inline assembler to get and set mc68881 fpcr)
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
|
||||||
|
unsigned int fpcr;
|
||||||
|
__asm__ __volatile__ ("fmove.l %%fpcr,%0" : "=g" (fpcr));
|
||||||
|
__asm__ __volatile__ ("fmove.l %0,%%fpcr" : : "g" (fpcr));
|
||||||
|
]])],[have_gcc_asm_for_mc68881=yes],[have_gcc_asm_for_mc68881=no])
|
||||||
|
AC_MSG_RESULT($have_gcc_asm_for_mc68881)
|
||||||
|
if test "$have_gcc_asm_for_mc68881" = yes
|
||||||
|
then
|
||||||
|
AC_DEFINE(HAVE_GCC_ASM_FOR_MC68881, 1,
|
||||||
|
[Define if we can use gcc inline assembler to get and set mc68881 fpcr])
|
||||||
|
fi
|
||||||
|
|
||||||
# Detect whether system arithmetic is subject to x87-style double
|
# Detect whether system arithmetic is subject to x87-style double
|
||||||
# rounding issues. The result of this test has little meaning on non
|
# rounding issues. The result of this test has little meaning on non
|
||||||
# IEEE 754 platforms. On IEEE 754, test should return 1 if rounding
|
# IEEE 754 platforms. On IEEE 754, test should return 1 if rounding
|
||||||
|
|
|
@ -313,6 +313,9 @@
|
||||||
/* Define to 1 if you have the `gamma' function. */
|
/* Define to 1 if you have the `gamma' function. */
|
||||||
#undef HAVE_GAMMA
|
#undef HAVE_GAMMA
|
||||||
|
|
||||||
|
/* Define if we can use gcc inline assembler to get and set mc68881 fpcr */
|
||||||
|
#undef HAVE_GCC_ASM_FOR_MC68881
|
||||||
|
|
||||||
/* Define if we can use x64 gcc inline assembler */
|
/* Define if we can use x64 gcc inline assembler */
|
||||||
#undef HAVE_GCC_ASM_FOR_X64
|
#undef HAVE_GCC_ASM_FOR_X64
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue