[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commits] r23425 - in /fsf/trunk/libc: ./ manual/ nptl/ nptl/sysdeps/pthread/ nptl/sysdeps/unix/sysv/linux/ nptl/sysdeps/unix/sysv/lin...
- To: commits@xxxxxxxxxx
- Subject: [Commits] r23425 - in /fsf/trunk/libc: ./ manual/ nptl/ nptl/sysdeps/pthread/ nptl/sysdeps/unix/sysv/linux/ nptl/sysdeps/unix/sysv/lin...
- From: eglibc@xxxxxxxxxx
- Date: Wed, 03 Jul 2013 00:02:30 -0000
Author: eglibc
Date: Wed Jul 3 00:02:28 2013
New Revision: 23425
Log:
Import glibc-mainline for 2013-07-03
Added:
fsf/trunk/libc/nptl/elision-conf.h
fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/Makefile
fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/elision-conf.c
fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/elision-conf.h
fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/elision-lock.c
fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/elision-timed.c
fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/elision-trylock.c
fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/elision-unlock.c
fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/force-elision.h
fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/hle.h
fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_cond_lock.c
fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_lock.c
fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_timedlock.c
fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_trylock.c
fsf/trunk/libc/ports/sysdeps/arm/s_fma.c
fsf/trunk/libc/ports/sysdeps/arm/s_fmaf.c
fsf/trunk/libc/ports/sysdeps/arm/soft-fp/
fsf/trunk/libc/ports/sysdeps/arm/soft-fp/sfp-machine.h
fsf/trunk/libc/ports/sysdeps/mips/ieee754/s_fma.c
fsf/trunk/libc/ports/sysdeps/mips/ieee754/s_fmaf.c
fsf/trunk/libc/ports/sysdeps/mips/ieee754/s_fmal.c
fsf/trunk/libc/soft-fp/fmadf4.c
fsf/trunk/libc/soft-fp/fmasf4.c
fsf/trunk/libc/soft-fp/fmatf4.c
Removed:
fsf/trunk/libc/ports/sysdeps/mips/mips64/n32/s_fma.c
fsf/trunk/libc/ports/sysdeps/mips/mips64/n64/s_fma.c
Modified:
fsf/trunk/libc/ChangeLog
fsf/trunk/libc/INSTALL
fsf/trunk/libc/NEWS
fsf/trunk/libc/config.h.in
fsf/trunk/libc/configure
fsf/trunk/libc/configure.in
fsf/trunk/libc/manual/install.texi
fsf/trunk/libc/nptl/ChangeLog
fsf/trunk/libc/nptl/pthreadP.h
fsf/trunk/libc/nptl/pthread_mutex_lock.c
fsf/trunk/libc/nptl/pthread_mutex_timedlock.c
fsf/trunk/libc/nptl/pthread_mutex_trylock.c
fsf/trunk/libc/nptl/pthread_mutex_unlock.c
fsf/trunk/libc/nptl/pthread_mutexattr_settype.c
fsf/trunk/libc/nptl/sysdeps/pthread/pthread.h
fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h
fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/pthread_mutex_cond_lock.c
fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/bits/pthreadtypes.h
fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h
fsf/trunk/libc/nptl/tst-mutex5.c
fsf/trunk/libc/nptl/tst-mutex8.c
fsf/trunk/libc/ports/ChangeLog.alpha
fsf/trunk/libc/ports/ChangeLog.arm
fsf/trunk/libc/ports/ChangeLog.m68k
fsf/trunk/libc/ports/ChangeLog.mips
fsf/trunk/libc/ports/sysdeps/alpha/fpu/libm-test-ulps
fsf/trunk/libc/ports/sysdeps/arm/Implies
fsf/trunk/libc/ports/sysdeps/arm/dl-machine.h
fsf/trunk/libc/ports/sysdeps/arm/libm-test-ulps
fsf/trunk/libc/ports/sysdeps/m68k/m680x0/fpu/libm-test-ulps
fsf/trunk/libc/ports/sysdeps/mips/mips32/Implies
fsf/trunk/libc/ports/sysdeps/mips/mips32/libm-test-ulps
fsf/trunk/libc/ports/sysdeps/mips/mips64/libm-test-ulps
fsf/trunk/libc/ports/sysdeps/mips/mips64/soft-fp/sfp-machine.h
fsf/trunk/libc/ports/sysdeps/mips/soft-fp/sfp-machine.h
fsf/trunk/libc/soft-fp/double.h
fsf/trunk/libc/soft-fp/extended.h
fsf/trunk/libc/soft-fp/op-1.h
fsf/trunk/libc/soft-fp/op-2.h
fsf/trunk/libc/soft-fp/op-4.h
fsf/trunk/libc/soft-fp/op-common.h
fsf/trunk/libc/soft-fp/quad.h
fsf/trunk/libc/soft-fp/single.h
fsf/trunk/libc/sysdeps/i386/fpu/libm-test-ulps
fsf/trunk/libc/sysdeps/i386/i686/multiarch/strcasecmp.S
fsf/trunk/libc/sysdeps/i386/i686/multiarch/strncase.S
fsf/trunk/libc/sysdeps/sparc/fpu/libm-test-ulps
fsf/trunk/libc/sysdeps/x86_64/fpu/libm-test-ulps
Modified: fsf/trunk/libc/ChangeLog
==============================================================================
--- fsf/trunk/libc/ChangeLog (original)
+++ fsf/trunk/libc/ChangeLog Wed Jul 3 00:02:28 2013
@@ -1,3 +1,81 @@
+2013-07-02 David S. Miller <davem@xxxxxxxxxxxxx>
+
+ * sysdeps/sparc/fpu/libm-test-ulps: Update.
+
+2013-07-02 Markus Trippelsdorf <markus@xxxxxxxxxxxxxxx>
+
+ * sysdeps/x86_64/fpu/libm-test-ulps: Update.
+
+2013-07-02 Joseph Myers <joseph@xxxxxxxxxxxxxxxx>
+
+ * sysdeps/i386/fpu/libm-test-ulps: Regenerated.
+ * sysdeps/x86_64/fpu/libm-test-ulps: Likewise.
+
+2013-07-02 Andi Kleen <ak@xxxxxxxxxxxxxxx>
+
+ * config.h.in (ENABLE_LOCK_ELISION): Add.
+ * configure.in (--enable-lock-elision): Add option.
+ * manual/install.texi: Document --enable lock elision.
+ * configure: Regenerate
+ * INSTALL: Regenerate.
+
+2013-07-02 H.J. Lu <hongjiu.lu@xxxxxxxxx>
+
+ * sysdeps/i386/i686/multiarch/strcasecmp.S (__strcasecmp): Enable
+ SSE4.2 strcasecmp for libc.a.
+ * sysdeps/i386/i686/multiarch/strncase.S (__strncasecmp): Likewise.
+
+2013-07-02 Joseph Myers <joseph@xxxxxxxxxxxxxxxx>
+
+ [BZ #13304]
+ * soft-fp/op-common.h (_FP_FMA): New macro.
+ * soft-fp/op-1.h (_FP_FRAC_HIGHBIT_DW_1): New macro.
+ (_FP_MUL_MEAT_DW_1_imm): Likewise. Split out of ...
+ (_FP_MUL_MEAT_1_imm): ... here.
+ (_FP_MUL_MEAT_DW_1_wide): New macro. Split out of ...
+ (_FP_MUL_MEAT_1_wide): ... here.
+ (_FP_MUL_MEAT_DW_1_hard): Likewise. Split out of ...
+ (_FP_MUL_MEAT_1_hard): ... here.
+ * soft-fp/op-2.h (_FP_FRAC_HIGHBIT_DW_2): New macro.
+ (_FP_MUL_MEAT_DW_2_wide): Likewise. Split out of ...
+ (_FP_MUL_MEAT_2_wide): ... here.
+ (_FP_MUL_MEAT_DW_2_wide_3mul): New macro. Split out of ...
+ (_FP_MUL_MEAT_2_wide_3mul): ... here.
+ (_FP_MUL_MEAT_DW_2_gmp): New macro. Split out of ...
+ (_FP_MUL_MEAT_2_gmp): ... here.
+ * soft-fp/op-4.h (_FP_FRAC_HIGHBIT_DW_4): New macro.
+ (_FP_MUL_MEAT_DW_4_wide): Likewise. Split out of ...
+ (_FP_MUL_MEAT_4_wide): ... here.
+ (_FP_MUL_MEAT_DW_4_gmp): New macro. Split out of ...
+ (_FP_MUL_MEAT_4_gmp): ... here.
+ * soft-fp/single.h (_FP_FRACTBITS_DW_S): New macro.
+ (_FP_WFRACBITS_DW_S): Likewise.
+ (_FP_WFRACXBITS_DW_S): Likewise.
+ (_FP_HIGHBIT_DW_S): Likewise.
+ (FP_FMA_S): Likewise.
+ (_FP_FRAC_HIGH_DW_S): Likewise.
+ * soft-fp/double.h (_FP_FRACTBITS_DW_D): New macro.
+ (_FP_WFRACBITS_DW_D): Likewise.
+ (_FP_WFRACXBITS_DW_D): Likewise.
+ (_FP_HIGHBIT_DW_D): Likewise.
+ (FP_FMA_D): Likewise.
+ (_FP_FRAC_HIGH_DW_D): Likewise.
+ * soft-fp/extended.h (_FP_FRACTBITS_DW_E): New macro.
+ (_FP_WFRACBITS_DW_E): Likewise.
+ (_FP_WFRACXBITS_DW_E): Likewise.
+ (_FP_HIGHBIT_DW_E): Likewise.
+ (FP_FMA_E): Likewise.
+ (_FP_FRAC_HIGH_DW_E): Likewise.
+ * soft-fp/quad.h (_FP_FRACTBITS_DW_Q): New macro.
+ (_FP_WFRACBITS_DW_Q): Likewise.
+ (_FP_WFRACXBITS_DW_Q): Likewise.
+ (_FP_HIGHBIT_DW_Q): Likewise.
+ (FP_FMA_Q): Likewise.
+ (_FP_FRAC_HIGH_DW_Q): Likewise.
+ * soft-fp/fmasf4.c: New file.
+ * soft-fp/fmadf4.c: Likewise.
+ * soft-fp/fmatf4.c: Likewise.
+
2013-06-28 Liubov Dmitrieva <liubov.dmitrieva@xxxxxxxxx>
* sysdeps/x86_64/multiarch/init-arch.c (__init_cpu_features): Set
Modified: fsf/trunk/libc/INSTALL
==============================================================================
--- fsf/trunk/libc/INSTALL (original)
+++ fsf/trunk/libc/INSTALL Wed Jul 3 00:02:28 2013
@@ -132,6 +132,9 @@
By default, dynamic tests are linked to run with the installed C
library. This option hardcodes the newly built C library path in
dynamic tests so that they can be invoked directly.
+
+`--enable-lock-elision=yes'
+ Enable lock elision for pthread mutexes and rwlocks by default.
`--build=BUILD-SYSTEM'
`--host=HOST-SYSTEM'
Modified: fsf/trunk/libc/NEWS
==============================================================================
--- fsf/trunk/libc/NEWS (original)
+++ fsf/trunk/libc/NEWS Wed Jul 3 00:02:28 2013
@@ -65,6 +65,12 @@
* Added new API functions pthread_getattr_default_np and
pthread_setattr_default_np to get and set the default pthread
attributes of a process.
+
+* Added support for TSX lock elision for pthread mutexes on i386 and x86-64.
+ This may improve lock scaling of existing programs on TSX capable systems.
+ When the --enable-lock-elision=yes parameter is specified at configure
+ time lock elision will be enabled by default for all PTHREAD_MUTEX_DEFAULT
+ mutexes.
Version 2.17
Modified: fsf/trunk/libc/config.h.in
==============================================================================
--- fsf/trunk/libc/config.h.in (original)
+++ fsf/trunk/libc/config.h.in Wed Jul 3 00:02:28 2013
@@ -163,6 +163,9 @@
/* Define if __stack_chk_guard canary should be randomized at program startup. */
#undef ENABLE_STACKGUARD_RANDOMIZE
+
+/* Define if lock elision should be enabled by default. */
+#undef ENABLE_LOCK_ELISION
/* Package description. */
#undef PKGVERSION
Modified: fsf/trunk/libc/configure
==============================================================================
--- fsf/trunk/libc/configure (original)
+++ fsf/trunk/libc/configure Wed Jul 3 00:02:28 2013
@@ -742,6 +742,7 @@
enable_oldest_abi
enable_hardcoded_path_in_tests
enable_stackguard_randomization
+enable_lock_elision
enable_add_ons
enable_hidden_plt
enable_bind_now
@@ -1399,6 +1400,9 @@
--enable-stackguard-randomization
initialize __stack_chk_guard canary with a random
number at program start
+ --enable-lock-elision=yes/no
+ Enable lock elision for pthread mutexes and rwlocks
+ by default
--enable-add-ons[=DIRS...]
configure and build add-ons in DIR1,DIR2,... search
for add-ons if no parameter given
@@ -3469,6 +3473,18 @@
if test "$enable_stackguard_randomize" = yes; then
$as_echo "#define ENABLE_STACKGUARD_RANDOMIZE 1" >>confdefs.h
+
+fi
+
+# Check whether --enable-lock-elision was given.
+if test "${enable_lock_elision+set}" = set; then :
+ enableval=$enable_lock_elision; enable_lock_elision=$enableval
+else
+ enable_lock_elision=no
+fi
+
+if test "$enable_lock_elision" = yes ; then
+ $as_echo "#define ENABLE_LOCK_ELISION 1" >>confdefs.h
fi
Modified: fsf/trunk/libc/configure.in
==============================================================================
--- fsf/trunk/libc/configure.in (original)
+++ fsf/trunk/libc/configure.in Wed Jul 3 00:02:28 2013
@@ -182,6 +182,15 @@
[enable_stackguard_randomize=no])
if test "$enable_stackguard_randomize" = yes; then
AC_DEFINE(ENABLE_STACKGUARD_RANDOMIZE)
+fi
+
+AC_ARG_ENABLE([lock-elision],
+ AC_HELP_STRING([--enable-lock-elision[=yes/no]],
+ [Enable lock elision for pthread mutexes and rwlocks by default]),
+ [enable_lock_elision=$enableval],
+ [enable_lock_elision=no])
+if test "$enable_lock_elision" = yes ; then
+ AC_DEFINE(ENABLE_LOCK_ELISION)
fi
dnl Generic infrastructure for drop-in additions to libc.
Modified: fsf/trunk/libc/manual/install.texi
==============================================================================
--- fsf/trunk/libc/manual/install.texi (original)
+++ fsf/trunk/libc/manual/install.texi Wed Jul 3 00:02:28 2013
@@ -159,6 +159,9 @@
By default, dynamic tests are linked to run with the installed C library.
This option hardcodes the newly built C library path in dynamic tests
so that they can be invoked directly.
+
+@item --enable-lock-elision=yes
+Enable lock elision for pthread mutexes by default.
@item --build=@var{build-system}
@itemx --host=@var{host-system}
Modified: fsf/trunk/libc/nptl/ChangeLog
==============================================================================
--- fsf/trunk/libc/nptl/ChangeLog (original)
+++ fsf/trunk/libc/nptl/ChangeLog Wed Jul 3 00:02:28 2013
@@ -1,3 +1,69 @@
+2013-07-02 Andi Kleen <ak@xxxxxxxxxxxxxxx>
+
+ * sysdeps/unix/sysv/linux/x86/elision-conf.c (elision_init):
+ Check ENABLE_LOCK_ELISION.
+
+2013-07-02 Andi Kleen <ak@xxxxxxxxxxxxxxx>
+
+ * pthread_mutexattr_settype.c (__pthread_mutexattr_settype):
+ Disable elision for PTHREAD_MUTEX_DEFAULT.
+
+2013-07-02 Andi Kleen <ak@xxxxxxxxxxxxxxx>
+ Hongjiu Lu <hongjiu.lu@xxxxxxxxx>
+
+ * pthread_mutex_lock.c
+ (__pthread_mutex_lock): Add lock elision support.
+ * pthread_mutex_timedlock.c (pthread_mutex_timedlock): Likewise.
+ * pthread_mutex_trylock.c (__pthread_mutex_trylock): Likewise.
+ * pthread_mutex_unlock.c (__pthread_mutex_unlock_usercnt): Likewise.
+ * sysdeps/unix/sysv/linux/pthread_mutex_cond_lock.c: Likewise.
+ * sysdeps/unix/sysv/linux/x86/bits/pthreadtypes.h: Likewise.
+ * sysdeps/unix/sysv/linux/x86/Makefile: New file.
+ * sysdeps/unix/sysv/linux/x86/force-elision.h: New file
+ * sysdeps/unix/sysv/linux/x86/pthread_mutex_cond_lock.c: Likewise.
+ * sysdeps/unix/sysv/linux/x86/pthread_mutex_lock.c: Likewise.
+ * sysdeps/unix/sysv/linux/x86/pthread_mutex_timedlock.c: Likewise.
+ * sysdeps/unix/sysv/linux/x86/pthread_mutex_trylock.c: Likewise.
+ * sysdeps/unix/sysv/linux/x86/pthread_mutex_unlock.c: Likewise.
+
+2013-07-02 Andi Kleen <ak@xxxxxxxxxxxxxxx>
+
+ * tst-mutex5.c: Include config.h.
+ (do_test): Add checks for ENABLE_LOCK_ELISION.
+ * tst-mutex8.c: Include config.h
+ (tf): Add checks for ENABLE_LOCK_ELISION.
+ (check_type): Likewise.
+
+2013-07-02 Andi Kleen <ak@xxxxxxxxxxxxxxx>
+
+ * pthreadP.h: Add elision types.
+ (PTHREAD_MUTEX_TYPE_ELISION): Add.
+ * sysdeps/pthread/pthread.h: Add elision initializers.
+ (PTHREAD_MUTEX_ELISION_NP, PTHREAD_MUTEX_NO_ELISION_NP,
+ PTHREAD_MUTEX_PSHARED_NP): Add new flags.
+ (__PTHREAD_SPINS): Add.
+
+2013-07-02 Andi Kleen <ak@xxxxxxxxxxxxxxx>
+ Hongjiu Lu <hongjiu.lu@xxxxxxxxx>
+
+ * sysdeps/unix/sysv/linux/i386/lowlevellock.h (__lll_timedwait_tid,
+ lll_timedlock_elision, __lll_lock_elision, __lll_unlock_elision,
+ __lll_trylock_elision, lll_lock_elision, lll_unlock_elision,
+ lll_trylock_elision): Add.
+ * sysdeps/unix/sysv/linux/x86/Makefile: Imply x86.
+ * sysdeps/unix/sysv/linux/x86/elision-conf.c: New file.
+ * sysdeps/unix/sysv/linux/x86/elision-conf.h: New file.
+ * sysdeps/unix/sysv/linux/x86/elision-lock.c: New file.
+ * sysdeps/unix/sysv/linux/x86/elision-timed.c: New file.
+ * sysdeps/unix/sysv/linux/x86/elision-trylock.c: New file.
+ * sysdeps/unix/sysv/linux/x86/elision-unlock.c: New file.
+ * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h (__lll_timedwait_tid,
+ lll_timedlock_elision, __lll_lock_elision, __lll_unlock_elision,
+ __lll_trylock_elision, lll_lock_elision, lll_unlock_elision,
+ lll_trylock_elision): Add.
+ * nptl/sysdeps/unix/sysv/linux/x86/hle.h: New file.
+ * elision-conf.h: New file.
+
2013-06-24 Vladimir Nikulichev <v.nikulichev@xxxxxxxxx>
[BZ #12310]
Added: fsf/trunk/libc/nptl/elision-conf.h
==============================================================================
--- fsf/trunk/libc/nptl/elision-conf.h (added)
+++ fsf/trunk/libc/nptl/elision-conf.h Wed Jul 3 00:02:28 2013
@@ -1,0 +1,1 @@
+/* empty */
Modified: fsf/trunk/libc/nptl/pthreadP.h
==============================================================================
--- fsf/trunk/libc/nptl/pthreadP.h (original)
+++ fsf/trunk/libc/nptl/pthreadP.h Wed Jul 3 00:02:28 2013
@@ -61,6 +61,10 @@
enum
{
PTHREAD_MUTEX_KIND_MASK_NP = 3,
+
+ PTHREAD_MUTEX_ELISION_NP = 256,
+ PTHREAD_MUTEX_NO_ELISION_NP = 512,
+
PTHREAD_MUTEX_ROBUST_NORMAL_NP = 16,
PTHREAD_MUTEX_ROBUST_RECURSIVE_NP
= PTHREAD_MUTEX_ROBUST_NORMAL_NP | PTHREAD_MUTEX_RECURSIVE_NP,
@@ -93,12 +97,23 @@
PTHREAD_MUTEX_PP_ERRORCHECK_NP
= PTHREAD_MUTEX_PRIO_PROTECT_NP | PTHREAD_MUTEX_ERRORCHECK_NP,
PTHREAD_MUTEX_PP_ADAPTIVE_NP
- = PTHREAD_MUTEX_PRIO_PROTECT_NP | PTHREAD_MUTEX_ADAPTIVE_NP
+ = PTHREAD_MUTEX_PRIO_PROTECT_NP | PTHREAD_MUTEX_ADAPTIVE_NP,
+ PTHREAD_MUTEX_ELISION_FLAGS_NP
+ = PTHREAD_MUTEX_ELISION_NP | PTHREAD_MUTEX_NO_ELISION_NP,
+
+ PTHREAD_MUTEX_TIMED_ELISION_NP =
+ PTHREAD_MUTEX_TIMED_NP | PTHREAD_MUTEX_ELISION_NP,
+ PTHREAD_MUTEX_TIMED_NO_ELISION_NP =
+ PTHREAD_MUTEX_TIMED_NP | PTHREAD_MUTEX_NO_ELISION_NP,
};
#define PTHREAD_MUTEX_PSHARED_BIT 128
#define PTHREAD_MUTEX_TYPE(m) \
((m)->__data.__kind & 127)
+/* Don't include NO_ELISION, as that type is always the same
+ as the underlying lock type. */
+#define PTHREAD_MUTEX_TYPE_ELISION(m) \
+ ((m)->__data.__kind & (127|PTHREAD_MUTEX_ELISION_NP))
#if LLL_PRIVATE == 0 && LLL_SHARED == 128
# define PTHREAD_MUTEX_PSHARED(m) \
Modified: fsf/trunk/libc/nptl/pthread_mutex_lock.c
==============================================================================
--- fsf/trunk/libc/nptl/pthread_mutex_lock.c (original)
+++ fsf/trunk/libc/nptl/pthread_mutex_lock.c Wed Jul 3 00:02:28 2013
@@ -25,6 +25,14 @@
#include <lowlevellock.h>
#include <stap-probe.h>
+#ifndef lll_lock_elision
+#define lll_lock_elision(lock, try_lock, private) ({ \
+ lll_lock (lock, private); 0; })
+#endif
+
+#ifndef lll_trylock_elision
+#define lll_trylock_elision(a,t) lll_trylock(a)
+#endif
#ifndef LLL_MUTEX_LOCK
# define LLL_MUTEX_LOCK(mutex) \
@@ -34,12 +42,20 @@
# define LLL_ROBUST_MUTEX_LOCK(mutex, id) \
lll_robust_lock ((mutex)->__data.__lock, id, \
PTHREAD_ROBUST_MUTEX_PSHARED (mutex))
-#endif
-
+# define LLL_MUTEX_LOCK_ELISION(mutex) \
+ lll_lock_elision ((mutex)->__data.__lock, (mutex)->__data.__elision, \
+ PTHREAD_MUTEX_PSHARED (mutex))
+# define LLL_MUTEX_TRYLOCK_ELISION(mutex) \
+ lll_trylock_elision((mutex)->__data.__lock, (mutex)->__data.__elision, \
+ PTHREAD_MUTEX_PSHARED (mutex))
+#endif
+
+#ifndef FORCE_ELISION
+#define FORCE_ELISION(m, s)
+#endif
static int __pthread_mutex_lock_full (pthread_mutex_t *mutex)
__attribute_noinline__;
-
int
__pthread_mutex_lock (mutex)
@@ -47,26 +63,39 @@
{
assert (sizeof (mutex->__size) >= sizeof (mutex->__data));
- unsigned int type = PTHREAD_MUTEX_TYPE (mutex);
+ unsigned int type = PTHREAD_MUTEX_TYPE_ELISION (mutex);
LIBC_PROBE (mutex_entry, 1, mutex);
- if (__builtin_expect (type & ~PTHREAD_MUTEX_KIND_MASK_NP, 0))
+ if (__builtin_expect (type & ~(PTHREAD_MUTEX_KIND_MASK_NP
+ | PTHREAD_MUTEX_ELISION_FLAGS_NP), 0))
return __pthread_mutex_lock_full (mutex);
- pid_t id = THREAD_GETMEM (THREAD_SELF, tid);
-
- if (__builtin_expect (type, PTHREAD_MUTEX_TIMED_NP)
- == PTHREAD_MUTEX_TIMED_NP)
+ if (__builtin_expect (type == PTHREAD_MUTEX_TIMED_NP, 1))
{
+ FORCE_ELISION (mutex, goto elision);
simple:
/* Normal mutex. */
LLL_MUTEX_LOCK (mutex);
assert (mutex->__data.__owner == 0);
}
- else if (__builtin_expect (type == PTHREAD_MUTEX_RECURSIVE_NP, 1))
+#ifdef HAVE_ELISION
+ else if (__builtin_expect (type == PTHREAD_MUTEX_TIMED_ELISION_NP, 1))
+ {
+ elision: __attribute__((unused))
+ /* This case can never happen on a system without elision,
+ as the mutex type initialization functions will not
+ allow to set the elision flags. */
+ /* Don't record owner or users for elision case. This is a
+ tail call. */
+ return LLL_MUTEX_LOCK_ELISION (mutex);
+ }
+#endif
+ else if (__builtin_expect (PTHREAD_MUTEX_TYPE (mutex)
+ == PTHREAD_MUTEX_RECURSIVE_NP, 1))
{
/* Recursive mutex. */
+ pid_t id = THREAD_GETMEM (THREAD_SELF, tid);
/* Check whether we already hold the mutex. */
if (mutex->__data.__owner == id)
@@ -87,7 +116,8 @@
assert (mutex->__data.__owner == 0);
mutex->__data.__count = 1;
}
- else if (__builtin_expect (type == PTHREAD_MUTEX_ADAPTIVE_NP, 1))
+ else if (__builtin_expect (PTHREAD_MUTEX_TYPE (mutex)
+ == PTHREAD_MUTEX_ADAPTIVE_NP, 1))
{
if (! __is_smp)
goto simple;
@@ -117,12 +147,15 @@
}
else
{
- assert (type == PTHREAD_MUTEX_ERRORCHECK_NP);
+ pid_t id = THREAD_GETMEM (THREAD_SELF, tid);
+ assert (PTHREAD_MUTEX_TYPE (mutex) == PTHREAD_MUTEX_ERRORCHECK_NP);
/* Check whether we already hold the mutex. */
if (__builtin_expect (mutex->__data.__owner == id, 0))
return EDEADLK;
goto simple;
}
+
+ pid_t id = THREAD_GETMEM (THREAD_SELF, tid);
/* Record the ownership. */
mutex->__data.__owner = id;
Modified: fsf/trunk/libc/nptl/pthread_mutex_timedlock.c
==============================================================================
--- fsf/trunk/libc/nptl/pthread_mutex_timedlock.c (original)
+++ fsf/trunk/libc/nptl/pthread_mutex_timedlock.c Wed Jul 3 00:02:28 2013
@@ -25,6 +25,17 @@
#include <stap-probe.h>
+#ifndef lll_timedlock_elision
+#define lll_timedlock_elision(a,dummy,b,c) lll_timedlock(a, b, c)
+#endif
+
+#ifndef lll_trylock_elision
+#define lll_trylock_elision(a,t) lll_trylock(a)
+#endif
+
+#ifndef FORCE_ELISION
+#define FORCE_ELISION(m, s)
+#endif
int
pthread_mutex_timedlock (mutex, abstime)
@@ -40,10 +51,11 @@
/* We must not check ABSTIME here. If the thread does not block
abstime must not be checked for a valid value. */
- switch (__builtin_expect (PTHREAD_MUTEX_TYPE (mutex),
+ switch (__builtin_expect (PTHREAD_MUTEX_TYPE_ELISION (mutex),
PTHREAD_MUTEX_TIMED_NP))
{
/* Recursive mutex. */
+ case PTHREAD_MUTEX_RECURSIVE_NP|PTHREAD_MUTEX_ELISION_NP:
case PTHREAD_MUTEX_RECURSIVE_NP:
/* Check whether we already hold the mutex. */
if (mutex->__data.__owner == id)
@@ -78,11 +90,21 @@
/* FALLTHROUGH */
case PTHREAD_MUTEX_TIMED_NP:
+ FORCE_ELISION (mutex, goto elision);
simple:
/* Normal mutex. */
result = lll_timedlock (mutex->__data.__lock, abstime,
PTHREAD_MUTEX_PSHARED (mutex));
break;
+
+ case PTHREAD_MUTEX_TIMED_ELISION_NP:
+ elision: __attribute__((unused))
+ /* Don't record ownership */
+ return lll_timedlock_elision (mutex->__data.__lock,
+ mutex->__data.__spins,
+ abstime,
+ PTHREAD_MUTEX_PSHARED (mutex));
+
case PTHREAD_MUTEX_ADAPTIVE_NP:
if (! __is_smp)
Modified: fsf/trunk/libc/nptl/pthread_mutex_trylock.c
==============================================================================
--- fsf/trunk/libc/nptl/pthread_mutex_trylock.c (original)
+++ fsf/trunk/libc/nptl/pthread_mutex_trylock.c Wed Jul 3 00:02:28 2013
@@ -22,6 +22,16 @@
#include "pthreadP.h"
#include <lowlevellock.h>
+#ifndef lll_trylock_elision
+#define lll_trylock_elision(a,t) lll_trylock(a)
+#endif
+
+#ifndef DO_ELISION
+#define DO_ELISION(m) 0
+#endif
+
+/* We don't force elision in trylock, because this can lead to inconsistent
+ lock state if the lock was actually busy. */
int
__pthread_mutex_trylock (mutex)
@@ -30,10 +40,11 @@
int oldval;
pid_t id = THREAD_GETMEM (THREAD_SELF, tid);
- switch (__builtin_expect (PTHREAD_MUTEX_TYPE (mutex),
+ switch (__builtin_expect (PTHREAD_MUTEX_TYPE_ELISION (mutex),
PTHREAD_MUTEX_TIMED_NP))
{
/* Recursive mutex. */
+ case PTHREAD_MUTEX_RECURSIVE_NP|PTHREAD_MUTEX_ELISION_NP:
case PTHREAD_MUTEX_RECURSIVE_NP:
/* Check whether we already hold the mutex. */
if (mutex->__data.__owner == id)
@@ -57,10 +68,20 @@
}
break;
+ case PTHREAD_MUTEX_TIMED_ELISION_NP:
+ elision:
+ if (lll_trylock_elision (mutex->__data.__lock,
+ mutex->__data.__elision) != 0)
+ break;
+ /* Don't record the ownership. */
+ return 0;
+
+ case PTHREAD_MUTEX_TIMED_NP:
+ if (DO_ELISION (mutex))
+ goto elision;
+ /*FALL THROUGH*/
+ case PTHREAD_MUTEX_ADAPTIVE_NP:
case PTHREAD_MUTEX_ERRORCHECK_NP:
- case PTHREAD_MUTEX_TIMED_NP:
- case PTHREAD_MUTEX_ADAPTIVE_NP:
- /* Normal mutex. */
if (lll_trylock (mutex->__data.__lock) != 0)
break;
@@ -378,4 +399,9 @@
return EBUSY;
}
+
+#ifndef __pthread_mutex_trylock
+#ifndef pthread_mutex_trylock
strong_alias (__pthread_mutex_trylock, pthread_mutex_trylock)
+#endif
+#endif
Modified: fsf/trunk/libc/nptl/pthread_mutex_unlock.c
==============================================================================
--- fsf/trunk/libc/nptl/pthread_mutex_unlock.c (original)
+++ fsf/trunk/libc/nptl/pthread_mutex_unlock.c Wed Jul 3 00:02:28 2013
@@ -23,6 +23,10 @@
#include <lowlevellock.h>
#include <stap-probe.h>
+#ifndef lll_unlock_elision
+#define lll_unlock_elision(a,b) ({ lll_unlock (a,b); 0; })
+#endif
+
static int
internal_function
__pthread_mutex_unlock_full (pthread_mutex_t *mutex, int decr)
@@ -34,8 +38,9 @@
pthread_mutex_t *mutex;
int decr;
{
- int type = PTHREAD_MUTEX_TYPE (mutex);
- if (__builtin_expect (type & ~PTHREAD_MUTEX_KIND_MASK_NP, 0))
+ int type = PTHREAD_MUTEX_TYPE_ELISION (mutex);
+ if (__builtin_expect (type &
+ ~(PTHREAD_MUTEX_KIND_MASK_NP|PTHREAD_MUTEX_ELISION_FLAGS_NP), 0))
return __pthread_mutex_unlock_full (mutex, decr);
if (__builtin_expect (type, PTHREAD_MUTEX_TIMED_NP)
@@ -55,7 +60,14 @@
return 0;
}
- else if (__builtin_expect (type == PTHREAD_MUTEX_RECURSIVE_NP, 1))
+ else if (__builtin_expect (type == PTHREAD_MUTEX_TIMED_ELISION_NP, 1))
+ {
+ /* Don't reset the owner/users fields for elision. */
+ return lll_unlock_elision (mutex->__data.__lock,
+ PTHREAD_MUTEX_PSHARED (mutex));
+ }
+ else if (__builtin_expect (PTHREAD_MUTEX_TYPE (mutex)
+ == PTHREAD_MUTEX_RECURSIVE_NP, 1))
{
/* Recursive mutex. */
if (mutex->__data.__owner != THREAD_GETMEM (THREAD_SELF, tid))
@@ -66,7 +78,8 @@
return 0;
goto normal;
}
- else if (__builtin_expect (type == PTHREAD_MUTEX_ADAPTIVE_NP, 1))
+ else if (__builtin_expect (PTHREAD_MUTEX_TYPE (mutex)
+ == PTHREAD_MUTEX_ADAPTIVE_NP, 1))
goto normal;
else
{
Modified: fsf/trunk/libc/nptl/pthread_mutexattr_settype.c
==============================================================================
--- fsf/trunk/libc/nptl/pthread_mutexattr_settype.c (original)
+++ fsf/trunk/libc/nptl/pthread_mutexattr_settype.c Wed Jul 3 00:02:28 2013
@@ -30,6 +30,11 @@
if (kind < PTHREAD_MUTEX_NORMAL || kind > PTHREAD_MUTEX_ADAPTIVE_NP)
return EINVAL;
+ /* Cannot distinguish between DEFAULT and NORMAL. So any settype
+ call disables elision for now. */
+ if (kind == PTHREAD_MUTEX_DEFAULT)
+ kind |= PTHREAD_MUTEX_NO_ELISION_NP;
+
iattr = (struct pthread_mutexattr *) attr;
iattr->mutexkind = (iattr->mutexkind & PTHREAD_MUTEXATTR_FLAG_BITS) | kind;
Modified: fsf/trunk/libc/nptl/sysdeps/pthread/pthread.h
==============================================================================
--- fsf/trunk/libc/nptl/sysdeps/pthread/pthread.h (original)
+++ fsf/trunk/libc/nptl/sysdeps/pthread/pthread.h Wed Jul 3 00:02:28 2013
@@ -83,27 +83,39 @@
/* Mutex initializers. */
+#if __PTHREAD_MUTEX_HAVE_ELISION == 1 /* 64bit layout. */
+#define __PTHREAD_SPINS 0, 0
+#elif __PTHREAD_MUTEX_HAVE_ELISION == 2 /* 32bit layout. */
+#define __PTHREAD_SPINS { 0, 0 }
+#else
+#define __PTHREAD_SPINS 0
+#endif
+
#ifdef __PTHREAD_MUTEX_HAVE_PREV
# define PTHREAD_MUTEX_INITIALIZER \
- { { 0, 0, 0, 0, 0, 0, { 0, 0 } } }
+ { { 0, 0, 0, 0, 0, __PTHREAD_SPINS, { 0, 0 } } }
# ifdef __USE_GNU
# define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \
- { { 0, 0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP, 0, { 0, 0 } } }
+ { { 0, 0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP, __PTHREAD_SPINS, { 0, 0 } } }
# define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP \
- { { 0, 0, 0, 0, PTHREAD_MUTEX_ERRORCHECK_NP, 0, { 0, 0 } } }
+ { { 0, 0, 0, 0, PTHREAD_MUTEX_ERRORCHECK_NP, __PTHREAD_SPINS, { 0, 0 } } }
# define PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP \
- { { 0, 0, 0, 0, PTHREAD_MUTEX_ADAPTIVE_NP, 0, { 0, 0 } } }
+ { { 0, 0, 0, 0, PTHREAD_MUTEX_ADAPTIVE_NP, __PTHREAD_SPINS, { 0, 0 } } }
+# define PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP \
+ { { 0, 0, 0, 0, PTHREAD_MUTEX_ADAPTIVE_NP, __PTHREAD_SPINS, { 0, 0 } } }
+
# endif
#else
# define PTHREAD_MUTEX_INITIALIZER \
- { { 0, 0, 0, 0, 0, { 0 } } }
+ { { 0, 0, 0, 0, 0, { __PTHREAD_SPINS } } }
# ifdef __USE_GNU
# define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \
- { { 0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP, 0, { 0 } } }
+ { { 0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP, 0, { __PTHREAD_SPINS } } }
# define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP \
- { { 0, 0, 0, PTHREAD_MUTEX_ERRORCHECK_NP, 0, { 0 } } }
+ { { 0, 0, 0, PTHREAD_MUTEX_ERRORCHECK_NP, 0, { __PTHREAD_SPINS } } }
# define PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP \
- { { 0, 0, 0, PTHREAD_MUTEX_ADAPTIVE_NP, 0, { 0 } } }
+ { { 0, 0, 0, PTHREAD_MUTEX_ADAPTIVE_NP, 0, { __PTHREAD_SPINS } } }
+
# endif
#endif
Modified: fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h
==============================================================================
--- fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h (original)
+++ fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h Wed Jul 3 00:02:28 2013
@@ -430,6 +430,12 @@
: "memory"); \
result; })
+extern int __lll_timedlock_elision (int *futex, short *adapt_count,
+ const struct timespec *timeout,
+ int private) attribute_hidden;
+
+#define lll_timedlock_elision(futex, adapt_count, timeout, private) \
+ __lll_timedlock_elision(&(futex), &(adapt_count), timeout, private)
#define lll_robust_timedlock(futex, timeout, id, private) \
({ int result, ignore1, ignore2, ignore3; \
@@ -583,6 +589,22 @@
} \
__result; })
+extern int __lll_lock_elision (int *futex, short *adapt_count, int private)
+ attribute_hidden;
+
+extern int __lll_unlock_elision(int *lock, int private)
+ attribute_hidden;
+
+extern int __lll_trylock_elision(int *lock, short *adapt_count)
+ attribute_hidden;
+
+#define lll_lock_elision(futex, adapt_count, private) \
+ __lll_lock_elision (&(futex), &(adapt_count), private)
+#define lll_unlock_elision(futex, private) \
+ __lll_unlock_elision (&(futex), private)
+#define lll_trylock_elision(futex, adapt_count) \
+ __lll_trylock_elision(&(futex), &(adapt_count))
+
#endif /* !__ASSEMBLER__ */
#endif /* lowlevellock.h */
Modified: fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/pthread_mutex_cond_lock.c
==============================================================================
--- fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/pthread_mutex_cond_lock.c (original)
+++ fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/pthread_mutex_cond_lock.c Wed Jul 3 00:02:28 2013
@@ -2,8 +2,15 @@
#define LLL_MUTEX_LOCK(mutex) \
lll_cond_lock ((mutex)->__data.__lock, PTHREAD_MUTEX_PSHARED (mutex))
+
+/* Not actually elided so far. Needed? */
+#define LLL_MUTEX_LOCK_ELISION(mutex) \
+ ({ lll_cond_lock ((mutex)->__data.__lock, PTHREAD_MUTEX_PSHARED (mutex)); 0; })
+
#define LLL_MUTEX_TRYLOCK(mutex) \
lll_cond_trylock ((mutex)->__data.__lock)
+#define LLL_MUTEX_TRYLOCK_ELISION(mutex) LLL_MUTEX_TRYLOCK(mutex)
+
#define LLL_ROBUST_MUTEX_LOCK(mutex, id) \
lll_robust_cond_lock ((mutex)->__data.__lock, id, \
PTHREAD_ROBUST_MUTEX_PSHARED (mutex))
Added: fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/Makefile
==============================================================================
--- fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/Makefile (added)
+++ fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/Makefile Wed Jul 3 00:02:28 2013
@@ -1,0 +1,3 @@
+libpthread-sysdep_routines += init-arch
+libpthread-sysdep_routines += elision-lock elision-unlock elision-timed \
+ elision-trylock
Modified: fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/bits/pthreadtypes.h
==============================================================================
--- fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/bits/pthreadtypes.h (original)
+++ fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/bits/pthreadtypes.h Wed Jul 3 00:02:28 2013
@@ -101,14 +101,23 @@
binary compatibility. */
int __kind;
#ifdef __x86_64__
- int __spins;
+ short __spins;
+ short __elision;
__pthread_list_t __list;
# define __PTHREAD_MUTEX_HAVE_PREV 1
+# define __PTHREAD_MUTEX_HAVE_ELISION 1
#else
unsigned int __nusers;
__extension__ union
{
- int __spins;
+ struct
+ {
+ short __espins;
+ short __elision;
+# define __spins d.__espins
+# define __elision d.__elision
+# define __PTHREAD_MUTEX_HAVE_ELISION 2
+ } d;
__pthread_slist_t __list;
};
#endif
Added: fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/elision-conf.c
==============================================================================
--- fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/elision-conf.c (added)
+++ fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/elision-conf.c Wed Jul 3 00:02:28 2013
@@ -1,0 +1,90 @@
+/* elision-conf.c: Lock elision tunable parameters.
+ Copyright (C) 2013 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include "config.h"
+#include <pthreadP.h>
+#include <init-arch.h>
+#include <elision-conf.h>
+#include <unistd.h>
+
+/* Reasonable initial tuning values, may be revised in the future.
+ This is a conservative initial value. */
+
+struct elision_config __elision_aconf =
+ {
+ /* How often to not attempt to use elision if a transaction aborted
+ because the lock is already acquired. Expressed in number of lock
+ acquisition attempts. */
+ .skip_lock_busy = 3,
+ /* How often to not attempt to use elision if a transaction aborted due
+ to reasons other than other threads' memory accesses. Expressed in
+ number of lock acquisition attempts. */
+ .skip_lock_internal_abort = 3,
+ /* How often we retry using elision if there is chance for the transaction
+ to finish execution (e.g., it wasn't aborted due to the lock being
+ already acquired. */
+ .retry_try_xbegin = 3,
+ /* Same as SKIP_LOCK_INTERNAL_ABORT but for trylock. */
+ .skip_trylock_internal_abort = 3,
+ };
+
+/* Elided rwlock toggle, set when elision is available and is
+ enabled for rwlocks. */
+
+int __rwlock_rtm_enabled attribute_hidden;
+
+/* Retries for elided rwlocks on read. Conservative initial value. */
+
+int __rwlock_rtm_read_retries attribute_hidden = 3;
+
+/* Set when the CPU supports elision. When false elision is never attempted. */
+
+int __elision_available attribute_hidden;
+
+/* Force elision for all new locks. This is used to decide whether existing
+ DEFAULT locks should be automatically upgraded to elision in
+ pthread_mutex_lock(). Disabled for suid programs. Only used when elision
+ is available. */
+
+int __pthread_force_elision attribute_hidden;
+
+/* Initialize elison. */
+
+static void
+elision_init (int argc __attribute__ ((unused)),
+ char **argv __attribute__ ((unused)),
+ char **environ)
+{
+ __elision_available = HAS_RTM;
+#ifdef ENABLE_LOCK_ELISION
+ __pthread_force_elision = __libc_enable_secure ? 0 : __elision_available;
+ __rwlock_rtm_enabled = __libc_enable_secure ? 0 : __elision_available;
+#endif
+}
+
+#ifdef SHARED
+# define INIT_SECTION ".init_array"
+#else
+# define INIT_SECTION ".preinit_array"
+#endif
+
+void (*const __pthread_init_array []) (int, char **, char **)
+ __attribute__ ((section (INIT_SECTION), aligned (sizeof (void *)))) =
+{
+ &elision_init
+};
Added: fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/elision-conf.h
==============================================================================
--- fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/elision-conf.h (added)
+++ fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/elision-conf.h Wed Jul 3 00:02:28 2013
@@ -1,0 +1,44 @@
+/* elision-conf.h: Lock elision tunable parameters.
+ Copyright (C) 2013 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+#ifndef _ELISION_CONF_H
+#define _ELISION_CONF_H 1
+
+#include <pthread.h>
+#include <cpuid.h>
+#include <time.h>
+
+/* Should make sure there is no false sharing on this. */
+
+struct elision_config
+{
+ int skip_lock_busy;
+ int skip_lock_internal_abort;
+ int retry_try_xbegin;
+ int skip_trylock_internal_abort;
+};
+
+extern struct elision_config __elision_aconf attribute_hidden;
+
+extern int __rwlock_rtm_enabled attribute_hidden;
+extern int __elision_available attribute_hidden;
+extern int __pthread_force_elision attribute_hidden;
+
+/* Tell the test suite to test elision for this architecture. */
+#define HAVE_ELISION 1
+
+#endif
Added: fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/elision-lock.c
==============================================================================
--- fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/elision-lock.c (added)
+++ fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/elision-lock.c Wed Jul 3 00:02:28 2013
@@ -1,0 +1,95 @@
+/* elision-lock.c: Elided pthread mutex lock.
+ Copyright (C) 2011-2013 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <pthread.h>
+#include "pthreadP.h"
+#include "lowlevellock.h"
+#include "hle.h"
+#include <elision-conf.h>
+
+#if !defined(LLL_LOCK) && !defined(EXTRAARG)
+/* Make sure the configuration code is always linked in for static
+ libraries. */
+#include "elision-conf.c"
+#endif
+
+#ifndef EXTRAARG
+#define EXTRAARG
+#endif
+#ifndef LLL_LOCK
+#define LLL_LOCK(a,b) lll_lock(a,b), 0
+#endif
+
+#define aconf __elision_aconf
+
+/* Adaptive lock using transactions.
+ By default the lock region is run as a transaction, and when it
+ aborts or the lock is busy the lock adapts itself. */
+
+int
+__lll_lock_elision (int *futex, short *adapt_count, EXTRAARG int private)
+{
+ if (*adapt_count <= 0)
+ {
+ unsigned status;
+ int try_xbegin;
+
+ for (try_xbegin = aconf.retry_try_xbegin;
+ try_xbegin > 0;
+ try_xbegin--)
+ {
+ if ((status = _xbegin()) == _XBEGIN_STARTED)
+ {
+ if (*futex == 0)
+ return 0;
+
+ /* Lock was busy. Fall back to normal locking.
+ Could also _xend here but xabort with 0xff code
+ is more visible in the profiler. */
+ _xabort (_ABORT_LOCK_BUSY);
+ }
+
+ if (!(status & _XABORT_RETRY))
+ {
+ if ((status & _XABORT_EXPLICIT)
+ && _XABORT_CODE (status) == _ABORT_LOCK_BUSY)
+ {
+ /* Right now we skip here. Better would be to wait a bit
+ and retry. This likely needs some spinning. */
+ if (*adapt_count != aconf.skip_lock_busy)
+ *adapt_count = aconf.skip_lock_busy;
+ }
+ /* Internal abort. There is no chance for retry.
+ Use the normal locking and next time use lock.
+ Be careful to avoid writing to the lock. */
+ else if (*adapt_count != aconf.skip_lock_internal_abort)
+ *adapt_count = aconf.skip_lock_internal_abort;
+ break;
+ }
+ }
+ }
+ else
+ {
+ /* Use a normal lock until the threshold counter runs out.
+ Lost updates possible. */
+ (*adapt_count)--;
+ }
+
+ /* Use a normal lock here. */
+ return LLL_LOCK ((*futex), private);
+}
Added: fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/elision-timed.c
==============================================================================
--- fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/elision-timed.c (added)
+++ fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/elision-timed.c Wed Jul 3 00:02:28 2013
@@ -1,0 +1,26 @@
+/* elision-timed.c: Lock elision timed lock.
+ Copyright (C) 2013 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <time.h>
+#include <elision-conf.h>
+#include "lowlevellock.h"
+#define __lll_lock_elision __lll_timedlock_elision
+#define EXTRAARG const struct timespec *t,
+#undef LLL_LOCK
+#define LLL_LOCK(a, b) lll_timedlock(a, t, b)
+#include "elision-lock.c"
Added: fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/elision-trylock.c
==============================================================================
--- fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/elision-trylock.c (added)
+++ fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/elision-trylock.c Wed Jul 3 00:02:28 2013
@@ -1,0 +1,71 @@
+/* elision-trylock.c: Lock eliding trylock for pthreads.
+ Copyright (C) 2013 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <pthread.h>
+#include <pthreadP.h>
+#include <lowlevellock.h>
+#include "hle.h"
+#include <elision-conf.h>
+
+#define aconf __elision_aconf
+
+/* Try to elide a futex trylock. FUTEX is the futex variable. ADAPT_COUNT is the
+ adaptation counter in the mutex. */
+
+int
+__lll_trylock_elision (int *futex, short *adapt_count)
+{
+ /* Implement POSIX semantics by forbiding nesting
+ trylock. Sorry. After the abort the code is re-executed
+ non transactional and if the lock was already locked
+ return an error. */
+ _xabort (_ABORT_NESTED_TRYLOCK);
+
+ /* Only try a transaction if it's worth it. */
+ if (*adapt_count <= 0)
+ {
+ unsigned status;
+
+ if ((status = _xbegin()) == _XBEGIN_STARTED)
+ {
+ if (*futex == 0)
+ return 0;
+
+ /* Lock was busy. Fall back to normal locking.
+ Could also _xend here but xabort with 0xff code
+ is more visible in the profiler. */
+ _xabort (_ABORT_LOCK_BUSY);
+ }
+
+ if (!(status & _XABORT_RETRY))
+ {
+ /* Internal abort. No chance for retry. For future
+ locks don't try speculation for some time. */
+ if (*adapt_count != aconf.skip_trylock_internal_abort)
+ *adapt_count = aconf.skip_trylock_internal_abort;
+ }
+ /* Could do some retries here. */
+ }
+ else
+ {
+ /* Lost updates are possible, but harmless. */
+ (*adapt_count)--;
+ }
+
+ return lll_trylock (*futex);
+}
Added: fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/elision-unlock.c
==============================================================================
--- fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/elision-unlock.c (added)
+++ fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/elision-unlock.c Wed Jul 3 00:02:28 2013
@@ -1,0 +1,33 @@
+/* elision-unlock.c: Commit an elided pthread lock.
+ Copyright (C) 2013 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include "pthreadP.h"
+#include "lowlevellock.h"
+#include "hle.h"
+
+int
+__lll_unlock_elision(int *lock, int private)
+{
+ /* When the lock was free we're in a transaction.
+ When you crash here you unlocked a free lock. */
+ if (*lock == 0)
+ _xend();
+ else
+ lll_unlock ((*lock), private);
+ return 0;
+}
Added: fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/force-elision.h
==============================================================================
--- fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/force-elision.h (added)
+++ fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/force-elision.h Wed Jul 3 00:02:28 2013
@@ -1,0 +1,31 @@
+/* force-elision.h: Automatic enabling of elision for mutexes
+ Copyright (C) 2013 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+/* Check for elision on this lock without upgrading. */
+#define DO_ELISION(m) \
+ (__pthread_force_elision \
+ && (m->__data.__kind & PTHREAD_MUTEX_NO_ELISION_NP) == 0) \
+
+/* Automatically enable elision for existing user lock kinds. */
+#define FORCE_ELISION(m, s) \
+ if (__pthread_force_elision \
+ && (m->__data.__kind & PTHREAD_MUTEX_ELISION_FLAGS_NP) == 0) \
+ { \
+ mutex->__data.__kind |= PTHREAD_MUTEX_ELISION_NP; \
+ s; \
+ }
Added: fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/hle.h
==============================================================================
--- fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/hle.h (added)
+++ fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/hle.h Wed Jul 3 00:02:28 2013
@@ -1,0 +1,75 @@
+/* Shared RTM header. Emulate TSX intrinsics for compilers and assemblers
+ that do not support the intrinsics and instructions yet. */
+#ifndef _HLE_H
+#define _HLE_H 1
+
+#ifdef __ASSEMBLER__
+
+.macro XBEGIN target
+ .byte 0xc7,0xf8
+ .long \target-1f
+1:
+.endm
+
+.macro XEND
+ .byte 0x0f,0x01,0xd5
+.endm
+
+.macro XABORT code
+ .byte 0xc6,0xf8,\code
+.endm
+
+.macro XTEST
+ .byte 0x0f,0x01,0xd6
+.endm
+
+#endif
+
+/* Official RTM intrinsics interface matching gcc/icc, but works
+ on older gcc compatible compilers and binutils.
+ We should somehow detect if the compiler supports it, because
+ it may be able to generate slightly better code. */
+
+#define _XBEGIN_STARTED (~0u)
+#define _XABORT_EXPLICIT (1 << 0)
+#define _XABORT_RETRY (1 << 1)
+#define _XABORT_CONFLICT (1 << 2)
+#define _XABORT_CAPACITY (1 << 3)
+#define _XABORT_DEBUG (1 << 4)
+#define _XABORT_NESTED (1 << 5)
+#define _XABORT_CODE(x) (((x) >> 24) & 0xff)
+
+#define _ABORT_LOCK_BUSY 0xff
+#define _ABORT_LOCK_IS_LOCKED 0xfe
+#define _ABORT_NESTED_TRYLOCK 0xfd
+
+#ifndef __ASSEMBLER__
+
+#define __force_inline __attribute__((__always_inline__)) inline
+
+static __force_inline int _xbegin(void)
+{
+ int ret = _XBEGIN_STARTED;
+ asm volatile (".byte 0xc7,0xf8 ; .long 0" : "+a" (ret) :: "memory");
+ return ret;
+}
+
+static __force_inline void _xend(void)
+{
+ asm volatile (".byte 0x0f,0x01,0xd5" ::: "memory");
+}
+
+static __force_inline void _xabort(const unsigned int status)
+{
+ asm volatile (".byte 0xc6,0xf8,%P0" :: "i" (status) : "memory");
+}
+
+static __force_inline int _xtest(void)
+{
+ unsigned char out;
+ asm volatile (".byte 0x0f,0x01,0xd6 ; setnz %0" : "=r" (out) :: "memory");
+ return out;
+}
+
+#endif
+#endif
Added: fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_cond_lock.c
==============================================================================
--- fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_cond_lock.c (added)
+++ fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_cond_lock.c Wed Jul 3 00:02:28 2013
@@ -1,0 +1,21 @@
+/* Copyright (C) 2013 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+/* The cond lock is not actually elided yet, but we still need to handle
+ already elided locks. */
+#include <elision-conf.h>
+#include "sysdeps/unix/sysv/linux/pthread_mutex_cond_lock.c"
Added: fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_lock.c
==============================================================================
--- fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_lock.c (added)
+++ fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_lock.c Wed Jul 3 00:02:28 2013
@@ -1,0 +1,21 @@
+/* Elided version of pthread_mutex_lock.
+ Copyright (C) 2011, 2012, 2013 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+#include <elision-conf.h>
+#include "force-elision.h"
+
+#include "nptl/pthread_mutex_lock.c"
Added: fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_timedlock.c
==============================================================================
--- fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_timedlock.c (added)
+++ fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_timedlock.c Wed Jul 3 00:02:28 2013
@@ -1,0 +1,20 @@
+/* Elided version of pthread_mutex_timedlock.
+ Copyright (C) 2011, 2012, 2013 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+#include <elision-conf.h>
+#include "force-elision.h"
+#include "nptl/pthread_mutex_timedlock.c"
Added: fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_trylock.c
==============================================================================
--- fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_trylock.c (added)
+++ fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_trylock.c Wed Jul 3 00:02:28 2013
@@ -1,0 +1,21 @@
+/* Elided version of pthread_mutex_trylock.
+ Copyright (C) 2011, 2012, 2013 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+#include <elision-conf.h>
+#include "force-elision.h"
+
+#include "nptl/pthread_mutex_trylock.c"
Modified: fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h
==============================================================================
--- fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h (original)
+++ fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h Wed Jul 3 00:02:28 2013
@@ -427,6 +427,13 @@
: "memory", "cx", "cc", "r10", "r11"); \
result; })
+extern int __lll_timedlock_elision (int *futex, short *adapt_count,
+ const struct timespec *timeout,
+ int private) attribute_hidden;
+
+#define lll_timedlock_elision(futex, adapt_count, timeout, private) \
+ __lll_timedlock_elision(&(futex), &(adapt_count), timeout, private)
+
#define lll_robust_timedlock(futex, timeout, id, private) \
({ int result, ignore1, ignore2, ignore3; \
__asm __volatile (LOCK_INSTR "cmpxchgl %1, %4\n\t" \
@@ -597,6 +604,22 @@
} \
__result; })
+extern int __lll_lock_elision (int *futex, short *adapt_count, int private)
+ attribute_hidden;
+
+extern int __lll_unlock_elision (int *lock, int private)
+ attribute_hidden;
+
+extern int __lll_trylock_elision (int *lock, short *adapt_count)
+ attribute_hidden;
+
+#define lll_lock_elision(futex, adapt_count, private) \
+ __lll_lock_elision (&(futex), &(adapt_count), private)
+#define lll_unlock_elision(futex, private) \
+ __lll_unlock_elision (&(futex), private)
+#define lll_trylock_elision(futex, adapt_count) \
+ __lll_trylock_elision (&(futex), &(adapt_count))
+
#endif /* !__ASSEMBLER__ */
#endif /* lowlevellock.h */
Modified: fsf/trunk/libc/nptl/tst-mutex5.c
==============================================================================
--- fsf/trunk/libc/nptl/tst-mutex5.c (original)
+++ fsf/trunk/libc/nptl/tst-mutex5.c Wed Jul 3 00:02:28 2013
@@ -22,6 +22,7 @@
#include <time.h>
#include <unistd.h>
#include <sys/time.h>
+#include <config.h>
#ifndef TYPE
@@ -85,6 +86,8 @@
return 1;
}
+ /* Elided locks do not time out. */
+#ifdef ENABLE_LOCK_ELISION
if (pthread_mutex_trylock (&m) == 0)
{
puts ("mutex_trylock succeeded");
@@ -180,6 +183,7 @@
puts ("3rd timedlock didn't return right away");
return 1;
}
+#endif
if (pthread_mutex_unlock (&m) != 0)
{
Modified: fsf/trunk/libc/nptl/tst-mutex8.c
==============================================================================
--- fsf/trunk/libc/nptl/tst-mutex8.c (original)
+++ fsf/trunk/libc/nptl/tst-mutex8.c Wed Jul 3 00:02:28 2013
@@ -93,6 +93,8 @@
static int
check_type (const char *mas, pthread_mutexattr_t *ma)
{
+ int e __attribute__((unused));
+
if (pthread_mutex_init (m, ma) != 0)
{
printf ("1st mutex_init failed for %s\n", mas);
@@ -117,7 +119,10 @@
return 1;
}
- int e = pthread_mutex_destroy (m);
+ /* Elided mutexes don't fail destroy. If elision is not explicitly disabled
+ we don't know, so can also not check this. */
+#ifndef ENABLE_LOCK_ELISION
+ e = pthread_mutex_destroy (m);
if (e == 0)
{
printf ("mutex_destroy of self-locked mutex succeeded for %s\n", mas);
@@ -129,6 +134,7 @@
mas);
return 1;
}
+#endif
if (pthread_mutex_unlock (m) != 0)
{
@@ -142,6 +148,8 @@
return 1;
}
+ /* Elided mutexes don't fail destroy. */
+#ifndef ENABLE_LOCK_ELISION
e = pthread_mutex_destroy (m);
if (e == 0)
{
@@ -155,6 +163,7 @@
mas);
return 1;
}
+#endif
if (pthread_mutex_unlock (m) != 0)
{
@@ -189,6 +198,8 @@
return 1;
}
+ /* Elided mutexes don't fail destroy. */
+#ifndef ENABLE_LOCK_ELISION
e = pthread_mutex_destroy (m);
if (e == 0)
{
@@ -201,6 +212,7 @@
mutex_destroy of condvar-used mutex did not return EBUSY for %s\n", mas);
return 1;
}
+#endif
done = true;
if (pthread_cond_signal (&c) != 0)
@@ -259,6 +271,8 @@
return 1;
}
+ /* Elided mutexes don't fail destroy. */
+#ifndef ENABLE_LOCK_ELISION
e = pthread_mutex_destroy (m);
if (e == 0)
{
@@ -273,6 +287,7 @@
mas);
return 1;
}
+#endif
if (pthread_cancel (th) != 0)
{
Modified: fsf/trunk/libc/ports/ChangeLog.alpha
==============================================================================
--- fsf/trunk/libc/ports/ChangeLog.alpha (original)
+++ fsf/trunk/libc/ports/ChangeLog.alpha Wed Jul 3 00:02:28 2013
@@ -1,3 +1,7 @@
+2013-07-02 Richard Henderson <rth@xxxxxxxxxx>
+
+ * sysdeps/alpha/fpu/libm-test-ulps: Update.
+
2013-06-28 Ryan S. Arnold <rsa@xxxxxxxxxxxxxxxxxx>
* sysdeps/alpha/dl-procinfo.h (_dl_procinfo): Add TYPE parameter
Modified: fsf/trunk/libc/ports/ChangeLog.arm
==============================================================================
--- fsf/trunk/libc/ports/ChangeLog.arm (original)
+++ fsf/trunk/libc/ports/ChangeLog.arm Wed Jul 3 00:02:28 2013
@@ -1,3 +1,19 @@
+2013-07-02 Joseph Myers <joseph@xxxxxxxxxxxxxxxx>
+
+ * sysdeps/arm/libm-test-ulps: Regenerated.
+
+ [BZ #13304]
+ * sysdeps/arm/s_fma.c: New file.
+ * sysdeps/arm/s_fmaf.c: New file.
+ * sysdeps/arm/soft-fp/sfp-machine.h: New file. Based on powerpc
+ version.
+ * sysdeps/arm/Implies: Add arm/soft-fp.
+
+2013-07-02 Will Newton <will.newton@xxxxxxxxxx>
+
+ * sysdeps/arm/dl-machine.h (elf_machine_rela): Pass dl_hwcap
+ to IFUNC resolver functions.
+
2013-06-28 Ryan S. Arnold <rsa@xxxxxxxxxxxxxxxxxx>
* sysdeps/unix/sysv/linux/arm/dl-procinfo.h (_dl_procinfo): Add
Modified: fsf/trunk/libc/ports/ChangeLog.m68k
==============================================================================
--- fsf/trunk/libc/ports/ChangeLog.m68k (original)
+++ fsf/trunk/libc/ports/ChangeLog.m68k Wed Jul 3 00:02:28 2013
@@ -1,3 +1,7 @@
+2013-07-03 Andreas Schwab <schwab@xxxxxxxxxxxxxx>
+
+ * sysdeps/m68k/m680x0/fpu/libm-test-ulps: Update.
+
2013-06-30 Joseph Myers <joseph@xxxxxxxxxxxxxxxx>
* sysdeps/m68k/dl-trampoline.S (FMOVE): Define conditional on
Modified: fsf/trunk/libc/ports/ChangeLog.mips
==============================================================================
--- fsf/trunk/libc/ports/ChangeLog.mips (original)
+++ fsf/trunk/libc/ports/ChangeLog.mips Wed Jul 3 00:02:28 2013
@@ -1,3 +1,24 @@
+2013-07-02 Joseph Myers <joseph@xxxxxxxxxxxxxxxx>
+
+ * sysdeps/mips/mips32/libm-test-ulps: Regenerated.
+ * sysdeps/mips/mips64/libm-test-ulps: Likewise.
+
+ [BZ #13304]
+ * sysdeps/mips/ieee754/s_fma.c: New file.
+ * sysdeps/mips/ieee754/s_fmaf.c: Likewise.
+ * sysdeps/mips/ieee754/s_fmal.c: Likewise.
+ * sysdeps/mips/mips32/Implies: Add mips/soft-fp.
+ * sysdeps/mips/mips64/n32/s_fma.c: Remove file.
+ * sysdeps/mips/mips64/n64/s_fma.c: Likewise.
+ * sysdeps/mips/mips64/soft-fp/sfp-machine.h (_FP_MUL_MEAT_DW_S):
+ New macro.
+ (_FP_MUL_MEAT_DW_D): Likewise.
+ (_FP_MUL_MEAT_DW_Q): Likewise.
+ * sysdeps/mips/soft-fp/sfp-machine.h (_FP_MUL_MEAT_DW_S): New
+ macro.
+ (_FP_MUL_MEAT_DW_D): Likewise.
+ (_FP_MUL_MEAT_DW_Q): Likewise.
+
2013-06-28 Ryan S. Arnold <rsa@xxxxxxxxxxxxxxxxxx>
* sysdeps/mips/dl-procinfo.h (_dl_procinfo): Add TYPE parameter
Modified: fsf/trunk/libc/ports/sysdeps/alpha/fpu/libm-test-ulps
==============================================================================
--- fsf/trunk/libc/ports/sysdeps/alpha/fpu/libm-test-ulps (original)
+++ fsf/trunk/libc/ports/sysdeps/alpha/fpu/libm-test-ulps Wed Jul 3 00:02:28 2013
@@ -123,26 +123,22 @@
# cacos
Test "Imaginary part of: cacos (+0 + 0.5 i)":
-double: 2
-float: 1
-idouble: 2
+float: 1
ifloat: 1
ildouble: 1
ldouble: 1
Test "Imaginary part of: cacos (+0 + 1.0 i)":
-double: 2
-float: 1
-idouble: 2
-ifloat: 1
-ildouble: 3
-ldouble: 3
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 1
+ldouble: 1
Test "Imaginary part of: cacos (+0 + 1.5 i)":
-double: 2
-float: 1
-idouble: 2
-ifloat: 1
-ildouble: 2
-ldouble: 2
+double: 1
+idouble: 1
+ildouble: 1
+ldouble: 1
Test "Imaginary part of: cacos (+0 - 0.5 i)":
float: 1
ifloat: 1
@@ -161,26 +157,22 @@
ildouble: 1
ldouble: 1
Test "Imaginary part of: cacos (-0 + 0.5 i)":
-double: 2
-float: 1
-idouble: 2
+float: 1
ifloat: 1
ildouble: 1
ldouble: 1
Test "Imaginary part of: cacos (-0 + 1.0 i)":
-double: 2
-float: 1
-idouble: 2
-ifloat: 1
-ildouble: 3
-ldouble: 3
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 1
+ldouble: 1
Test "Imaginary part of: cacos (-0 + 1.5 i)":
-double: 2
-float: 1
-idouble: 2
-ifloat: 1
-ildouble: 2
-ldouble: 2
+double: 1
+idouble: 1
+ildouble: 1
+ldouble: 1
Test "Imaginary part of: cacos (-0 - 0.5 i)":
float: 1
ifloat: 1
@@ -856,13 +848,6 @@
Test "Imaginary part of: cacos (-1.0 - 0x1p5000 i)":
ildouble: 1
ldouble: 1
-Test "Imaginary part of: cacos (-1.5 + +0 i)":
-double: 1
-float: 1
-idouble: 1
-ifloat: 1
-ildouble: 1
-ldouble: 1
Test "Real part of: cacos (-2 - 3 i)":
float: 1
ifloat: 1
@@ -911,8 +896,6 @@
Test "Real part of: cacos (0.5 + +0 i)":
double: 1
idouble: 1
-ildouble: 1
-ldouble: 1
Test "Real part of: cacos (0.5 + 0x1.fp-1025 i)":
double: 1
idouble: 1
@@ -965,8 +948,6 @@
Test "Real part of: cacos (0.5 - 0 i)":
double: 1
idouble: 1
-ildouble: 1
-ldouble: 1
Test "Real part of: cacos (0.5 - 0x1.fp-1025 i)":
double: 1
idouble: 1
@@ -1014,9 +995,6 @@
Test "Imaginary part of: cacos (0.5 - 1.0 i)":
double: 1
idouble: 1
-ildouble: 1
-ldouble: 1
-Test "Imaginary part of: cacos (0.75 + 1.25 i)":
ildouble: 1
ldouble: 1
Test "Imaginary part of: cacos (0x0.fffffffffffff8p0 + 0x1p-52 i)":
@@ -1504,13 +1482,6 @@
Test "Imaginary part of: cacos (1.0 - 0x1p5000 i)":
ildouble: 1
ldouble: 1
-Test "Imaginary part of: cacos (1.5 + +0 i)":
-double: 1
-float: 1
-idouble: 1
-ifloat: 1
-ildouble: 1
-ldouble: 1
# cacosh
Test "Real part of: cacosh (+0 + 0.5 i)":
@@ -1632,8 +1603,6 @@
idouble: 1
ifloat: 1
Test "Imaginary part of: cacosh (-0.5 + +0 i)":
-double: 1
-idouble: 1
ildouble: 1
ldouble: 1
Test "Imaginary part of: cacosh (-0.5 + 0x1.fp-1025 i)":
@@ -1687,8 +1656,6 @@
float: 1
ifloat: 1
Test "Imaginary part of: cacosh (-0.5 - 0 i)":
-double: 1
-idouble: 1
ildouble: 1
ldouble: 1
Test "Imaginary part of: cacosh (-0.5 - 0x1.fp-1025 i)":
@@ -2243,16 +2210,6 @@
Test "Real part of: cacosh (-1.0 - 0x1p5000 i)":
ildouble: 1
ldouble: 1
-Test "Real part of: cacosh (-1.5 + +0 i)":
-float: 1
-ifloat: 1
-ildouble: 1
-ldouble: 1
-Test "Real part of: cacosh (-1.5 - 0 i)":
-float: 1
-ifloat: 1
-ildouble: 1
-ldouble: 1
Test "Imaginary part of: cacosh (-2 - 3 i)":
float: 1
ifloat: 1
@@ -2887,39 +2844,25 @@
Test "Real part of: cacosh (1.0 - 0x1p5000 i)":
ildouble: 1
ldouble: 1
-Test "Real part of: cacosh (1.5 + +0 i)":
-float: 1
-ifloat: 1
-ildouble: 1
-ldouble: 1
-Test "Real part of: cacosh (1.5 - 0 i)":
-float: 1
-ifloat: 1
-ildouble: 1
-ldouble: 1
# casin
Test "Imaginary part of: casin (+0 + 0.5 i)":
-double: 2
-float: 1
-idouble: 2
+float: 1
ifloat: 1
ildouble: 1
ldouble: 1
Test "Imaginary part of: casin (+0 + 1.0 i)":
-double: 2
-float: 1
-idouble: 2
-ifloat: 1
-ildouble: 3
-ldouble: 3
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 1
+ldouble: 1
Test "Imaginary part of: casin (+0 + 1.5 i)":
-double: 2
-float: 1
-idouble: 2
-ifloat: 1
-ildouble: 2
-ldouble: 2
+double: 1
+idouble: 1
+ildouble: 1
+ldouble: 1
Test "Imaginary part of: casin (+0 - 0.5 i)":
float: 1
ifloat: 1
@@ -2938,26 +2881,22 @@
ildouble: 1
ldouble: 1
Test "Imaginary part of: casin (-0 + 0.5 i)":
-double: 2
-float: 1
-idouble: 2
+float: 1
ifloat: 1
ildouble: 1
ldouble: 1
Test "Imaginary part of: casin (-0 + 1.0 i)":
-double: 2
-float: 1
-idouble: 2
-ifloat: 1
-ildouble: 3
-ldouble: 3
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 1
+ldouble: 1
Test "Imaginary part of: casin (-0 + 1.5 i)":
-double: 2
-float: 1
-idouble: 2
-ifloat: 1
-ildouble: 2
-ldouble: 2
+double: 1
+idouble: 1
+ildouble: 1
+ldouble: 1
Test "Imaginary part of: casin (-0 - 0.5 i)":
float: 1
ifloat: 1
@@ -3547,13 +3486,6 @@
Test "Imaginary part of: casin (-1.0 - 0x1p5000 i)":
ildouble: 1
ldouble: 1
-Test "Imaginary part of: casin (-1.5 + +0 i)":
-double: 1
-float: 1
-idouble: 1
-ifloat: 1
-ildouble: 1
-ldouble: 1
Test "Imaginary part of: casin (0.0 + 0x0.ffffffffffffffffffffffffffcp0 i)":
ildouble: 1
ldouble: 1
@@ -3669,9 +3601,6 @@
float: 1
idouble: 1
ifloat: 1
-Test "Imaginary part of: casin (0.75 + 1.25 i)":
-ildouble: 1
-ldouble: 1
Test "Real part of: casin (0x0.fffffffffffff8p0 + 0.0 i)":
ildouble: 1
ldouble: 1
@@ -4143,29 +4072,8 @@
Test "Imaginary part of: casin (1.0 - 0x1p5000 i)":
ildouble: 1
ldouble: 1
-Test "Imaginary part of: casin (1.5 + +0 i)":
-double: 1
-float: 1
-idouble: 1
-ifloat: 1
-ildouble: 1
-ldouble: 1
# casinh
-Test "Real part of: casinh (-0 + 1.5 i)":
-double: 1
-float: 1
-idouble: 1
-ifloat: 1
-ildouble: 1
-ldouble: 1
-Test "Real part of: casinh (-0 - 1.5 i)":
-double: 1
-float: 1
-idouble: 1
-ifloat: 1
-ildouble: 1
-ldouble: 1
Test "Imaginary part of: casinh (-0.0 + 0x0.fffffffffffff8p0 i)":
ildouble: 1
ldouble: 1
@@ -4195,9 +4103,7 @@
ildouble: 1
ldouble: 1
Test "Real part of: casinh (-0.5 + +0 i)":
-double: 2
-float: 1
-idouble: 2
+float: 1
ifloat: 1
ildouble: 1
ldouble: 1
@@ -4248,9 +4154,7 @@
float: 1
ifloat: 1
Test "Real part of: casinh (-0.5 - 0 i)":
-double: 2
-float: 1
-idouble: 2
+float: 1
ifloat: 1
ildouble: 1
ldouble: 1
@@ -4593,12 +4497,12 @@
ildouble: 1
ldouble: 1
Test "Real part of: casinh (-1.0 + +0 i)":
-double: 2
-float: 1
-idouble: 2
-ifloat: 1
-ildouble: 3
-ldouble: 3
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 1
+ldouble: 1
Test "Real part of: casinh (-1.0 + 0.25 i)":
float: 1
ifloat: 1
@@ -4667,12 +4571,12 @@
ildouble: 1
ldouble: 1
Test "Real part of: casinh (-1.0 - 0 i)":
-double: 2
-float: 1
-idouble: 2
-ifloat: 1
-ildouble: 3
-ldouble: 3
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 1
+ldouble: 1
Test "Real part of: casinh (-1.0 - 0.25 i)":
float: 1
ifloat: 1
@@ -4741,12 +4645,10 @@
ildouble: 1
ldouble: 1
Test "Real part of: casinh (-1.5 + +0 i)":
-double: 2
-float: 1
-idouble: 2
-ifloat: 1
-ildouble: 2
-ldouble: 2
+double: 1
+idouble: 1
+ildouble: 1
+ldouble: 1
Test "Real part of: casinh (-1.5 + 0x1.fp-1025 i)":
double: 1
idouble: 1
@@ -4761,12 +4663,10 @@
ildouble: 1
ldouble: 1
Test "Real part of: casinh (-1.5 - 0 i)":
-double: 2
-float: 1
-idouble: 2
-ifloat: 1
-ildouble: 2
-ldouble: 2
+double: 1
+idouble: 1
+ildouble: 1
+ldouble: 1
Test "Real part of: casinh (-1.5 - 0x1.fp-1025 i)":
double: 1
idouble: 1
@@ -4780,20 +4680,6 @@
Test "Real part of: casinh (-1.5 - 0x1.fp-16385 i)":
ildouble: 1
ldouble: 1
-Test "Real part of: casinh (-2 - 3 i)":
-double: 5
-float: 1
-idouble: 5
-ifloat: 1
-ildouble: 4
-ldouble: 4
-Test "Imaginary part of: casinh (-2 - 3 i)":
-double: 3
-float: 6
-idouble: 3
-ifloat: 6
-ildouble: 2
-ldouble: 2
Test "Imaginary part of: casinh (0.0 + 0x0.fffffffffffff8p0 i)":
ildouble: 1
ldouble: 1
@@ -5838,13 +5724,11 @@
float: 1
ifloat: 1
Test "Real part of: catanh (-2 - 3 i)":
-double: 4
-idouble: 4
+double: 1
+idouble: 1
ildouble: 1
ldouble: 1
Test "Real part of: catanh (0.75 + 1.25 i)":
-double: 1
-idouble: 1
ildouble: 1
ldouble: 1
Test "Imaginary part of: catanh (0.75 + 1.25 i)":
@@ -6293,11 +6177,6 @@
Test "Real part of: clog (-0x1p-16494 - 0x1.fp+16383 i)":
ildouble: 1
ldouble: 1
-Test "Real part of: clog (0.75 + 1.25 i)":
-float: 1
-ifloat: 1
-ildouble: 1
-ldouble: 1
Test "Real part of: clog (0x0.ffffffp0 + 0x0.ffffffp-100 i)":
float: 1
ifloat: 1
@@ -6512,9 +6391,6 @@
float: 1
idouble: 1
ifloat: 1
-Test "Real part of: clog10 (0.75 + 1.25 i)":
-float: 1
-ifloat: 1
Test "Imaginary part of: clog10 (0.75 + 1.25 i)":
ildouble: 1
ldouble: 1
@@ -6953,8 +6829,6 @@
float: 1
ifloat: 1
Test "Imaginary part of: cpow (0.75 + 1.25 i, 0.0 + 1.0 i)":
-float: 1
-ifloat: 1
ildouble: 1
ldouble: 1
Test "Real part of: cpow (0.75 + 1.25 i, 0.75 + 1.25 i)":
@@ -6972,8 +6846,8 @@
float: 3
idouble: 2
ifloat: 3
-ildouble: 11
-ldouble: 11
+ildouble: 2
+ldouble: 2
Test "Real part of: cpow (2 + 0 i, 10 + 0 i)":
ildouble: 2
ldouble: 2
@@ -6987,13 +6861,6 @@
Test "Imaginary part of: cpow (2 + 3 i, 4 + 0 i)":
float: 2
ifloat: 2
-Test "Imaginary part of: cpow (e + 0 i, 0 + 2 * M_PIl i)":
-double: 2
-float: 2
-idouble: 2
-ifloat: 2
-ildouble: 1
-ldouble: 1
# csin
Test "Real part of: csin (-0.75 + 11357.25 i)":
@@ -8311,8 +8178,6 @@
float: 1
idouble: 1
ifloat: 1
-ildouble: 1
-ldouble: 1
Test "tgamma (-0x0.fffffffffffff8p0)":
double: 1
idouble: 1
@@ -9134,8 +8999,6 @@
Test "tgamma (4)":
float: 1
ifloat: 1
-ildouble: 1
-ldouble: 1
Test "tgamma (4.5)":
double: 1
float: 1
@@ -9467,9 +9330,9 @@
ldouble: 2
Function: Imaginary part of "cacos":
-double: 2
+double: 1
float: 2
-idouble: 2
+idouble: 1
ifloat: 2
ildouble: 2
ldouble: 2
@@ -9499,25 +9362,25 @@
ldouble: 2
Function: Imaginary part of "casin":
-double: 2
+double: 1
float: 2
-idouble: 2
+idouble: 1
ifloat: 2
ildouble: 2
ldouble: 2
Function: Real part of "casinh":
-double: 5
+double: 1
float: 2
-idouble: 5
+idouble: 1
ifloat: 2
-ildouble: 4
-ldouble: 4
+ildouble: 2
+ldouble: 2
Function: Imaginary part of "casinh":
-double: 3
-float: 1
-idouble: 3
+double: 1
+float: 1
+idouble: 1
ifloat: 1
ildouble: 2
ldouble: 2
@@ -9537,9 +9400,9 @@
ldouble: 1
Function: Real part of "catanh":
-double: 4
-float: 1
-idouble: 4
+double: 1
+float: 1
+idouble: 1
ifloat: 1
ildouble: 1
ldouble: 1
@@ -9689,13 +9552,11 @@
float: 4
idouble: 2
ifloat: 4
-ildouble: 11
-ldouble: 11
+ildouble: 4
+ldouble: 4
Function: Imaginary part of "cpow":
-double: 2
float: 2
-idouble: 2
ifloat: 2
ildouble: 1
ldouble: 1
Modified: fsf/trunk/libc/ports/sysdeps/arm/Implies
==============================================================================
--- fsf/trunk/libc/ports/sysdeps/arm/Implies (original)
+++ fsf/trunk/libc/ports/sysdeps/arm/Implies Wed Jul 3 00:02:28 2013
@@ -1,3 +1,4 @@
+arm/soft-fp
wordsize-32
ieee754/flt-32
ieee754/dbl-64
Modified: fsf/trunk/libc/ports/sysdeps/arm/dl-machine.h
==============================================================================
--- fsf/trunk/libc/ports/sysdeps/arm/dl-machine.h (original)
+++ fsf/trunk/libc/ports/sysdeps/arm/dl-machine.h Wed Jul 3 00:02:28 2013
@@ -595,7 +595,7 @@
break;
case R_ARM_IRELATIVE:
value = map->l_addr + *reloc_addr;
- value = ((Elf32_Addr (*) (void)) value) ();
+ value = ((Elf32_Addr (*) (int)) value) (GLRO(dl_hwcap));
*reloc_addr = value;
break;
#endif
Modified: fsf/trunk/libc/ports/sysdeps/arm/libm-test-ulps
==============================================================================
--- fsf/trunk/libc/ports/sysdeps/arm/libm-test-ulps (original)
+++ fsf/trunk/libc/ports/sysdeps/arm/libm-test-ulps Wed Jul 3 00:02:28 2013
@@ -89,20 +89,16 @@
# cacos
Test "Imaginary part of: cacos (+0 + 0.5 i)":
-double: 2
-float: 1
-idouble: 2
+float: 1
ifloat: 1
Test "Imaginary part of: cacos (+0 + 1.0 i)":
-double: 2
-float: 1
-idouble: 2
+double: 1
+float: 1
+idouble: 1
ifloat: 1
Test "Imaginary part of: cacos (+0 + 1.5 i)":
-double: 2
-float: 1
-idouble: 2
-ifloat: 1
+double: 1
+idouble: 1
Test "Imaginary part of: cacos (+0 - 0.5 i)":
float: 1
ifloat: 1
@@ -115,20 +111,16 @@
double: 1
idouble: 1
Test "Imaginary part of: cacos (-0 + 0.5 i)":
-double: 2
-float: 1
-idouble: 2
+float: 1
ifloat: 1
Test "Imaginary part of: cacos (-0 + 1.0 i)":
-double: 2
-float: 1
-idouble: 2
+double: 1
+float: 1
+idouble: 1
ifloat: 1
Test "Imaginary part of: cacos (-0 + 1.5 i)":
-double: 2
-float: 1
-idouble: 2
-ifloat: 1
+double: 1
+idouble: 1
Test "Imaginary part of: cacos (-0 - 0.5 i)":
float: 1
ifloat: 1
@@ -140,21 +132,618 @@
Test "Imaginary part of: cacos (-0 - 1.5 i)":
double: 1
idouble: 1
-Test "Imaginary part of: cacos (-1.5 + +0 i)":
-double: 1
-float: 1
-idouble: 1
+Test "Real part of: cacos (-0.25 + 1.0 i)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0.25 + 1.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0.25 - 1.0 i)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0.25 - 1.0 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0.5 + 0x1.fp-129 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (-0.5 + 0x1p-105 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (-0.5 + 0x1p-112 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (-0.5 + 0x1p-23 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacos (-0.5 + 1.0 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0.5 + 1.0 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (-0.5 - 0x1.fp-129 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (-0.5 - 0x1p-105 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (-0.5 - 0x1p-112 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (-0.5 - 0x1p-23 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacos (-0.5 - 1.0 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0.5 - 1.0 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (-0x0.fffffffffffff8p0 + 0x1p-52 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (-0x0.fffffffffffff8p0 - 0x1p-52 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (-0x0.ffffffp0 + 0x1p-23 i)":
+float: 2
+ifloat: 2
+Test "Imaginary part of: cacos (-0x0.ffffffp0 - 0x1p-23 i)":
+float: 2
+ifloat: 2
+Test "Imaginary part of: cacos (-0x1.000002p0 + 0x1p-23 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0x1.000002p0 - 0x1p-23 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0x1.fp-10 + 1.0 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (-0x1.fp-10 - 1.0 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacos (-0x1.fp-100 + 1.0 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0x1.fp-100 + 1.0 i)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1.fp-100 - 1.0 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0x1.fp-100 - 1.0 i)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0x1.fp-1000 + 1.0 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (-0x1.fp-1000 - 1.0 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (-0x1.fp-1025 + 1.0 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (-0x1.fp-1025 + 1.5 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (-0x1.fp-1025 - 1.0 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (-0x1.fp-1025 - 1.5 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacos (-0x1.fp-129 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0x1.fp-129 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1.fp-129 + 0x0.ffffffp0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1.fp-129 + 0x1.000002p0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1.fp-129 + 0x1.fp-129 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1.fp-129 + 0x1p-23 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1.fp-129 + 1.0 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0x1.fp-129 + 1.0 i)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1.fp-129 + 1.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0x1.fp-129 + 1.5 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacos (-0x1.fp-129 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0x1.fp-129 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1.fp-129 - 0x0.ffffffp0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1.fp-129 - 0x1.000002p0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1.fp-129 - 0x1.fp-129 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1.fp-129 - 0x1p-23 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1.fp-129 - 1.0 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0x1.fp-129 - 1.0 i)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1.fp-129 - 1.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0x1.fp-129 - 1.5 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacos (-0x1.fp-30 + 1.0 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0x1.fp-30 + 1.0 i)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1.fp-30 - 1.0 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0x1.fp-30 - 1.0 i)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-105 + 0.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-105 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0x1p-105 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-105 + 0x1p-105 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-105 - 0.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-105 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0x1p-105 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-105 - 0x1p-105 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-112 + 0.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-112 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0x1p-112 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-112 + 0x1p-112 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-112 - 0.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-112 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0x1p-112 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-112 - 0x1p-112 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-23 + 0.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-23 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0x1p-23 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0x1p-23 + 0x0.ffffffp0 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacos (-0x1p-23 + 0x1.fp-129 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-23 + 0x1p-23 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-23 - 0.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-23 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0x1p-23 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0x1p-23 - 0x0.ffffffp0 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacos (-0x1p-23 - 0x1.fp-129 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-23 - 0x1p-23 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-52 + 0.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-52 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0x1p-52 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-52 + 0x1p-52 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-52 - 0.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-52 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0x1p-52 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-52 - 0x1p-52 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-63 + 0.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-63 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0x1p-63 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-63 + 0x1p-63 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-63 - 0.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-63 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-0x1p-63 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-0x1p-63 - 0x1p-63 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-1.0 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-1.0 + 0x1.fp-10 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-1.0 + 0x1p50 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-1.0 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (-1.0 - 0x1.fp-10 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-1.0 - 0x1p50 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (-2 - 3 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (0.25 + 1.0 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (0.25 - 1.0 i)":
+float: 1
ifloat: 1
Test "Real part of: cacos (0.5 + +0 i)":
double: 1
idouble: 1
+Test "Real part of: cacos (0.5 + 0x1.fp-1025 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacos (0.5 + 0x1.fp-129 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (0.5 + 0x1.fp-129 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacos (0.5 + 0x1p-105 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (0.5 + 0x1p-105 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacos (0.5 + 0x1p-112 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (0.5 + 0x1p-112 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (0.5 + 0x1p-23 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacos (0.5 + 0x1p-52 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacos (0.5 + 0x1p-63 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacos (0.5 + 1.0 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (0.5 + 1.0 i)":
+double: 1
+idouble: 1
Test "Real part of: cacos (0.5 - 0 i)":
double: 1
idouble: 1
-Test "Imaginary part of: cacos (1.5 + +0 i)":
-double: 1
-float: 1
-idouble: 1
+Test "Real part of: cacos (0.5 - 0x1.fp-1025 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacos (0.5 - 0x1.fp-129 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (0.5 - 0x1.fp-129 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacos (0.5 - 0x1p-105 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (0.5 - 0x1p-105 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacos (0.5 - 0x1p-112 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (0.5 - 0x1p-112 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (0.5 - 0x1p-23 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacos (0.5 - 0x1p-52 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacos (0.5 - 0x1p-63 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacos (0.5 - 1.0 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (0.5 - 1.0 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (0x0.fffffffffffff8p0 + 0x1p-52 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (0x0.fffffffffffff8p0 - 0x1p-52 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacos (0x0.ffffffp0 + 0.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (0x0.ffffffp0 + 0x1.fp-129 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (0x0.ffffffp0 + 0x1p-23 i)":
+float: 2
+ifloat: 2
+Test "Imaginary part of: cacos (0x0.ffffffp0 + 0x1p-23 i)":
+float: 2
+ifloat: 2
+Test "Real part of: cacos (0x0.ffffffp0 - 0.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (0x0.ffffffp0 - 0x1.fp-129 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (0x0.ffffffp0 - 0x1p-23 i)":
+float: 2
+ifloat: 2
+Test "Imaginary part of: cacos (0x0.ffffffp0 - 0x1p-23 i)":
+float: 2
+ifloat: 2
+Test "Real part of: cacos (0x1.0000000000001p0 + 0x1p-52 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacos (0x1.0000000000001p0 - 0x1p-52 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacos (0x1.000002p0 + 0x1p-23 i)":
+float: 2
+ifloat: 2
+Test "Imaginary part of: cacos (0x1.000002p0 + 0x1p-23 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (0x1.000002p0 - 0x1p-23 i)":
+float: 2
+ifloat: 2
+Test "Imaginary part of: cacos (0x1.000002p0 - 0x1p-23 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (0x1.fp-10 + 1.0 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (0x1.fp-10 - 1.0 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (0x1.fp-100 + 1.0 i)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: cacos (0x1.fp-100 - 1.0 i)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: cacos (0x1.fp-1000 + 1.0 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (0x1.fp-1000 - 1.0 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (0x1.fp-1025 + 1.0 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (0x1.fp-1025 + 1.5 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (0x1.fp-1025 - 1.0 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (0x1.fp-1025 - 1.5 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (0x1.fp-129 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (0x1.fp-129 + 1.0 i)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: cacos (0x1.fp-129 + 1.5 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (0x1.fp-129 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (0x1.fp-129 - 1.0 i)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: cacos (0x1.fp-129 - 1.5 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (0x1.fp-30 + 1.0 i)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: cacos (0x1.fp-30 - 1.0 i)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: cacos (0x1.fp1023 + 0x1.fp1023 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (0x1.fp127 + 0x1.fp127 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (0x1p-105 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (0x1p-105 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (0x1p-112 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (0x1p-112 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (0x1p-23 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (0x1p-23 + 0x0.ffffffp0 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (0x1p-23 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (0x1p-23 - 0x0.ffffffp0 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacos (0x1p-52 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (0x1p-52 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (0x1p-63 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (0x1p-63 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (1.0 + 0.25 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacos (1.0 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (1.0 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (1.0 + 0x1.fp-10 i)":
+float: 2
+ifloat: 2
+Test "Imaginary part of: cacos (1.0 + 0x1.fp-10 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (1.0 - 0.25 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacos (1.0 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacos (1.0 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacos (1.0 - 0x1.fp-10 i)":
+float: 2
+ifloat: 2
+Test "Imaginary part of: cacos (1.0 - 0x1.fp-10 i)":
+float: 1
ifloat: 1
# cacosh
@@ -202,44 +791,632 @@
Test "Real part of: cacosh (-0 - 1.5 i)":
double: 1
idouble: 1
-Test "Imaginary part of: cacosh (-0.5 + +0 i)":
-double: 1
-idouble: 1
-Test "Imaginary part of: cacosh (-0.5 - 0 i)":
-double: 1
-idouble: 1
-Test "Real part of: cacosh (-1.5 + +0 i)":
-float: 1
-ifloat: 1
-Test "Real part of: cacosh (-1.5 - 0 i)":
+Test "Real part of: cacosh (-0.25 + 1.0 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0.25 + 1.0 i)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Real part of: cacosh (-0.25 - 1.0 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0.25 - 1.0 i)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Real part of: cacosh (-0.5 + 0x1.fp-129 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacosh (-0.5 + 0x1p-105 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacosh (-0.5 + 0x1p-112 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacosh (-0.5 + 0x1p-23 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacosh (-0.5 + 1.0 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacosh (-0.5 + 1.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-0.5 - 0x1.fp-129 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacosh (-0.5 - 0x1p-105 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacosh (-0.5 - 0x1p-112 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacosh (-0.5 - 0x1p-23 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacosh (-0.5 - 1.0 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacosh (-0.5 - 1.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-0x0.fffffffffffff8p0 + 0x1p-52 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacosh (-0x0.fffffffffffff8p0 - 0x1p-52 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacosh (-0x0.ffffffp0 + 0x1p-23 i)":
+float: 2
+ifloat: 2
+Test "Real part of: cacosh (-0x0.ffffffp0 - 0x1p-23 i)":
+float: 2
+ifloat: 2
+Test "Real part of: cacosh (-0x1.000002p0 + 0x1p-23 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-0x1.000002p0 - 0x1p-23 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-0x1.fp-10 + 1.0 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacosh (-0x1.fp-10 - 1.0 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacosh (-0x1.fp-100 + 1.0 i)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1.fp-100 + 1.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-0x1.fp-100 - 1.0 i)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1.fp-100 - 1.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-0x1.fp-1000 + 1.0 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacosh (-0x1.fp-1000 - 1.0 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacosh (-0x1.fp-1025 + 1.0 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacosh (-0x1.fp-1025 + 1.5 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacosh (-0x1.fp-1025 - 1.0 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacosh (-0x1.fp-1025 - 1.5 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacosh (-0x1.fp-129 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1.fp-129 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1.fp-129 + 0x0.ffffffp0 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1.fp-129 + 0x1.000002p0 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1.fp-129 + 0x1.fp-129 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1.fp-129 + 0x1p-23 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-0x1.fp-129 + 1.0 i)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1.fp-129 + 1.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-0x1.fp-129 + 1.5 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacosh (-0x1.fp-129 + 1.5 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-0x1.fp-129 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1.fp-129 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1.fp-129 - 0x0.ffffffp0 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1.fp-129 - 0x1.000002p0 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1.fp-129 - 0x1.fp-129 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1.fp-129 - 0x1p-23 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-0x1.fp-129 - 1.0 i)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1.fp-129 - 1.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-0x1.fp-129 - 1.5 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacosh (-0x1.fp-129 - 1.5 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-0x1.fp-30 + 1.0 i)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1.fp-30 + 1.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-0x1.fp-30 - 1.0 i)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1.fp-30 - 1.0 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-105 + 0.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-0x1p-105 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-105 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-105 + 0x1p-105 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-105 - 0.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-0x1p-105 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-105 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-105 - 0x1p-105 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-112 + 0.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-0x1p-112 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-112 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-112 + 0x1p-112 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-112 - 0.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-0x1p-112 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-112 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-112 - 0x1p-112 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-23 + 0.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-0x1p-23 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-23 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-0x1p-23 + 0x0.ffffffp0 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacosh (-0x1p-23 + 0x1.fp-129 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-23 + 0x1p-23 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-23 - 0.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-0x1p-23 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-23 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-0x1p-23 - 0x0.ffffffp0 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacosh (-0x1p-23 - 0x1.fp-129 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-23 - 0x1p-23 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-52 + 0.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-0x1p-52 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-52 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-52 + 0x1p-52 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-52 - 0.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-0x1p-52 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-52 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-52 - 0x1p-52 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-63 + 0.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-0x1p-63 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-63 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-63 + 0x1p-63 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-63 - 0.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-0x1p-63 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-63 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-0x1p-63 - 0x1p-63 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-1.0 + 0.5 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-1.0 + 0x1.fp-10 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-1.0 + 0x1p50 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-1.0 - 0.5 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (-1.0 - 0x1.fp-10 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (-1.0 - 0x1p50 i)":
float: 1
ifloat: 1
Test "Imaginary part of: cacosh (-2 - 3 i)":
float: 1
ifloat: 1
-Test "Real part of: cacosh (1.5 + +0 i)":
-float: 1
-ifloat: 1
-Test "Real part of: cacosh (1.5 - 0 i)":
-float: 1
-ifloat: 1
+Test "Real part of: cacosh (0.25 + 1.0 i)":
+float: 1
+ifloat: 1
+Test "Real part of: cacosh (0.25 - 1.0 i)":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cacosh (0.5 + +0 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacosh (0.5 + 0x1.fp-1025 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacosh (0.5 + 0x1.fp-129 i)":
+double: 1
+idouble: 1
+Test "Imaginary part of: cacosh (0.5 + 0x1.fp-129 i)":
+double: 1
+idouble: 1
+Test "Real part of: cacosh (0.5 + 0x1p-105 i)":
+double: 1
[... 19842 lines stripped ...]
_______________________________________________
Commits mailing list
Commits@xxxxxxxxxx
http://eglibc.org/cgi-bin/mailman/listinfo/commits