Remove DJGPP (and therefore WATT32) #ifdef's.
[openssl.git] / crypto / x86cpuid.pl
index 597b7a51a71fa06a119c1a36e3defc6e31c77d0f..dca37e7cd265878d04a77d6dea0235add06e4c74 100644 (file)
@@ -22,6 +22,8 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); }
        &xor    ("eax","eax");
        &bt     ("ecx",21);
        &jnc    (&label("nocpuid"));
+       &mov    ("esi",&wparam(0));
+       &mov    (&DWP(8,"esi"),"eax");  # clear 3rd word
        &cpuid  ();
        &mov    ("edi","eax");          # max value for standard query level
 
@@ -67,6 +69,7 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); }
        &inc    ("esi");                # number of cores
 
        &mov    ("eax",1);
+       &xor    ("ecx","ecx");
        &cpuid  ();
        &bt     ("edx",28);
        &jnc    (&label("generic"));
@@ -78,6 +81,16 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); }
        &jmp    (&label("generic"));
        
 &set_label("intel");
+       &cmp    ("edi",7);
+       &jb     (&label("cacheinfo"));
+
+       &mov    ("esi",&wparam(0));
+       &mov    ("eax",7);
+       &xor    ("ecx","ecx");
+       &cpuid  ();
+       &mov    (&DWP(8,"esi"),"ebx");
+
+&set_label("cacheinfo");
        &cmp    ("edi",4);
        &mov    ("edi",-1);
        &jb     (&label("nocacheinfo"));
@@ -91,6 +104,7 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); }
 
 &set_label("nocacheinfo");
        &mov    ("eax",1);
+       &xor    ("ecx","ecx");
        &cpuid  ();
        &and    ("edx",0xbfefffff);     # force reserved bits #20, #30 to 0
        &cmp    ("ebp",0);
@@ -133,6 +147,8 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); }
        &and    ("esi",0xfeffffff);     # clear FXSR
 &set_label("clear_avx");
        &and    ("ebp",0xefffe7ff);     # clear AVX, FMA and AMD XOP bits
+       &mov    ("edi",&wparam(0));
+       &and    (&DWP(8,"edi"),0xffffffdf);     # clear AVX2
 &set_label("done");
        &mov    ("eax","esi");
        &mov    ("edx","ebp");
@@ -152,7 +168,7 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); }
        &ret    ();
 &function_end_B("OPENSSL_rdtsc");
 
-# This works in Ring 0 only [read DJGPP+MS-DOS+privileged DPMI host],
+# This works in Ring 0 only [read MS-DOS+privileged DPMI host],
 # but it's safe to call it on any [supported] 32-bit platform...
 # Just check for [non-]zero return value...
 &function_begin_B("OPENSSL_instrument_halt","EXTRN\t_OPENSSL_ia32cap_P:DWORD");
@@ -186,41 +202,6 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); }
        &ret    ();
 &function_end_B("OPENSSL_instrument_halt");
 
-# Essentially there is only one use for this function. Under DJGPP:
-#
-#      #include <go32.h>
-#      ...
-#      i=OPENSSL_far_spin(_dos_ds,0x46c);
-#      ...
-# to obtain the number of spins till closest timer interrupt.
-
-&function_begin_B("OPENSSL_far_spin");
-       &pushf  ();
-       &pop    ("eax");
-       &bt     ("eax",9);
-       &jnc    (&label("nospin"));     # interrupts are disabled
-
-       &mov    ("eax",&DWP(4,"esp"));
-       &mov    ("ecx",&DWP(8,"esp"));
-       &data_word (0x90d88e1e);        # push %ds, mov %eax,%ds
-       &xor    ("eax","eax");
-       &mov    ("edx",&DWP(0,"ecx"));
-       &jmp    (&label("spin"));
-
-       &align  (16);
-&set_label("spin");
-       &inc    ("eax");
-       &cmp    ("edx",&DWP(0,"ecx"));
-       &je     (&label("spin"));
-
-       &data_word (0x1f909090);        # pop   %ds
-       &ret    ();
-
-&set_label("nospin");
-       &xor    ("eax","eax");
-       &xor    ("edx","edx");
-       &ret    ();
-&function_end_B("OPENSSL_far_spin");
 
 &function_begin_B("OPENSSL_wipe_cpu","EXTRN\t_OPENSSL_ia32cap_P:DWORD");
        &xor    ("eax","eax");
@@ -453,6 +434,18 @@ my $max = "ebp";
        &ret    ();
 &function_end_B("OPENSSL_ia32_rdrand");
 
+&function_begin_B("OPENSSL_ia32_rdseed");
+       &mov    ("ecx",8);
+&set_label("loop");
+       &rdseed ("eax");
+       &jc     (&label("break"));
+       &loop   (&label("loop"));
+&set_label("break");
+       &cmp    ("eax",0);
+       &cmove  ("eax","ecx");
+       &ret    ();
+&function_end_B("OPENSSL_ia32_rdseed");
+
 &initseg("OPENSSL_cpuid_setup");
 
 &hidden("OPENSSL_cpuid_setup");