xref: /freebsd/sys/crypto/openssl/amd64/x86_64cpuid.S (revision 4757b351ea9d59d71d4a38b82506d2d16fcd560d)
1/* Do not modify. This file is auto-generated from x86_64cpuid.pl. */
2
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,40,4
10.text
11
12.globl	OPENSSL_atomic_add
13.type	OPENSSL_atomic_add,@function
14.align	16
15OPENSSL_atomic_add:
16.cfi_startproc
17.byte	243,15,30,250
18	movl	(%rdi),%eax
19.Lspin:	leaq	(%rsi,%rax,1),%r8
20.byte	0xf0
21	cmpxchgl	%r8d,(%rdi)
22	jne	.Lspin
23	movl	%r8d,%eax
24.byte	0x48,0x98
25	.byte	0xf3,0xc3
26.cfi_endproc
27.size	OPENSSL_atomic_add,.-OPENSSL_atomic_add
28
29.globl	OPENSSL_rdtsc
30.type	OPENSSL_rdtsc,@function
31.align	16
32OPENSSL_rdtsc:
33.cfi_startproc
34.byte	243,15,30,250
35	rdtsc
36	shlq	$32,%rdx
37	orq	%rdx,%rax
38	.byte	0xf3,0xc3
39.cfi_endproc
40.size	OPENSSL_rdtsc,.-OPENSSL_rdtsc
41
42.globl	OPENSSL_ia32_cpuid
43.type	OPENSSL_ia32_cpuid,@function
44.align	16
45OPENSSL_ia32_cpuid:
46.cfi_startproc
47.byte	243,15,30,250
48	movq	%rbx,%r8
49.cfi_register	%rbx,%r8
50
51	xorl	%eax,%eax
52	movq	%rax,8(%rdi)
53	cpuid
54	movl	%eax,%r11d
55
56	xorl	%eax,%eax
57	cmpl	$0x756e6547,%ebx
58	setne	%al
59	movl	%eax,%r9d
60	cmpl	$0x49656e69,%edx
61	setne	%al
62	orl	%eax,%r9d
63	cmpl	$0x6c65746e,%ecx
64	setne	%al
65	orl	%eax,%r9d
66	jz	.Lintel
67
68	cmpl	$0x68747541,%ebx
69	setne	%al
70	movl	%eax,%r10d
71	cmpl	$0x69746E65,%edx
72	setne	%al
73	orl	%eax,%r10d
74	cmpl	$0x444D4163,%ecx
75	setne	%al
76	orl	%eax,%r10d
77	jnz	.Lintel
78
79
80	movl	$0x80000000,%eax
81	cpuid
82	cmpl	$0x80000001,%eax
83	jb	.Lintel
84	movl	%eax,%r10d
85	movl	$0x80000001,%eax
86	cpuid
87	orl	%ecx,%r9d
88	andl	$0x00000801,%r9d
89
90	cmpl	$0x80000008,%r10d
91	jb	.Lintel
92
93	movl	$0x80000008,%eax
94	cpuid
95	movzbq	%cl,%r10
96	incq	%r10
97
98	movl	$1,%eax
99	cpuid
100	btl	$28,%edx
101	jnc	.Lgeneric
102	shrl	$16,%ebx
103	cmpb	%r10b,%bl
104	ja	.Lgeneric
105	andl	$0xefffffff,%edx
106	jmp	.Lgeneric
107
108.Lintel:
109	cmpl	$4,%r11d
110	movl	$-1,%r10d
111	jb	.Lnocacheinfo
112
113	movl	$4,%eax
114	movl	$0,%ecx
115	cpuid
116	movl	%eax,%r10d
117	shrl	$14,%r10d
118	andl	$0xfff,%r10d
119
120.Lnocacheinfo:
121	movl	$1,%eax
122	cpuid
123	movd	%eax,%xmm0
124	andl	$0xbfefffff,%edx
125	cmpl	$0,%r9d
126	jne	.Lnotintel
127	orl	$0x40000000,%edx
128	andb	$15,%ah
129	cmpb	$15,%ah
130	jne	.LnotP4
131	orl	$0x00100000,%edx
132.LnotP4:
133	cmpb	$6,%ah
134	jne	.Lnotintel
135	andl	$0x0fff0ff0,%eax
136	cmpl	$0x00050670,%eax
137	je	.Lknights
138	cmpl	$0x00080650,%eax
139	jne	.Lnotintel
140.Lknights:
141	andl	$0xfbffffff,%ecx
142
143.Lnotintel:
144	btl	$28,%edx
145	jnc	.Lgeneric
146	andl	$0xefffffff,%edx
147	cmpl	$0,%r10d
148	je	.Lgeneric
149
150	orl	$0x10000000,%edx
151	shrl	$16,%ebx
152	cmpb	$1,%bl
153	ja	.Lgeneric
154	andl	$0xefffffff,%edx
155.Lgeneric:
156	andl	$0x00000800,%r9d
157	andl	$0xfffff7ff,%ecx
158	orl	%ecx,%r9d
159
160	movl	%edx,%r10d
161
162	cmpl	$7,%r11d
163	jb	.Lno_extended_info
164	movl	$7,%eax
165	xorl	%ecx,%ecx
166	cpuid
167	movd	%eax,%xmm1
168	btl	$26,%r9d
169	jc	.Lnotknights
170	andl	$0xfff7ffff,%ebx
171.Lnotknights:
172	movd	%xmm0,%eax
173	andl	$0x0fff0ff0,%eax
174	cmpl	$0x00050650,%eax
175	jne	.Lnotskylakex
176	andl	$0xfffeffff,%ebx
177
178
179.Lnotskylakex:
180	movl	%ebx,8(%rdi)
181	movl	%ecx,12(%rdi)
182	movl	%edx,16(%rdi)
183
184	movd	%xmm1,%eax
185	cmpl	$0x1,%eax
186	jb	.Lno_extended_info
187	movl	$0x7,%eax
188	movl	$0x1,%ecx
189	cpuid
190	movl	%eax,20(%rdi)
191	movl	%edx,24(%rdi)
192	movl	%ebx,28(%rdi)
193	movl	%ecx,32(%rdi)
194
195	andl	$0x80000,%edx
196	cmpl	$0x0,%edx
197	je	.Lno_extended_info
198	movl	$0x24,%eax
199	movl	$0x0,%ecx
200	cpuid
201	movl	%ebx,36(%rdi)
202
203.Lno_extended_info:
204
205	btl	$27,%r9d
206	jnc	.Lclear_avx
207	xorl	%ecx,%ecx
208.byte	0x0f,0x01,0xd0
209	andl	$0xe6,%eax
210	cmpl	$0xe6,%eax
211	je	.Ldone
212	andl	$0x3fdeffff,8(%rdi)
213
214
215
216
217	andl	$6,%eax
218	cmpl	$6,%eax
219	je	.Ldone
220.Lclear_avx:
221	andl	$0xff7fffff,20(%rdi)
222
223
224	movl	$0xefffe7ff,%eax
225	andl	%eax,%r9d
226	movl	$0x3fdeffdf,%eax
227	andl	%eax,8(%rdi)
228.Ldone:
229	shlq	$32,%r9
230	movl	%r10d,%eax
231	movq	%r8,%rbx
232.cfi_restore	%rbx
233	orq	%r9,%rax
234	.byte	0xf3,0xc3
235.cfi_endproc
236.size	OPENSSL_ia32_cpuid,.-OPENSSL_ia32_cpuid
237
238.globl	OPENSSL_cleanse
239.type	OPENSSL_cleanse,@function
240.align	16
241OPENSSL_cleanse:
242.cfi_startproc
243.byte	243,15,30,250
244	xorq	%rax,%rax
245	cmpq	$15,%rsi
246	jae	.Lot
247	cmpq	$0,%rsi
248	je	.Lret
249.Little:
250	movb	%al,(%rdi)
251	subq	$1,%rsi
252	leaq	1(%rdi),%rdi
253	jnz	.Little
254.Lret:
255	.byte	0xf3,0xc3
256.align	16
257.Lot:
258	testq	$7,%rdi
259	jz	.Laligned
260	movb	%al,(%rdi)
261	leaq	-1(%rsi),%rsi
262	leaq	1(%rdi),%rdi
263	jmp	.Lot
264.Laligned:
265	movq	%rax,(%rdi)
266	leaq	-8(%rsi),%rsi
267	testq	$-8,%rsi
268	leaq	8(%rdi),%rdi
269	jnz	.Laligned
270	cmpq	$0,%rsi
271	jne	.Little
272	.byte	0xf3,0xc3
273.cfi_endproc
274.size	OPENSSL_cleanse,.-OPENSSL_cleanse
275
276.globl	CRYPTO_memcmp
277.type	CRYPTO_memcmp,@function
278.align	16
279CRYPTO_memcmp:
280.cfi_startproc
281.byte	243,15,30,250
282	xorq	%rax,%rax
283	xorq	%r10,%r10
284	cmpq	$0,%rdx
285	je	.Lno_data
286	cmpq	$16,%rdx
287	jne	.Loop_cmp
288	movq	(%rdi),%r10
289	movq	8(%rdi),%r11
290	movq	$1,%rdx
291	xorq	(%rsi),%r10
292	xorq	8(%rsi),%r11
293	orq	%r11,%r10
294	cmovnzq	%rdx,%rax
295	.byte	0xf3,0xc3
296
297.align	16
298.Loop_cmp:
299	movb	(%rdi),%r10b
300	leaq	1(%rdi),%rdi
301	xorb	(%rsi),%r10b
302	leaq	1(%rsi),%rsi
303	orb	%r10b,%al
304	decq	%rdx
305	jnz	.Loop_cmp
306	negq	%rax
307	shrq	$63,%rax
308.Lno_data:
309	.byte	0xf3,0xc3
310.cfi_endproc
311.size	CRYPTO_memcmp,.-CRYPTO_memcmp
312.globl	OPENSSL_wipe_cpu
313.type	OPENSSL_wipe_cpu,@function
314.align	16
315OPENSSL_wipe_cpu:
316.cfi_startproc
317.byte	243,15,30,250
318	pxor	%xmm0,%xmm0
319	pxor	%xmm1,%xmm1
320	pxor	%xmm2,%xmm2
321	pxor	%xmm3,%xmm3
322	pxor	%xmm4,%xmm4
323	pxor	%xmm5,%xmm5
324	pxor	%xmm6,%xmm6
325	pxor	%xmm7,%xmm7
326	pxor	%xmm8,%xmm8
327	pxor	%xmm9,%xmm9
328	pxor	%xmm10,%xmm10
329	pxor	%xmm11,%xmm11
330	pxor	%xmm12,%xmm12
331	pxor	%xmm13,%xmm13
332	pxor	%xmm14,%xmm14
333	pxor	%xmm15,%xmm15
334	xorq	%rcx,%rcx
335	xorq	%rdx,%rdx
336	xorq	%rsi,%rsi
337	xorq	%rdi,%rdi
338	xorq	%r8,%r8
339	xorq	%r9,%r9
340	xorq	%r10,%r10
341	xorq	%r11,%r11
342	leaq	8(%rsp),%rax
343	.byte	0xf3,0xc3
344.cfi_endproc
345.size	OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
346.globl	OPENSSL_instrument_bus
347.type	OPENSSL_instrument_bus,@function
348.align	16
349OPENSSL_instrument_bus:
350.cfi_startproc
351.byte	243,15,30,250
352	movq	%rdi,%r10
353	movq	%rsi,%rcx
354	movq	%rsi,%r11
355
356	rdtsc
357	movl	%eax,%r8d
358	movl	$0,%r9d
359	clflush	(%r10)
360.byte	0xf0
361	addl	%r9d,(%r10)
362	jmp	.Loop
363.align	16
364.Loop:	rdtsc
365	movl	%eax,%edx
366	subl	%r8d,%eax
367	movl	%edx,%r8d
368	movl	%eax,%r9d
369	clflush	(%r10)
370.byte	0xf0
371	addl	%eax,(%r10)
372	leaq	4(%r10),%r10
373	subq	$1,%rcx
374	jnz	.Loop
375
376	movq	%r11,%rax
377	.byte	0xf3,0xc3
378.cfi_endproc
379.size	OPENSSL_instrument_bus,.-OPENSSL_instrument_bus
380
381.globl	OPENSSL_instrument_bus2
382.type	OPENSSL_instrument_bus2,@function
383.align	16
384OPENSSL_instrument_bus2:
385.cfi_startproc
386.byte	243,15,30,250
387	movq	%rdi,%r10
388	movq	%rsi,%rcx
389	movq	%rdx,%r11
390	movq	%rcx,8(%rsp)
391
392	rdtsc
393	movl	%eax,%r8d
394	movl	$0,%r9d
395
396	clflush	(%r10)
397.byte	0xf0
398	addl	%r9d,(%r10)
399
400	rdtsc
401	movl	%eax,%edx
402	subl	%r8d,%eax
403	movl	%edx,%r8d
404	movl	%eax,%r9d
405.Loop2:
406	clflush	(%r10)
407.byte	0xf0
408	addl	%eax,(%r10)
409
410	subq	$1,%r11
411	jz	.Ldone2
412
413	rdtsc
414	movl	%eax,%edx
415	subl	%r8d,%eax
416	movl	%edx,%r8d
417	cmpl	%r9d,%eax
418	movl	%eax,%r9d
419	movl	$0,%edx
420	setne	%dl
421	subq	%rdx,%rcx
422	leaq	(%r10,%rdx,4),%r10
423	jnz	.Loop2
424
425.Ldone2:
426	movq	8(%rsp),%rax
427	subq	%rcx,%rax
428	.byte	0xf3,0xc3
429.cfi_endproc
430.size	OPENSSL_instrument_bus2,.-OPENSSL_instrument_bus2
431.globl	OPENSSL_ia32_rdrand_bytes
432.type	OPENSSL_ia32_rdrand_bytes,@function
433.align	16
434OPENSSL_ia32_rdrand_bytes:
435.cfi_startproc
436.byte	243,15,30,250
437	xorq	%rax,%rax
438	cmpq	$0,%rsi
439	je	.Ldone_rdrand_bytes
440
441	movq	$8,%r11
442.Loop_rdrand_bytes:
443.byte	73,15,199,242
444	jc	.Lbreak_rdrand_bytes
445	decq	%r11
446	jnz	.Loop_rdrand_bytes
447	jmp	.Ldone_rdrand_bytes
448
449.align	16
450.Lbreak_rdrand_bytes:
451	cmpq	$8,%rsi
452	jb	.Ltail_rdrand_bytes
453	movq	%r10,(%rdi)
454	leaq	8(%rdi),%rdi
455	addq	$8,%rax
456	subq	$8,%rsi
457	jz	.Ldone_rdrand_bytes
458	movq	$8,%r11
459	jmp	.Loop_rdrand_bytes
460
461.align	16
462.Ltail_rdrand_bytes:
463	movb	%r10b,(%rdi)
464	leaq	1(%rdi),%rdi
465	incq	%rax
466	shrq	$8,%r10
467	decq	%rsi
468	jnz	.Ltail_rdrand_bytes
469
470.Ldone_rdrand_bytes:
471	xorq	%r10,%r10
472	.byte	0xf3,0xc3
473.cfi_endproc
474.size	OPENSSL_ia32_rdrand_bytes,.-OPENSSL_ia32_rdrand_bytes
475.globl	OPENSSL_ia32_rdseed_bytes
476.type	OPENSSL_ia32_rdseed_bytes,@function
477.align	16
478OPENSSL_ia32_rdseed_bytes:
479.cfi_startproc
480.byte	243,15,30,250
481	xorq	%rax,%rax
482	cmpq	$0,%rsi
483	je	.Ldone_rdseed_bytes
484
485	movq	$8,%r11
486.Loop_rdseed_bytes:
487.byte	73,15,199,250
488	jc	.Lbreak_rdseed_bytes
489	decq	%r11
490	jnz	.Loop_rdseed_bytes
491	jmp	.Ldone_rdseed_bytes
492
493.align	16
494.Lbreak_rdseed_bytes:
495	cmpq	$8,%rsi
496	jb	.Ltail_rdseed_bytes
497	movq	%r10,(%rdi)
498	leaq	8(%rdi),%rdi
499	addq	$8,%rax
500	subq	$8,%rsi
501	jz	.Ldone_rdseed_bytes
502	movq	$8,%r11
503	jmp	.Loop_rdseed_bytes
504
505.align	16
506.Ltail_rdseed_bytes:
507	movb	%r10b,(%rdi)
508	leaq	1(%rdi),%rdi
509	incq	%rax
510	shrq	$8,%r10
511	decq	%rsi
512	jnz	.Ltail_rdseed_bytes
513
514.Ldone_rdseed_bytes:
515	xorq	%r10,%r10
516	.byte	0xf3,0xc3
517.cfi_endproc
518.size	OPENSSL_ia32_rdseed_bytes,.-OPENSSL_ia32_rdseed_bytes
519	.section ".note.gnu.property", "a"
520	.p2align 3
521	.long 1f - 0f
522	.long 4f - 1f
523	.long 5
5240:
525	# "GNU" encoded with .byte, since .asciz isn't supported
526	# on Solaris.
527	.byte 0x47
528	.byte 0x4e
529	.byte 0x55
530	.byte 0
5311:
532	.p2align 3
533	.long 0xc0000002
534	.long 3f - 2f
5352:
536	.long 3
5373:
538	.p2align 3
5394:
540