Update files for OpenSSL-1.0.1g import.
[dragonfly.git] / secure / lib / libcrypto / asm / x86_64cpuid.s
1
2 .hidden OPENSSL_cpuid_setup
3 .section        .init
4         call    OPENSSL_cpuid_setup
5
6 .hidden OPENSSL_ia32cap_P
7 .comm   OPENSSL_ia32cap_P,8,4
8
9 .text   
10
11 .globl  OPENSSL_atomic_add
12 .type   OPENSSL_atomic_add,@function
13 .align  16
14 OPENSSL_atomic_add:
15         movl    (%rdi),%eax
16 .Lspin: leaq    (%rsi,%rax,1),%r8
17 .byte   0xf0            
18         cmpxchgl        %r8d,(%rdi)
19         jne     .Lspin
20         movl    %r8d,%eax
21 .byte   0x48,0x98       
22         .byte   0xf3,0xc3
23 .size   OPENSSL_atomic_add,.-OPENSSL_atomic_add
24
25 .globl  OPENSSL_rdtsc
26 .type   OPENSSL_rdtsc,@function
27 .align  16
28 OPENSSL_rdtsc:
29         rdtsc
30         shlq    $32,%rdx
31         orq     %rdx,%rax
32         .byte   0xf3,0xc3
33 .size   OPENSSL_rdtsc,.-OPENSSL_rdtsc
34
35 .globl  OPENSSL_ia32_cpuid
36 .type   OPENSSL_ia32_cpuid,@function
37 .align  16
38 OPENSSL_ia32_cpuid:
39         movq    %rbx,%r8
40
41         xorl    %eax,%eax
42         cpuid
43         movl    %eax,%r11d
44
45         xorl    %eax,%eax
46         cmpl    $1970169159,%ebx
47         setne   %al
48         movl    %eax,%r9d
49         cmpl    $1231384169,%edx
50         setne   %al
51         orl     %eax,%r9d
52         cmpl    $1818588270,%ecx
53         setne   %al
54         orl     %eax,%r9d
55         jz      .Lintel
56
57         cmpl    $1752462657,%ebx
58         setne   %al
59         movl    %eax,%r10d
60         cmpl    $1769238117,%edx
61         setne   %al
62         orl     %eax,%r10d
63         cmpl    $1145913699,%ecx
64         setne   %al
65         orl     %eax,%r10d
66         jnz     .Lintel
67
68
69         movl    $2147483648,%eax
70         cpuid
71         cmpl    $2147483649,%eax
72         jb      .Lintel
73         movl    %eax,%r10d
74         movl    $2147483649,%eax
75         cpuid
76         orl     %ecx,%r9d
77         andl    $2049,%r9d
78
79         cmpl    $2147483656,%r10d
80         jb      .Lintel
81
82         movl    $2147483656,%eax
83         cpuid
84         movzbq  %cl,%r10
85         incq    %r10
86
87         movl    $1,%eax
88         cpuid
89         btl     $28,%edx
90         jnc     .Lgeneric
91         shrl    $16,%ebx
92         cmpb    %r10b,%bl
93         ja      .Lgeneric
94         andl    $4026531839,%edx
95         jmp     .Lgeneric
96
97 .Lintel:
98         cmpl    $4,%r11d
99         movl    $-1,%r10d
100         jb      .Lnocacheinfo
101
102         movl    $4,%eax
103         movl    $0,%ecx
104         cpuid
105         movl    %eax,%r10d
106         shrl    $14,%r10d
107         andl    $4095,%r10d
108
109 .Lnocacheinfo:
110         movl    $1,%eax
111         cpuid
112         andl    $3220176895,%edx
113         cmpl    $0,%r9d
114         jne     .Lnotintel
115         orl     $1073741824,%edx
116         andb    $15,%ah
117         cmpb    $15,%ah
118         jne     .Lnotintel
119         orl     $1048576,%edx
120 .Lnotintel:
121         btl     $28,%edx
122         jnc     .Lgeneric
123         andl    $4026531839,%edx
124         cmpl    $0,%r10d
125         je      .Lgeneric
126
127         orl     $268435456,%edx
128         shrl    $16,%ebx
129         cmpb    $1,%bl
130         ja      .Lgeneric
131         andl    $4026531839,%edx
132 .Lgeneric:
133         andl    $2048,%r9d
134         andl    $4294965247,%ecx
135         orl     %ecx,%r9d
136
137         movl    %edx,%r10d
138         btl     $27,%r9d
139         jnc     .Lclear_avx
140         xorl    %ecx,%ecx
141 .byte   0x0f,0x01,0xd0          
142         andl    $6,%eax
143         cmpl    $6,%eax
144         je      .Ldone
145 .Lclear_avx:
146         movl    $4026525695,%eax
147         andl    %eax,%r9d
148 .Ldone:
149         shlq    $32,%r9
150         movl    %r10d,%eax
151         movq    %r8,%rbx
152         orq     %r9,%rax
153         .byte   0xf3,0xc3
154 .size   OPENSSL_ia32_cpuid,.-OPENSSL_ia32_cpuid
155
156 .globl  OPENSSL_cleanse
157 .type   OPENSSL_cleanse,@function
158 .align  16
159 OPENSSL_cleanse:
160         xorq    %rax,%rax
161         cmpq    $15,%rsi
162         jae     .Lot
163         cmpq    $0,%rsi
164         je      .Lret
165 .Little:
166         movb    %al,(%rdi)
167         subq    $1,%rsi
168         leaq    1(%rdi),%rdi
169         jnz     .Little
170 .Lret:
171         .byte   0xf3,0xc3
172 .align  16
173 .Lot:
174         testq   $7,%rdi
175         jz      .Laligned
176         movb    %al,(%rdi)
177         leaq    -1(%rsi),%rsi
178         leaq    1(%rdi),%rdi
179         jmp     .Lot
180 .Laligned:
181         movq    %rax,(%rdi)
182         leaq    -8(%rsi),%rsi
183         testq   $-8,%rsi
184         leaq    8(%rdi),%rdi
185         jnz     .Laligned
186         cmpq    $0,%rsi
187         jne     .Little
188         .byte   0xf3,0xc3
189 .size   OPENSSL_cleanse,.-OPENSSL_cleanse
190 .globl  OPENSSL_wipe_cpu
191 .type   OPENSSL_wipe_cpu,@function
192 .align  16
193 OPENSSL_wipe_cpu:
194         pxor    %xmm0,%xmm0
195         pxor    %xmm1,%xmm1
196         pxor    %xmm2,%xmm2
197         pxor    %xmm3,%xmm3
198         pxor    %xmm4,%xmm4
199         pxor    %xmm5,%xmm5
200         pxor    %xmm6,%xmm6
201         pxor    %xmm7,%xmm7
202         pxor    %xmm8,%xmm8
203         pxor    %xmm9,%xmm9
204         pxor    %xmm10,%xmm10
205         pxor    %xmm11,%xmm11
206         pxor    %xmm12,%xmm12
207         pxor    %xmm13,%xmm13
208         pxor    %xmm14,%xmm14
209         pxor    %xmm15,%xmm15
210         xorq    %rcx,%rcx
211         xorq    %rdx,%rdx
212         xorq    %rsi,%rsi
213         xorq    %rdi,%rdi
214         xorq    %r8,%r8
215         xorq    %r9,%r9
216         xorq    %r10,%r10
217         xorq    %r11,%r11
218         leaq    8(%rsp),%rax
219         .byte   0xf3,0xc3
220 .size   OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
221 .globl  OPENSSL_ia32_rdrand
222 .type   OPENSSL_ia32_rdrand,@function
223 .align  16
224 OPENSSL_ia32_rdrand:
225         movl    $8,%ecx
226 .Loop_rdrand:
227 .byte   72,15,199,240
228         jc      .Lbreak_rdrand
229         loop    .Loop_rdrand
230 .Lbreak_rdrand:
231         cmpq    $0,%rax
232         cmoveq  %rcx,%rax
233         .byte   0xf3,0xc3
234 .size   OPENSSL_ia32_rdrand,.-OPENSSL_ia32_rdrand