Added Appro's SSSE3 SHA implementations
[gnutls:gnutls.git] / lib / accelerated / x86 / coff / openssl-cpuid-x86.s
1 # Copyright (c) 2011-2012, Andy Polyakov <appro@openssl.org>
2 # All rights reserved.
3 #
4 # Redistribution and use in source and binary forms, with or without
5 # modification, are permitted provided that the following conditions
6 # are met:
7
8 #     * Redistributions of source code must retain copyright notices,
9 #      this list of conditions and the following disclaimer.
10 #
11 #     * Redistributions in binary form must reproduce the above
12 #      copyright notice, this list of conditions and the following
13 #      disclaimer in the documentation and/or other materials
14 #      provided with the distribution.
15 #
16 #     * Neither the name of the Andy Polyakov nor the names of its
17 #      copyright holder and contributors may be used to endorse or
18 #      promote products derived from this software without specific
19 #      prior written permission.
20 #
21 # ALTERNATIVELY, provided that this notice is retained in full, this
22 # product may be distributed under the terms of the GNU General Public
23 # License (GPL), in which case the provisions of the GPL apply INSTEAD OF
24 # those given above.
25 #
26 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS
27 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 #
38 # *** This file is auto-generated ***
39 #
40 .file   "x86cpuid.s"
41 .text
42 .globl  _OPENSSL_ia32_cpuid
43 .def    _OPENSSL_ia32_cpuid;    .scl    2;      .type   32;     .endef
44 .align  16
45 _OPENSSL_ia32_cpuid:
46 .L_OPENSSL_ia32_cpuid_begin:
47         pushl   %ebp
48         pushl   %ebx
49         pushl   %esi
50         pushl   %edi
51         xorl    %edx,%edx
52         pushfl
53         popl    %eax
54         movl    %eax,%ecx
55         xorl    $2097152,%eax
56         pushl   %eax
57         popfl
58         pushfl
59         popl    %eax
60         xorl    %eax,%ecx
61         xorl    %eax,%eax
62         btl     $21,%ecx
63         jnc     .L000nocpuid
64         movl    20(%esp),%esi
65         movl    %eax,8(%esi)
66         .byte   0x0f,0xa2
67         movl    %eax,%edi
68         xorl    %eax,%eax
69         cmpl    $1970169159,%ebx
70         setne   %al
71         movl    %eax,%ebp
72         cmpl    $1231384169,%edx
73         setne   %al
74         orl     %eax,%ebp
75         cmpl    $1818588270,%ecx
76         setne   %al
77         orl     %eax,%ebp
78         jz      .L001intel
79         cmpl    $1752462657,%ebx
80         setne   %al
81         movl    %eax,%esi
82         cmpl    $1769238117,%edx
83         setne   %al
84         orl     %eax,%esi
85         cmpl    $1145913699,%ecx
86         setne   %al
87         orl     %eax,%esi
88         jnz     .L001intel
89         movl    $2147483648,%eax
90         .byte   0x0f,0xa2
91         cmpl    $2147483649,%eax
92         jb      .L001intel
93         movl    %eax,%esi
94         movl    $2147483649,%eax
95         .byte   0x0f,0xa2
96         orl     %ecx,%ebp
97         andl    $2049,%ebp
98         cmpl    $2147483656,%esi
99         jb      .L001intel
100         movl    $2147483656,%eax
101         .byte   0x0f,0xa2
102         movzbl  %cl,%esi
103         incl    %esi
104         movl    $1,%eax
105         xorl    %ecx,%ecx
106         .byte   0x0f,0xa2
107         btl     $28,%edx
108         jnc     .L002generic
109         shrl    $16,%ebx
110         andl    $255,%ebx
111         cmpl    %esi,%ebx
112         ja      .L002generic
113         andl    $4026531839,%edx
114         jmp     .L002generic
115 .L001intel:
116         cmpl    $7,%edi
117         jb      .L003cacheinfo
118         movl    20(%esp),%esi
119         movl    $7,%eax
120         xorl    %ecx,%ecx
121         .byte   0x0f,0xa2
122         movl    %ebx,8(%esi)
123 .L003cacheinfo:
124         cmpl    $4,%edi
125         movl    $-1,%edi
126         jb      .L004nocacheinfo
127         movl    $4,%eax
128         movl    $0,%ecx
129         .byte   0x0f,0xa2
130         movl    %eax,%edi
131         shrl    $14,%edi
132         andl    $4095,%edi
133 .L004nocacheinfo:
134         movl    $1,%eax
135         xorl    %ecx,%ecx
136         .byte   0x0f,0xa2
137         andl    $3220176895,%edx
138         cmpl    $0,%ebp
139         jne     .L005notintel
140         orl     $1073741824,%edx
141         andb    $15,%ah
142         cmpb    $15,%ah
143         jne     .L005notintel
144         orl     $1048576,%edx
145 .L005notintel:
146         btl     $28,%edx
147         jnc     .L002generic
148         andl    $4026531839,%edx
149         cmpl    $0,%edi
150         je      .L002generic
151         orl     $268435456,%edx
152         shrl    $16,%ebx
153         cmpb    $1,%bl
154         ja      .L002generic
155         andl    $4026531839,%edx
156 .L002generic:
157         andl    $2048,%ebp
158         andl    $4294965247,%ecx
159         movl    %edx,%esi
160         orl     %ecx,%ebp
161         btl     $27,%ecx
162         jnc     .L006clear_avx
163         xorl    %ecx,%ecx
164 .byte   15,1,208
165         andl    $6,%eax
166         cmpl    $6,%eax
167         je      .L007done
168         cmpl    $2,%eax
169         je      .L006clear_avx
170 .L008clear_xmm:
171         andl    $4261412861,%ebp
172         andl    $4278190079,%esi
173 .L006clear_avx:
174         andl    $4026525695,%ebp
175         movl    20(%esp),%edi
176         andl    $4294967263,8(%edi)
177 .L007done:
178         movl    %esi,%eax
179         movl    %ebp,%edx
180 .L000nocpuid:
181         popl    %edi
182         popl    %esi
183         popl    %ebx
184         popl    %ebp
185         ret
186 .globl  _OPENSSL_rdtsc
187 .def    _OPENSSL_rdtsc; .scl    2;      .type   32;     .endef
188 .align  16
189 _OPENSSL_rdtsc:
190 .L_OPENSSL_rdtsc_begin:
191         xorl    %eax,%eax
192         xorl    %edx,%edx
193         leal    __gnutls_x86_cpuid_s,%ecx
194         btl     $4,(%ecx)
195         jnc     .L009notsc
196         .byte   0x0f,0x31
197 .L009notsc:
198         ret
199 .globl  _OPENSSL_instrument_halt
200 .def    _OPENSSL_instrument_halt;       .scl    2;      .type   32;     .endef
201 .align  16
202 _OPENSSL_instrument_halt:
203 .L_OPENSSL_instrument_halt_begin:
204         leal    __gnutls_x86_cpuid_s,%ecx
205         btl     $4,(%ecx)
206         jnc     .L010nohalt
207 .long   2421723150
208         andl    $3,%eax
209         jnz     .L010nohalt
210         pushfl
211         popl    %eax
212         btl     $9,%eax
213         jnc     .L010nohalt
214         .byte   0x0f,0x31
215         pushl   %edx
216         pushl   %eax
217         hlt
218         .byte   0x0f,0x31
219         subl    (%esp),%eax
220         sbbl    4(%esp),%edx
221         addl    $8,%esp
222         ret
223 .L010nohalt:
224         xorl    %eax,%eax
225         xorl    %edx,%edx
226         ret
227 .globl  _OPENSSL_far_spin
228 .def    _OPENSSL_far_spin;      .scl    2;      .type   32;     .endef
229 .align  16
230 _OPENSSL_far_spin:
231 .L_OPENSSL_far_spin_begin:
232         pushfl
233         popl    %eax
234         btl     $9,%eax
235         jnc     .L011nospin
236         movl    4(%esp),%eax
237         movl    8(%esp),%ecx
238 .long   2430111262
239         xorl    %eax,%eax
240         movl    (%ecx),%edx
241         jmp     .L012spin
242 .align  16
243 .L012spin:
244         incl    %eax
245         cmpl    (%ecx),%edx
246         je      .L012spin
247 .long   529567888
248         ret
249 .L011nospin:
250         xorl    %eax,%eax
251         xorl    %edx,%edx
252         ret
253 .globl  _OPENSSL_wipe_cpu
254 .def    _OPENSSL_wipe_cpu;      .scl    2;      .type   32;     .endef
255 .align  16
256 _OPENSSL_wipe_cpu:
257 .L_OPENSSL_wipe_cpu_begin:
258         xorl    %eax,%eax
259         xorl    %edx,%edx
260         leal    __gnutls_x86_cpuid_s,%ecx
261         movl    (%ecx),%ecx
262         btl     $1,(%ecx)
263         jnc     .L013no_x87
264 .long   4007259865,4007259865,4007259865,4007259865,2430851995
265 .L013no_x87:
266         leal    4(%esp),%eax
267         ret
268 .globl  _OPENSSL_atomic_add
269 .def    _OPENSSL_atomic_add;    .scl    2;      .type   32;     .endef
270 .align  16
271 _OPENSSL_atomic_add:
272 .L_OPENSSL_atomic_add_begin:
273         movl    4(%esp),%edx
274         movl    8(%esp),%ecx
275         pushl   %ebx
276         nop
277         movl    (%edx),%eax
278 .L014spin:
279         leal    (%eax,%ecx,1),%ebx
280         nop
281 .long   447811568
282         jne     .L014spin
283         movl    %ebx,%eax
284         popl    %ebx
285         ret
286 .globl  _OPENSSL_indirect_call
287 .def    _OPENSSL_indirect_call; .scl    2;      .type   32;     .endef
288 .align  16
289 _OPENSSL_indirect_call:
290 .L_OPENSSL_indirect_call_begin:
291         pushl   %ebp
292         movl    %esp,%ebp
293         subl    $28,%esp
294         movl    12(%ebp),%ecx
295         movl    %ecx,(%esp)
296         movl    16(%ebp),%edx
297         movl    %edx,4(%esp)
298         movl    20(%ebp),%eax
299         movl    %eax,8(%esp)
300         movl    24(%ebp),%eax
301         movl    %eax,12(%esp)
302         movl    28(%ebp),%eax
303         movl    %eax,16(%esp)
304         movl    32(%ebp),%eax
305         movl    %eax,20(%esp)
306         movl    36(%ebp),%eax
307         movl    %eax,24(%esp)
308         call    *8(%ebp)
309         movl    %ebp,%esp
310         popl    %ebp
311         ret
312 .globl  _OPENSSL_cleanse
313 .def    _OPENSSL_cleanse;       .scl    2;      .type   32;     .endef
314 .align  16
315 _OPENSSL_cleanse:
316 .L_OPENSSL_cleanse_begin:
317         movl    4(%esp),%edx
318         movl    8(%esp),%ecx
319         xorl    %eax,%eax
320         cmpl    $7,%ecx
321         jae     .L015lot
322         cmpl    $0,%ecx
323         je      .L016ret
324 .L017little:
325         movb    %al,(%edx)
326         subl    $1,%ecx
327         leal    1(%edx),%edx
328         jnz     .L017little
329 .L016ret:
330         ret
331 .align  16
332 .L015lot:
333         testl   $3,%edx
334         jz      .L018aligned
335         movb    %al,(%edx)
336         leal    -1(%ecx),%ecx
337         leal    1(%edx),%edx
338         jmp     .L015lot
339 .L018aligned:
340         movl    %eax,(%edx)
341         leal    -4(%ecx),%ecx
342         testl   $-4,%ecx
343         leal    4(%edx),%edx
344         jnz     .L018aligned
345         cmpl    $0,%ecx
346         jne     .L017little
347         ret
348 .globl  _OPENSSL_instrument_bus
349 .def    _OPENSSL_instrument_bus;        .scl    2;      .type   32;     .endef
350 .align  16
351 _OPENSSL_instrument_bus:
352 .L_OPENSSL_instrument_bus_begin:
353         pushl   %ebp
354         pushl   %ebx
355         pushl   %esi
356         pushl   %edi
357         movl    $0,%eax
358         popl    %edi
359         popl    %esi
360         popl    %ebx
361         popl    %ebp
362         ret
363 .globl  _OPENSSL_instrument_bus2
364 .def    _OPENSSL_instrument_bus2;       .scl    2;      .type   32;     .endef
365 .align  16
366 _OPENSSL_instrument_bus2:
367 .L_OPENSSL_instrument_bus2_begin:
368         pushl   %ebp
369         pushl   %ebx
370         pushl   %esi
371         pushl   %edi
372         movl    $0,%eax
373         popl    %edi
374         popl    %esi
375         popl    %ebx
376         popl    %ebp
377         ret
378 .globl  _OPENSSL_ia32_rdrand
379 .def    _OPENSSL_ia32_rdrand;   .scl    2;      .type   32;     .endef
380 .align  16
381 _OPENSSL_ia32_rdrand:
382 .L_OPENSSL_ia32_rdrand_begin:
383         movl    $8,%ecx
384 .L019loop:
385 .byte   15,199,240
386         jc      .L020break
387         loop    .L019loop
388 .L020break:
389         cmpl    $0,%eax
390         cmovel  %ecx,%eax
391         ret
392 .comm   __gnutls_x86_cpuid_s,16
393 .section        .ctors
394 .long   _OPENSSL_cpuid_setup
395
396 .section .note.GNU-stack,"",%progbits