x86[_64]cpuid.pl: add low-level RDSEED.
(cherry picked from commit f4d456408d
)
This commit is contained in:
parent
b347341c75
commit
104c032b7b
4 changed files with 48 additions and 0 deletions
|
@ -778,6 +778,19 @@ my $rdrand = sub {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
my $rdseed = sub {
|
||||||
|
if (shift =~ /%[er](\w+)/) {
|
||||||
|
my @opcode=();
|
||||||
|
my $dst=$1;
|
||||||
|
if ($dst !~ /[0-9]+/) { $dst = $regrm{"%e$dst"}; }
|
||||||
|
rex(\@opcode,0,$1,8);
|
||||||
|
push @opcode,0x0f,0xc7,0xf8|($dst&7);
|
||||||
|
@opcode;
|
||||||
|
} else {
|
||||||
|
();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
sub rxb {
|
sub rxb {
|
||||||
local *opcode=shift;
|
local *opcode=shift;
|
||||||
my ($dst,$src1,$src2,$rxb)=@_;
|
my ($dst,$src1,$src2,$rxb)=@_;
|
||||||
|
|
|
@ -131,6 +131,14 @@ sub ::rdrand
|
||||||
{ &::generic("rdrand",@_); }
|
{ &::generic("rdrand",@_); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub ::rdseed
|
||||||
|
{ my ($dst)=@_;
|
||||||
|
if ($dst =~ /(e[a-dsd][ixp])/)
|
||||||
|
{ &::data_byte(0x0f,0xc7,0xf8|$regrm{$dst}); }
|
||||||
|
else
|
||||||
|
{ &::generic("rdrand",@_); }
|
||||||
|
}
|
||||||
|
|
||||||
sub rxb {
|
sub rxb {
|
||||||
local *opcode=shift;
|
local *opcode=shift;
|
||||||
my ($dst,$src1,$src2,$rxb)=@_;
|
my ($dst,$src1,$src2,$rxb)=@_;
|
||||||
|
|
|
@ -289,6 +289,21 @@ OPENSSL_ia32_rdrand:
|
||||||
cmove %rcx,%rax
|
cmove %rcx,%rax
|
||||||
ret
|
ret
|
||||||
.size OPENSSL_ia32_rdrand,.-OPENSSL_ia32_rdrand
|
.size OPENSSL_ia32_rdrand,.-OPENSSL_ia32_rdrand
|
||||||
|
|
||||||
|
.globl OPENSSL_ia32_rdseed
|
||||||
|
.type OPENSSL_ia32_rdseed,\@abi-omnipotent
|
||||||
|
.align 16
|
||||||
|
OPENSSL_ia32_rdseed:
|
||||||
|
mov \$8,%ecx
|
||||||
|
.Loop_rdseed:
|
||||||
|
rdseed %rax
|
||||||
|
jc .Lbreak_rdseed
|
||||||
|
loop .Loop_rdseed
|
||||||
|
.Lbreak_rdseed:
|
||||||
|
cmp \$0,%rax
|
||||||
|
cmove %rcx,%rax
|
||||||
|
ret
|
||||||
|
.size OPENSSL_ia32_rdseed,.-OPENSSL_ia32_rdseed
|
||||||
___
|
___
|
||||||
|
|
||||||
close STDOUT; # flush
|
close STDOUT; # flush
|
||||||
|
|
|
@ -367,6 +367,18 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); }
|
||||||
&ret ();
|
&ret ();
|
||||||
&function_end_B("OPENSSL_ia32_rdrand");
|
&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");
|
&initseg("OPENSSL_cpuid_setup");
|
||||||
|
|
||||||
&hidden("OPENSSL_cpuid_setup");
|
&hidden("OPENSSL_cpuid_setup");
|
||||||
|
|
Loading…
Reference in a new issue