summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/perlasm/x86asm.pl
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lib/libcrypto/perlasm/x86asm.pl55
1 files changed, 54 insertions, 1 deletions
diff --git a/src/lib/libcrypto/perlasm/x86asm.pl b/src/lib/libcrypto/perlasm/x86asm.pl
index 28080caaa6..eb543db2f6 100644
--- a/src/lib/libcrypto/perlasm/x86asm.pl
+++ b/src/lib/libcrypto/perlasm/x86asm.pl
@@ -80,6 +80,57 @@ sub ::movq
80 { &::generic("movq",@_); } 80 { &::generic("movq",@_); }
81} 81}
82 82
83# SSE>2 instructions
84my %regrm = ( "eax"=>0, "ecx"=>1, "edx"=>2, "ebx"=>3,
85 "esp"=>4, "ebp"=>5, "esi"=>6, "edi"=>7 );
86sub ::pextrd
87{ my($dst,$src,$imm)=@_;
88 if ("$dst:$src" =~ /(e[a-dsd][ixp]):xmm([0-7])/)
89 { &::data_byte(0x66,0x0f,0x3a,0x16,0xc0|($2<<3)|$regrm{$1},$imm); }
90 else
91 { &::generic("pextrd",@_); }
92}
93
94sub ::pinsrd
95{ my($dst,$src,$imm)=@_;
96 if ("$dst:$src" =~ /xmm([0-7]):(e[a-dsd][ixp])/)
97 { &::data_byte(0x66,0x0f,0x3a,0x22,0xc0|($1<<3)|$regrm{$2},$imm); }
98 else
99 { &::generic("pinsrd",@_); }
100}
101
102sub ::pshufb
103{ my($dst,$src)=@_;
104 if ("$dst:$src" =~ /xmm([0-7]):xmm([0-7])/)
105 { &data_byte(0x66,0x0f,0x38,0x00,0xc0|($1<<3)|$2); }
106 else
107 { &::generic("pshufb",@_); }
108}
109
110sub ::palignr
111{ my($dst,$src,$imm)=@_;
112 if ("$dst:$src" =~ /xmm([0-7]):xmm([0-7])/)
113 { &::data_byte(0x66,0x0f,0x3a,0x0f,0xc0|($1<<3)|$2,$imm); }
114 else
115 { &::generic("palignr",@_); }
116}
117
118sub ::pclmulqdq
119{ my($dst,$src,$imm)=@_;
120 if ("$dst:$src" =~ /xmm([0-7]):xmm([0-7])/)
121 { &::data_byte(0x66,0x0f,0x3a,0x44,0xc0|($1<<3)|$2,$imm); }
122 else
123 { &::generic("pclmulqdq",@_); }
124}
125
126sub ::rdrand
127{ my ($dst)=@_;
128 if ($dst =~ /(e[a-dsd][ixp])/)
129 { &::data_byte(0x0f,0xc7,0xf0|$regrm{$dst}); }
130 else
131 { &::generic("rdrand",@_); }
132}
133
83# label management 134# label management
84$lbdecor="L"; # local label decoration, set by package 135$lbdecor="L"; # local label decoration, set by package
85$label="000"; 136$label="000";
@@ -167,7 +218,7 @@ sub ::asm_init
167 $filename=$fn; 218 $filename=$fn;
168 $i386=$cpu; 219 $i386=$cpu;
169 220
170 $elf=$cpp=$coff=$aout=$macosx=$win32=$netware=$mwerks=0; 221 $elf=$cpp=$coff=$aout=$macosx=$win32=$netware=$mwerks=$android=0;
171 if (($type eq "elf")) 222 if (($type eq "elf"))
172 { $elf=1; require "x86gas.pl"; } 223 { $elf=1; require "x86gas.pl"; }
173 elsif (($type eq "a\.out")) 224 elsif (($type eq "a\.out"))
@@ -184,6 +235,8 @@ sub ::asm_init
184 { $win32=1; require "x86masm.pl"; } 235 { $win32=1; require "x86masm.pl"; }
185 elsif (($type eq "macosx")) 236 elsif (($type eq "macosx"))
186 { $aout=1; $macosx=1; require "x86gas.pl"; } 237 { $aout=1; $macosx=1; require "x86gas.pl"; }
238 elsif (($type eq "android"))
239 { $elf=1; $android=1; require "x86gas.pl"; }
187 else 240 else
188 { print STDERR <<"EOF"; 241 { print STDERR <<"EOF";
189Pick one target type from 242Pick one target type from