OLD | NEW |
| (Empty) |
1 %ifidn __OUTPUT_FORMAT__,obj | |
2 section code use32 class=code align=64 | |
3 %elifidn __OUTPUT_FORMAT__,win32 | |
4 %ifdef __YASM_VERSION_ID__ | |
5 %if __YASM_VERSION_ID__ < 01010000h | |
6 %error yasm version 1.1.0 or later needed. | |
7 %endif | |
8 ; Yasm automatically includes .00 and complains about redefining it. | |
9 ; https://www.tortall.net/projects/yasm/manual/html/objfmt-win32-safeseh.html | |
10 %else | |
11 $@feat.00 equ 1 | |
12 %endif | |
13 section .text code align=64 | |
14 %else | |
15 section .text code | |
16 %endif | |
17 global _OPENSSL_ia32_cpuid | |
18 align 16 | |
19 _OPENSSL_ia32_cpuid: | |
20 L$_OPENSSL_ia32_cpuid_begin: | |
21 push ebp | |
22 push ebx | |
23 push esi | |
24 push edi | |
25 xor edx,edx | |
26 pushfd | |
27 pop eax | |
28 mov ecx,eax | |
29 xor eax,2097152 | |
30 push eax | |
31 popfd | |
32 pushfd | |
33 pop eax | |
34 xor ecx,eax | |
35 xor eax,eax | |
36 bt ecx,21 | |
37 jnc NEAR L$000nocpuid | |
38 mov esi,DWORD [20+esp] | |
39 mov DWORD [8+esi],eax | |
40 cpuid | |
41 mov edi,eax | |
42 xor eax,eax | |
43 cmp ebx,1970169159 | |
44 setne al | |
45 mov ebp,eax | |
46 cmp edx,1231384169 | |
47 setne al | |
48 or ebp,eax | |
49 cmp ecx,1818588270 | |
50 setne al | |
51 or ebp,eax | |
52 jz NEAR L$001intel | |
53 cmp ebx,1752462657 | |
54 setne al | |
55 mov esi,eax | |
56 cmp edx,1769238117 | |
57 setne al | |
58 or esi,eax | |
59 cmp ecx,1145913699 | |
60 setne al | |
61 or esi,eax | |
62 jnz NEAR L$001intel | |
63 mov eax,2147483648 | |
64 cpuid | |
65 cmp eax,2147483649 | |
66 jb NEAR L$001intel | |
67 mov esi,eax | |
68 mov eax,2147483649 | |
69 cpuid | |
70 or ebp,ecx | |
71 and ebp,2049 | |
72 cmp esi,2147483656 | |
73 jb NEAR L$001intel | |
74 mov eax,2147483656 | |
75 cpuid | |
76 movzx esi,cl | |
77 inc esi | |
78 mov eax,1 | |
79 xor ecx,ecx | |
80 cpuid | |
81 bt edx,28 | |
82 jnc NEAR L$002generic | |
83 shr ebx,16 | |
84 and ebx,255 | |
85 cmp ebx,esi | |
86 ja NEAR L$002generic | |
87 and edx,4026531839 | |
88 jmp NEAR L$002generic | |
89 L$001intel: | |
90 cmp edi,7 | |
91 jb NEAR L$003cacheinfo | |
92 mov esi,DWORD [20+esp] | |
93 mov eax,7 | |
94 xor ecx,ecx | |
95 cpuid | |
96 mov DWORD [8+esi],ebx | |
97 L$003cacheinfo: | |
98 cmp edi,4 | |
99 mov edi,-1 | |
100 jb NEAR L$004nocacheinfo | |
101 mov eax,4 | |
102 mov ecx,0 | |
103 cpuid | |
104 mov edi,eax | |
105 shr edi,14 | |
106 and edi,4095 | |
107 L$004nocacheinfo: | |
108 mov eax,1 | |
109 xor ecx,ecx | |
110 cpuid | |
111 and edx,3220176895 | |
112 cmp ebp,0 | |
113 jne NEAR L$005notintel | |
114 or edx,1073741824 | |
115 L$005notintel: | |
116 bt edx,28 | |
117 jnc NEAR L$002generic | |
118 and edx,4026531839 | |
119 cmp edi,0 | |
120 je NEAR L$002generic | |
121 or edx,268435456 | |
122 shr ebx,16 | |
123 cmp bl,1 | |
124 ja NEAR L$002generic | |
125 and edx,4026531839 | |
126 L$002generic: | |
127 and ebp,2048 | |
128 and ecx,4294965247 | |
129 mov esi,edx | |
130 or ebp,ecx | |
131 bt ecx,27 | |
132 jnc NEAR L$006clear_avx | |
133 xor ecx,ecx | |
134 db 15,1,208 | |
135 and eax,6 | |
136 cmp eax,6 | |
137 je NEAR L$007done | |
138 cmp eax,2 | |
139 je NEAR L$006clear_avx | |
140 L$008clear_xmm: | |
141 and ebp,4261412861 | |
142 and esi,4278190079 | |
143 L$006clear_avx: | |
144 and ebp,4026525695 | |
145 mov edi,DWORD [20+esp] | |
146 and DWORD [8+edi],4294967263 | |
147 L$007done: | |
148 mov eax,esi | |
149 mov edx,ebp | |
150 L$000nocpuid: | |
151 pop edi | |
152 pop esi | |
153 pop ebx | |
154 pop ebp | |
155 ret | |
156 ;extern _OPENSSL_ia32cap_P | |
157 global _OPENSSL_rdtsc | |
158 align 16 | |
159 _OPENSSL_rdtsc: | |
160 L$_OPENSSL_rdtsc_begin: | |
161 xor eax,eax | |
162 xor edx,edx | |
163 lea ecx,[_OPENSSL_ia32cap_P] | |
164 bt DWORD [ecx],4 | |
165 jnc NEAR L$009notsc | |
166 rdtsc | |
167 L$009notsc: | |
168 ret | |
169 global _OPENSSL_instrument_halt | |
170 align 16 | |
171 _OPENSSL_instrument_halt: | |
172 L$_OPENSSL_instrument_halt_begin: | |
173 lea ecx,[_OPENSSL_ia32cap_P] | |
174 bt DWORD [ecx],4 | |
175 jnc NEAR L$010nohalt | |
176 dd 2421723150 | |
177 and eax,3 | |
178 jnz NEAR L$010nohalt | |
179 pushfd | |
180 pop eax | |
181 bt eax,9 | |
182 jnc NEAR L$010nohalt | |
183 rdtsc | |
184 push edx | |
185 push eax | |
186 hlt | |
187 rdtsc | |
188 sub eax,DWORD [esp] | |
189 sbb edx,DWORD [4+esp] | |
190 add esp,8 | |
191 ret | |
192 L$010nohalt: | |
193 xor eax,eax | |
194 xor edx,edx | |
195 ret | |
196 global _OPENSSL_far_spin | |
197 align 16 | |
198 _OPENSSL_far_spin: | |
199 L$_OPENSSL_far_spin_begin: | |
200 pushfd | |
201 pop eax | |
202 bt eax,9 | |
203 jnc NEAR L$011nospin | |
204 mov eax,DWORD [4+esp] | |
205 mov ecx,DWORD [8+esp] | |
206 dd 2430111262 | |
207 xor eax,eax | |
208 mov edx,DWORD [ecx] | |
209 jmp NEAR L$012spin | |
210 align 16 | |
211 L$012spin: | |
212 inc eax | |
213 cmp edx,DWORD [ecx] | |
214 je NEAR L$012spin | |
215 dd 529567888 | |
216 ret | |
217 L$011nospin: | |
218 xor eax,eax | |
219 xor edx,edx | |
220 ret | |
221 global _OPENSSL_wipe_cpu | |
222 align 16 | |
223 _OPENSSL_wipe_cpu: | |
224 L$_OPENSSL_wipe_cpu_begin: | |
225 xor eax,eax | |
226 xor edx,edx | |
227 lea ecx,[_OPENSSL_ia32cap_P] | |
228 mov ecx,DWORD [ecx] | |
229 bt DWORD [ecx],1 | |
230 jnc NEAR L$013no_x87 | |
231 and ecx,83886080 | |
232 cmp ecx,83886080 | |
233 jne NEAR L$014no_sse2 | |
234 pxor xmm0,xmm0 | |
235 pxor xmm1,xmm1 | |
236 pxor xmm2,xmm2 | |
237 pxor xmm3,xmm3 | |
238 pxor xmm4,xmm4 | |
239 pxor xmm5,xmm5 | |
240 pxor xmm6,xmm6 | |
241 pxor xmm7,xmm7 | |
242 L$014no_sse2: | |
243 dd 4007259865,4007259865,4007259865,4007259865,2430851995 | |
244 L$013no_x87: | |
245 lea eax,[4+esp] | |
246 ret | |
247 global _OPENSSL_atomic_add | |
248 align 16 | |
249 _OPENSSL_atomic_add: | |
250 L$_OPENSSL_atomic_add_begin: | |
251 mov edx,DWORD [4+esp] | |
252 mov ecx,DWORD [8+esp] | |
253 push ebx | |
254 nop | |
255 mov eax,DWORD [edx] | |
256 L$015spin: | |
257 lea ebx,[ecx*1+eax] | |
258 nop | |
259 dd 447811568 | |
260 jne NEAR L$015spin | |
261 mov eax,ebx | |
262 pop ebx | |
263 ret | |
264 global _OPENSSL_indirect_call | |
265 align 16 | |
266 _OPENSSL_indirect_call: | |
267 L$_OPENSSL_indirect_call_begin: | |
268 push ebp | |
269 mov ebp,esp | |
270 sub esp,28 | |
271 mov ecx,DWORD [12+ebp] | |
272 mov DWORD [esp],ecx | |
273 mov edx,DWORD [16+ebp] | |
274 mov DWORD [4+esp],edx | |
275 mov eax,DWORD [20+ebp] | |
276 mov DWORD [8+esp],eax | |
277 mov eax,DWORD [24+ebp] | |
278 mov DWORD [12+esp],eax | |
279 mov eax,DWORD [28+ebp] | |
280 mov DWORD [16+esp],eax | |
281 mov eax,DWORD [32+ebp] | |
282 mov DWORD [20+esp],eax | |
283 mov eax,DWORD [36+ebp] | |
284 mov DWORD [24+esp],eax | |
285 call DWORD [8+ebp] | |
286 mov esp,ebp | |
287 pop ebp | |
288 ret | |
289 global _OPENSSL_ia32_rdrand | |
290 align 16 | |
291 _OPENSSL_ia32_rdrand: | |
292 L$_OPENSSL_ia32_rdrand_begin: | |
293 mov ecx,8 | |
294 L$016loop: | |
295 db 15,199,240 | |
296 jc NEAR L$017break | |
297 loop L$016loop | |
298 L$017break: | |
299 cmp eax,0 | |
300 cmove eax,ecx | |
301 ret | |
302 segment .bss | |
303 common _OPENSSL_ia32cap_P 16 | |
OLD | NEW |