x86_64cpuid.S revision 325337
1/* $FreeBSD: stable/11/secure/lib/libcrypto/amd64/x86_64cpuid.S 325337 2017-11-02 18:30:41Z jkim $ */
2/* Do not modify. This file is auto-generated from x86_64cpuid.pl. */
3
4.hidden	OPENSSL_cpuid_setup
5.section	.init
6	call	OPENSSL_cpuid_setup
7
8.hidden	OPENSSL_ia32cap_P
9.comm	OPENSSL_ia32cap_P,16,4
10
11.text
12
13.globl	OPENSSL_atomic_add
14.type	OPENSSL_atomic_add,@function
15.align	16
16OPENSSL_atomic_add:
17	movl	(%rdi),%eax
18.Lspin:	leaq	(%rsi,%rax,1),%r8
19.byte	0xf0
20	cmpxchgl	%r8d,(%rdi)
21	jne	.Lspin
22	movl	%r8d,%eax
23.byte	0x48,0x98
24	.byte	0xf3,0xc3
25.size	OPENSSL_atomic_add,.-OPENSSL_atomic_add
26
27.globl	OPENSSL_rdtsc
28.type	OPENSSL_rdtsc,@function
29.align	16
30OPENSSL_rdtsc:
31	rdtsc
32	shlq	$32,%rdx
33	orq	%rdx,%rax
34	.byte	0xf3,0xc3
35.size	OPENSSL_rdtsc,.-OPENSSL_rdtsc
36
37.globl	OPENSSL_ia32_cpuid
38.type	OPENSSL_ia32_cpuid,@function
39.align	16
40OPENSSL_ia32_cpuid:
41	movq	%rbx,%r8
42
43	xorl	%eax,%eax
44	movl	%eax,8(%rdi)
45	cpuid
46	movl	%eax,%r11d
47
48	xorl	%eax,%eax
49	cmpl	$0x756e6547,%ebx
50	setne	%al
51	movl	%eax,%r9d
52	cmpl	$0x49656e69,%edx
53	setne	%al
54	orl	%eax,%r9d
55	cmpl	$0x6c65746e,%ecx
56	setne	%al
57	orl	%eax,%r9d
58	jz	.Lintel
59
60	cmpl	$0x68747541,%ebx
61	setne	%al
62	movl	%eax,%r10d
63	cmpl	$0x69746E65,%edx
64	setne	%al
65	orl	%eax,%r10d
66	cmpl	$0x444D4163,%ecx
67	setne	%al
68	orl	%eax,%r10d
69	jnz	.Lintel
70
71
72	movl	$0x80000000,%eax
73	cpuid
74	cmpl	$0x80000001,%eax
75	jb	.Lintel
76	movl	%eax,%r10d
77	movl	$0x80000001,%eax
78	cpuid
79	orl	%ecx,%r9d
80	andl	$0x00000801,%r9d
81
82	cmpl	$0x80000008,%r10d
83	jb	.Lintel
84
85	movl	$0x80000008,%eax
86	cpuid
87	movzbq	%cl,%r10
88	incq	%r10
89
90	movl	$1,%eax
91	cpuid
92	btl	$28,%edx
93	jnc	.Lgeneric
94	shrl	$16,%ebx
95	cmpb	%r10b,%bl
96	ja	.Lgeneric
97	andl	$0xefffffff,%edx
98	jmp	.Lgeneric
99
100.Lintel:
101	cmpl	$4,%r11d
102	movl	$-1,%r10d
103	jb	.Lnocacheinfo
104
105	movl	$4,%eax
106	movl	$0,%ecx
107	cpuid
108	movl	%eax,%r10d
109	shrl	$14,%r10d
110	andl	$0xfff,%r10d
111
112.Lnocacheinfo:
113	movl	$1,%eax
114	cpuid
115	andl	$0xbfefffff,%edx
116	cmpl	$0,%r9d
117	jne	.Lnotintel
118	orl	$0x40000000,%edx
119	andb	$15,%ah
120	cmpb	$15,%ah
121	jne	.LnotP4
122	orl	$0x00100000,%edx
123.LnotP4:
124	cmpb	$6,%ah
125	jne	.Lnotintel
126	andl	$0x0fff0ff0,%eax
127	cmpl	$0x00050670,%eax
128	je	.Lknights
129	cmpl	$0x00080650,%eax
130	jne	.Lnotintel
131.Lknights:
132	andl	$0xfbffffff,%ecx
133
134.Lnotintel:
135	btl	$28,%edx
136	jnc	.Lgeneric
137	andl	$0xefffffff,%edx
138	cmpl	$0,%r10d
139	je	.Lgeneric
140
141	orl	$0x10000000,%edx
142	shrl	$16,%ebx
143	cmpb	$1,%bl
144	ja	.Lgeneric
145	andl	$0xefffffff,%edx
146.Lgeneric:
147	andl	$0x00000800,%r9d
148	andl	$0xfffff7ff,%ecx
149	orl	%ecx,%r9d
150
151	movl	%edx,%r10d
152
153	cmpl	$7,%r11d
154	jb	.Lno_extended_info
155	movl	$7,%eax
156	xorl	%ecx,%ecx
157	cpuid
158	btl	$26,%r9d
159	jc	.Lnotknights
160	andl	$0xfff7ffff,%ebx
161.Lnotknights:
162	movl	%ebx,8(%rdi)
163.Lno_extended_info:
164
165	btl	$27,%r9d
166	jnc	.Lclear_avx
167	xorl	%ecx,%ecx
168.byte	0x0f,0x01,0xd0
169	andl	$6,%eax
170	cmpl	$6,%eax
171	je	.Ldone
172.Lclear_avx:
173	movl	$0xefffe7ff,%eax
174	andl	%eax,%r9d
175	andl	$0xffffffdf,8(%rdi)
176.Ldone:
177	shlq	$32,%r9
178	movl	%r10d,%eax
179	movq	%r8,%rbx
180	orq	%r9,%rax
181	.byte	0xf3,0xc3
182.size	OPENSSL_ia32_cpuid,.-OPENSSL_ia32_cpuid
183
184.globl	OPENSSL_cleanse
185.type	OPENSSL_cleanse,@function
186.align	16
187OPENSSL_cleanse:
188	xorq	%rax,%rax
189	cmpq	$15,%rsi
190	jae	.Lot
191	cmpq	$0,%rsi
192	je	.Lret
193.Little:
194	movb	%al,(%rdi)
195	subq	$1,%rsi
196	leaq	1(%rdi),%rdi
197	jnz	.Little
198.Lret:
199	.byte	0xf3,0xc3
200.align	16
201.Lot:
202	testq	$7,%rdi
203	jz	.Laligned
204	movb	%al,(%rdi)
205	leaq	-1(%rsi),%rsi
206	leaq	1(%rdi),%rdi
207	jmp	.Lot
208.Laligned:
209	movq	%rax,(%rdi)
210	leaq	-8(%rsi),%rsi
211	testq	$-8,%rsi
212	leaq	8(%rdi),%rdi
213	jnz	.Laligned
214	cmpq	$0,%rsi
215	jne	.Little
216	.byte	0xf3,0xc3
217.size	OPENSSL_cleanse,.-OPENSSL_cleanse
218.globl	OPENSSL_wipe_cpu
219.type	OPENSSL_wipe_cpu,@function
220.align	16
221OPENSSL_wipe_cpu:
222	pxor	%xmm0,%xmm0
223	pxor	%xmm1,%xmm1
224	pxor	%xmm2,%xmm2
225	pxor	%xmm3,%xmm3
226	pxor	%xmm4,%xmm4
227	pxor	%xmm5,%xmm5
228	pxor	%xmm6,%xmm6
229	pxor	%xmm7,%xmm7
230	pxor	%xmm8,%xmm8
231	pxor	%xmm9,%xmm9
232	pxor	%xmm10,%xmm10
233	pxor	%xmm11,%xmm11
234	pxor	%xmm12,%xmm12
235	pxor	%xmm13,%xmm13
236	pxor	%xmm14,%xmm14
237	pxor	%xmm15,%xmm15
238	xorq	%rcx,%rcx
239	xorq	%rdx,%rdx
240	xorq	%rsi,%rsi
241	xorq	%rdi,%rdi
242	xorq	%r8,%r8
243	xorq	%r9,%r9
244	xorq	%r10,%r10
245	xorq	%r11,%r11
246	leaq	8(%rsp),%rax
247	.byte	0xf3,0xc3
248.size	OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
249.globl	OPENSSL_ia32_rdrand
250.type	OPENSSL_ia32_rdrand,@function
251.align	16
252OPENSSL_ia32_rdrand:
253	movl	$8,%ecx
254.Loop_rdrand:
255.byte	72,15,199,240
256	jc	.Lbreak_rdrand
257	loop	.Loop_rdrand
258.Lbreak_rdrand:
259	cmpq	$0,%rax
260	cmoveq	%rcx,%rax
261	.byte	0xf3,0xc3
262.size	OPENSSL_ia32_rdrand,.-OPENSSL_ia32_rdrand
263
264.globl	OPENSSL_ia32_rdseed
265.type	OPENSSL_ia32_rdseed,@function
266.align	16
267OPENSSL_ia32_rdseed:
268	movl	$8,%ecx
269.Loop_rdseed:
270.byte	72,15,199,248
271	jc	.Lbreak_rdseed
272	loop	.Loop_rdseed
273.Lbreak_rdseed:
274	cmpq	$0,%rax
275	cmoveq	%rcx,%rax
276	.byte	0xf3,0xc3
277.size	OPENSSL_ia32_rdseed,.-OPENSSL_ia32_rdseed
278