diff options
author | Shen-Ta Hsieh <ibmibmibm.tw@gmail.com> | 2021-05-24 09:43:11 +0800 |
---|---|---|
committer | Sunil K Pandey <skpgkp2@gmail.com> | 2022-09-29 13:15:17 -0700 |
commit | b85d5b3fe1d5c6cc081109d2ed5381bcf667d46c (patch) | |
tree | 04e591afeef63dd867c32a68e672d83c2731c79f /sysdeps/x86_64 | |
parent | 63b6eecd086da532b29edfe1f8ec71a0ac46f32b (diff) | |
download | glibc-b85d5b3fe1d5c6cc081109d2ed5381bcf667d46c.tar.gz |
x86_64: roundeven with sse4.1 support
This patch adds support for the sse4.1 hardware floating point
roundeven.
Here is some benchmark results on my systems:
=AMD Ryzen 9 3900X 12-Core Processor=
* benchmark result before this commit
| | roundeven | roundevenf |
|------------|--------------|--------------|
| duration | 3.75587e+09 | 3.75114e+09 |
| iterations | 3.93053e+08 | 4.35402e+08 |
| max | 52.592 | 58.71 |
| min | 7.98 | 7.22 |
| mean | 9.55563 | 8.61535 |
* benchmark result after this commit
| | roundeven | roundevenf |
|------------|---------------|--------------|
| duration | 3.73815e+09 | 3.73738e+09 |
| iterations | 5.82692e+08 | 5.91498e+08 |
| max | 56.468 | 51.642 |
| min | 6.27 | 6.156 |
| mean | 6.41532 | 6.3185 |
=Intel(R) Pentium(R) CPU D1508 @ 2.20GHz=
* benchmark result before this commit
| | roundeven | roundevenf |
|------------|--------------|--------------|
| duration | 2.18208e+09 | 2.18258e+09 |
| iterations | 2.39932e+08 | 2.46924e+08 |
| max | 96.378 | 98.035 |
| min | 6.776 | 5.94 |
| mean | 9.09456 | 8.83907 |
* benchmark result after this commit
| | roundeven | roundevenf |
|------------|--------------|--------------|
| duration | 2.17415e+09 | 2.17005e+09 |
| iterations | 3.56193e+08 | 4.09824e+08 |
| max | 51.693 | 97.192 |
| min | 5.926 | 5.093 |
| mean | 6.10385 | 5.29507 |
Signed-off-by: Shen-Ta Hsieh <ibmibmibm.tw@gmail.com>
Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
(cherry picked from commit 1683249d17e14827b6579529742eb895027dfa84)
Diffstat (limited to 'sysdeps/x86_64')
-rw-r--r-- | sysdeps/x86_64/fpu/multiarch/Makefile | 5 | ||||
-rw-r--r-- | sysdeps/x86_64/fpu/multiarch/s_roundeven-c.c | 2 | ||||
-rw-r--r-- | sysdeps/x86_64/fpu/multiarch/s_roundeven-sse4_1.S | 24 | ||||
-rw-r--r-- | sysdeps/x86_64/fpu/multiarch/s_roundeven.c | 31 | ||||
-rw-r--r-- | sysdeps/x86_64/fpu/multiarch/s_roundevenf-c.c | 3 | ||||
-rw-r--r-- | sysdeps/x86_64/fpu/multiarch/s_roundevenf-sse4_1.S | 24 | ||||
-rw-r--r-- | sysdeps/x86_64/fpu/multiarch/s_roundevenf.c | 31 |
7 files changed, 118 insertions, 2 deletions
diff --git a/sysdeps/x86_64/fpu/multiarch/Makefile b/sysdeps/x86_64/fpu/multiarch/Makefile index 3836574f48..7e3a3f78cb 100644 --- a/sysdeps/x86_64/fpu/multiarch/Makefile +++ b/sysdeps/x86_64/fpu/multiarch/Makefile @@ -1,11 +1,12 @@ ifeq ($(subdir),math) libm-sysdep_routines += s_floor-c s_ceil-c s_floorf-c s_ceilf-c \ s_rint-c s_rintf-c s_nearbyint-c s_nearbyintf-c \ - s_trunc-c s_truncf-c + s_roundeven-c s_roundevenf-c s_trunc-c s_truncf-c libm-sysdep_routines += s_ceil-sse4_1 s_ceilf-sse4_1 s_floor-sse4_1 \ s_floorf-sse4_1 s_nearbyint-sse4_1 \ - s_nearbyintf-sse4_1 s_rint-sse4_1 s_rintf-sse4_1 \ + s_nearbyintf-sse4_1 s_roundeven-sse4_1 \ + s_roundevenf-sse4_1 s_rint-sse4_1 s_rintf-sse4_1 \ s_trunc-sse4_1 s_truncf-sse4_1 libm-sysdep_routines += e_exp-fma e_log-fma e_pow-fma s_atan-fma \ diff --git a/sysdeps/x86_64/fpu/multiarch/s_roundeven-c.c b/sysdeps/x86_64/fpu/multiarch/s_roundeven-c.c new file mode 100644 index 0000000000..c7be43cb22 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/s_roundeven-c.c @@ -0,0 +1,2 @@ +#define __roundeven __roundeven_c +#include <sysdeps/ieee754/dbl-64/s_roundeven.c> diff --git a/sysdeps/x86_64/fpu/multiarch/s_roundeven-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_roundeven-sse4_1.S new file mode 100644 index 0000000000..6ae8f6b1d3 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/s_roundeven-sse4_1.S @@ -0,0 +1,24 @@ +/* Copyright (C) 2021 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 + <https://www.gnu.org/licenses/>. */ + +#include <sysdep.h> + + .section .text.sse4.1,"ax",@progbits +ENTRY(__roundeven_sse41) + roundsd $8, %xmm0, %xmm0 + ret +END(__roundeven_sse41) diff --git a/sysdeps/x86_64/fpu/multiarch/s_roundeven.c b/sysdeps/x86_64/fpu/multiarch/s_roundeven.c new file mode 100644 index 0000000000..d92eda652a --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/s_roundeven.c @@ -0,0 +1,31 @@ +/* Multiple versions of __roundeven. + Copyright (C) 2021 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 + <https://www.gnu.org/licenses/>. */ + +#include <libm-alias-double.h> + +#define roundeven __redirect_roundeven +#define __roundeven __redirect___roundeven +#include <math.h> +#undef roundeven +#undef __roundeven + +#define SYMBOL_NAME roundeven +#include "ifunc-sse4_1.h" + +libc_ifunc_redirected (__redirect_roundeven, __roundeven, IFUNC_SELECTOR ()); +libm_alias_double (__roundeven, roundeven) diff --git a/sysdeps/x86_64/fpu/multiarch/s_roundevenf-c.c b/sysdeps/x86_64/fpu/multiarch/s_roundevenf-c.c new file mode 100644 index 0000000000..72a6e7d1fb --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/s_roundevenf-c.c @@ -0,0 +1,3 @@ +#undef __roundevenf +#define __roundevenf __roundevenf_c +#include <sysdeps/ieee754/flt-32/s_roundevenf.c> diff --git a/sysdeps/x86_64/fpu/multiarch/s_roundevenf-sse4_1.S b/sysdeps/x86_64/fpu/multiarch/s_roundevenf-sse4_1.S new file mode 100644 index 0000000000..a76e10807e --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/s_roundevenf-sse4_1.S @@ -0,0 +1,24 @@ +/* Copyright (C) 2021 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 + <https://www.gnu.org/licenses/>. */ + +#include <sysdep.h> + + .section .text.sse4.1,"ax",@progbits +ENTRY(__roundevenf_sse41) + roundss $8, %xmm0, %xmm0 + ret +END(__roundevenf_sse41) diff --git a/sysdeps/x86_64/fpu/multiarch/s_roundevenf.c b/sysdeps/x86_64/fpu/multiarch/s_roundevenf.c new file mode 100644 index 0000000000..2ee196e68f --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/s_roundevenf.c @@ -0,0 +1,31 @@ +/* Multiple versions of __roundevenf. + Copyright (C) 2021 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 + <https://www.gnu.org/licenses/>. */ + +#include <libm-alias-float.h> + +#define roundevenf __redirect_roundevenf +#define __roundevenf __redirect___roundevenf +#include <math.h> +#undef roundevenf +#undef __roundevenf + +#define SYMBOL_NAME roundevenf +#include "ifunc-sse4_1.h" + +libc_ifunc_redirected (__redirect_roundevenf, __roundevenf, IFUNC_SELECTOR ()); +libm_alias_float (__roundeven, roundeven) |