x86*cpuid update.

This commit is contained in:
Andy Polyakov 2007-07-21 14:46:27 +00:00
parent a415ebd026
commit 3df2eff4bd
2 changed files with 12 additions and 9 deletions

View File

@ -134,8 +134,6 @@ OPENSSL_ia32_cpuid:
mov \$1,%eax mov \$1,%eax
cpuid cpuid
bt \$28,%edx # test hyper-threading bit
jnc .Ldone
cmp \$0,%r9d cmp \$0,%r9d
jne .Lnotintel jne .Lnotintel
or \$1<<20,%edx # use reserved bit to engage RC4_CHAR or \$1<<20,%edx # use reserved bit to engage RC4_CHAR
@ -144,6 +142,8 @@ OPENSSL_ia32_cpuid:
je .Lnotintel je .Lnotintel
or \$1<<30,%edx # use reserved bit to skip unrolled loop or \$1<<30,%edx # use reserved bit to skip unrolled loop
.Lnotintel: .Lnotintel:
bt \$28,%edx # test hyper-threading bit
jnc .Ldone
shr \$16,%ebx shr \$16,%ebx
cmp \$1,%bl # see if cache is shared cmp \$1,%bl # see if cache is shared
ja .Ldone ja .Ldone

View File

@ -19,7 +19,7 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); }
&pop ("eax"); &pop ("eax");
&xor ("ecx","eax"); &xor ("ecx","eax");
&bt ("ecx",21); &bt ("ecx",21);
&jnc (&label("nocpuid")); &jnc (&label("done"));
&xor ("eax","eax"); &xor ("eax","eax");
&cpuid (); &cpuid ();
&xor ("eax","eax"); &xor ("eax","eax");
@ -34,17 +34,20 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); }
&or ("ebp","eax"); &or ("ebp","eax");
&mov ("eax",1); &mov ("eax",1);
&cpuid (); &cpuid ();
&bt ("edx",28); # test hyper-threading bit
&jnc (&label("nocpuid"));
&cmp ("ebp",0); &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 &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); &shr ("ebx",16);
&cmp (&LB("ebx"),1); # see if cache is shared(*) &cmp (&LB("ebx"),1); # see if cache is shared(*)
&ja (&label("nocpuid")); &ja (&label("done"));
&and ("edx",0xefffffff); # clear hyper-threading bit if not &and ("edx",0xefffffff); # clear hyper-threading bit if not
&set_label("nocpuid"); &set_label("done");
&mov ("eax","edx"); &mov ("eax","edx");
&mov ("edx","ecx"); &mov ("edx","ecx");
&function_end("OPENSSL_ia32_cpuid"); &function_end("OPENSSL_ia32_cpuid");