aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crypto/x86_64cpuid.pl4
-rw-r--r--crypto/x86cpuid.pl17
2 files changed, 12 insertions, 9 deletions
diff --git a/crypto/x86_64cpuid.pl b/crypto/x86_64cpuid.pl
index f90bbc9..e29792a 100644
--- a/crypto/x86_64cpuid.pl
+++ b/crypto/x86_64cpuid.pl
@@ -134,8 +134,6 @@ OPENSSL_ia32_cpuid:
mov \$1,%eax
cpuid
- bt \$28,%edx # test hyper-threading bit
- jnc .Ldone
cmp \$0,%r9d
jne .Lnotintel
or \$1<<20,%edx # use reserved bit to engage RC4_CHAR
@@ -144,6 +142,8 @@ OPENSSL_ia32_cpuid:
je .Lnotintel
or \$1<<30,%edx # use reserved bit to skip unrolled loop
.Lnotintel:
+ bt \$28,%edx # test hyper-threading bit
+ jnc .Ldone
shr \$16,%ebx
cmp \$1,%bl # see if cache is shared
ja .Ldone
diff --git a/crypto/x86cpuid.pl b/crypto/x86cpuid.pl
index ce9b8ea..0fb0657 100644
--- a/crypto/x86cpuid.pl
+++ b/crypto/x86cpuid.pl
@@ -19,7 +19,7 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); }
&pop ("eax");
&xor ("ecx","eax");
&bt ("ecx",21);
- &jnc (&label("nocpuid"));
+ &jnc (&label("done"));
&xor ("eax","eax");
&cpuid ();
&xor ("eax","eax");
@@ -34,17 +34,20 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); }
&or ("ebp","eax");
&mov ("eax",1);
&cpuid ();
- &bt ("edx",28); # test hyper-threading bit
- &jnc (&label("nocpuid"));
&cmp ("ebp",0);
- &jne (&label("notintel"));
+ &jne (&label("notP4"));
+ &and (&HB("eax"),15); # familiy ID
+ &cmp (&HB("eax"),15); # P4?
+ &jne (&label("notP4"));
&or ("edx",1<<20); # use reserved bit to engage RC4_CHAR
-&set_label("notintel");
+&set_label("notP4");
+ &bt ("edx",28); # test hyper-threading bit
+ &jnc (&label("done"));
&shr ("ebx",16);
&cmp (&LB("ebx"),1); # see if cache is shared(*)
- &ja (&label("nocpuid"));
+ &ja (&label("done"));
&and ("edx",0xefffffff); # clear hyper-threading bit if not
-&set_label("nocpuid");
+&set_label("done");
&mov ("eax","edx");
&mov ("edx","ecx");
&function_end("OPENSSL_ia32_cpuid");