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