* [PATCH 2/4] sparc: Implement memset/bzero ifunc selection in C
2017-10-05 13:51 [PATCH 1/4] sparc: Implement memcpy/mempcpy ifunc selection in C Adhemerval Zanella
2017-10-05 13:51 ` [PATCH 4/4] sparc: Use default memset for rtld objects Adhemerval Zanella
@ 2017-10-05 13:51 ` Adhemerval Zanella
2017-10-05 13:51 ` [PATCH 3/4] sparc: Use default memcpy for rtld objects Adhemerval Zanella
2 siblings, 0 replies; 11+ messages in thread
From: Adhemerval Zanella @ 2017-10-05 13:51 UTC (permalink / raw)
To: libc-alpha
This patch refactor the SPARC64 ifunc selector to a C implementation.
No functional change is expected, including ifunc resolution rules.
Checked on sparc64-linux-gnu, sparcv9-linux-gnu and x86_64-linux-gnu.
* sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile
[$(subdir) = string] (sysdep_routines): Add memset-ultra1.
* sysdeps/sparc/sparc64/multiarch/Makefile [$(subdir) = string]
(sysdep_routines): Add memset-ultra1.
* sysdeps/sparc/sparc32/sparcv9/multiarch/memset-ultra1.S: New
file.
* sysdeps/sparc/sparc32/sparcv9/multiarch/memset.c: Likewise.
* sysdeps/sparc/sparc64/multiarch/ifunc-memset.h: Likewise.
* sysdeps/sparc/sparc64/multiarch/memset-ultra1.S: Likewise.
* sysdeps/sparc/sparc64/multiarch/memset.c: Likewise.
* sysdeps/sparc/sparc32/sparcv9/multiarch/memset.S: Remove file.
* sysdeps/sparc/sparc64/multiarch/memset.S: Likewise.
---
ChangeLog | 13 +++
sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile | 2 +-
.../sparc32/sparcv9/multiarch/memset-ultra1.S | 33 ++++++
sysdeps/sparc/sparc32/sparcv9/multiarch/memset.S | 4 -
sysdeps/sparc/sparc32/sparcv9/multiarch/memset.c | 1 +
sysdeps/sparc/sparc64/multiarch/Makefile | 2 +-
sysdeps/sparc/sparc64/multiarch/ifunc-memset.h | 34 ++++++
sysdeps/sparc/sparc64/multiarch/memset-ultra1.S | 33 ++++++
sysdeps/sparc/sparc64/multiarch/memset.S | 124 ---------------------
sysdeps/sparc/sparc64/multiarch/memset.c | 49 ++++++++
10 files changed, 165 insertions(+), 130 deletions(-)
create mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/memset-ultra1.S
delete mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/memset.S
create mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/memset.c
create mode 100644 sysdeps/sparc/sparc64/multiarch/ifunc-memset.h
create mode 100644 sysdeps/sparc/sparc64/multiarch/memset-ultra1.S
delete mode 100644 sysdeps/sparc/sparc64/multiarch/memset.S
create mode 100644 sysdeps/sparc/sparc64/multiarch/memset.c
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile b/sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile
index ca44798..e12636b 100644
--- a/sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile
@@ -9,5 +9,5 @@ endif
ifeq ($(subdir),string)
sysdep_routines += memcpy-ultra3 memcpy-niagara1 memcpy-niagara2 \
memset-niagara1 memcpy-niagara4 memset-niagara4 \
- memcpy-ultra1
+ memcpy-ultra1 memset-ultra1
endif
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memset-ultra1.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/memset-ultra1.S
new file mode 100644
index 0000000..4a5508d
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/memset-ultra1.S
@@ -0,0 +1,33 @@
+/* Default SPARC64 memset implementation.
+ Copyright (C) 2017 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/>. */
+
+#if IS_IN (libc)
+
+# include <sysdep.h>
+
+# undef libc_hidden_builtin_def
+# define libc_hidden_builtin_def(name)
+# undef weak_alias
+# define weak_alias(x, y)
+
+# define memset __memset_ultra1
+# define __bzero __bzero_ultra1
+
+#endif
+
+#include <sysdeps/sparc/sparc32/sparcv9/memset.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memset.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/memset.S
deleted file mode 100644
index 8f82643..0000000
--- a/sysdeps/sparc/sparc32/sparcv9/multiarch/memset.S
+++ /dev/null
@@ -1,4 +0,0 @@
-#define ASI_PNF 0x82
-#define ASI_BLK_P 0xf0
-#define XCC icc
-#include <sparc64/multiarch/memset.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memset.c b/sysdeps/sparc/sparc32/sparcv9/multiarch/memset.c
new file mode 100644
index 0000000..a6c5734
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/memset.c
@@ -0,0 +1 @@
+#include <sysdeps/sparc/sparc64/multiarch/memset.c>
diff --git a/sysdeps/sparc/sparc64/multiarch/Makefile b/sysdeps/sparc/sparc64/multiarch/Makefile
index 4e52526..6e90cba 100644
--- a/sysdeps/sparc/sparc64/multiarch/Makefile
+++ b/sysdeps/sparc/sparc64/multiarch/Makefile
@@ -9,7 +9,7 @@ endif
ifeq ($(subdir),string)
sysdep_routines += memcpy-ultra3 memcpy-niagara1 memcpy-niagara2 \
memset-niagara1 memcpy-niagara4 memset-niagara4 \
- memcpy-ultra1
+ memcpy-ultra1 memset-ultra1
endif
ifeq ($(subdir),stdlib)
diff --git a/sysdeps/sparc/sparc64/multiarch/ifunc-memset.h b/sysdeps/sparc/sparc64/multiarch/ifunc-memset.h
new file mode 100644
index 0000000..eaf0fb8
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/ifunc-memset.h
@@ -0,0 +1,34 @@
+/* Common definition for memset/bzero implementation.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2017 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 <init-arch.h>
+
+extern __typeof (REDIRECT_NAME) OPTIMIZE (niagara4) attribute_hidden;
+extern __typeof (REDIRECT_NAME) OPTIMIZE (niagara1) attribute_hidden;
+extern __typeof (REDIRECT_NAME) OPTIMIZE (ultra1) attribute_hidden;
+
+static inline void *
+IFUNC_SELECTOR (int hwcap)
+{
+ if (hwcap & HWCAP_SPARC_CRYPTO)
+ return OPTIMIZE (niagara4);
+ if (hwcap & HWCAP_SPARC_BLKINIT)
+ return OPTIMIZE (niagara1);
+ return OPTIMIZE (ultra1);
+}
diff --git a/sysdeps/sparc/sparc64/multiarch/memset-ultra1.S b/sysdeps/sparc/sparc64/multiarch/memset-ultra1.S
new file mode 100644
index 0000000..728c179
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/memset-ultra1.S
@@ -0,0 +1,33 @@
+/* Default SPARC64 memset implementation.
+ Copyright (C) 2017 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/>. */
+
+#if IS_IN (libc)
+
+# include <sysdep.h>
+
+# undef libc_hidden_builtin_def
+# define libc_hidden_builtin_def(name)
+# undef weak_alias
+# define weak_alias(x, y)
+
+# define memset __memset_ultra1
+# define __bzero __bzero_ultra1
+
+#endif
+
+#include <sysdeps/sparc/sparc64/memset.S>
diff --git a/sysdeps/sparc/sparc64/multiarch/memset.S b/sysdeps/sparc/sparc64/multiarch/memset.S
deleted file mode 100644
index 9469d5e..0000000
--- a/sysdeps/sparc/sparc64/multiarch/memset.S
+++ /dev/null
@@ -1,124 +0,0 @@
-/* Multiple versions of memset and bzero
- All versions must be listed in ifunc-impl-list.c.
- Copyright (C) 2010-2017 Free Software Foundation, Inc.
- Contributed by David S. Miller (davem@davemloft.net)
- 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 <sysdep.h>
-
-#if IS_IN (libc)
- .text
-ENTRY(memset)
- .type memset, @gnu_indirect_function
-# ifdef SHARED
- SETUP_PIC_REG_LEAF(o3, o5)
-# endif
- set HWCAP_SPARC_CRYPTO, %o1
- andcc %o0, %o1, %g0
- be 1f
- andcc %o0, HWCAP_SPARC_BLKINIT, %g0
-# ifdef SHARED
- sethi %gdop_hix22(__memset_niagara4), %o1
- xor %o1, %gdop_lox10(__memset_niagara4), %o1
-# else
- set __memset_niagara4, %o1
-# endif
- ba 10f
- nop
-1: be 9f
- nop
-# ifdef SHARED
- sethi %gdop_hix22(__memset_niagara1), %o1
- xor %o1, %gdop_lox10(__memset_niagara1), %o1
-# else
- set __memset_niagara1, %o1
-# endif
- ba 10f
- nop
-9:
-# ifdef SHARED
- sethi %gdop_hix22(__memset_ultra1), %o1
- xor %o1, %gdop_lox10(__memset_ultra1), %o1
-# else
- set __memset_ultra1, %o1
-# endif
-10:
-# ifdef SHARED
- add %o3, %o1, %o1
-# endif
- retl
- mov %o1, %o0
-END(memset)
-
-ENTRY(__bzero)
- .type bzero, @gnu_indirect_function
-# ifdef SHARED
- SETUP_PIC_REG_LEAF(o3, o5)
-# endif
- set HWCAP_SPARC_CRYPTO, %o1
- andcc %o0, %o1, %g0
- be 1f
- andcc %o0, HWCAP_SPARC_BLKINIT, %g0
-# ifdef SHARED
- sethi %gdop_hix22(__bzero_niagara4), %o1
- xor %o1, %gdop_lox10(__bzero_niagara4), %o1
-# else
- set __bzero_niagara4, %o1
-# endif
- ba 10f
- nop
-1: be 9f
- nop
-# ifdef SHARED
- sethi %gdop_hix22(__bzero_niagara1), %o1
- xor %o1, %gdop_lox10(__bzero_niagara1), %o1
-# else
- set __bzero_niagara1, %o1
-# endif
- ba 10f
- nop
-9:
-# ifdef SHARED
- sethi %gdop_hix22(__bzero_ultra1), %o1
- xor %o1, %gdop_lox10(__bzero_ultra1), %o1
-# else
- set __bzero_ultra1, %o1
-# endif
-10:
-# ifdef SHARED
- add %o3, %o1, %o1
-# endif
- retl
- mov %o1, %o0
-END(__bzero)
-
-weak_alias (__bzero, bzero)
-
-# undef weak_alias
-# define weak_alias(a, b)
-
-libc_hidden_builtin_def (memset)
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#define memset __memset_ultra1
-#define __bzero __bzero_ultra1
-
-#endif
-
-#include "../memset.S"
diff --git a/sysdeps/sparc/sparc64/multiarch/memset.c b/sysdeps/sparc/sparc64/multiarch/memset.c
new file mode 100644
index 0000000..7f1d499
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/memset.c
@@ -0,0 +1,49 @@
+/* Multiple versions of memset.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2017 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/>. */
+
+#if IS_IN (libc)
+# define memset __redirect_memset
+# define bzero __redirect_bzero
+# include <string.h>
+# undef memset
+# undef bzero
+
+# include <sparc-ifunc.h>
+
+# define SYMBOL_NAME memset
+# include "ifunc-memset.h"
+
+sparc_libc_ifunc_redirected (__redirect_memset, memset, IFUNC_SELECTOR);
+
+/* It essentially does libc_hidden_builtin_def (memset) and redirect
+ the internal symbol to ifunc implementation. */
+# ifdef SHARED
+__hidden_ver1 (memset, __GI_memset, __redirect_memset)
+ __attribute__ ((visibility ("hidden")));
+# endif
+# undef SYMBOL_NAME
+
+
+# define SYMBOL_NAME bzero
+# include "ifunc-memset.h"
+
+sparc_libc_ifunc_redirected (__redirect_bzero, __bzero, IFUNC_SELECTOR);
+weak_alias (__bzero, bzero)
+
+#endif
--
2.7.4
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 4/4] sparc: Use default memset for rtld objects
2017-10-05 13:51 [PATCH 1/4] sparc: Implement memcpy/mempcpy ifunc selection in C Adhemerval Zanella
@ 2017-10-05 13:51 ` Adhemerval Zanella
2017-10-05 16:50 ` David Miller
2017-10-05 13:51 ` [PATCH 2/4] sparc: Implement memset/bzero ifunc selection in C Adhemerval Zanella
2017-10-05 13:51 ` [PATCH 3/4] sparc: Use default memcpy for rtld objects Adhemerval Zanella
2 siblings, 1 reply; 11+ messages in thread
From: Adhemerval Zanella @ 2017-10-05 13:51 UTC (permalink / raw)
To: libc-alpha
Both SPARC support multiarch platforms (sparcv9 and sparc64) have the
a default assembly implemented memset. Since it should not be any
restriction about it them on the loader object and assuming they are
faster than generic ones this patch uses them for rtld objects.
Also, there is no indication neither on original patch [1] or in commit
message why the generic one where used instead of the sparc optimized
ones.
Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
* sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memset.S: New file.
* sysdeps/sparc/sparc64/multiarch/rtld-memset.S: New file.
* sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memset.c: Remove
file.
* sysdeps/sparc/sparc32/sparcv9/rtld-memset.c: Likewise.
* sysdeps/sparc/sparc64/multiarch/rtld-memset.c: Likewise.
* sysdeps/sparc/sparc64/rtld-memset.c: Likewise.
---
ChangeLog | 8 ++++++++
sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memset.S | 1 +
sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memset.c | 1 -
sysdeps/sparc/sparc32/sparcv9/rtld-memset.c | 1 -
sysdeps/sparc/sparc64/multiarch/rtld-memset.S | 1 +
sysdeps/sparc/sparc64/multiarch/rtld-memset.c | 1 -
sysdeps/sparc/sparc64/rtld-memset.c | 1 -
7 files changed, 10 insertions(+), 4 deletions(-)
create mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memset.S
delete mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memset.c
delete mode 100644 sysdeps/sparc/sparc32/sparcv9/rtld-memset.c
create mode 100644 sysdeps/sparc/sparc64/multiarch/rtld-memset.S
delete mode 100644 sysdeps/sparc/sparc64/multiarch/rtld-memset.c
delete mode 100644 sysdeps/sparc/sparc64/rtld-memset.c
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memset.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memset.S
new file mode 100644
index 0000000..6e02eeb
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memset.S
@@ -0,0 +1 @@
+#include <sysdeps/sparc/sparc32/sparcv9/memset.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memset.c b/sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memset.c
deleted file mode 100644
index f24ae88..0000000
--- a/sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memset.c
+++ /dev/null
@@ -1 +0,0 @@
-#include <sparc64/multiarch/rtld-memset.c>
diff --git a/sysdeps/sparc/sparc32/sparcv9/rtld-memset.c b/sysdeps/sparc/sparc32/sparcv9/rtld-memset.c
deleted file mode 100644
index 49b29f5..0000000
--- a/sysdeps/sparc/sparc32/sparcv9/rtld-memset.c
+++ /dev/null
@@ -1 +0,0 @@
-#include <sparc64/rtld-memset.c>
diff --git a/sysdeps/sparc/sparc64/multiarch/rtld-memset.S b/sysdeps/sparc/sparc64/multiarch/rtld-memset.S
new file mode 100644
index 0000000..e9f078e
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/rtld-memset.S
@@ -0,0 +1 @@
+#include <sysdeps/sparc/sparc64/memset.S>
diff --git a/sysdeps/sparc/sparc64/multiarch/rtld-memset.c b/sysdeps/sparc/sparc64/multiarch/rtld-memset.c
deleted file mode 100644
index c01eb0b..0000000
--- a/sysdeps/sparc/sparc64/multiarch/rtld-memset.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "../rtld-memset.c"
diff --git a/sysdeps/sparc/sparc64/rtld-memset.c b/sysdeps/sparc/sparc64/rtld-memset.c
deleted file mode 100644
index 55f3835..0000000
--- a/sysdeps/sparc/sparc64/rtld-memset.c
+++ /dev/null
@@ -1 +0,0 @@
-#include <string/memset.c>
--
2.7.4
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 1/4] sparc: Implement memcpy/mempcpy ifunc selection in C
@ 2017-10-05 13:51 Adhemerval Zanella
2017-10-05 13:51 ` [PATCH 4/4] sparc: Use default memset for rtld objects Adhemerval Zanella
` (2 more replies)
0 siblings, 3 replies; 11+ messages in thread
From: Adhemerval Zanella @ 2017-10-05 13:51 UTC (permalink / raw)
To: libc-alpha
This patch refactor the SPARC64 ifunc selector to a C implementation.
The x86_64 implementation is used as default, which resulted in common
definitions (ifunc-init.h) used on both architectures. No functional
change is expected, including ifunc resolution rules.
Checked on sparc64-linux-gnu, sparcv9-linux-gnu and x86_64-linux-gnu.
* sysdeps/generic/ifunc-init.h: New file.
* sysdeps/sparc/init-arch.h: Likewise.
* sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-ultra1.S: New
file.
* sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.c: Likewise.
* sysdeps/sparc/sparc32/sparcv9/multiarch/mempcpy.c: Likewise.
* sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-mempcpy.S: Likewise.
* sysdeps/sparc/sparc64/multiarch/ifunc-memcpy.h: Likewise.
* sysdeps/sparc/sparc64/multiarch/memcpy-ultra1.S: Likewise.
* sysdeps/sparc/sparc64/multiarch/memcpy.c: Likewise.
* sysdeps/sparc/sparc64/multiarch/mempcpy.c: Likewise.
* sysdeps/sparc/sparc64/multiarch/rtld-mempcpy.S: Likewise.
* sysdeps/sparc/sparc-ifunc.h (sparc_libc_ifunc_redirected): New
macro.
* sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile
[$(subdir) = string] (sysdep_routines): Add memcpy-ultra1.
* sysdeps/sparc/sparc64/multiarch/Makefile [$(subdir) = string]
(sysdep_routines): Add memcpy-ultra1.
* sysdeps/sparc/sparc64/multiarch/memcpy.S: Remove file.
* sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.S: Likewise.
* sysdeps/x86/init-arch.h: Use generic ifunc-init.h.
---
ChangeLog | 24 +++
sysdeps/generic/ifunc-init.h | 54 +++++++
sysdeps/sparc/init-arch.h | 23 +++
sysdeps/sparc/sparc-ifunc.h | 3 +
sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile | 3 +-
.../sparc32/sparcv9/multiarch/memcpy-ultra1.S | 35 +++++
sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.S | 4 -
sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.c | 1 +
sysdeps/sparc/sparc32/sparcv9/multiarch/mempcpy.c | 1 +
.../sparc/sparc32/sparcv9/multiarch/rtld-mempcpy.S | 1 +
sysdeps/sparc/sparc64/multiarch/Makefile | 3 +-
sysdeps/sparc/sparc64/multiarch/ifunc-memcpy.h | 40 +++++
sysdeps/sparc/sparc64/multiarch/memcpy-ultra1.S | 35 +++++
sysdeps/sparc/sparc64/multiarch/memcpy.S | 167 ---------------------
sysdeps/sparc/sparc64/multiarch/memcpy.c | 38 +++++
sysdeps/sparc/sparc64/multiarch/mempcpy.c | 47 ++++++
sysdeps/sparc/sparc64/multiarch/rtld-mempcpy.S | 1 +
sysdeps/x86/init-arch.h | 40 +----
18 files changed, 308 insertions(+), 212 deletions(-)
create mode 100644 sysdeps/generic/ifunc-init.h
create mode 100644 sysdeps/sparc/init-arch.h
create mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-ultra1.S
delete mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.S
create mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.c
create mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/mempcpy.c
create mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-mempcpy.S
create mode 100644 sysdeps/sparc/sparc64/multiarch/ifunc-memcpy.h
create mode 100644 sysdeps/sparc/sparc64/multiarch/memcpy-ultra1.S
delete mode 100644 sysdeps/sparc/sparc64/multiarch/memcpy.S
create mode 100644 sysdeps/sparc/sparc64/multiarch/memcpy.c
create mode 100644 sysdeps/sparc/sparc64/multiarch/mempcpy.c
create mode 100644 sysdeps/sparc/sparc64/multiarch/rtld-mempcpy.S
diff --git a/sysdeps/generic/ifunc-init.h b/sysdeps/generic/ifunc-init.h
new file mode 100644
index 0000000..59d5ac6
--- /dev/null
+++ b/sysdeps/generic/ifunc-init.h
@@ -0,0 +1,54 @@
+/* IFUNC generic definitions.
+ This file is part of the GNU C Library.
+ Copyright (C) 2017 Free Software Foundation, Inc.
+
+ 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/>. */
+
+/* These macros are used to implement ifunc selection in C. To implement
+ an ifunc function, foo, which returns the address of __foo_impl1 or
+ __foo_impl2:
+
+ #define foo __redirect_foo
+ #include <foo.h>
+ #undef foo
+ #define SYMBOL_NAME foo
+ #include <ifunc-init.h>
+
+ extern __typeof (REDIRECT_NAME) OPTIMIZE (impl1) attribute_hidden;
+ extern __typeof (REDIRECT_NAME) OPTIMIZE (impl2) attribute_hidden;
+
+ static inline void *
+ foo_selector (void)
+ {
+ if (condition)
+ return OPTIMIZE (impl2);
+
+ return OPTIMIZE (impl1);
+ }
+
+ libc_ifunc_redirected (__redirect_foo, foo, IFUNC_SELECTOR ());
+*/
+
+#define PASTER1(x,y) x##_##y
+#define EVALUATOR1(x,y) PASTER1 (x,y)
+#define PASTER2(x,y) __##x##_##y
+#define EVALUATOR2(x,y) PASTER2 (x,y)
+
+/* Basically set '__redirect_<symbol>' to use as type definition,
+ '__<symbol>_<variant>' as the optimized implementation and
+ '<symbol>_ifunc_selector' as the IFUNC selector. */
+#define REDIRECT_NAME EVALUATOR1 (__redirect, SYMBOL_NAME)
+#define OPTIMIZE(name) EVALUATOR2 (SYMBOL_NAME, name)
+#define IFUNC_SELECTOR EVALUATOR1 (SYMBOL_NAME, ifunc_selector)
diff --git a/sysdeps/sparc/init-arch.h b/sysdeps/sparc/init-arch.h
new file mode 100644
index 0000000..30972cd
--- /dev/null
+++ b/sysdeps/sparc/init-arch.h
@@ -0,0 +1,23 @@
+/* IFUNC common definition for SPARC64.
+ This file is part of the GNU C Library.
+ Copyright (C) 2017 Free Software Foundation, Inc.
+
+ 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 <sys/auxv.h>
+#include <ldsodefs.h>
+
+#define INIT_ARCH()
+#include <ifunc-init.h>
diff --git a/sysdeps/sparc/sparc-ifunc.h b/sysdeps/sparc/sparc-ifunc.h
index 4b1ea00..3d81b52 100644
--- a/sysdeps/sparc/sparc-ifunc.h
+++ b/sysdeps/sparc/sparc-ifunc.h
@@ -162,6 +162,9 @@ END (__##name)
#else /* __ASSEMBLER__ */
+# define sparc_libc_ifunc_redirected(redirected_name, name, expr) \
+ __ifunc (redirected_name, name, expr(hwcap), int hwcap, INIT_ARCH)
+
# define sparc_libm_ifunc(name, expr) \
__ifunc (name, name, expr, int hwcap, libm_ifunc_init)
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile b/sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile
index 4ad7aff..ca44798 100644
--- a/sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile
@@ -8,5 +8,6 @@ endif
ifeq ($(subdir),string)
sysdep_routines += memcpy-ultra3 memcpy-niagara1 memcpy-niagara2 \
- memset-niagara1 memcpy-niagara4 memset-niagara4
+ memset-niagara1 memcpy-niagara4 memset-niagara4 \
+ memcpy-ultra1
endif
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-ultra1.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-ultra1.S
new file mode 100644
index 0000000..b56438d
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-ultra1.S
@@ -0,0 +1,35 @@
+/* Default SPARC32 memcpy implementation.
+ Copyright (C) 2017 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/>. */
+
+#if IS_IN (libc)
+
+# include <sysdep.h>
+
+# undef libc_hidden_builtin_def
+# define libc_hidden_builtin_def(name)
+# undef weak_alias
+# define weak_alias(x, y)
+# undef libc_hidden_def
+# define libc_hidden_def(name)
+
+# define memcpy __memcpy_ultra1
+# define __mempcpy __mempcpy_ultra1
+
+#endif
+
+#include <sysdeps/sparc/sparc32/sparcv9/memcpy.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.S
deleted file mode 100644
index 14df91e..0000000
--- a/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.S
+++ /dev/null
@@ -1,4 +0,0 @@
-#define ASI_PNF 0x82
-#define ASI_BLK_P 0xf0
-#define XCC icc
-#include <sparc64/multiarch/memcpy.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.c b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.c
new file mode 100644
index 0000000..369acac
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.c
@@ -0,0 +1 @@
+#include <sysdeps/sparc/sparc64/multiarch/memcpy.c>
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/mempcpy.c b/sysdeps/sparc/sparc32/sparcv9/multiarch/mempcpy.c
new file mode 100644
index 0000000..616a538
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/mempcpy.c
@@ -0,0 +1 @@
+#include <sysdeps/sparc/sparc64/multiarch/mempcpy.c>
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-mempcpy.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-mempcpy.S
new file mode 100644
index 0000000..f18c9f9
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-mempcpy.S
@@ -0,0 +1 @@
+/* rtld-mempcpy is implemented by rtld-memcpy.S. */
diff --git a/sysdeps/sparc/sparc64/multiarch/Makefile b/sysdeps/sparc/sparc64/multiarch/Makefile
index 55b757f..4e52526 100644
--- a/sysdeps/sparc/sparc64/multiarch/Makefile
+++ b/sysdeps/sparc/sparc64/multiarch/Makefile
@@ -8,7 +8,8 @@ endif
ifeq ($(subdir),string)
sysdep_routines += memcpy-ultra3 memcpy-niagara1 memcpy-niagara2 \
- memset-niagara1 memcpy-niagara4 memset-niagara4
+ memset-niagara1 memcpy-niagara4 memset-niagara4 \
+ memcpy-ultra1
endif
ifeq ($(subdir),stdlib)
diff --git a/sysdeps/sparc/sparc64/multiarch/ifunc-memcpy.h b/sysdeps/sparc/sparc64/multiarch/ifunc-memcpy.h
new file mode 100644
index 0000000..f497108
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/ifunc-memcpy.h
@@ -0,0 +1,40 @@
+/* Common definition for memcpy and mempcpy implementation.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2017 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 <init-arch.h>
+
+extern __typeof (REDIRECT_NAME) OPTIMIZE (niagara4) attribute_hidden;
+extern __typeof (REDIRECT_NAME) OPTIMIZE (niagara2) attribute_hidden;
+extern __typeof (REDIRECT_NAME) OPTIMIZE (niagara1) attribute_hidden;
+extern __typeof (REDIRECT_NAME) OPTIMIZE (ultra3) attribute_hidden;
+extern __typeof (REDIRECT_NAME) OPTIMIZE (ultra1) attribute_hidden;
+
+static inline void *
+IFUNC_SELECTOR (int hwcap)
+{
+ if (hwcap & HWCAP_SPARC_CRYPTO)
+ return OPTIMIZE (niagara4);
+ if (hwcap & HWCAP_SPARC_N2)
+ return OPTIMIZE (niagara2);
+ if (hwcap & HWCAP_SPARC_BLKINIT)
+ return OPTIMIZE (niagara1);
+ if (hwcap & HWCAP_SPARC_ULTRA3)
+ return OPTIMIZE (ultra3);
+ return OPTIMIZE (ultra1);
+}
diff --git a/sysdeps/sparc/sparc64/multiarch/memcpy-ultra1.S b/sysdeps/sparc/sparc64/multiarch/memcpy-ultra1.S
new file mode 100644
index 0000000..1a0aaf3
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/memcpy-ultra1.S
@@ -0,0 +1,35 @@
+/* Default SPARC64 memcpy implementation.
+ Copyright (C) 2017 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/>. */
+
+#if IS_IN (libc)
+
+# include <sysdep.h>
+
+# undef libc_hidden_builtin_def
+# define libc_hidden_builtin_def(name)
+# undef weak_alias
+# define weak_alias(x, y)
+# undef libc_hidden_def
+# define libc_hidden_def(name)
+
+# define memcpy __memcpy_ultra1
+# define __mempcpy __mempcpy_ultra1
+
+#endif
+
+#include <sysdeps/sparc/sparc64/memcpy.S>
diff --git a/sysdeps/sparc/sparc64/multiarch/memcpy.S b/sysdeps/sparc/sparc64/multiarch/memcpy.S
deleted file mode 100644
index b6396ee..0000000
--- a/sysdeps/sparc/sparc64/multiarch/memcpy.S
+++ /dev/null
@@ -1,167 +0,0 @@
-/* Multiple versions of memcpy
- All versions must be listed in ifunc-impl-list.c.
- Copyright (C) 2010-2017 Free Software Foundation, Inc.
- Contributed by David S. Miller (davem@davemloft.net)
- 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 <sysdep.h>
-
-#if IS_IN (libc)
- .text
-ENTRY(memcpy)
- .type memcpy, @gnu_indirect_function
-# ifdef SHARED
- SETUP_PIC_REG_LEAF(o3, o5)
-# endif
- set HWCAP_SPARC_CRYPTO, %o1
- andcc %o0, %o1, %g0
- be 1f
- andcc %o0, HWCAP_SPARC_N2, %g0
-# ifdef SHARED
- sethi %gdop_hix22(__memcpy_niagara4), %o1
- xor %o1, %gdop_lox10(__memcpy_niagara4), %o1
-# else
- set __memcpy_niagara4, %o1
-# endif
- ba 10f
- nop
-1: be 1f
- andcc %o0, HWCAP_SPARC_BLKINIT, %g0
-# ifdef SHARED
- sethi %gdop_hix22(__memcpy_niagara2), %o1
- xor %o1, %gdop_lox10(__memcpy_niagara2), %o1
-# else
- set __memcpy_niagara2, %o1
-# endif
- ba 10f
- nop
-1: be 1f
- andcc %o0, HWCAP_SPARC_ULTRA3, %g0
-# ifdef SHARED
- sethi %gdop_hix22(__memcpy_niagara1), %o1
- xor %o1, %gdop_lox10(__memcpy_niagara1), %o1
-# else
- set __memcpy_niagara1, %o1
-# endif
- ba 10f
- nop
-1: be 9f
- nop
-# ifdef SHARED
- sethi %gdop_hix22(__memcpy_ultra3), %o1
- xor %o1, %gdop_lox10(__memcpy_ultra3), %o1
-# else
- set __memcpy_ultra3, %o1
-# endif
- ba 10f
- nop
-9:
-# ifdef SHARED
- sethi %gdop_hix22(__memcpy_ultra1), %o1
- xor %o1, %gdop_lox10(__memcpy_ultra1), %o1
-# else
- set __memcpy_ultra1, %o1
-# endif
-10:
-# ifdef SHARED
- add %o3, %o1, %o1
-# endif
- retl
- mov %o1, %o0
-END(memcpy)
-
-ENTRY(__mempcpy)
- .type __mempcpy, @gnu_indirect_function
-# ifdef SHARED
- SETUP_PIC_REG_LEAF(o3, o5)
-# endif
- set HWCAP_SPARC_CRYPTO, %o1
- andcc %o0, %o1, %g0
- be 1f
- andcc %o0, HWCAP_SPARC_N2, %g0
-# ifdef SHARED
- sethi %gdop_hix22(__mempcpy_niagara4), %o1
- xor %o1, %gdop_lox10(__mempcpy_niagara4), %o1
-# else
- set __mempcpy_niagara4, %o1
-# endif
- ba 10f
- nop
-1: be 1f
- andcc %o0, HWCAP_SPARC_BLKINIT, %g0
-# ifdef SHARED
- sethi %gdop_hix22(__mempcpy_niagara2), %o1
- xor %o1, %gdop_lox10(__mempcpy_niagara2), %o1
-# else
- set __mempcpy_niagara2, %o1
-# endif
- ba 10f
- nop
-1: be 1f
- andcc %o0, HWCAP_SPARC_ULTRA3, %g0
-# ifdef SHARED
- sethi %gdop_hix22(__mempcpy_niagara1), %o1
- xor %o1, %gdop_lox10(__mempcpy_niagara1), %o1
-# else
- set __mempcpy_niagara1, %o1
-# endif
- ba 10f
- nop
-1: be 9f
- nop
-# ifdef SHARED
- sethi %gdop_hix22(__mempcpy_ultra3), %o1
- xor %o1, %gdop_lox10(__mempcpy_ultra3), %o1
-# else
- set __mempcpy_ultra3, %o1
-# endif
- ba 10f
- nop
-9:
-# ifdef SHARED
- sethi %gdop_hix22(__mempcpy_ultra1), %o1
- xor %o1, %gdop_lox10(__mempcpy_ultra1), %o1
-# else
- set __mempcpy_ultra1, %o1
-# endif
-10:
-# ifdef SHARED
- add %o3, %o1, %o1
-# endif
- retl
- mov %o1, %o0
-END(__mempcpy)
-
-libc_hidden_builtin_def (memcpy)
-
-libc_hidden_def (__mempcpy)
-weak_alias (__mempcpy, mempcpy)
-libc_hidden_builtin_def (mempcpy)
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-#undef weak_alias
-#define weak_alias(x, y)
-#undef libc_hidden_def
-#define libc_hidden_def(name)
-
-#define memcpy __memcpy_ultra1
-#define __mempcpy __mempcpy_ultra1
-
-#endif
-
-#include "../memcpy.S"
diff --git a/sysdeps/sparc/sparc64/multiarch/memcpy.c b/sysdeps/sparc/sparc64/multiarch/memcpy.c
new file mode 100644
index 0000000..2c3d3f3
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/memcpy.c
@@ -0,0 +1,38 @@
+/* Multiple versions of memcpy.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2017 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/>. */
+
+#if IS_IN (libc)
+# define memcpy __redirect_memcpy
+# include <string.h>
+# undef memcpy
+
+# include <sparc-ifunc.h>
+
+# define SYMBOL_NAME memcpy
+# include "ifunc-memcpy.h"
+
+sparc_libc_ifunc_redirected (__redirect_memcpy, memcpy, IFUNC_SELECTOR);
+
+/* It essentially does libc_hidden_builtin_def (memcpy) and redirect
+ the internal symbol to ifunc implementation. */
+# ifdef SHARED
+__hidden_ver1 (memcpy, __GI_memcpy, __redirect_memcpy)
+ __attribute__ ((visibility ("hidden")));
+# endif
+#endif
diff --git a/sysdeps/sparc/sparc64/multiarch/mempcpy.c b/sysdeps/sparc/sparc64/multiarch/mempcpy.c
new file mode 100644
index 0000000..f52dca6
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/mempcpy.c
@@ -0,0 +1,47 @@
+/* Multiple versions of memcpy
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2017 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/>. */
+
+#if IS_IN (libc)
+# define mempcpy __redirect_mempcpy
+# define __mempcpy __redirect___mempcpy
+# define NO_MEMPCPY_STPCPY_REDIRECT
+# define __NO_STRING_INLINES
+# include <string.h>
+# undef mempcpy
+# undef __mempcpy
+
+# include <sparc-ifunc.h>
+
+# define SYMBOL_NAME mempcpy
+# include "ifunc-memcpy.h"
+
+sparc_libc_ifunc_redirected (__redirect_mempcpy, __mempcpy, IFUNC_SELECTOR);
+
+weak_alias (__mempcpy, mempcpy)
+
+/* It essentially does libc_hidden_builtin_def (mempcpy) and
+ and libc_hidden_def (__mempcpy) and redirects the internal symbol to
+ ifunc implementation. */
+# ifdef SHARED
+__hidden_ver1 (__mempcpy, __GI___mempcpy, __redirect___mempcpy)
+ __attribute__ ((visibility ("hidden")));
+__hidden_ver1 (mempcpy, __GI_mempcpy, __redirect_mempcpy)
+ __attribute__ ((visibility ("hidden")));
+# endif
+#endif
diff --git a/sysdeps/sparc/sparc64/multiarch/rtld-mempcpy.S b/sysdeps/sparc/sparc64/multiarch/rtld-mempcpy.S
new file mode 100644
index 0000000..f18c9f9
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/rtld-mempcpy.S
@@ -0,0 +1 @@
+/* rtld-mempcpy is implemented by rtld-memcpy.S. */
diff --git a/sysdeps/x86/init-arch.h b/sysdeps/x86/init-arch.h
index 15d3f09..9228fe5 100644
--- a/sysdeps/x86/init-arch.h
+++ b/sysdeps/x86/init-arch.h
@@ -21,45 +21,7 @@
# include <ldsodefs.h>
#endif
-/* These macros are used to implement ifunc selection in C. To implement
- an ifunc function, foo, which returns the address of __foo_sse2 or
- __foo_avx2:
-
- #define foo __redirect_foo
- #define __foo __redirect___foo
- #include <foo.h>
- #undef foo
- #undef __foo
- #define SYMBOL_NAME foo
- #include <init-arch.h>
-
- extern __typeof (REDIRECT_NAME) OPTIMIZE (sse2) attribute_hidden;
- extern __typeof (REDIRECT_NAME) OPTIMIZE (avx2) attribute_hidden;
-
- static inline void *
- foo_selector (void)
- {
- if (use AVX2)
- return OPTIMIZE (avx2);
-
- return OPTIMIZE (sse2);
- }
-
- libc_ifunc_redirected (__redirect_foo, foo, foo_selector ());
-
-*/
-
-#define PASTER1(x,y) x##_##y
-#define EVALUATOR1(x,y) PASTER1 (x,y)
-#define PASTER2(x,y) __##x##_##y
-#define EVALUATOR2(x,y) PASTER2 (x,y)
-
-/* Basically set '__redirect_<symbol>' to use as type definition,
- '__<symbol>_<variant>' as the optimized implementation and
- '<symbol>_ifunc_selector' as the IFUNC selector. */
-#define REDIRECT_NAME EVALUATOR1 (__redirect, SYMBOL_NAME)
-#define OPTIMIZE(name) EVALUATOR2 (SYMBOL_NAME, name)
-#define IFUNC_SELECTOR EVALUATOR1 (SYMBOL_NAME, ifunc_selector)
+#include <ifunc-init.h>
#ifndef __x86_64__
/* Due to the reordering and the other nifty extensions in i686, it is
--
2.7.4
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 3/4] sparc: Use default memcpy for rtld objects
2017-10-05 13:51 [PATCH 1/4] sparc: Implement memcpy/mempcpy ifunc selection in C Adhemerval Zanella
2017-10-05 13:51 ` [PATCH 4/4] sparc: Use default memset for rtld objects Adhemerval Zanella
2017-10-05 13:51 ` [PATCH 2/4] sparc: Implement memset/bzero ifunc selection in C Adhemerval Zanella
@ 2017-10-05 13:51 ` Adhemerval Zanella
2017-10-05 16:49 ` David Miller
2 siblings, 1 reply; 11+ messages in thread
From: Adhemerval Zanella @ 2017-10-05 13:51 UTC (permalink / raw)
To: libc-alpha
Both SPARC support multiarch platforms (sparcv9 and sparc64) have the
a default assembly implemented memcpy. Since it should not be any
restriction about it them on the loader object and assuming they are
faster than generic ones this patch uses them for rtld objects.
Also, there is no indication neither on original patch [1] or in commit
message why the generic one where used instead of the sparc optimized
ones.
Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
* sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memcpy.S: New file.
* sysdeps/sparc/sparc64/multiarch/rtld-memcpy.S: Likewise.
* sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memcpy.c: Remove
file.
* sysdeps/sparc/sparc32/sparcv9/rtld-memcpy.c: Likewise.
* sysdeps/sparc/sparc64/multiarch/rtld-memcpy.c: Likewise.
* sysdeps/sparc/sparc64/rtld-memcpy.c: Likewise.
---
ChangeLog | 8 ++++++++
sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memcpy.S | 1 +
sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memcpy.c | 1 -
sysdeps/sparc/sparc32/sparcv9/rtld-memcpy.c | 1 -
sysdeps/sparc/sparc64/multiarch/rtld-memcpy.S | 1 +
sysdeps/sparc/sparc64/multiarch/rtld-memcpy.c | 1 -
sysdeps/sparc/sparc64/rtld-memcpy.c | 3 ---
7 files changed, 10 insertions(+), 6 deletions(-)
create mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memcpy.S
delete mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memcpy.c
delete mode 100644 sysdeps/sparc/sparc32/sparcv9/rtld-memcpy.c
create mode 100644 sysdeps/sparc/sparc64/multiarch/rtld-memcpy.S
delete mode 100644 sysdeps/sparc/sparc64/multiarch/rtld-memcpy.c
delete mode 100644 sysdeps/sparc/sparc64/rtld-memcpy.c
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memcpy.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memcpy.S
new file mode 100644
index 0000000..8e524da
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memcpy.S
@@ -0,0 +1 @@
+#include <sysdeps/sparc/sparc32/sparcv9/memcpy.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memcpy.c b/sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memcpy.c
deleted file mode 100644
index 304ad4e..0000000
--- a/sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memcpy.c
+++ /dev/null
@@ -1 +0,0 @@
-#include <sparc64/multiarch/rtld-memcpy.c>
diff --git a/sysdeps/sparc/sparc32/sparcv9/rtld-memcpy.c b/sysdeps/sparc/sparc32/sparcv9/rtld-memcpy.c
deleted file mode 100644
index 6f8386b..0000000
--- a/sysdeps/sparc/sparc32/sparcv9/rtld-memcpy.c
+++ /dev/null
@@ -1 +0,0 @@
-#include <sparc64/rtld-memcpy.c>
diff --git a/sysdeps/sparc/sparc64/multiarch/rtld-memcpy.S b/sysdeps/sparc/sparc64/multiarch/rtld-memcpy.S
new file mode 100644
index 0000000..dc7e095
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/rtld-memcpy.S
@@ -0,0 +1 @@
+#include <sysdeps/sparc/sparc64/memcpy.S>
diff --git a/sysdeps/sparc/sparc64/multiarch/rtld-memcpy.c b/sysdeps/sparc/sparc64/multiarch/rtld-memcpy.c
deleted file mode 100644
index 2452575..0000000
--- a/sysdeps/sparc/sparc64/multiarch/rtld-memcpy.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "../rtld-memcpy.c"
diff --git a/sysdeps/sparc/sparc64/rtld-memcpy.c b/sysdeps/sparc/sparc64/rtld-memcpy.c
deleted file mode 100644
index 52f8302..0000000
--- a/sysdeps/sparc/sparc64/rtld-memcpy.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define NO_MEMPCPY_STPCPY_REDIRECT
-#include <string/memcpy.c>
-#include <string/mempcpy.c>
--
2.7.4
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 3/4] sparc: Use default memcpy for rtld objects
2017-10-05 13:51 ` [PATCH 3/4] sparc: Use default memcpy for rtld objects Adhemerval Zanella
@ 2017-10-05 16:49 ` David Miller
2017-10-05 18:02 ` Adhemerval Zanella
0 siblings, 1 reply; 11+ messages in thread
From: David Miller @ 2017-10-05 16:49 UTC (permalink / raw)
To: adhemerval.zanella; +Cc: libc-alpha
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Date: Thu, 5 Oct 2017 10:51:11 -0300
> Both SPARC support multiarch platforms (sparcv9 and sparc64) have the
> a default assembly implemented memcpy. Since it should not be any
> restriction about it them on the loader object and assuming they are
> faster than generic ones this patch uses them for rtld objects.
>
> Also, there is no indication neither on original patch [1] or in commit
> message why the generic one where used instead of the sparc optimized
> ones.
The ultra1 memcpy is really an extremely non-ideal variant to use as
the default for anything.
It's much slower on newer cpus, as the block loads and stores used in
the ultra1 version aren't optimized the same way they were in those
older chips.
The C version is faster on newer cpus and definitely a better choice
as a default, especially because it doesn't use any cpu specific
instructions like the ultra1 variant does.
In the Linux kernel we have an assembler version we use as the default
which doesn't use any special instructions.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 4/4] sparc: Use default memset for rtld objects
2017-10-05 13:51 ` [PATCH 4/4] sparc: Use default memset for rtld objects Adhemerval Zanella
@ 2017-10-05 16:50 ` David Miller
0 siblings, 0 replies; 11+ messages in thread
From: David Miller @ 2017-10-05 16:50 UTC (permalink / raw)
To: adhemerval.zanella; +Cc: libc-alpha
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Date: Thu, 5 Oct 2017 10:51:12 -0300
> Both SPARC support multiarch platforms (sparcv9 and sparc64) have the
> a default assembly implemented memset. Since it should not be any
> restriction about it them on the loader object and assuming they are
> faster than generic ones this patch uses them for rtld objects.
>
> Also, there is no indication neither on original patch [1] or in commit
> message why the generic one where used instead of the sparc optimized
> ones.
Same exact feedback as patch #3.
The ultra1 variant uses very cpu specific characteristics and is a poor
choice as a default.
The C variant, baring a newly written assembler default, is the best
choice by far.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 3/4] sparc: Use default memcpy for rtld objects
2017-10-05 16:49 ` David Miller
@ 2017-10-05 18:02 ` Adhemerval Zanella
2017-10-05 18:12 ` Adhemerval Zanella
2017-10-05 18:26 ` David Miller
0 siblings, 2 replies; 11+ messages in thread
From: Adhemerval Zanella @ 2017-10-05 18:02 UTC (permalink / raw)
To: David Miller; +Cc: libc-alpha
[-- Attachment #1: Type: text/plain, Size: 2139 bytes --]
On 05/10/2017 13:49, David Miller wrote:
> From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> Date: Thu, 5 Oct 2017 10:51:11 -0300
>
>> Both SPARC support multiarch platforms (sparcv9 and sparc64) have the
>> a default assembly implemented memcpy. Since it should not be any
>> restriction about it them on the loader object and assuming they are
>> faster than generic ones this patch uses them for rtld objects.
>>
>> Also, there is no indication neither on original patch [1] or in commit
>> message why the generic one where used instead of the sparc optimized
>> ones.
>
> The ultra1 memcpy is really an extremely non-ideal variant to use as
> the default for anything.
>
> It's much slower on newer cpus, as the block loads and stores used in
> the ultra1 version aren't optimized the same way they were in those
> older chips.
>
> The C version is faster on newer cpus and definitely a better choice
> as a default, especially because it doesn't use any cpu specific
> instructions like the ultra1 variant does.
>
> In the Linux kernel we have an assembler version we use as the default
> which doesn't use any special instructions.
Thanks for the explanation, although it does not explain why the ultra1
is currently the default for sparc64 (sysdeps/sparc/sparc64/memcpy.S)
and also the default selection for multiarch. The C version is used
solely for loader currently.
I tried to check which are the performance of C implementation against
ultra1 one on a niagara5 and results are:
- on bench-memcpy the C version is slight slower for sizes up to
32 (about 4% faster for sizes up to 16, 40% from 16 to 32 and
50% up to 32). It is definitely faster for sizes higher than
64 (62% faster for sizes from 64 to 128 and 85% for sizes
higher than 128).
- on bench-memcpy-random shows no performance difference, however
bench-memcpy-large shows the C implementation is indeed faster
for all inputs.
So I think that instead of using default memcpy for rtld, the best
strategy would to use the C implementation instead as default and
add ultra1 as another option for ifunc resolution.
[-- Attachment #2: bench-memcpy-random-sparc64.out --]
[-- Type: text/plain, Size: 694 bytes --]
{
"timing_type": "hp_timing",
"functions": {
"memcpy": {
"bench-variant": "random",
"ifuncs": ["__memcpy_niagara4", "__memcpy_niagara2", "__memcpy_niagara1", "__memcpy_ultra1", "__memcpy_c"],
"results": [
{
"max-size": 4096,
"timings": [295019, 285867, 335106, 304419, 302071]
},
{
"max-size": 8192,
"timings": [280727, 277078, 323454, 296089, 296732]
},
{
"max-size": 16384,
"timings": [306328, 296740, 346874, 314423, 313847]
},
{
"max-size": 32768,
"timings": [313908, 308621, 354756, 324550, 323395]
},
{
"max-size": 65536,
"timings": [344289, 336540, 394800, 353721, 357068]
}]
}
}
}
[-- Attachment #3: bench-memcpy-sparc64.out --]
[-- Type: text/plain, Size: 64026 bytes --]
{
"timing_type": "hp_timing",
"functions": {
"memcpy": {
"bench-variant": "default",
"ifuncs": ["builtin_memcpy", "simple_memcpy", "__memcpy_niagara4", "__memcpy_niagara2", "__memcpy_niagara1", "__memcpy_ultra1", "__memcpy_c"],
"results": [
{
"length": 1,
"align1": 0,
"align2": 0,
"timings": [1104.31, 13.0625, 16.7656, 47.4062, 34.625, 40.7969, 36.1562]
},
{
"length": 1,
"align1": 0,
"align2": 0,
"timings": [20.7344, 10.6562, 14.2969, 18.0781, 18.0938, 17.0469, 19.3438]
},
{
"length": 1,
"align1": 0,
"align2": 0,
"timings": [19.8281, 10.6562, 14.2812, 17.6094, 17.7344, 17.4219, 19.0625]
},
{
"length": 1,
"align1": 0,
"align2": 0,
"timings": [19.4844, 10.6562, 14.2812, 17.5469, 16.4531, 16.75, 19.8281]
},
{
"length": 2,
"align1": 0,
"align2": 0,
"timings": [21.7344, 22.0312, 18.7031, 31.2188, 26.2031, 25.4688, 28.8438]
},
{
"length": 2,
"align1": 1,
"align2": 0,
"timings": [19.5938, 19.9688, 14.8906, 24.7812, 23.6094, 16.2188, 27.2812]
},
{
"length": 2,
"align1": 0,
"align2": 1,
"timings": [20.5, 19.8906, 15.2031, 24.2812, 22.9688, 15.8906, 28.1562]
},
{
"length": 2,
"align1": 1,
"align2": 1,
"timings": [20.1562, 19.0938, 14.8438, 22.7188, 22.0781, 15.8906, 27.375]
},
{
"length": 4,
"align1": 0,
"align2": 0,
"timings": [25.0938, 34.6562, 25.625, 21.2656, 20, 28.0156, 37.9375]
},
{
"length": 4,
"align1": 2,
"align2": 0,
"timings": [74.9375, 25.3281, 79.0938, 35.0312, 31.7969, 28.0156, 34.2188]
},
{
"length": 4,
"align1": 0,
"align2": 2,
"timings": [69.0938, 24.1094, 68.0625, 28.0469, 28.5312, 27.8906, 34.1875]
},
{
"length": 4,
"align1": 2,
"align2": 2,
"timings": [70.0312, 24.0312, 66.7031, 28.1094, 25.5938, 26.5625, 34.1875]
},
{
"length": 8,
"align1": 0,
"align2": 0,
"timings": [29.6094, 48.9688, 24.2656, 45.4375, 39.5, 40.3906, 51.7812]
},
{
"length": 8,
"align1": 3,
"align2": 0,
"timings": [88.1094, 37.4375, 81.4219, 44.1875, 45.8906, 34.7344, 46.4219]
},
{
"length": 8,
"align1": 0,
"align2": 3,
"timings": [81.4375, 36.9219, 76.7656, 37.2656, 36.9531, 34.2656, 46.625]
},
{
"length": 8,
"align1": 3,
"align2": 3,
"timings": [81.2969, 35.6094, 76.0469, 34.6094, 36.0781, 34.1719, 44.9688]
},
{
"length": 16,
"align1": 0,
"align2": 0,
"timings": [67.9688, 68.5469, 58.4844, 34.9688, 45.8281, 57.8594, 75.8438]
},
{
"length": 16,
"align1": 4,
"align2": 0,
"timings": [60.6094, 58.9062, 53.0938, 54.3281, 64.6719, 60.1719, 59.8125]
},
{
"length": 16,
"align1": 0,
"align2": 4,
"timings": [61.4688, 58.9844, 53.0625, 87.1406, 108.625, 37.25, 88.0312]
},
{
"length": 16,
"align1": 4,
"align2": 4,
"timings": [60.0938, 58.9844, 53.1875, 57.0312, 57.5156, 31.2344, 88.5625]
},
{
"length": 32,
"align1": 0,
"align2": 0,
"timings": [41.1875, 117.203, 33, 39, 42.3125, 37.5625, 57.7969]
},
{
"length": 32,
"align1": 5,
"align2": 0,
"timings": [70.625, 106.547, 57.3906, 59.2188, 57.7812, 162.266, 53.4375]
},
{
"length": 32,
"align1": 0,
"align2": 5,
"timings": [157.828, 107, 139.047, 105.859, 110.266, 245.234, 107.547]
},
{
"length": 32,
"align1": 5,
"align2": 5,
"timings": [134.656, 107.844, 101.062, 94.5, 93.3438, 65.5938, 110.469]
},
{
"length": 64,
"align1": 0,
"align2": 0,
"timings": [50.0625, 226.016, 44.8438, 55.9062, 50.5625, 56.6094, 56.9062]
},
{
"length": 64,
"align1": 6,
"align2": 0,
"timings": [77.2812, 225.797, 68.8281, 73.9531, 74.0312, 161.359, 66.7188]
},
{
"length": 64,
"align1": 0,
"align2": 6,
"timings": [145.203, 225.188, 133.656, 104.484, 109.891, 243.031, 98.4531]
},
{
"length": 64,
"align1": 6,
"align2": 6,
"timings": [79.5156, 226.047, 62.9844, 89.5938, 82.4219, 70.4844, 87.8906]
},
{
"length": 128,
"align1": 0,
"align2": 0,
"timings": [133.938, 417.578, 118.594, 72.3594, 259.328, 72.2656, 67.9375]
},
{
"length": 128,
"align1": 7,
"align2": 0,
"timings": [228.891, 417.172, 217.547, 110.438, 294.781, 186.047, 96.3594]
},
{
"length": 128,
"align1": 0,
"align2": 7,
"timings": [328.031, 417.812, 309.719, 138.609, 504.922, 267.328, 126.469]
},
{
"length": 128,
"align1": 7,
"align2": 7,
"timings": [233.844, 417.578, 222.875, 130.875, 482.609, 96.5156, 105.906]
},
{
"length": 256,
"align1": 0,
"align2": 0,
"timings": [164.125, 801.594, 156.891, 528.234, 314.219, 95.6406, 109.969]
},
{
"length": 256,
"align1": 8,
"align2": 0,
"timings": [157.922, 801.609, 151.578, 563.484, 313.734, 89.5938, 93.5469]
},
{
"length": 256,
"align1": 0,
"align2": 8,
"timings": [262.906, 801.578, 221.078, 832.297, 538.25, 82.2656, 92.4688]
},
{
"length": 256,
"align1": 8,
"align2": 8,
"timings": [254.406, 801.594, 218.344, 751.828, 523.703, 82.2656, 92.5]
},
{
"length": 512,
"align1": 0,
"align2": 0,
"timings": [246.5, 1569.56, 236.594, 673.062, 386.234, 835.203, 172.469]
},
{
"length": 512,
"align1": 9,
"align2": 0,
"timings": [333.781, 1569.56, 321.031, 695.219, 478.188, 783.531, 257.078]
},
{
"length": 512,
"align1": 0,
"align2": 9,
"timings": [439.859, 1569.58, 419.5, 907.453, 700.703, 897.172, 365.938]
},
{
"length": 512,
"align1": 9,
"align2": 9,
"timings": [381.547, 1569.58, 364.719, 886.172, 618, 873.188, 219.172]
},
{
"length": 1024,
"align1": 0,
"align2": 0,
"timings": [403.312, 3105.58, 390.469, 957.469, 551.234, 976.844, 320.156]
},
{
"length": 1024,
"align1": 10,
"align2": 0,
"timings": [493.016, 3105.81, 479.688, 970.844, 751.703, 962.5, 485.938]
},
{
"length": 1024,
"align1": 0,
"align2": 10,
"timings": [595.266, 3106.25, 573.953, 1197.27, 993.641, 1116.22, 519.031]
},
{
"length": 1024,
"align1": 10,
"align2": 10,
"timings": [558.875, 3105.81, 538.188, 1172.83, 778.375, 1104.25, 5235.78]
},
{
"length": 2048,
"align1": 0,
"align2": 0,
"timings": [711.922, 6177.8, 698, 1520.27, 949.188, 1389.56, 580.172]
},
{
"length": 2048,
"align1": 11,
"align2": 0,
"timings": [843, 6177.84, 832.828, 1535.2, 1322, 1380.7, 904.141]
},
{
"length": 2048,
"align1": 0,
"align2": 11,
"timings": [903.672, 6182.53, 891.219, 1802.75, 1522.86, 1495.52, 935.75]
},
{
"length": 2048,
"align1": 11,
"align2": 11,
"timings": [857.234, 6178.23, 845.109, 1729.52, 1195.28, 1476.55, 623.656]
},
{
"length": 4096,
"align1": 0,
"align2": 0,
"timings": [1326.77, 12707.1, 1313, 2647.8, 1772.73, 2197.03, 1090.64]
},
{
"length": 4096,
"align1": 12,
"align2": 0,
"timings": [1434.52, 12331.8, 1402.78, 2664.81, 2403.75, 2198.64, 1739.91]
},
{
"length": 4096,
"align1": 0,
"align2": 12,
"timings": [1512.84, 12324.8, 1493.83, 3052.48, 2642.42, 2287.92, 1768.97]
},
{
"length": 4096,
"align1": 12,
"align2": 12,
"timings": [1407.02, 12322, 1429.42, 2865.95, 2021.94, 2272.27, 1126.33]
},
{
"length": 8192,
"align1": 0,
"align2": 0,
"timings": [2570.88, 24617.4, 2553.47, 4901.33, 3598.92, 3859.39, 2125.73]
},
{
"length": 8192,
"align1": 13,
"align2": 0,
"timings": [2836.59, 24611.1, 2809.27, 4921.42, 4582.08, 3859.48, 3433.42]
},
{
"length": 8192,
"align1": 0,
"align2": 13,
"timings": [3545.12, 24610.6, 2933.81, 5491.77, 4795.16, 3967.22, 3494.17]
},
{
"length": 8192,
"align1": 13,
"align2": 13,
"timings": [2729.34, 24610.6, 2715.8, 5122.61, 3799.27, 3953.42, 2224.47]
},
{
"length": 16384,
"align1": 0,
"align2": 0,
"timings": [5097.59, 49188.8, 5085.94, 10186.9, 7338.25, 7847.52, 5902.27]
},
{
"length": 16384,
"align1": 14,
"align2": 0,
"timings": [5286.89, 49199.9, 5252.14, 10273.5, 8998.58, 7602.14, 6832.72]
},
{
"length": 16384,
"align1": 0,
"align2": 14,
"timings": [5955.66, 49190.6, 5340.47, 10428.8, 9190.97, 7826.78, 6839.39]
},
{
"length": 16384,
"align1": 14,
"align2": 14,
"timings": [5292.27, 49199.2, 5255.86, 10330.3, 7578.17, 7961.38, 6285.44]
},
{
"length": 32768,
"align1": 0,
"align2": 0,
"timings": [12813.5, 98343, 11937.2, 19630, 16859.4, 17639.8, 10210.5]
},
{
"length": 32768,
"align1": 15,
"align2": 0,
"timings": [11274.9, 100272, 11503.1, 20330.9, 17764.6, 17054.2, 13730]
},
{
"length": 32768,
"align1": 0,
"align2": 15,
"timings": [12425.5, 98343.9, 11262.3, 20399.2, 17928.7, 17039.4, 13831]
},
{
"length": 32768,
"align1": 15,
"align2": 15,
"timings": [12227.3, 98350.2, 12145, 19800.4, 16828.3, 20054.5, 10298.1]
},
{
"length": 65536,
"align1": 0,
"align2": 0,
"timings": [27778.3, 196774, 25230, 40669, 38732.3, 40669.8, 26624.9]
},
{
"length": 65536,
"align1": 16,
"align2": 0,
"timings": [25550.4, 198301, 25295.7, 41461.1, 38993.7, 40954.7, 26689.1]
},
{
"length": 65536,
"align1": 0,
"align2": 16,
"timings": [26350.3, 196825, 25459.6, 46308, 42703.1, 45040.3, 26732.9]
},
{
"length": 65536,
"align1": 16,
"align2": 16,
"timings": [25633, 196870, 25355.7, 40868.4, 38262.7, 40633.9, 26703.8]
},
{
"length": 0,
"align1": 0,
"align2": 0,
"timings": [27.625, 15.5, 14.0312, 18.2344, 18.1875, 17.8594, 20.625]
},
{
"length": 0,
"align1": 0,
"align2": 0,
"timings": [17.4219, 12.7031, 11.7344, 12.8125, 15.1406, 14.0625, 18.6875]
},
{
"length": 0,
"align1": 0,
"align2": 0,
"timings": [15.6875, 12.0938, 12.1094, 12.0312, 14.3281, 12.6562, 18.7031]
},
{
"length": 0,
"align1": 0,
"align2": 0,
"timings": [15.7344, 11.8125, 12.0938, 12.0625, 12.5156, 12.1719, 18.4219]
},
{
"length": 1,
"align1": 0,
"align2": 0,
"timings": [21.0156, 17.0156, 16.5469, 19.5625, 22.2812, 24.4688, 20.1406]
},
{
"length": 1,
"align1": 1,
"align2": 0,
"timings": [19.5469, 12.7344, 14.6094, 17.0781, 17.6094, 17.4375, 19.4375]
},
{
"length": 1,
"align1": 0,
"align2": 1,
"timings": [19.375, 11.5156, 14.625, 17.125, 17.9375, 17.9531, 18.9219]
},
{
"length": 1,
"align1": 1,
"align2": 1,
"timings": [18.6094, 11.0938, 13.9219, 16.0312, 17.625, 17.2812, 19.3281]
},
{
"length": 2,
"align1": 0,
"align2": 0,
"timings": [20.0781, 18.3906, 16.0625, 27.4219, 27.0938, 22.2188, 29.3125]
},
{
"length": 2,
"align1": 2,
"align2": 0,
"timings": [20.3594, 18.2969, 17.4062, 23.4531, 23.1094, 16.6719, 26.5781]
},
{
"length": 2,
"align1": 0,
"align2": 2,
"timings": [20.0156, 17.4219, 15.2969, 22.7031, 21.8906, 16.0938, 26.5469]
},
{
"length": 2,
"align1": 2,
"align2": 2,
"timings": [19.125, 18, 14.9531, 21.9062, 21.4844, 16.0938, 26.9688]
},
{
"length": 3,
"align1": 0,
"align2": 0,
"timings": [34.1719, 47.7969, 23.4844, 59.0156, 63.375, 26.3438, 59.375]
},
{
"length": 3,
"align1": 3,
"align2": 0,
"timings": [21.4531, 44.625, 17.2969, 52.5938, 65.3125, 19.7969, 54.5469]
},
{
"length": 3,
"align1": 0,
"align2": 3,
"timings": [21.5312, 43.7344, 17.2812, 51.2031, 65.2188, 19.5625, 54.0781]
},
{
"length": 3,
"align1": 3,
"align2": 3,
"timings": [20.7188, 43.7188, 16.8906, 56.5469, 51.2188, 18.7031, 54.0312]
},
{
"length": 4,
"align1": 0,
"align2": 0,
"timings": [29.6719, 32.9062, 22.375, 19.2188, 18.5312, 27.7344, 59.0625]
},
{
"length": 4,
"align1": 4,
"align2": 0,
"timings": [24.25, 26.3125, 20.5469, 16.375, 16.2344, 27.3438, 33.25]
},
{
"length": 4,
"align1": 0,
"align2": 4,
"timings": [25.4062, 24.9062, 17.0469, 16.375, 15.8594, 26.9062, 32.9375]
},
{
"length": 4,
"align1": 4,
"align2": 4,
"timings": [22.7344, 24.0781, 17.9219, 16.375, 15.6406, 26.5625, 32.625]
},
{
"length": 5,
"align1": 0,
"align2": 0,
"timings": [32.0469, 35.25, 23.2188, 35.0938, 44.4062, 31, 37.9531]
},
{
"length": 5,
"align1": 5,
"align2": 0,
"timings": [78.8281, 26.4844, 78.2344, 30.7031, 31.6406, 27.5781, 36.75]
},
{
"length": 5,
"align1": 0,
"align2": 5,
"timings": [75.9688, 25.5938, 69.4844, 28.0625, 28.5156, 26.4531, 36.4062]
},
{
"length": 5,
"align1": 5,
"align2": 5,
"timings": [74.375, 25.625, 69.0781, 30.7031, 27.6406, 25.5938, 36.375]
},
{
"length": 6,
"align1": 0,
"align2": 0,
"timings": [39.3125, 35.0625, 36.2031, 34.2031, 36.25, 33.6406, 44.1094]
},
{
"length": 6,
"align1": 6,
"align2": 0,
"timings": [78.2031, 36.5938, 71.8906, 30.5625, 60.9062, 31.0938, 38.5938]
},
{
"length": 6,
"align1": 0,
"align2": 6,
"timings": [74.8594, 29.7969, 70.3594, 31.0156, 58.1406, 30.4531, 38.5625]
},
{
"length": 6,
"align1": 6,
"align2": 6,
"timings": [74.0469, 29.7188, 70.3438, 31.0156, 32.3125, 29.6406, 38.5938]
},
{
"length": 7,
"align1": 0,
"align2": 0,
"timings": [45.1875, 39.2969, 32.0469, 38.5938, 41.4062, 35.1875, 46.5469]
},
{
"length": 7,
"align1": 7,
"align2": 0,
"timings": [81.6562, 57.5781, 75.2656, 33.0312, 33.0938, 32.0938, 41.9375]
},
{
"length": 7,
"align1": 0,
"align2": 7,
"timings": [79.5156, 32.3125, 73.9375, 35.6719, 32.6875, 31.7188, 41.9375]
},
{
"length": 7,
"align1": 7,
"align2": 7,
"timings": [78.7031, 56.2656, 73.1875, 33.0312, 32.2812, 29.6719, 41.6094]
},
{
"length": 8,
"align1": 0,
"align2": 0,
"timings": [31.6719, 38.7812, 22.8281, 40.3125, 35.7656, 37.1719, 45.7031]
},
{
"length": 8,
"align1": 8,
"align2": 0,
"timings": [27.4531, 35.2969, 20.9219, 42.9062, 34.5469, 35.6094, 44.5156]
},
{
"length": 8,
"align1": 0,
"align2": 8,
"timings": [26.7344, 35.2969, 20.4531, 38.2344, 33.7969, 33.5781, 44.5156]
},
{
"length": 8,
"align1": 8,
"align2": 8,
"timings": [26.3281, 34.875, 21.3125, 36.4375, 33.375, 33.6719, 44.5156]
},
{
"length": 9,
"align1": 0,
"align2": 0,
"timings": [37.4375, 46.7188, 39.5312, 56.9531, 49.8125, 40.2344, 54.5156]
},
{
"length": 9,
"align1": 9,
"align2": 0,
"timings": [93.7031, 38.3125, 82.3906, 38.8906, 39.375, 33.625, 49.125]
},
{
"length": 9,
"align1": 0,
"align2": 9,
"timings": [84.9688, 37.9219, 79.3125, 40.7812, 39.875, 33.6094, 47.625]
},
{
"length": 9,
"align1": 9,
"align2": 9,
"timings": [84.5938, 38.7969, 79.3281, 38.0469, 38.5469, 33.7031, 47.625]
},
{
"length": 10,
"align1": 0,
"align2": 0,
"timings": [55.1406, 46.5156, 37.7969, 46.2969, 42.7656, 45.4062, 54.3906]
},
{
"length": 10,
"align1": 10,
"align2": 0,
"timings": [91.5781, 40.5938, 82.7969, 42.2812, 40.1719, 38, 52.1406]
},
{
"length": 10,
"align1": 0,
"align2": 10,
"timings": [86.1406, 40.6406, 81.9531, 40.6406, 39.3125, 37.625, 50.5469]
},
{
"length": 10,
"align1": 10,
"align2": 10,
"timings": [86.1406, 40.6406, 81.6406, 39.7188, 39.3125, 37.625, 50.5469]
},
{
"length": 11,
"align1": 0,
"align2": 0,
"timings": [40.5156, 50.9844, 36.7812, 52.5156, 51.4531, 44.8438, 55.9688]
},
{
"length": 11,
"align1": 11,
"align2": 0,
"timings": [92.9688, 44.0625, 85.5, 44.4062, 44.0625, 38.7969, 53.625]
},
{
"length": 11,
"align1": 0,
"align2": 11,
"timings": [90.3125, 43.5625, 85.5781, 43.6094, 45.1875, 38.0469, 53.6406]
},
{
"length": 11,
"align1": 11,
"align2": 11,
"timings": [89.1406, 43.1406, 85.0938, 43.2188, 44.0469, 37.6094, 53.6094]
},
{
"length": 12,
"align1": 0,
"align2": 0,
"timings": [39.8438, 52.1406, 32.2031, 30.7969, 29.1406, 46.3906, 61.75]
},
{
"length": 12,
"align1": 12,
"align2": 0,
"timings": [33.9375, 47.8281, 27.9688, 25.625, 25.125, 42.5312, 56.5781]
},
{
"length": 12,
"align1": 0,
"align2": 12,
"timings": [33.25, 47.4375, 27.5938, 26.4688, 24.7031, 43.0469, 56.9688]
},
{
"length": 12,
"align1": 12,
"align2": 12,
"timings": [33.6406, 46.5625, 27.4531, 25.0781, 25.6562, 42.1562, 56.625]
},
{
"length": 13,
"align1": 0,
"align2": 0,
"timings": [45.5469, 56.9531, 37.6562, 75.1562, 67.6406, 49.0469, 62.9375]
},
{
"length": 13,
"align1": 13,
"align2": 0,
"timings": [102.844, 49.5938, 101.469, 63.4688, 63.7344, 42.375, 59.6094]
},
{
"length": 13,
"align1": 0,
"align2": 13,
"timings": [99.4531, 49.6562, 92.4062, 63.0312, 64.1094, 41.6562, 59.6094]
},
{
"length": 13,
"align1": 13,
"align2": 13,
"timings": [96.7812, 49.5938, 92.2656, 62.5469, 66.5, 41.7031, 59.2344]
},
{
"length": 14,
"align1": 0,
"align2": 0,
"timings": [42.375, 54.9844, 39.5469, 58.5781, 55.1094, 49.7656, 65.4062]
},
{
"length": 14,
"align1": 14,
"align2": 0,
"timings": [101.906, 52.625, 99.3125, 50.3125, 54.4531, 46.6562, 62.9375]
},
{
"length": 14,
"align1": 0,
"align2": 14,
"timings": [103.25, 53.1875, 95.1094, 53.0625, 51.7656, 47.9531, 62.9375]
},
{
"length": 14,
"align1": 14,
"align2": 14,
"timings": [99.5625, 52.5781, 94.3125, 50.3125, 51.8125, 46.4688, 62.5469]
},
{
"length": 15,
"align1": 0,
"align2": 0,
"timings": [44.6094, 66.2188, 36.8906, 62.0781, 63.1094, 51.1406, 69.3906]
},
{
"length": 15,
"align1": 15,
"align2": 0,
"timings": [105.609, 55.6406, 98.4219, 58.25, 54.9219, 46.4531, 65.2344]
},
{
"length": 15,
"align1": 0,
"align2": 15,
"timings": [102.625, 55.6406, 97.5156, 52.6719, 53.625, 46.0938, 65.2344]
},
{
"length": 15,
"align1": 15,
"align2": 15,
"timings": [101.906, 55.6406, 97.5625, 52.6719, 54.1094, 46.0938, 65.2344]
},
{
"length": 16,
"align1": 0,
"align2": 0,
"timings": [61.4688, 62.9375, 53.0781, 41.7188, 37.3438, 59.875, 58.2969]
},
{
"length": 16,
"align1": 16,
"align2": 0,
"timings": [59.6875, 58.3906, 53.0781, 26.1562, 26.4688, 34.5312, 46.7031]
},
{
"length": 16,
"align1": 0,
"align2": 16,
"timings": [60.0781, 58.1406, 52.7031, 26.1094, 26.4531, 34.5, 46.0938]
},
{
"length": 16,
"align1": 16,
"align2": 16,
"timings": [59.7188, 58.1406, 53.125, 26.125, 27.1875, 34.1406, 46.0781]
},
{
"length": 17,
"align1": 0,
"align2": 0,
"timings": [93.4375, 72.5938, 75.8594, 50.5938, 43.6719, 44.6094, 54.0781]
},
{
"length": 17,
"align1": 17,
"align2": 0,
"timings": [117.547, 61.9219, 107.266, 46.4375, 60.0938, 148.781, 48.3281]
},
{
"length": 17,
"align1": 0,
"align2": 17,
"timings": [109.797, 61.6094, 103.781, 81.3125, 79.7031, 220.578, 85.3438]
},
{
"length": 17,
"align1": 17,
"align2": 17,
"timings": [108.047, 61.6094, 103.609, 74.875, 68.4844, 65.3281, 84.6094]
},
{
"length": 18,
"align1": 0,
"align2": 0,
"timings": [80.0625, 68.125, 61.7031, 41.7656, 45.0469, 39.2031, 61.2188]
},
{
"length": 18,
"align1": 18,
"align2": 0,
"timings": [117.812, 65.3125, 106.328, 47.625, 52.8281, 193.359, 53.6562]
},
{
"length": 18,
"align1": 0,
"align2": 18,
"timings": [111.406, 64.5625, 106.109, 65.3281, 72.75, 232.094, 81.75]
},
{
"length": 18,
"align1": 18,
"align2": 18,
"timings": [111.016, 65.3281, 106, 61.2969, 62.3594, 53.7344, 86.3125]
},
{
"length": 19,
"align1": 0,
"align2": 0,
"timings": [69.875, 71.5312, 67.0469, 69.6719, 69.1094, 47.9219, 81.9531]
},
{
"length": 19,
"align1": 19,
"align2": 0,
"timings": [119.656, 67.625, 111.219, 96.0156, 91.2812, 178.953, 99.2188]
},
{
"length": 19,
"align1": 0,
"align2": 19,
"timings": [114.766, 67.9375, 110.172, 74.2969, 74.8125, 204.219, 77.6562]
},
{
"length": 19,
"align1": 19,
"align2": 19,
"timings": [113.656, 67.1406, 109.875, 65.125, 62.8281, 65.2344, 85.4531]
},
{
"length": 20,
"align1": 0,
"align2": 0,
"timings": [67.5, 76.0781, 45.0938, 32.0156, 36.4219, 41.1562, 65.375]
},
{
"length": 20,
"align1": 20,
"align2": 0,
"timings": [102.344, 70.5469, 98.9844, 58.9219, 56.5, 50.0625, 65.2969]
},
{
"length": 20,
"align1": 0,
"align2": 20,
"timings": [70.0156, 70.8906, 56.6562, 74.0312, 61.7344, 34.5312, 64.3281]
},
{
"length": 20,
"align1": 20,
"align2": 20,
"timings": [66.3438, 71.0156, 56.9219, 62.625, 62.125, 35.2969, 67.5312]
},
{
"length": 21,
"align1": 0,
"align2": 0,
"timings": [55.125, 76.2812, 35.6094, 46.5312, 35.6719, 42.5781, 70.0938]
},
{
"length": 21,
"align1": 21,
"align2": 0,
"timings": [108.453, 73.1562, 99.2344, 63.8594, 62.3125, 212.109, 61.875]
},
{
"length": 21,
"align1": 0,
"align2": 21,
"timings": [132.453, 73.9219, 133.203, 84.5469, 83.8438, 207.5, 95.8281]
},
{
"length": 21,
"align1": 21,
"align2": 21,
"timings": [93.4531, 73.8906, 77.625, 82.1094, 89.9688, 52.9062, 92.3906]
},
{
"length": 22,
"align1": 0,
"align2": 0,
"timings": [44.8906, 81.2031, 38, 38.5781, 43.625, 41.8438, 74.8281]
},
{
"length": 22,
"align1": 22,
"align2": 0,
"timings": [102.016, 76.5156, 97.8906, 56.7031, 63.2812, 190.75, 62.8125]
},
{
"length": 22,
"align1": 0,
"align2": 22,
"timings": [110.516, 76.5781, 103.484, 67.2969, 66.2969, 239.797, 72.7969]
},
{
"length": 22,
"align1": 22,
"align2": 22,
"timings": [59.0469, 76.9219, 53.9375, 53.875, 49.2344, 45.125, 79.7344]
},
{
"length": 23,
"align1": 0,
"align2": 0,
"timings": [48.0312, 85.7656, 38.9062, 71.7031, 72.6094, 43.4531, 71.375]
},
{
"length": 23,
"align1": 23,
"align2": 0,
"timings": [110.125, 79.9219, 101.312, 63.2031, 61.7031, 191.938, 68.9219]
},
{
"length": 23,
"align1": 0,
"align2": 23,
"timings": [107.234, 79.1406, 99.625, 60.75, 67.7188, 207.094, 73.9688]
},
{
"length": 23,
"align1": 23,
"align2": 23,
"timings": [52.7188, 79.5312, 48.7656, 59.5625, 50.0312, 43.5938, 73.2188]
},
{
"length": 24,
"align1": 0,
"align2": 0,
"timings": [49.3594, 90.25, 36.3281, 31.3594, 39.2188, 45.0469, 58.375]
},
{
"length": 24,
"align1": 24,
"align2": 0,
"timings": [40.2188, 83.2969, 35.25, 29.375, 27.9688, 34.9688, 50.9062]
},
{
"length": 24,
"align1": 0,
"align2": 24,
"timings": [38.5938, 82.9531, 34.6406, 26.9375, 26.875, 34.0312, 48.9844]
},
{
"length": 24,
"align1": 24,
"align2": 24,
"timings": [38.9688, 83.2969, 34.2969, 27.75, 26.7969, 34.1094, 49.3438]
},
{
"length": 25,
"align1": 0,
"align2": 0,
"timings": [46.1562, 90.5938, 36.5938, 35.2188, 38.25, 43.6719, 59.8281]
},
{
"length": 25,
"align1": 25,
"align2": 0,
"timings": [97.5938, 87.1719, 89.9375, 47.9375, 46.375, 153.828, 53.5312]
},
{
"length": 25,
"align1": 0,
"align2": 25,
"timings": [133.156, 86.375, 109.859, 77.1562, 82.1875, 197.422, 89.5]
},
{
"length": 25,
"align1": 25,
"align2": 25,
"timings": [81.0312, 86.0625, 64.5469, 68.1406, 70.2344, 55.75, 80.7656]
},
{
"length": 26,
"align1": 0,
"align2": 0,
"timings": [46.4219, 96.8438, 38.125, 42.8906, 41.6875, 39.2656, 67.9844]
},
{
"length": 26,
"align1": 26,
"align2": 0,
"timings": [101.312, 88.5938, 91.4688, 54.2969, 56.125, 184.281, 57.1719]
},
{
"length": 26,
"align1": 0,
"align2": 26,
"timings": [121.547, 88.5625, 111.438, 83.3125, 78.5, 230.266, 88.625]
},
{
"length": 26,
"align1": 26,
"align2": 26,
"timings": [81.3438, 88.1406, 60.0625, 57.3125, 57.2344, 45.4062, 85.7188]
},
{
"length": 27,
"align1": 0,
"align2": 0,
"timings": [46.0781, 98.9531, 39.6719, 71.625, 70.6875, 44.625, 84.5938]
},
{
"length": 27,
"align1": 27,
"align2": 0,
"timings": [126.969, 91.9531, 115.891, 85.5781, 82.2188, 186.5, 85.0781]
},
{
"length": 27,
"align1": 0,
"align2": 27,
"timings": [126.859, 92.5938, 114.812, 79.125, 82.2031, 204.547, 83.8281]
},
{
"length": 27,
"align1": 27,
"align2": 27,
"timings": [71.4062, 92.7344, 62.375, 66.25, 64.7656, 48.7188, 85.7656]
},
{
"length": 28,
"align1": 0,
"align2": 0,
"timings": [44.4375, 102.891, 36.6719, 40.9844, 39.4531, 42.4375, 67.4062]
},
{
"length": 28,
"align1": 28,
"align2": 0,
"timings": [100.188, 95.375, 98.1875, 57.5156, 55.2188, 40.6875, 65.3438]
},
{
"length": 28,
"align1": 0,
"align2": 28,
"timings": [71.1875, 95.375, 59.9375, 68.75, 70.8125, 34.8438, 69.2656]
},
{
"length": 28,
"align1": 28,
"align2": 28,
"timings": [73.2344, 95.9219, 62.4531, 49.1406, 68.25, 37.4688, 74.8906]
},
{
"length": 29,
"align1": 0,
"align2": 0,
"timings": [49.8594, 108.391, 43.1094, 46.6562, 43.0938, 45.2344, 76.1562]
},
{
"length": 29,
"align1": 29,
"align2": 0,
"timings": [108.766, 97.1562, 99.0156, 59.9375, 60.9219, 191.719, 64.8281]
},
{
"length": 29,
"align1": 0,
"align2": 29,
"timings": [137.703, 97.1562, 123.578, 88.7188, 98.0938, 198.609, 93.7344]
},
{
"length": 29,
"align1": 29,
"align2": 29,
"timings": [110.578, 97.1562, 90, 88.75, 87.8281, 54.7031, 98.2344]
},
{
"length": 30,
"align1": 0,
"align2": 0,
"timings": [49.75, 108.625, 38.6719, 51.9375, 40.9688, 40.8125, 74.0781]
},
{
"length": 30,
"align1": 30,
"align2": 0,
"timings": [106.812, 100.141, 102.922, 58.7969, 60.1562, 193.969, 67.8281]
},
{
"length": 30,
"align1": 0,
"align2": 30,
"timings": [115.438, 100.141, 106.406, 74.0156, 69.5625, 241.219, 71.2031]
},
{
"length": 30,
"align1": 30,
"align2": 30,
"timings": [62.2812, 100.141, 52.9531, 47.3125, 51.4844, 47.5781, 81.7812]
},
{
"length": 31,
"align1": 0,
"align2": 0,
"timings": [50.6562, 111.703, 42.3438, 74.1406, 74.3125, 43.1406, 77.2812]
},
{
"length": 31,
"align1": 31,
"align2": 0,
"timings": [111.047, 103.594, 106.906, 63.7031, 62.4219, 196.844, 71.4219]
},
{
"length": 31,
"align1": 0,
"align2": 31,
"timings": [121.297, 103.156, 106.688, 70.7031, 73.2344, 199.281, 72.7656]
},
{
"length": 31,
"align1": 31,
"align2": 31,
"timings": [61.6406, 103.156, 50, 56.6719, 55.625, 45.2969, 76.6406]
},
{
"length": 48,
"align1": 0,
"align2": 0,
"timings": [52.7031, 178.375, 42.375, 43.6719, 50.0781, 50.5156, 52.7969]
},
{
"length": 48,
"align1": 3,
"align2": 0,
"timings": [66.2812, 177.172, 57.8438, 66.1094, 65.7031, 156.266, 67.8438]
},
{
"length": 48,
"align1": 0,
"align2": 3,
"timings": [157.219, 178.625, 150.703, 123.656, 140.797, 236.828, 115.719]
},
{
"length": 48,
"align1": 3,
"align2": 3,
"timings": [67.875, 177.172, 61.7031, 97.2969, 104.562, 60.9844, 106.75]
},
{
"length": 80,
"align1": 0,
"align2": 0,
"timings": [55.875, 273.281, 42.8906, 59.8594, 62.5312, 57.6562, 68.375]
},
{
"length": 80,
"align1": 5,
"align2": 0,
"timings": [90.5156, 273.25, 79.2031, 90.0156, 79.6875, 173.484, 73.2656]
},
{
"length": 80,
"align1": 0,
"align2": 5,
"timings": [175.797, 273.281, 169.094, 127.828, 125.609, 237.016, 135.516]
},
{
"length": 80,
"align1": 5,
"align2": 5,
"timings": [107.953, 273.25, 93.8438, 104.672, 100.328, 77.125, 124.453]
},
{
"length": 96,
"align1": 0,
"align2": 0,
"timings": [55.625, 321.188, 44.3438, 63.6875, 61.1406, 64.3281, 75.4219]
},
{
"length": 96,
"align1": 6,
"align2": 0,
"timings": [91.625, 321.188, 80.9375, 85.9219, 88.9062, 168.891, 76.8281]
},
{
"length": 96,
"align1": 0,
"align2": 6,
"timings": [153.969, 321.188, 146.188, 108.766, 118.359, 236.688, 110.719]
},
{
"length": 96,
"align1": 6,
"align2": 6,
"timings": [83.3125, 321.188, 71.8281, 86.3438, 92.4219, 71.3906, 100.547]
},
{
"length": 112,
"align1": 0,
"align2": 0,
"timings": [60.3594, 369.172, 56.375, 65.2031, 66.9688, 69.6719, 62.7188]
},
{
"length": 112,
"align1": 7,
"align2": 0,
"timings": [101.875, 369.812, 89.8906, 97.125, 99.2812, 180.438, 84.3125]
},
{
"length": 112,
"align1": 0,
"align2": 7,
"timings": [160.641, 369.844, 152.484, 119.734, 121.391, 239.672, 115.844]
},
{
"length": 112,
"align1": 7,
"align2": 7,
"timings": [78.1719, 369.172, 71.2969, 121.672, 120.781, 87.1094, 96.1875]
},
{
"length": 144,
"align1": 0,
"align2": 0,
"timings": [219.469, 465.172, 205.453, 79.9688, 331.578, 80.0625, 81.0312]
},
{
"length": 144,
"align1": 9,
"align2": 0,
"timings": [311, 465.172, 300.203, 113.734, 355.891, 198.078, 95.4219]
},
{
"length": 144,
"align1": 0,
"align2": 9,
"timings": [321.672, 465.172, 302.297, 148.016, 531.359, 234.75, 136.75]
},
{
"length": 144,
"align1": 9,
"align2": 9,
"timings": [259.391, 465.984, 228.391, 116.688, 521.031, 94.2812, 101.719]
},
{
"length": 160,
"align1": 0,
"align2": 0,
"timings": [189.734, 513.984, 173.141, 79.4531, 411.469, 60.8438, 74.9062]
},
{
"length": 160,
"align1": 10,
"align2": 0,
"timings": [256.094, 513.969, 241.703, 119.594, 440.312, 199.094, 106.469]
},
{
"length": 160,
"align1": 0,
"align2": 10,
"timings": [342, 513.578, 331.641, 146.484, 593.094, 290.562, 136.172]
},
{
"length": 160,
"align1": 10,
"align2": 10,
"timings": [246.5, 513.562, 225.219, 108.859, 581.203, 104.109, 114.203]
},
{
"length": 176,
"align1": 0,
"align2": 0,
"timings": [188.656, 561.578, 174.969, 83.7812, 430.734, 62.2344, 77.8281]
},
{
"length": 176,
"align1": 11,
"align2": 0,
"timings": [259.734, 561.969, 254.094, 133.312, 451.969, 207.688, 113.656]
},
{
"length": 176,
"align1": 0,
"align2": 11,
"timings": [345.047, 561.984, 338.859, 204.781, 633.328, 293.594, 195.969]
},
{
"length": 176,
"align1": 11,
"align2": 11,
"timings": [245.328, 561.969, 229.594, 136.859, 620.953, 106.906, 141.625]
},
{
"length": 192,
"align1": 0,
"align2": 0,
"timings": [145.703, 609.984, 137.594, 86.9375, 270.703, 65.6875, 85.8438]
},
{
"length": 192,
"align1": 12,
"align2": 0,
"timings": [241.047, 609.172, 230.703, 143.047, 307.438, 126.047, 120.484]
},
{
"length": 192,
"align1": 0,
"align2": 12,
"timings": [338.922, 609.172, 323.469, 165.938, 549.438, 110.125, 150.984]
},
{
"length": 192,
"align1": 12,
"align2": 12,
"timings": [248.047, 609.172, 232.906, 110.344, 529.031, 82.7344, 115.688]
},
{
"length": 208,
"align1": 0,
"align2": 0,
"timings": [238.141, 657.172, 223.703, 98.8125, 352.641, 67.3594, 94.125]
},
{
"length": 208,
"align1": 13,
"align2": 0,
"timings": [325.156, 657.188, 314.328, 151.266, 379.578, 230.391, 122.781]
},
{
"length": 208,
"align1": 0,
"align2": 13,
"timings": [357.406, 657.172, 341.422, 195.016, 574.438, 315.359, 177.906]
},
{
"length": 208,
"align1": 13,
"align2": 13,
"timings": [288.344, 658, 267.812, 142.469, 544.469, 115.156, 159.609]
},
{
"length": 224,
"align1": 0,
"align2": 0,
"timings": [199.625, 705.578, 187.812, 98.6406, 440.844, 71.4375, 92.5781]
},
{
"length": 224,
"align1": 14,
"align2": 0,
"timings": [273.719, 706.672, 258.312, 212.047, 472.828, 241.297, 131.719]
},
{
"length": 224,
"align1": 0,
"align2": 14,
"timings": [334.125, 706.672, 323.703, 185.547, 623.562, 293.469, 156.625]
},
{
"length": 224,
"align1": 14,
"align2": 14,
"timings": [256.047, 714.812, 232.203, 129.781, 604.656, 120.578, 125.547]
},
{
"length": 240,
"align1": 0,
"align2": 0,
"timings": [213.578, 753.578, 196.547, 104.984, 453.297, 74.9844, 94.0625]
},
{
"length": 240,
"align1": 15,
"align2": 0,
"timings": [279.859, 754, 270.906, 223.734, 484.203, 241.156, 134.766]
},
{
"length": 240,
"align1": 0,
"align2": 15,
"timings": [343.797, 753.984, 335.031, 187.422, 663.562, 322.578, 159.188]
},
{
"length": 240,
"align1": 15,
"align2": 15,
"timings": [262.688, 754.672, 237.688, 158.406, 642.266, 118.75, 119.5]
},
{
"length": 272,
"align1": 0,
"align2": 0,
"timings": [257.125, 850.656, 246.422, 610.656, 374.688, 96.4844, 108.203]
},
{
"length": 272,
"align1": 17,
"align2": 0,
"timings": [347.297, 849.156, 334.469, 633.719, 416.5, 311.969, 147.484]
},
{
"length": 272,
"align1": 0,
"align2": 17,
"timings": [356.844, 849.172, 337.562, 898.812, 654.781, 321.297, 185.734]
},
{
"length": 272,
"align1": 17,
"align2": 17,
"timings": [271.625, 849.969, 265.281, 826.125, 617.328, 133.078, 134.844]
},
{
"length": 288,
"align1": 0,
"align2": 0,
"timings": [215.562, 897.969, 210.453, 693.094, 466.391, 95.1562, 112.219]
},
{
"length": 288,
"align1": 18,
"align2": 0,
"timings": [287.984, 897.562, 274.625, 716.031, 508.859, 292.5, 155.516]
},
{
"length": 288,
"align1": 0,
"align2": 18,
"timings": [371.141, 897.984, 363.188, 901.5, 656.844, 397.406, 184.938]
},
{
"length": 288,
"align1": 18,
"align2": 18,
"timings": [280.719, 897.969, 266.406, 847.734, 622.812, 134.75, 142.016]
},
{
"length": 304,
"align1": 0,
"align2": 0,
"timings": [227.25, 945.984, 212.5, 708.812, 476.312, 93.1875, 108.641]
},
{
"length": 304,
"align1": 19,
"align2": 0,
"timings": [293.5, 945.984, 284.109, 728.938, 519.219, 329.125, 157.078]
},
{
"length": 304,
"align1": 0,
"align2": 19,
"timings": [380.516, 945.984, 374.719, 846.328, 570.734, 398.922, 239.938]
},
{
"length": 304,
"align1": 19,
"align2": 19,
"timings": [305.438, 945.172, 290.391, 755.016, 538.219, 157.562, 157.203]
},
{
"length": 320,
"align1": 0,
"align2": 0,
"timings": [189.984, 993.172, 180.875, 562.453, 324.922, 96.2969, 118.109]
},
{
"length": 320,
"align1": 20,
"align2": 0,
"timings": [275.75, 993.188, 266.766, 592.656, 382, 156.719, 171.516]
},
{
"length": 320,
"align1": 0,
"align2": 20,
"timings": [375.109, 993.562, 360.234, 829.594, 589.297, 165.734, 198.703]
},
{
"length": 320,
"align1": 20,
"align2": 20,
"timings": [265.094, 994, 240.344, 769.641, 542.922, 108.906, 173.344]
},
{
"length": 336,
"align1": 0,
"align2": 0,
"timings": [275.469, 1041.98, 258.016, 635.484, 390.75, 98.3125, 121.688]
},
{
"length": 336,
"align1": 21,
"align2": 0,
"timings": [361.656, 1041.17, 352.172, 660.172, 452.609, 309.516, 173.062]
},
{
"length": 336,
"align1": 0,
"align2": 21,
"timings": [387.297, 1041.56, 379.438, 922.359, 678.531, 403.172, 236.156]
},
{
"length": 336,
"align1": 21,
"align2": 21,
"timings": [307.297, 1041.98, 293.516, 860.609, 631.344, 167.656, 198.391]
},
{
"length": 352,
"align1": 0,
"align2": 0,
"timings": [234.125, 1089.97, 229.609, 728.469, 488.562, 102.656, 126.266]
},
{
"length": 352,
"align1": 22,
"align2": 0,
"timings": [303.812, 1089.98, 294.516, 752.594, 542.672, 315.984, 179.562]
},
{
"length": 352,
"align1": 0,
"align2": 22,
"timings": [373.844, 1089.98, 357.625, 934.828, 686.906, 382.938, 213.109]
},
{
"length": 352,
"align1": 22,
"align2": 22,
"timings": [283.422, 1089.59, 272.391, 872.094, 644.234, 166.969, 166.297]
},
{
"length": 368,
"align1": 0,
"align2": 0,
"timings": [234.891, 1137.98, 230.484, 740.125, 498.172, 107.359, 123.156]
},
{
"length": 368,
"align1": 23,
"align2": 0,
"timings": [311.734, 1137.98, 300.281, 763.281, 553.094, 346.047, 186.203]
},
{
"length": 368,
"align1": 0,
"align2": 23,
"timings": [377.594, 1137.98, 369.156, 828.172, 583.812, 394.344, 211.531]
},
{
"length": 368,
"align1": 23,
"align2": 23,
"timings": [297.203, 1137.16, 281.609, 763.391, 521.094, 166.188, 166.609]
},
{
"length": 384,
"align1": 0,
"align2": 0,
"timings": [204.656, 1185.17, 196.625, 601.594, 342.188, 718.828, 133.172]
},
{
"length": 384,
"align1": 24,
"align2": 0,
"timings": [199.156, 1185.16, 192.328, 675.047, 348.188, 738.828, 127.578]
},
{
"length": 384,
"align1": 0,
"align2": 24,
"timings": [288.297, 1185.17, 275, 890.891, 573.828, 785.297, 124.797]
},
{
"length": 384,
"align1": 24,
"align2": 24,
"timings": [280.234, 1185.56, 272.703, 832.375, 562.484, 755.328, 124.766]
},
{
"length": 400,
"align1": 0,
"align2": 0,
"timings": [289.781, 1233.98, 281.25, 677.469, 411.516, 708.828, 143.297]
},
{
"length": 400,
"align1": 25,
"align2": 0,
"timings": [381.844, 1233.16, 369.5, 736.484, 480.75, 713, 197.938]
},
{
"length": 400,
"align1": 0,
"align2": 25,
"timings": [393.703, 1233.17, 378.047, 927.859, 707.75, 813.172, 243.438]
},
{
"length": 400,
"align1": 25,
"align2": 25,
"timings": [306.75, 1233.56, 292.172, 894, 652.328, 794.406, 172.172]
},
{
"length": 416,
"align1": 0,
"align2": 0,
"timings": [260.375, 1282.64, 242.969, 768.047, 507.906, 713.203, 141.172]
},
{
"length": 416,
"align1": 26,
"align2": 0,
"timings": [320.453, 1281.97, 313.781, 827.453, 575.906, 716.016, 209.156]
},
{
"length": 416,
"align1": 0,
"align2": 26,
"timings": [408.641, 1281.98, 397.281, 960.578, 750.328, 823.422, 248.406]
},
{
"length": 416,
"align1": 26,
"align2": 26,
"timings": [326.094, 1281.84, 296.594, 935.25, 693.672, 818.422, 169.594]
},
{
"length": 432,
"align1": 0,
"align2": 0,
"timings": [270.172, 1329.98, 256.766, 783.859, 517.953, 729.719, 141.375]
},
{
"length": 432,
"align1": 27,
"align2": 0,
"timings": [330.516, 1329.98, 325.688, 839.891, 587.078, 727.438, 217.859]
},
{
"length": 432,
"align1": 0,
"align2": 27,
"timings": [416.172, 1329.98, 407.438, 854.609, 645.016, 806.797, 283.125]
},
{
"length": 432,
"align1": 27,
"align2": 27,
"timings": [338.609, 1331.08, 322.219, 828.109, 575.141, 820.094, 176.922]
},
{
"length": 448,
"align1": 0,
"align2": 0,
"timings": [231.344, 1377.56, 216.094, 635.031, 362.688, 737.953, 143.812]
},
{
"length": 448,
"align1": 28,
"align2": 0,
"timings": [314.891, 1377.17, 304.219, 694.641, 443.109, 734.766, 222.375]
},
{
"length": 448,
"align1": 0,
"align2": 28,
"timings": [407.281, 1377.17, 390.391, 890.344, 679.969, 812.719, 248.688]
},
{
"length": 448,
"align1": 28,
"align2": 28,
"timings": [329.453, 1377.97, 305.781, 876.422, 611.156, 798.406, 212.828]
},
{
"length": 464,
"align1": 0,
"align2": 0,
"timings": [315.312, 1425.97, 303.234, 707.969, 433.547, 739.312, 154.875]
},
{
"length": 464,
"align1": 29,
"align2": 0,
"timings": [393.266, 1425.19, 384.922, 766.75, 517.359, 738.188, 232.703]
},
{
"length": 464,
"align1": 0,
"align2": 29,
"timings": [429.141, 1425.17, 414.922, 956.078, 741.312, 831.141, 293.25]
},
{
"length": 464,
"align1": 29,
"align2": 29,
"timings": [345.828, 1425.59, 306.812, 932.625, 669.672, 805.484, 223.25]
},
{
"length": 480,
"align1": 0,
"align2": 0,
"timings": [277.594, 1473.97, 264.969, 800.703, 527.203, 741.75, 158.234]
},
{
"length": 480,
"align1": 30,
"align2": 0,
"timings": [344.281, 1473.98, 329.766, 861.438, 609.297, 741.297, 235.422]
},
{
"length": 480,
"align1": 0,
"align2": 30,
"timings": [410.969, 1473.58, 389.766, 995.266, 781.781, 826.828, 291.406]
},
{
"length": 480,
"align1": 30,
"align2": 30,
"timings": [316.562, 1473.58, 308.422, 973.844, 711.016, 812.781, 185.625]
},
{
"length": 496,
"align1": 0,
"align2": 0,
"timings": [283.469, 1521.97, 275.469, 816.094, 538.719, 745.703, 155.016]
},
{
"length": 496,
"align1": 31,
"align2": 0,
"timings": [351.406, 1521.97, 338.938, 874.141, 620.5, 749.047, 237.938]
},
{
"length": 496,
"align1": 0,
"align2": 31,
"timings": [418.375, 1521.98, 400.078, 883.062, 680.016, 830.828, 266.516]
},
{
"length": 496,
"align1": 31,
"align2": 31,
"timings": [339.422, 1521.56, 315.297, 862.031, 596.531, 831.453, 185.141]
},
{
"length": 1024,
"align1": 0,
"align2": 0,
"timings": [404.047, 3105.58, 388.641, 953.391, 552.922, 972.109, 321.172]
},
{
"length": 1024,
"align1": 32,
"align2": 0,
"timings": [396.625, 3105.16, 390.953, 1006.23, 548.531, 975.594, 317.609]
},
{
"length": 1024,
"align1": 0,
"align2": 32,
"timings": [452.562, 3105.17, 436.453, 1227.55, 794.969, 1016.7, 316.844]
},
{
"length": 1024,
"align1": 32,
"align2": 32,
"timings": [444.594, 3105.95, 433.906, 1185.55, 791.547, 1002.55, 317.109]
},
{
"length": 1056,
"align1": 0,
"align2": 0,
"timings": [450.781, 3201.58, 438.203, 1126.55, 718.203, 974.625, 326.672]
},
{
"length": 1056,
"align1": 33,
"align2": 0,
"timings": [515.781, 3201.58, 503.391, 1162.8, 919.641, 979.312, 498.422]
},
{
"length": 1056,
"align1": 0,
"align2": 33,
"timings": [588.281, 3201.98, 563.469, 1173.05, 890.641, 1072.31, 542.438]
},
{
"length": 1056,
"align1": 33,
"align2": 33,
"timings": [528.062, 3201.17, 524.922, 1087.41, 682.109, 1067.45, 381.109]
},
{
"length": 1088,
"align1": 0,
"align2": 0,
"timings": [423.5, 3297.17, 412.5, 989.406, 571.766, 979.594, 335.188]
},
{
"length": 1088,
"align1": 34,
"align2": 0,
"timings": [506.234, 3297.19, 491.547, 1031.64, 786.75, 997.016, 511.219]
},
{
"length": 1088,
"align1": 0,
"align2": 34,
"timings": [596.391, 3297.17, 585.438, 1299.89, 1021, 1114.3, 550.234]
},
{
"length": 1088,
"align1": 34,
"align2": 34,
"timings": [539.375, 3297.98, 531.906, 1222.64, 811.125, 1109.98, 392.812]
},
{
"length": 1120,
"align1": 0,
"align2": 0,
"timings": [466.25, 3393.58, 459.297, 1160.28, 740.062, 990.922, 344.953]
},
{
"length": 1120,
"align1": 35,
"align2": 0,
"timings": [531.109, 3393.58, 519.641, 1199.16, 949.266, 997.172, 521.391]
},
{
"length": 1120,
"align1": 0,
"align2": 35,
"timings": [603.781, 3393.98, 585.203, 1232.61, 948.453, 1089.89, 552.484]
},
{
"length": 1120,
"align1": 35,
"align2": 35,
"timings": [573.266, 3393.17, 572.062, 1149.8, 732.953, 1076.14, 396.25]
},
{
"length": 1152,
"align1": 0,
"align2": 0,
"timings": [443.172, 3492.2, 426.312, 1030.33, 599.062, 1014.25, 352.031]
},
{
"length": 1152,
"align1": 36,
"align2": 0,
"timings": [527.344, 3489.19, 511.531, 1074.5, 826.125, 1022.59, 536.375]
},
{
"length": 1152,
"align1": 0,
"align2": 36,
"timings": [622.234, 3489.17, 605.156, 1344.38, 1051.19, 1085.39, 562.484]
},
{
"length": 1152,
"align1": 36,
"align2": 36,
"timings": [506.109, 3489.98, 496.25, 1259.08, 834.781, 1081.22, 390.953]
},
{
"length": 1184,
"align1": 0,
"align2": 0,
"timings": [491.375, 3585.97, 481.969, 1195.16, 761.734, 1028.31, 360.562]
},
{
"length": 1184,
"align1": 37,
"align2": 0,
"timings": [548.75, 3585.58, 539.641, 1241.2, 985.469, 1031.41, 547.859]
},
{
"length": 1184,
"align1": 0,
"align2": 37,
"timings": [649.219, 3585.98, 631.5, 1235.19, 955.656, 1118.53, 604.391]
},
{
"length": 1184,
"align1": 37,
"align2": 37,
"timings": [602.156, 3585.97, 593.953, 1160.95, 735.906, 1113.77, 425.812]
},
{
"length": 1216,
"align1": 0,
"align2": 0,
"timings": [454.016, 3681.97, 447.688, 1059.36, 614.438, 1039.3, 367.094]
},
{
"length": 1216,
"align1": 38,
"align2": 0,
"timings": [547.328, 3681.16, 530.547, 1128.67, 855.391, 1046.33, 561.453]
},
{
"length": 1216,
"align1": 0,
"align2": 38,
"timings": [645.203, 3681.84, 618.719, 1370.95, 1080.98, 1146.28, 589.062]
},
{
"length": 1216,
"align1": 38,
"align2": 38,
"timings": [569.828, 3682.66, 559.438, 1292.33, 857.594, 1137.8, 444.734]
},
{
"length": 1248,
"align1": 0,
"align2": 0,
"timings": [508.344, 3777.97, 499.172, 1231.67, 779.766, 1051.11, 376.547]
},
{
"length": 1248,
"align1": 39,
"align2": 0,
"timings": [566.766, 3777.56, 556.875, 1284.05, 1016.88, 1054.95, 573.859]
},
{
"length": 1248,
"align1": 0,
"align2": 39,
"timings": [638.172, 3778.02, 616.328, 1276.69, 978.609, 1157.16, 599.953]
},
{
"length": 1248,
"align1": 39,
"align2": 39,
"timings": [590.062, 3777.95, 587.828, 1194.73, 747.859, 1147.64, 425.922]
},
{
"length": 1280,
"align1": 0,
"align2": 0,
"timings": [476, 3873.58, 464.094, 1097.86, 641.375, 1066.12, 382.703]
},
{
"length": 1280,
"align1": 40,
"align2": 0,
"timings": [470.062, 3873.17, 464.25, 1194.92, 645.312, 1074.8, 381.188]
},
{
"length": 1280,
"align1": 0,
"align2": 40,
"timings": [524.688, 3873.17, 516.594, 1386.02, 886.641, 1120.55, 380.688]
},
{
"length": 1280,
"align1": 40,
"align2": 40,
"timings": [517.672, 3873.58, 515.375, 1298.89, 848.125, 1113.83, 380.25]
},
{
"length": 1312,
"align1": 0,
"align2": 0,
"timings": [525.406, 3969.97, 518.156, 1264.55, 808.688, 1074.48, 390.688]
},
{
"length": 1312,
"align1": 41,
"align2": 0,
"timings": [585.391, 3969.59, 576.578, 1338.25, 1059.75, 1070.48, 599.891]
},
{
"length": 1312,
"align1": 0,
"align2": 41,
"timings": [656.922, 3969.98, 638.391, 1300.5, 1013.78, 1176.86, 648.922]
},
{
"length": 1312,
"align1": 41,
"align2": 41,
"timings": [630.812, 3969.19, 623.938, 1225.44, 758.641, 1174.47, 449.219]
},
{
"length": 1344,
"align1": 0,
"align2": 0,
"timings": [494.297, 4065.17, 483.234, 1133.11, 666.578, 1089.22, 399.578]
},
{
"length": 1344,
"align1": 42,
"align2": 0,
"timings": [580.547, 4065.17, 566.312, 1216.09, 921.953, 1092.14, 614.078]
},
{
"length": 1344,
"align1": 0,
"align2": 42,
"timings": [672.266, 4065.17, 655.531, 1404.36, 1116.02, 1221.34, 657.344]
},
{
"length": 1344,
"align1": 42,
"align2": 42,
"timings": [619.609, 4065.58, 606.766, 1331.94, 864.172, 1201.98, 459.844]
},
{
"length": 1376,
"align1": 0,
"align2": 0,
"timings": [550.641, 4161.97, 534.875, 1301.58, 837.016, 1103.12, 408.891]
},
{
"length": 1376,
"align1": 43,
"align2": 0,
"timings": [603.375, 4162, 593.516, 1379.25, 1088.83, 1114.2, 625.953]
},
{
"length": 1376,
"align1": 0,
"align2": 43,
"timings": [667.906, 4162.02, 656.797, 1338.59, 1047.41, 1194.98, 656.047]
},
{
"length": 1376,
"align1": 43,
"align2": 43,
"timings": [643.984, 4163.41, 642.078, 1260.09, 787.672, 1188.88, 470.031]
},
{
"length": 1408,
"align1": 0,
"align2": 0,
"timings": [516.328, 4257.56, 504.422, 1168.27, 692.516, 1112.41, 414.984]
},
{
"length": 1408,
"align1": 44,
"align2": 0,
"timings": [595.875, 4257.17, 586.109, 1251.02, 957.266, 1116.97, 641.156]
},
{
"length": 1408,
"align1": 0,
"align2": 44,
"timings": [688.25, 4257.17, 670.375, 1442.59, 1151.61, 1196.58, 689.609]
},
{
"length": 1408,
"align1": 44,
"align2": 44,
"timings": [662.406, 4257.97, 567.359, 1366.59, 888.797, 1187.08, 453.188]
},
{
"length": 1440,
"align1": 0,
"align2": 0,
"timings": [565.688, 4353.97, 556.266, 1336.39, 854.328, 1132.12, 424.516]
},
{
"length": 1440,
"align1": 45,
"align2": 0,
"timings": [615.719, 4353.64, 610.438, 1421.84, 1117.83, 1127.44, 651.938]
},
{
"length": 1440,
"align1": 0,
"align2": 45,
"timings": [722.078, 4353.97, 698.969, 1373.27, 1088.58, 1220, 705.359]
},
{
"length": 1440,
"align1": 45,
"align2": 45,
"timings": [697.281, 4353.56, 684.516, 1307.61, 832.453, 1221.19, 490.75]
},
{
"length": 1472,
"align1": 0,
"align2": 0,
"timings": [530.219, 4449.97, 523.109, 1200.11, 712.609, 1137.41, 430.812]
},
{
"length": 1472,
"align1": 46,
"align2": 0,
"timings": [615.344, 4449.16, 600.969, 1301.91, 991.328, 1143.47, 666.875]
},
{
"length": 1472,
"align1": 0,
"align2": 46,
"timings": [708.875, 4449.84, 691.109, 1481.19, 1185.53, 1247.88, 690.344]
},
{
"length": 1472,
"align1": 46,
"align2": 46,
"timings": [645.141, 4450.28, 644.984, 1401.11, 914.828, 1239.41, 508]
},
{
"length": 1504,
"align1": 0,
"align2": 0,
"timings": [583.156, 4545.58, 576.047, 1369.84, 877.031, 1155.27, 440.125]
},
{
"length": 1504,
"align1": 47,
"align2": 0,
"timings": [637.844, 4546.02, 628.641, 1455.86, 1152.33, 1150.3, 679.016]
},
{
"length": 1504,
"align1": 0,
"align2": 47,
"timings": [709.344, 4545.58, 690.781, 1410.73, 1119.02, 1254.95, 702.078]
},
{
"length": 1504,
"align1": 47,
"align2": 47,
"timings": [681.078, 4545.58, 678.578, 1331.88, 839.047, 1249.64, 492.984]
},
{
"length": 1536,
"align1": 0,
"align2": 0,
"timings": [551.219, 4641.58, 545.281, 1237.25, 741.062, 1165.42, 445.875]
},
{
"length": 1536,
"align1": 48,
"align2": 0,
"timings": [548.953, 4641.19, 541.359, 1285.02, 732.578, 1173.58, 444.312]
},
{
"length": 1536,
"align1": 0,
"align2": 48,
"timings": [600.031, 4641.17, 592.047, 1509.72, 942.781, 1219.25, 445.234]
},
{
"length": 1536,
"align1": 48,
"align2": 48,
"timings": [593.547, 4641.59, 587.422, 1435.95, 937.938, 1210.77, 444.297]
},
{
"length": 1568,
"align1": 0,
"align2": 0,
"timings": [605.453, 4737.98, 594.078, 1401.61, 900.25, 1180.2, 454.766]
},
{
"length": 1568,
"align1": 49,
"align2": 0,
"timings": [667.812, 4738.02, 647.891, 1448.75, 1194.33, 1185.12, 704.062]
},
{
"length": 1568,
"align1": 0,
"align2": 49,
"timings": [728.344, 4738.02, 708.688, 1392.89, 1161.78, 1273.69, 754.516]
},
{
"length": 1568,
"align1": 49,
"align2": 49,
"timings": [737.938, 4737.17, 721.031, 1366.09, 873.266, 1267.41, 499.5]
},
{
"length": 1600,
"align1": 0,
"align2": 0,
"timings": [573.812, 4833.17, 562.672, 1273.28, 767.594, 1189.64, 466.422]
},
{
"length": 1600,
"align1": 50,
"align2": 0,
"timings": [649.203, 4833.19, 637.906, 1313.61, 1058.78, 1197.67, 718.047]
},
{
"length": 1600,
"align1": 0,
"align2": 50,
"timings": [738.906, 4833.17, 728.812, 1487.56, 1253.56, 1311.11, 763.594]
},
{
"length": 1600,
"align1": 50,
"align2": 50,
"timings": [1848.25, 4835.22, 684.859, 1514.25, 969.641, 1322.73, 509.359]
},
{
"length": 1632,
"align1": 0,
"align2": 0,
"timings": [628.406, 4929.58, 615.156, 1440.94, 927.969, 1203.36, 474.078]
},
{
"length": 1632,
"align1": 51,
"align2": 0,
"timings": [678.984, 4929.97, 670.984, 1483.52, 1229.19, 1211.53, 731.828]
},
{
"length": 1632,
"align1": 0,
"align2": 51,
"timings": [750.469, 4929.97, 731.25, 1416.7, 1186.8, 1319.16, 759.109]
},
{
"length": 1632,
"align1": 51,
"align2": 51,
"timings": [759.469, 4930.36, 738.828, 1397.47, 882.641, 1299.31, 518.328]
},
{
"length": 1664,
"align1": 0,
"align2": 0,
"timings": [587.953, 5025.97, 573.875, 1309.55, 795.375, 1216.59, 478.734]
},
{
"length": 1664,
"align1": 52,
"align2": 0,
"timings": [676.766, 5025.16, 661.594, 1353.22, 1091.8, 1224.91, 744.125]
},
{
"length": 1664,
"align1": 0,
"align2": 52,
"timings": [761.625, 5025.17, 750.312, 1521.12, 1283.78, 1297.27, 773.141]
},
{
"length": 1664,
"align1": 52,
"align2": 52,
"timings": [668.312, 5025.95, 726.859, 1503.52, 986.5, 1291.45, 516.125]
},
{
"length": 1696,
"align1": 0,
"align2": 0,
"timings": [639.891, 5121.97, 631.016, 1476.22, 951.703, 1230.77, 487.938]
},
{
"length": 1696,
"align1": 53,
"align2": 0,
"timings": [696.594, 5121.56, 689.469, 1522.42, 1254.41, 1239.25, 756.25]
},
{
"length": 1696,
"align1": 0,
"align2": 53,
"timings": [796.266, 5121.58, 775.562, 1449.92, 1221.2, 1324.97, 811.547]
},
{
"length": 1696,
"align1": 53,
"align2": 53,
"timings": [727.406, 5121.95, 740.312, 1428.44, 907.016, 1320.75, 546.438]
},
{
"length": 1728,
"align1": 0,
"align2": 0,
"timings": [611.359, 5217.97, 597.594, 1344.33, 820.312, 1241.41, 494.219]
},
{
"length": 1728,
"align1": 54,
"align2": 0,
"timings": [693.844, 5217.17, 675.109, 1386.94, 1125.25, 1252.48, 769.938]
},
{
"length": 1728,
"align1": 0,
"align2": 54,
"timings": [780.969, 5217.84, 768.391, 1554.88, 1315.42, 1338.53, 798.094]
},
{
"length": 1728,
"align1": 54,
"align2": 54,
"timings": [721.469, 5218.28, 711.516, 1534.77, 1011.7, 1330.19, 552.703]
},
{
"length": 1760,
"align1": 0,
"align2": 0,
"timings": [663.719, 5313.58, 650.688, 1508.02, 980.859, 1257.58, 504.656]
},
{
"length": 1760,
"align1": 55,
"align2": 0,
"timings": [717.328, 5314.03, 707.609, 1555.61, 1288.97, 1259.98, 782.656]
},
{
"length": 1760,
"align1": 0,
"align2": 55,
"timings": [784.547, 5313.97, 766.578, 1500.89, 1254.69, 1348.58, 805.797]
},
{
"length": 1760,
"align1": 55,
"align2": 55,
"timings": [741.078, 5313.98, 726.453, 1466.81, 938.656, 1348.67, 539.938]
},
{
"length": 1792,
"align1": 0,
"align2": 0,
"timings": [629.812, 5409.97, 618.688, 1380.47, 844.328, 1270.86, 510.438]
},
{
"length": 1792,
"align1": 56,
"align2": 0,
"timings": [626.578, 5409.17, 620.562, 1509.89, 842.266, 1317.36, 508.344]
},
{
"length": 1792,
"align1": 0,
"align2": 56,
"timings": [681.969, 5409.17, 671.391, 1597.55, 1049.25, 1320.11, 509.359]
},
{
"length": 1792,
"align1": 56,
"align2": 56,
"timings": [674.594, 5409.58, 672.547, 1573.75, 1038.89, 1311.62, 509.375]
},
{
"length": 1824,
"align1": 0,
"align2": 0,
"timings": [681.891, 5505.58, 669.781, 1549.06, 1006.05, 1284.5, 518.859]
},
{
"length": 1824,
"align1": 57,
"align2": 0,
"timings": [748.141, 5505.98, 724.859, 1668.44, 1329.25, 1286, 809.828]
},
{
"length": 1824,
"align1": 0,
"align2": 57,
"timings": [813.172, 5506.59, 781.266, 1540.52, 1312.55, 1344.41, 871.938]
},
{
"length": 1824,
"align1": 57,
"align2": 57,
"timings": [717.938, 5506, 702.844, 1507.94, 965.234, 1332.73, 556.594]
},
{
"length": 1856,
"align1": 0,
"align2": 0,
"timings": [651.094, 5601.97, 635.703, 1413.73, 868.188, 1293.81, 527.172]
},
{
"length": 1856,
"align1": 58,
"align2": 0,
"timings": [730.844, 5601.19, 710.312, 1536.14, 1198.28, 1305.62, 824.578]
},
{
"length": 1856,
"align1": 0,
"align2": 58,
"timings": [810.297, 5601.17, 799.844, 1630.56, 1383.09, 1388.17, 865.125]
},
{
"length": 1856,
"align1": 58,
"align2": 58,
"timings": [709.422, 5601.59, 700.281, 1605.95, 1063.12, 1371.22, 560.609]
},
{
"length": 1888,
"align1": 0,
"align2": 0,
"timings": [695.125, 5697.97, 689.531, 1580.42, 1032.7, 1312.06, 538.312]
},
{
"length": 1888,
"align1": 59,
"align2": 0,
"timings": [746.234, 5697.98, 737.922, 1714.77, 1358.45, 1322.62, 836.406]
},
{
"length": 1888,
"align1": 0,
"align2": 59,
"timings": [820.594, 5697.58, 800.312, 1583.62, 1310.17, 1365.52, 864.844]
},
{
"length": 1888,
"align1": 59,
"align2": 59,
"timings": [726.062, 5697.98, 713.688, 1559.03, 996.516, 1361.27, 570.141]
},
{
"length": 1920,
"align1": 0,
"align2": 0,
"timings": [663.359, 5793.97, 656.094, 1450.38, 939.75, 1319.98, 543.828]
},
{
"length": 1920,
"align1": 60,
"align2": 0,
"timings": [752.359, 5793.17, 728.141, 1575.05, 1233.23, 1335.38, 849.734]
},
{
"length": 1920,
"align1": 0,
"align2": 60,
"timings": [834.078, 5793.17, 819.688, 1669.06, 1449.8, 1378.48, 924.125]
},
{
"length": 1920,
"align1": 60,
"align2": 60,
"timings": [735.969, 5793.58, 716.859, 1642.95, 1122.27, 1374.89, 581.75]
},
{
"length": 1952,
"align1": 0,
"align2": 0,
"timings": [720.672, 5889.97, 707.266, 1616.73, 1109.34, 1337.05, 554.016]
},
{
"length": 1952,
"align1": 61,
"align2": 0,
"timings": [768.016, 5890.05, 755.031, 1740.36, 1392.91, 1341.59, 861.984]
},
{
"length": 1952,
"align1": 0,
"align2": 61,
"timings": [866.594, 5889.58, 846.172, 1599.06, 1343.05, 1392.53, 914.422]
},
{
"length": 1952,
"align1": 61,
"align2": 61,
"timings": [775.203, 5889.59, 757.719, 1570.02, 1011.52, 1386.06, 610.547]
},
{
"length": 1984,
"align1": 0,
"align2": 0,
"timings": [687.797, 5985.58, 671.703, 1482.53, 960.328, 1348.5, 561.406]
},
{
"length": 1984,
"align1": 62,
"align2": 0,
"timings": [770.578, 5985.19, 746.109, 1617.97, 1268.91, 1363.16, 875.516]
},
{
"length": 1984,
"align1": 0,
"align2": 62,
"timings": [860.109, 5985.84, 837.328, 1698.58, 1458.98, 1407.27, 897.547]
},
{
"length": 1984,
"align1": 62,
"align2": 62,
"timings": [739.609, 5986.28, 726.891, 1683, 1116.5, 1399.86, 613.031]
},
{
"length": 2016,
"align1": 0,
"align2": 0,
"timings": [737.625, 6081.58, 729.328, 1647.55, 1129.17, 1363.94, 568.391]
},
{
"length": 2016,
"align1": 63,
"align2": 0,
"timings": [786.938, 6082.03, 774.062, 1774.28, 1427.14, 1366.14, 889.062]
},
{
"length": 2016,
"align1": 0,
"align2": 63,
"timings": [851.625, 6081.58, 834.656, 1627.39, 1373.86, 1417.42, 910.484]
},
{
"length": 2016,
"align1": 63,
"align2": 63,
"timings": [745.531, 7184.59, 750.781, 1601.55, 1079.95, 1418.48, 601.531]
},
{
"length": 8192,
"align1": 0,
"align2": 0,
"timings": [2617.83, 24611.3, 2551.62, 5061.19, 3624.98, 3858.86, 2126.98]
}]
}
}
}
[-- Attachment #4: bench-memcpy-large-sparc64.out --]
[-- Type: text/plain, Size: 6024 bytes --]
{
"timing_type": "hp_timing",
"functions": {
"memcpy": {
"bench-variant": "large",
"ifuncs": ["__memcpy_niagara4", "__memcpy_niagara2", "__memcpy_niagara1", "__memcpy_ultra1", "__memcpy_c"],
"results": [
{
"length": 65543,
"align1": 0,
"align2": 0,
"timings": [59127.1, 50140.2, 47568.8, 72907.4, 29730.2]
},
{
"length": 65551,
"align1": 0,
"align2": 3,
"timings": [35074.1, 58193.6, 48056.7, 53652.4, 38544.1]
},
{
"length": 65567,
"align1": 3,
"align2": 0,
"timings": [33287.4, 56042.3, 45161.9, 54339.6, 37674.2]
},
{
"length": 65599,
"align1": 3,
"align2": 5,
"timings": [33360.3, 58022, 45390.5, 53861.4, 37517.5]
},
{
"length": 131079,
"align1": 0,
"align2": 0,
"timings": [90264.6, 99100, 93145.8, 99447.2, 70812.8]
},
{
"length": 131087,
"align1": 0,
"align2": 3,
"timings": [73837, 107689, 87828.9, 99008.3, 79760.9]
},
{
"length": 131103,
"align1": 3,
"align2": 0,
"timings": [72335.1, 108369, 87037.8, 99012, 80061.6]
},
{
"length": 131135,
"align1": 3,
"align2": 5,
"timings": [72164.8, 107436, 87604.3, 98978, 80012.7]
},
{
"length": 262151,
"align1": 0,
"align2": 0,
"timings": [179844, 197113, 184066, 192429, 146549]
},
{
"length": 262159,
"align1": 0,
"align2": 3,
"timings": [157043, 212988, 160545, 191674, 157602]
},
{
"length": 262175,
"align1": 3,
"align2": 0,
"timings": [165027, 199828, 159090, 191833, 158787]
},
{
"length": 262207,
"align1": 3,
"align2": 5,
"timings": [164956, 206744, 166331, 193132, 159041]
},
{
"length": 524295,
"align1": 0,
"align2": 0,
"timings": [533385, 574664, 562402, 551662, 493239]
},
{
"length": 524303,
"align1": 0,
"align2": 3,
"timings": [481687, 604455, 511358, 553130, 511505]
},
{
"length": 524319,
"align1": 3,
"align2": 0,
"timings": [490018, 568112, 492695, 550434, 514233]
},
{
"length": 524351,
"align1": 3,
"align2": 5,
"timings": [480925, 597437, 514106, 560834, 516341]
},
{
"length": 1048583,
"align1": 0,
"align2": 0,
"timings": [1.11891e+06, 1.21379e+06, 1.1737e+06, 1.23087e+06, 1.07554e+06]
},
{
"length": 1048591,
"align1": 0,
"align2": 3,
"timings": [1.04617e+06, 1.36087e+06, 1.25046e+06, 1.32489e+06, 1.13088e+06]
},
{
"length": 1048607,
"align1": 3,
"align2": 0,
"timings": [1.05295e+06, 1.21036e+06, 1.0852e+06, 1.20669e+06, 1.11625e+06]
},
{
"length": 1048639,
"align1": 3,
"align2": 5,
"timings": [1.0514e+06, 1.25004e+06, 1.06701e+06, 1.18965e+06, 1.116e+06]
},
{
"length": 2097159,
"align1": 0,
"align2": 0,
"timings": [2.69514e+06, 3.22031e+06, 3.1901e+06, 3.37276e+06, 2.35872e+06]
},
{
"length": 2097167,
"align1": 0,
"align2": 3,
"timings": [2.20282e+06, 2.80237e+06, 2.98769e+06, 3.20854e+06, 2.46728e+06]
},
{
"length": 2097183,
"align1": 3,
"align2": 0,
"timings": [2.17914e+06, 2.68061e+06, 3.18438e+06, 3.20131e+06, 2.427e+06]
},
{
"length": 2097215,
"align1": 3,
"align2": 5,
"timings": [2.13129e+06, 2.54599e+06, 2.28398e+06, 2.69756e+06, 2.31616e+06]
},
{
"length": 4194311,
"align1": 0,
"align2": 0,
"timings": [6.44985e+06, 6.84935e+06, 6.36142e+06, 6.6896e+06, 9.85727e+06]
},
{
"length": 4194319,
"align1": 0,
"align2": 3,
"timings": [9.1533e+06, 7.40558e+06, 7.21224e+06, 1.01661e+07, 9.91204e+06]
},
{
"length": 4194335,
"align1": 3,
"align2": 0,
"timings": [8.63271e+06, 6.38308e+06, 6.37415e+06, 6.67057e+06, 9.51175e+06]
},
{
"length": 4194367,
"align1": 3,
"align2": 5,
"timings": [8.59695e+06, 6.66938e+06, 6.48887e+06, 7.43697e+06, 9.84484e+06]
},
{
"length": 8388615,
"align1": 0,
"align2": 0,
"timings": [1.81105e+07, 1.96478e+07, 1.91947e+07, 1.86411e+07, 2.54114e+07]
},
{
"length": 8388623,
"align1": 0,
"align2": 3,
"timings": [2.33228e+07, 2.3391e+07, 2.14993e+07, 2.59313e+07, 2.83967e+07]
},
{
"length": 8388639,
"align1": 3,
"align2": 0,
"timings": [2.4374e+07, 2.49625e+07, 2.00963e+07, 1.8503e+07, 2.82517e+07]
},
{
"length": 8388671,
"align1": 3,
"align2": 5,
"timings": [2.33218e+07, 2.39182e+07, 2.1584e+07, 2.00245e+07, 2.83425e+07]
},
{
"length": 16777223,
"align1": 0,
"align2": 0,
"timings": [4.03404e+07, 4.96037e+07, 5.23379e+07, 5.04445e+07, 5.11504e+07]
},
{
"length": 16777231,
"align1": 0,
"align2": 3,
"timings": [4.69308e+07, 6.2349e+07, 4.98645e+07, 5.77437e+07, 5.71984e+07]
},
{
"length": 16777247,
"align1": 3,
"align2": 0,
"timings": [4.88141e+07, 6.08496e+07, 4.51228e+07, 4.58737e+07, 5.72227e+07]
},
{
"length": 16777279,
"align1": 3,
"align2": 5,
"timings": [4.6599e+07, 6.24816e+07, 4.97614e+07, 5.09817e+07, 5.72153e+07]
},
{
"length": 33554439,
"align1": 0,
"align2": 0,
"timings": [6.57336e+07, 8.45818e+07, 9.20476e+07, 8.58418e+07, 8.84407e+07]
},
{
"length": 33554447,
"align1": 0,
"align2": 3,
"timings": [7.87364e+07, 1.11608e+08, 8.69825e+07, 1.03096e+08, 1.01216e+08]
},
{
"length": 33554463,
"align1": 3,
"align2": 0,
"timings": [8.36701e+07, 1.08938e+08, 7.55594e+07, 8.45694e+07, 1.00481e+08]
},
{
"length": 33554495,
"align1": 3,
"align2": 5,
"timings": [7.87672e+07, 1.11732e+08, 8.68008e+07, 1.03159e+08, 1.01291e+08]
}]
}
}
}
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 3/4] sparc: Use default memcpy for rtld objects
2017-10-05 18:02 ` Adhemerval Zanella
@ 2017-10-05 18:12 ` Adhemerval Zanella
2017-10-05 18:30 ` David Miller
2017-10-05 18:26 ` David Miller
1 sibling, 1 reply; 11+ messages in thread
From: Adhemerval Zanella @ 2017-10-05 18:12 UTC (permalink / raw)
To: David Miller; +Cc: libc-alpha
On 05/10/2017 15:02, Adhemerval Zanella wrote:
>
>
> On 05/10/2017 13:49, David Miller wrote:
>> From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
>> Date: Thu, 5 Oct 2017 10:51:11 -0300
>>
>>> Both SPARC support multiarch platforms (sparcv9 and sparc64) have the
>>> a default assembly implemented memcpy. Since it should not be any
>>> restriction about it them on the loader object and assuming they are
>>> faster than generic ones this patch uses them for rtld objects.
>>>
>>> Also, there is no indication neither on original patch [1] or in commit
>>> message why the generic one where used instead of the sparc optimized
>>> ones.
>>
>> The ultra1 memcpy is really an extremely non-ideal variant to use as
>> the default for anything.
>>
>> It's much slower on newer cpus, as the block loads and stores used in
>> the ultra1 version aren't optimized the same way they were in those
>> older chips.
>>
>> The C version is faster on newer cpus and definitely a better choice
>> as a default, especially because it doesn't use any cpu specific
>> instructions like the ultra1 variant does.
>>
>> In the Linux kernel we have an assembler version we use as the default
>> which doesn't use any special instructions.
>
> Thanks for the explanation, although it does not explain why the ultra1
> is currently the default for sparc64 (sysdeps/sparc/sparc64/memcpy.S)
> and also the default selection for multiarch. The C version is used
> solely for loader currently.
>
> I tried to check which are the performance of C implementation against
> ultra1 one on a niagara5 and results are:
>
> - on bench-memcpy the C version is slight slower for sizes up to
> 32 (about 4% faster for sizes up to 16, 40% from 16 to 32 and
> 50% up to 32). It is definitely faster for sizes higher than
> 64 (62% faster for sizes from 64 to 128 and 85% for sizes
> higher than 128).
>
> - on bench-memcpy-random shows no performance difference, however
> bench-memcpy-large shows the C implementation is indeed faster
> for all inputs.
>
> So I think that instead of using default memcpy for rtld, the best
> strategy would to use the C implementation instead as default and
> add ultra1 as another option for ifunc resolution.
One thing I forgot to ask is whether if you have any data points
how slow the C implementation would be compared to current default
sparc64 memcpy. Because one options would just remove it and use
the C as default without providing it as an option.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 3/4] sparc: Use default memcpy for rtld objects
2017-10-05 18:02 ` Adhemerval Zanella
2017-10-05 18:12 ` Adhemerval Zanella
@ 2017-10-05 18:26 ` David Miller
1 sibling, 0 replies; 11+ messages in thread
From: David Miller @ 2017-10-05 18:26 UTC (permalink / raw)
To: adhemerval.zanella; +Cc: libc-alpha
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Date: Thu, 5 Oct 2017 15:02:02 -0300
> Thanks for the explanation, although it does not explain why the ultra1
> is currently the default for sparc64 (sysdeps/sparc/sparc64/memcpy.S)
> and also the default selection for multiarch. The C version is used
> solely for loader currently.
I never got around to fixing up this situation on the glibc side,
that's why.
> I tried to check which are the performance of C implementation against
> ultra1 one on a niagara5 and results are:
>
> - on bench-memcpy the C version is slight slower for sizes up to
> 32 (about 4% faster for sizes up to 16, 40% from 16 to 32 and
> 50% up to 32). It is definitely faster for sizes higher than
> 64 (62% faster for sizes from 64 to 128 and 85% for sizes
> higher than 128).
>
> - on bench-memcpy-random shows no performance difference, however
> bench-memcpy-large shows the C implementation is indeed faster
> for all inputs.
>
> So I think that instead of using default memcpy for rtld, the best
> strategy would to use the C implementation instead as default and
> add ultra1 as another option for ifunc resolution.
Yes, that's a good way to go.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 3/4] sparc: Use default memcpy for rtld objects
2017-10-05 18:12 ` Adhemerval Zanella
@ 2017-10-05 18:30 ` David Miller
2017-10-05 18:45 ` Adhemerval Zanella
0 siblings, 1 reply; 11+ messages in thread
From: David Miller @ 2017-10-05 18:30 UTC (permalink / raw)
To: adhemerval.zanella; +Cc: libc-alpha
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Date: Thu, 5 Oct 2017 15:12:33 -0300
> One thing I forgot to ask is whether if you have any data points how
> slow the C implementation would be compared to current default
> sparc64 memcpy. Because one options would just remove it and use
> the C as default without providing it as an option.
Well, on actual Ultra1/2/2e/2i chips, it is significantly faster
than the C implementation.
But in rtld the safest thing to do is use a simple memcpy that works
on every cpu, regardless of cpu caps.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 3/4] sparc: Use default memcpy for rtld objects
2017-10-05 18:30 ` David Miller
@ 2017-10-05 18:45 ` Adhemerval Zanella
0 siblings, 0 replies; 11+ messages in thread
From: Adhemerval Zanella @ 2017-10-05 18:45 UTC (permalink / raw)
To: David Miller; +Cc: libc-alpha
On 05/10/2017 15:30, David Miller wrote:
> From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> Date: Thu, 5 Oct 2017 15:12:33 -0300
>
>> One thing I forgot to ask is whether if you have any data points how
>> slow the C implementation would be compared to current default
>> sparc64 memcpy. Because one options would just remove it and use
>> the C as default without providing it as an option.
>
> Well, on actual Ultra1/2/2e/2i chips, it is significantly faster
> than the C implementation.
>
> But in rtld the safest thing to do is use a simple memcpy that works
> on every cpu, regardless of cpu caps.
>
Right, I think we can live with it. I withdrawn both patch 3 and 4
then.
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2017-10-05 18:45 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-10-05 13:51 [PATCH 1/4] sparc: Implement memcpy/mempcpy ifunc selection in C Adhemerval Zanella
2017-10-05 13:51 ` [PATCH 4/4] sparc: Use default memset for rtld objects Adhemerval Zanella
2017-10-05 16:50 ` David Miller
2017-10-05 13:51 ` [PATCH 2/4] sparc: Implement memset/bzero ifunc selection in C Adhemerval Zanella
2017-10-05 13:51 ` [PATCH 3/4] sparc: Use default memcpy for rtld objects Adhemerval Zanella
2017-10-05 16:49 ` David Miller
2017-10-05 18:02 ` Adhemerval Zanella
2017-10-05 18:12 ` Adhemerval Zanella
2017-10-05 18:30 ` David Miller
2017-10-05 18:45 ` Adhemerval Zanella
2017-10-05 18:26 ` David Miller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).