aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2009-07-23 13:15:17 -0700
committerUlrich Drepper <drepper@redhat.com>2009-07-23 13:15:17 -0700
commitd28797e426aa7e4e380a7ae10faf4aa3c4767e0b (patch)
treef3219b54a090a6252edd85cd30af80ba81ae556a
parent666a9871f7afc40aebcc28eab8890ab99ee01a47 (diff)
downloadglibc-d28797e426aa7e4e380a7ae10faf4aa3c4767e0b.zip
glibc-d28797e426aa7e4e380a7ae10faf4aa3c4767e0b.tar.gz
glibc-d28797e426aa7e4e380a7ae10faf4aa3c4767e0b.tar.bz2
Perform test for Arom x86-64 in central place and handle it.
There will be more than one function which, in multiarch mode, wants to use SSSE3. We should not test in each of them for Atoms with slow SSSE3. Instead, disable the SSSE3 bit in the startup code for such machines.
-rw-r--r--ChangeLog5
-rw-r--r--sysdeps/x86_64/multiarch/init-arch.c8
-rw-r--r--sysdeps/x86_64/multiarch/strcpy.S13
3 files changed, 15 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 7bc9fc3..1498e4a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
2009-07-23 Ulrich Drepper <drepper@redhat.com>
+ * sysdeps/x86_64/multiarch/init-arch.c (__init_cpu_features): Reset
+ SSSE3 bit for Atoms.
+ * sysdeps/x86_64/multiarch/strcpy.S: New need to perform Atom test
+ here anymore.
+
* posix/tst-rfc3484.c (do_test): Initialize entire sockaddr_in
structure before copying it to avoid warning.
* posix/tst-rfc3484-2.c (do_test): Likewise.
diff --git a/sysdeps/x86_64/multiarch/init-arch.c b/sysdeps/x86_64/multiarch/init-arch.c
index 29e6873..35fd19a 100644
--- a/sysdeps/x86_64/multiarch/init-arch.c
+++ b/sysdeps/x86_64/multiarch/init-arch.c
@@ -68,7 +68,13 @@ __init_cpu_features (void)
__cpu_features.model += extended_model;
}
else if (__cpu_features.family == 0x06)
- __cpu_features.model += extended_model;
+ {
+ __cpu_features.model += extended_model;
+
+ if (__cpu_features.model == 0x1c)
+ /* Avoid SSSE3 on Atom since it is slow. */
+ __cpu_features.cpuid[COMMON_CPUID_INDEX_1].ecx &= ~(1 << 9);
+ }
}
/* This spells out "AuthenticAMD". */
else if (ebx == 0x68747541 && ecx == 0x444d4163 && edx == 0x69746e65)
diff --git a/sysdeps/x86_64/multiarch/strcpy.S b/sysdeps/x86_64/multiarch/strcpy.S
index 25cd013..7e400a9 100644
--- a/sysdeps/x86_64/multiarch/strcpy.S
+++ b/sysdeps/x86_64/multiarch/strcpy.S
@@ -64,16 +64,9 @@ ENTRY(STRCPY)
call __init_cpu_features
1: leaq STRCPY_SSE2(%rip), %rax
testl $(1<<9), __cpu_features+CPUID_OFFSET+COMMON_CPUID_INDEX_1*CPUID_SIZE+CPUID_ECX_OFFSET(%rip)
- jz 3f
-/* Avoid SSSE3 strcpy on Atom since it is slow. */
- cmpl $1, __cpu_features+KIND_OFFSET(%rip)
- jne 2f
- cmpl $6, __cpu_features+FAMILY_OFFSET(%rip)
- jne 2f
- cmpl $28, __cpu_features+MODEL_OFFSET(%rip)
- jz 3f
-2: leaq STRCPY_SSSE3(%rip), %rax
-3: ret
+ jz 2f
+ leaq STRCPY_SSSE3(%rip), %rax
+2: ret
END(STRCPY)
.section .text.ssse3,"ax",@progbits