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