diff options
Diffstat (limited to '')
-rw-r--r-- | src/lib/libcrypto/perlasm/x86asm.pl | 55 |
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 | ||
84 | my %regrm = ( "eax"=>0, "ecx"=>1, "edx"=>2, "ebx"=>3, | ||
85 | "esp"=>4, "ebp"=>5, "esi"=>6, "edi"=>7 ); | ||
86 | sub ::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 | |||
94 | sub ::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 | |||
102 | sub ::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 | |||
110 | sub ::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 | |||
118 | sub ::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 | |||
126 | sub ::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"; |
189 | Pick one target type from | 242 | Pick one target type from |