x86_64cpuid.S revision 325335
1/* $FreeBSD: stable/11/secure/lib/libcrypto/amd64/x86_64cpuid.S 325335 2017-11-02 18:22:53Z 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	.Lnotintel
122	orl	$0x00100000,%edx
123.Lnotintel:
124	btl	$28,%edx
125	jnc	.Lgeneric
126	andl	$0xefffffff,%edx
127	cmpl	$0,%r10d
128	je	.Lgeneric
129
130	orl	$0x10000000,%edx
131	shrl	$16,%ebx
132	cmpb	$1,%bl
133	ja	.Lgeneric
134	andl	$0xefffffff,%edx
135.Lgeneric:
136	andl	$0x00000800,%r9d
137	andl	$0xfffff7ff,%ecx
138	orl	%ecx,%r9d
139
140	movl	%edx,%r10d
141
142	cmpl	$7,%r11d
143	jb	.Lno_extended_info
144	movl	$7,%eax
145	xorl	%ecx,%ecx
146	cpuid
147	movl	%ebx,8(%rdi)
148.Lno_extended_info:
149
150	btl	$27,%r9d
151	jnc	.Lclear_avx
152	xorl	%ecx,%ecx
153.byte	0x0f,0x01,0xd0
154	andl	$6,%eax
155	cmpl	$6,%eax
156	je	.Ldone
157.Lclear_avx:
158	movl	$0xefffe7ff,%eax
159	andl	%eax,%r9d
160	andl	$0xffffffdf,8(%rdi)
161.Ldone:
162	shlq	$32,%r9
163	movl	%r10d,%eax
164	movq	%r8,%rbx
165	orq	%r9,%rax
166	.byte	0xf3,0xc3
167.size	OPENSSL_ia32_cpuid,.-OPENSSL_ia32_cpuid
168
169.globl	OPENSSL_cleanse
170.type	OPENSSL_cleanse,@function
171.align	16
172OPENSSL_cleanse:
173	xorq	%rax,%rax
174	cmpq	$15,%rsi
175	jae	.Lot
176	cmpq	$0,%rsi
177	je	.Lret
178.Little:
179	movb	%al,(%rdi)
180	subq	$1,%rsi
181	leaq	1(%rdi),%rdi
182	jnz	.Little
183.Lret:
184	.byte	0xf3,0xc3
185.align	16
186.Lot:
187	testq	$7,%rdi
188	jz	.Laligned
189	movb	%al,(%rdi)
190	leaq	-1(%rsi),%rsi
191	leaq	1(%rdi),%rdi
192	jmp	.Lot
193.Laligned:
194	movq	%rax,(%rdi)
195	leaq	-8(%rsi),%rsi
196	testq	$-8,%rsi
197	leaq	8(%rdi),%rdi
198	jnz	.Laligned
199	cmpq	$0,%rsi
200	jne	.Little
201	.byte	0xf3,0xc3
202.size	OPENSSL_cleanse,.-OPENSSL_cleanse
203.globl	OPENSSL_wipe_cpu
204.type	OPENSSL_wipe_cpu,@function
205.align	16
206OPENSSL_wipe_cpu:
207	pxor	%xmm0,%xmm0
208	pxor	%xmm1,%xmm1
209	pxor	%xmm2,%xmm2
210	pxor	%xmm3,%xmm3
211	pxor	%xmm4,%xmm4
212	pxor	%xmm5,%xmm5
213	pxor	%xmm6,%xmm6
214	pxor	%xmm7,%xmm7
215	pxor	%xmm8,%xmm8
216	pxor	%xmm9,%xmm9
217	pxor	%xmm10,%xmm10
218	pxor	%xmm11,%xmm11
219	pxor	%xmm12,%xmm12
220	pxor	%xmm13,%xmm13
221	pxor	%xmm14,%xmm14
222	pxor	%xmm15,%xmm15
223	xorq	%rcx,%rcx
224	xorq	%rdx,%rdx
225	xorq	%rsi,%rsi
226	xorq	%rdi,%rdi
227	xorq	%r8,%r8
228	xorq	%r9,%r9
229	xorq	%r10,%r10
230	xorq	%r11,%r11
231	leaq	8(%rsp),%rax
232	.byte	0xf3,0xc3
233.size	OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
234.globl	OPENSSL_ia32_rdrand
235.type	OPENSSL_ia32_rdrand,@function
236.align	16
237OPENSSL_ia32_rdrand:
238	movl	$8,%ecx
239.Loop_rdrand:
240.byte	72,15,199,240
241	jc	.Lbreak_rdrand
242	loop	.Loop_rdrand
243.Lbreak_rdrand:
244	cmpq	$0,%rax
245	cmoveq	%rcx,%rax
246	.byte	0xf3,0xc3
247.size	OPENSSL_ia32_rdrand,.-OPENSSL_ia32_rdrand
248
249.globl	OPENSSL_ia32_rdseed
250.type	OPENSSL_ia32_rdseed,@function
251.align	16
252OPENSSL_ia32_rdseed:
253	movl	$8,%ecx
254.Loop_rdseed:
255.byte	72,15,199,248
256	jc	.Lbreak_rdseed
257	loop	.Loop_rdseed
258.Lbreak_rdseed:
259	cmpq	$0,%rax
260	cmoveq	%rcx,%rax
261	.byte	0xf3,0xc3
262.size	OPENSSL_ia32_rdseed,.-OPENSSL_ia32_rdseed
263