Added Appro's SSSE3 SHA implementations
[gnutls:gnutls.git] / lib / accelerated / x86 / coff / openssl-cpuid-x86_64.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
41
42 .section        .ctors
43         .p2align        3
44         .quad   OPENSSL_cpuid_setup
45
46
47 .comm   _gnutls_x86_cpuid_s,16,4
48
49 .text   
50
51 .globl  OPENSSL_atomic_add
52 .def    OPENSSL_atomic_add;     .scl 2; .type 32;       .endef
53 .p2align        4
54 OPENSSL_atomic_add:
55         movl    (%rcx),%eax
56 .Lspin: leaq    (%rdx,%rax,1),%r8
57 .byte   0xf0            
58         cmpxchgl        %r8d,(%rcx)
59         jne     .Lspin
60         movl    %r8d,%eax
61 .byte   0x48,0x98       
62         .byte   0xf3,0xc3
63
64
65 .globl  OPENSSL_rdtsc
66 .def    OPENSSL_rdtsc;  .scl 2; .type 32;       .endef
67 .p2align        4
68 OPENSSL_rdtsc:
69         rdtsc
70         shlq    $32,%rdx
71         orq     %rdx,%rax
72         .byte   0xf3,0xc3
73
74
75 .globl  OPENSSL_ia32_cpuid
76 .def    OPENSSL_ia32_cpuid;     .scl 2; .type 32;       .endef
77 .p2align        4
78 OPENSSL_ia32_cpuid:
79         movq    %rdi,8(%rsp)
80         movq    %rsi,16(%rsp)
81         movq    %rsp,%rax
82 .LSEH_begin_OPENSSL_ia32_cpuid:
83         movq    %rcx,%rdi
84
85         movq    %rbx,%r8
86
87         xorl    %eax,%eax
88         movl    %eax,8(%rdi)
89         cpuid
90         movl    %eax,%r11d
91
92         xorl    %eax,%eax
93         cmpl    $1970169159,%ebx
94         setne   %al
95         movl    %eax,%r9d
96         cmpl    $1231384169,%edx
97         setne   %al
98         orl     %eax,%r9d
99         cmpl    $1818588270,%ecx
100         setne   %al
101         orl     %eax,%r9d
102         jz      .Lintel
103
104         cmpl    $1752462657,%ebx
105         setne   %al
106         movl    %eax,%r10d
107         cmpl    $1769238117,%edx
108         setne   %al
109         orl     %eax,%r10d
110         cmpl    $1145913699,%ecx
111         setne   %al
112         orl     %eax,%r10d
113         jnz     .Lintel
114
115
116         movl    $2147483648,%eax
117         cpuid
118         cmpl    $2147483649,%eax
119         jb      .Lintel
120         movl    %eax,%r10d
121         movl    $2147483649,%eax
122         cpuid
123         orl     %ecx,%r9d
124         andl    $2049,%r9d
125
126         cmpl    $2147483656,%r10d
127         jb      .Lintel
128
129         movl    $2147483656,%eax
130         cpuid
131         movzbq  %cl,%r10
132         incq    %r10
133
134         movl    $1,%eax
135         cpuid
136         btl     $28,%edx
137         jnc     .Lgeneric
138         shrl    $16,%ebx
139         cmpb    %r10b,%bl
140         ja      .Lgeneric
141         andl    $4026531839,%edx
142         jmp     .Lgeneric
143
144 .Lintel:
145         cmpl    $4,%r11d
146         movl    $-1,%r10d
147         jb      .Lnocacheinfo
148
149         movl    $4,%eax
150         movl    $0,%ecx
151         cpuid
152         movl    %eax,%r10d
153         shrl    $14,%r10d
154         andl    $4095,%r10d
155
156         cmpl    $7,%r11d
157         jb      .Lnocacheinfo
158
159         movl    $7,%eax
160         xorl    %ecx,%ecx
161         cpuid
162         movl    %ebx,8(%rdi)
163
164 .Lnocacheinfo:
165         movl    $1,%eax
166         cpuid
167         andl    $3220176895,%edx
168         cmpl    $0,%r9d
169         jne     .Lnotintel
170         orl     $1073741824,%edx
171         andb    $15,%ah
172         cmpb    $15,%ah
173         jne     .Lnotintel
174         orl     $1048576,%edx
175 .Lnotintel:
176         btl     $28,%edx
177         jnc     .Lgeneric
178         andl    $4026531839,%edx
179         cmpl    $0,%r10d
180         je      .Lgeneric
181
182         orl     $268435456,%edx
183         shrl    $16,%ebx
184         cmpb    $1,%bl
185         ja      .Lgeneric
186         andl    $4026531839,%edx
187 .Lgeneric:
188         andl    $2048,%r9d
189         andl    $4294965247,%ecx
190         orl     %ecx,%r9d
191
192         movl    %edx,%r10d
193         btl     $27,%r9d
194         jnc     .Lclear_avx
195         xorl    %ecx,%ecx
196 .byte   0x0f,0x01,0xd0          
197         andl    $6,%eax
198         cmpl    $6,%eax
199         je      .Ldone
200 .Lclear_avx:
201         movl    $4026525695,%eax
202         andl    %eax,%r9d
203         andl    $4294967263,8(%rdi)
204 .Ldone:
205         shlq    $32,%r9
206         movl    %r10d,%eax
207         movq    %r8,%rbx
208         orq     %r9,%rax
209         movq    8(%rsp),%rdi
210         movq    16(%rsp),%rsi
211         .byte   0xf3,0xc3
212 .LSEH_end_OPENSSL_ia32_cpuid:
213
214 .globl  OPENSSL_cleanse
215 .def    OPENSSL_cleanse;        .scl 2; .type 32;       .endef
216 .p2align        4
217 OPENSSL_cleanse:
218         xorq    %rax,%rax
219         cmpq    $15,%rdx
220         jae     .Lot
221         cmpq    $0,%rdx
222         je      .Lret
223 .Little:
224         movb    %al,(%rcx)
225         subq    $1,%rdx
226         leaq    1(%rcx),%rcx
227         jnz     .Little
228 .Lret:
229         .byte   0xf3,0xc3
230 .p2align        4
231 .Lot:
232         testq   $7,%rcx
233         jz      .Laligned
234         movb    %al,(%rcx)
235         leaq    -1(%rdx),%rdx
236         leaq    1(%rcx),%rcx
237         jmp     .Lot
238 .Laligned:
239         movq    %rax,(%rcx)
240         leaq    -8(%rdx),%rdx
241         testq   $-8,%rdx
242         leaq    8(%rcx),%rcx
243         jnz     .Laligned
244         cmpq    $0,%rdx
245         jne     .Little
246         .byte   0xf3,0xc3
247
248 .globl  OPENSSL_wipe_cpu
249 .def    OPENSSL_wipe_cpu;       .scl 2; .type 32;       .endef
250 .p2align        4
251 OPENSSL_wipe_cpu:
252         pxor    %xmm0,%xmm0
253         pxor    %xmm1,%xmm1
254         pxor    %xmm2,%xmm2
255         pxor    %xmm3,%xmm3
256         pxor    %xmm4,%xmm4
257         pxor    %xmm5,%xmm5
258         xorq    %rcx,%rcx
259         xorq    %rdx,%rdx
260         xorq    %r8,%r8
261         xorq    %r9,%r9
262         xorq    %r10,%r10
263         xorq    %r11,%r11
264         leaq    8(%rsp),%rax
265         .byte   0xf3,0xc3
266
267 .globl  OPENSSL_instrument_bus
268 .def    OPENSSL_instrument_bus; .scl 2; .type 32;       .endef
269 .p2align        4
270 OPENSSL_instrument_bus:
271         movq    %rcx,%r10
272         movq    %rdx,%rcx
273         movq    %rdx,%r11
274
275         rdtsc
276         movl    %eax,%r8d
277         movl    $0,%r9d
278         clflush (%r10)
279 .byte   0xf0            
280         addl    %r9d,(%r10)
281         jmp     .Loop
282 .p2align        4
283 .Loop:  rdtsc
284         movl    %eax,%edx
285         subl    %r8d,%eax
286         movl    %edx,%r8d
287         movl    %eax,%r9d
288         clflush (%r10)
289 .byte   0xf0            
290         addl    %eax,(%r10)
291         leaq    4(%r10),%r10
292         subq    $1,%rcx
293         jnz     .Loop
294
295         movq    %r11,%rax
296         .byte   0xf3,0xc3
297
298
299 .globl  OPENSSL_instrument_bus2
300 .def    OPENSSL_instrument_bus2;        .scl 2; .type 32;       .endef
301 .p2align        4
302 OPENSSL_instrument_bus2:
303         movq    %rcx,%r10
304         movq    %rdx,%rcx
305         movq    %r8,%r11
306         movq    %rcx,8(%rsp)
307
308         rdtsc
309         movl    %eax,%r8d
310         movl    $0,%r9d
311
312         clflush (%r10)
313 .byte   0xf0            
314         addl    %r9d,(%r10)
315
316         rdtsc
317         movl    %eax,%edx
318         subl    %r8d,%eax
319         movl    %edx,%r8d
320         movl    %eax,%r9d
321 .Loop2:
322         clflush (%r10)
323 .byte   0xf0            
324         addl    %eax,(%r10)
325
326         subq    $1,%r11
327         jz      .Ldone2
328
329         rdtsc
330         movl    %eax,%edx
331         subl    %r8d,%eax
332         movl    %edx,%r8d
333         cmpl    %r9d,%eax
334         movl    %eax,%r9d
335         movl    $0,%edx
336         setne   %dl
337         subq    %rdx,%rcx
338         leaq    (%r10,%rdx,4),%r10
339         jnz     .Loop2
340
341 .Ldone2:
342         movq    8(%rsp),%rax
343         subq    %rcx,%rax
344         .byte   0xf3,0xc3
345
346 .globl  OPENSSL_ia32_rdrand
347 .def    OPENSSL_ia32_rdrand;    .scl 2; .type 32;       .endef
348 .p2align        4
349 OPENSSL_ia32_rdrand:
350         movl    $8,%ecx
351 .Loop_rdrand:
352 .byte   72,15,199,240
353         jc      .Lbreak_rdrand
354         loop    .Loop_rdrand
355 .Lbreak_rdrand:
356         cmpq    $0,%rax
357         cmoveq  %rcx,%rax
358         .byte   0xf3,0xc3
359
360
361 .section .note.GNU-stack,"",%progbits