mirror of
https://github.com/openssl/openssl.git
synced 2024-11-21 01:15:20 +08:00
14e21f863a
is to have a placeholder to small routines, which can be written only in assembler. In IA-32 case this includes processor capability identification and access to Time-Stamp Counter. As discussed earlier OPENSSL_ia32cap is introduced to control recently added SSE2 code pathes (see docs/crypto/OPENSSL_ia32cap.pod). For the moment the code is operational on ELF platforms only. I haven't checked it yet, but I have all reasons to believe that Windows build should fail to link too. I'll be looking into it shortly...
44 lines
820 B
Raku
44 lines
820 B
Raku
#!/usr/bin/env perl
|
|
|
|
push(@INC,"perlasm");
|
|
require "x86asm.pl";
|
|
|
|
&asm_init($ARGV[0],"x86cpuid");
|
|
|
|
&function_begin("OPENSSL_ia32_cpuid");
|
|
&xor ("edx","edx");
|
|
&pushf ();
|
|
&pop ("eax");
|
|
&mov ("ecx","eax");
|
|
&xor ("eax",1<<21);
|
|
&push ("eax");
|
|
&popf ();
|
|
&pushf ();
|
|
&pop ("eax");
|
|
&xor ("ecx","eax");
|
|
&bt ("ecx",21);
|
|
&jnc (&label("nocpuid"));
|
|
&mov ("eax",1);
|
|
&cpuid ();
|
|
&set_label("nocpuid");
|
|
&mov ("eax","edx");
|
|
&mov ("edx","ecx");
|
|
&function_end("OPENSSL_ia32_cpuid");
|
|
|
|
&external_label("OPENSSL_ia32cap");
|
|
|
|
&function_begin_B("OPENSSL_rdtsc");
|
|
&xor ("eax","eax");
|
|
&xor ("edx","edx");
|
|
&picmeup("ecx","OPENSSL_ia32cap");
|
|
&bt (&DWP(0,"ecx"),4);
|
|
&jnc (&label("notsc"));
|
|
&rdtsc ();
|
|
&set_label("notsc");
|
|
&ret ();
|
|
&function_end_B("OPENSSL_rdtsc");
|
|
|
|
&initseg("OPENSSL_cpuid_setup") if ($main'elf);
|
|
|
|
&asm_finish();
|