Commit 3df2eff4 authored by Andy Polyakov's avatar Andy Polyakov
Browse files

x86*cpuid update.

parent a415ebd0
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -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
+10 −7
Original line number Original line Diff line number Diff line
@@ -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");