1#if defined(__i386__)
2.file	"crypto/cpu-x86-asm.S"
3.text
4.globl	OPENSSL_ia32_cpuid
5.hidden	OPENSSL_ia32_cpuid
6.type	OPENSSL_ia32_cpuid,@function
7.align	16
8OPENSSL_ia32_cpuid:
9.L_OPENSSL_ia32_cpuid_begin:
10	pushl	%ebp
11	pushl	%ebx
12	pushl	%esi
13	pushl	%edi
14	xorl	%edx,%edx
15	pushfl
16	popl	%eax
17	movl	%eax,%ecx
18	xorl	$2097152,%eax
19	pushl	%eax
20	popfl
21	pushfl
22	popl	%eax
23	xorl	%eax,%ecx
24	xorl	%eax,%eax
25	btl	$21,%ecx
26	jnc	.L000nocpuid
27	movl	20(%esp),%esi
28	movl	%eax,8(%esi)
29	.byte	0x0f,0xa2
30	movl	%eax,%edi
31	xorl	%eax,%eax
32	cmpl	$1970169159,%ebx
33	setne	%al
34	movl	%eax,%ebp
35	cmpl	$1231384169,%edx
36	setne	%al
37	orl	%eax,%ebp
38	cmpl	$1818588270,%ecx
39	setne	%al
40	orl	%eax,%ebp
41	jz	.L001intel
42	cmpl	$1752462657,%ebx
43	setne	%al
44	movl	%eax,%esi
45	cmpl	$1769238117,%edx
46	setne	%al
47	orl	%eax,%esi
48	cmpl	$1145913699,%ecx
49	setne	%al
50	orl	%eax,%esi
51	jnz	.L001intel
52	movl	$2147483648,%eax
53	.byte	0x0f,0xa2
54	cmpl	$2147483649,%eax
55	jb	.L001intel
56	movl	%eax,%esi
57	movl	$2147483649,%eax
58	.byte	0x0f,0xa2
59	orl	%ecx,%ebp
60	andl	$2049,%ebp
61	cmpl	$2147483656,%esi
62	jb	.L001intel
63	movl	$2147483656,%eax
64	.byte	0x0f,0xa2
65	movzbl	%cl,%esi
66	incl	%esi
67	movl	$1,%eax
68	xorl	%ecx,%ecx
69	.byte	0x0f,0xa2
70	btl	$28,%edx
71	jnc	.L002generic
72	shrl	$16,%ebx
73	andl	$255,%ebx
74	cmpl	%esi,%ebx
75	ja	.L002generic
76	andl	$4026531839,%edx
77	jmp	.L002generic
78.L001intel:
79	cmpl	$7,%edi
80	jb	.L003cacheinfo
81	movl	20(%esp),%esi
82	movl	$7,%eax
83	xorl	%ecx,%ecx
84	.byte	0x0f,0xa2
85	movl	%ebx,8(%esi)
86.L003cacheinfo:
87	cmpl	$4,%edi
88	movl	$-1,%edi
89	jb	.L004nocacheinfo
90	movl	$4,%eax
91	movl	$0,%ecx
92	.byte	0x0f,0xa2
93	movl	%eax,%edi
94	shrl	$14,%edi
95	andl	$4095,%edi
96.L004nocacheinfo:
97	movl	$1,%eax
98	xorl	%ecx,%ecx
99	.byte	0x0f,0xa2
100	andl	$3220176895,%edx
101	cmpl	$0,%ebp
102	jne	.L005notintel
103	orl	$1073741824,%edx
104	andb	$15,%ah
105	cmpb	$15,%ah
106	jne	.L005notintel
107	orl	$1048576,%edx
108.L005notintel:
109	btl	$28,%edx
110	jnc	.L002generic
111	andl	$4026531839,%edx
112	cmpl	$0,%edi
113	je	.L002generic
114	orl	$268435456,%edx
115	shrl	$16,%ebx
116	cmpb	$1,%bl
117	ja	.L002generic
118	andl	$4026531839,%edx
119.L002generic:
120	andl	$2048,%ebp
121	andl	$4294965247,%ecx
122	movl	%edx,%esi
123	orl	%ecx,%ebp
124	btl	$27,%ecx
125	jnc	.L006clear_avx
126	xorl	%ecx,%ecx
127.byte	15,1,208
128	andl	$6,%eax
129	cmpl	$6,%eax
130	je	.L007done
131	cmpl	$2,%eax
132	je	.L006clear_avx
133.L008clear_xmm:
134	andl	$4261412861,%ebp
135	andl	$4278190079,%esi
136.L006clear_avx:
137	andl	$4026525695,%ebp
138	movl	20(%esp),%edi
139	andl	$4294967263,8(%edi)
140.L007done:
141	movl	%esi,%eax
142	movl	%ebp,%edx
143.L000nocpuid:
144	popl	%edi
145	popl	%esi
146	popl	%ebx
147	popl	%ebp
148	ret
149.size	OPENSSL_ia32_cpuid,.-.L_OPENSSL_ia32_cpuid_begin
150.globl	OPENSSL_rdtsc
151.hidden	OPENSSL_rdtsc
152.type	OPENSSL_rdtsc,@function
153.align	16
154OPENSSL_rdtsc:
155.L_OPENSSL_rdtsc_begin:
156	xorl	%eax,%eax
157	xorl	%edx,%edx
158	call	.L009PIC_me_up
159.L009PIC_me_up:
160	popl	%ecx
161	leal	OPENSSL_ia32cap_P-.L009PIC_me_up(%ecx),%ecx
162	btl	$4,(%ecx)
163	jnc	.L010notsc
164	.byte	0x0f,0x31
165.L010notsc:
166	ret
167.size	OPENSSL_rdtsc,.-.L_OPENSSL_rdtsc_begin
168.globl	OPENSSL_instrument_halt
169.hidden	OPENSSL_instrument_halt
170.type	OPENSSL_instrument_halt,@function
171.align	16
172OPENSSL_instrument_halt:
173.L_OPENSSL_instrument_halt_begin:
174	call	.L011PIC_me_up
175.L011PIC_me_up:
176	popl	%ecx
177	leal	OPENSSL_ia32cap_P-.L011PIC_me_up(%ecx),%ecx
178	btl	$4,(%ecx)
179	jnc	.L012nohalt
180.long	2421723150
181	andl	$3,%eax
182	jnz	.L012nohalt
183	pushfl
184	popl	%eax
185	btl	$9,%eax
186	jnc	.L012nohalt
187	.byte	0x0f,0x31
188	pushl	%edx
189	pushl	%eax
190	hlt
191	.byte	0x0f,0x31
192	subl	(%esp),%eax
193	sbbl	4(%esp),%edx
194	addl	$8,%esp
195	ret
196.L012nohalt:
197	xorl	%eax,%eax
198	xorl	%edx,%edx
199	ret
200.size	OPENSSL_instrument_halt,.-.L_OPENSSL_instrument_halt_begin
201.globl	OPENSSL_far_spin
202.hidden	OPENSSL_far_spin
203.type	OPENSSL_far_spin,@function
204.align	16
205OPENSSL_far_spin:
206.L_OPENSSL_far_spin_begin:
207	pushfl
208	popl	%eax
209	btl	$9,%eax
210	jnc	.L013nospin
211	movl	4(%esp),%eax
212	movl	8(%esp),%ecx
213.long	2430111262
214	xorl	%eax,%eax
215	movl	(%ecx),%edx
216	jmp	.L014spin
217.align	16
218.L014spin:
219	incl	%eax
220	cmpl	(%ecx),%edx
221	je	.L014spin
222.long	529567888
223	ret
224.L013nospin:
225	xorl	%eax,%eax
226	xorl	%edx,%edx
227	ret
228.size	OPENSSL_far_spin,.-.L_OPENSSL_far_spin_begin
229.globl	OPENSSL_wipe_cpu
230.hidden	OPENSSL_wipe_cpu
231.type	OPENSSL_wipe_cpu,@function
232.align	16
233OPENSSL_wipe_cpu:
234.L_OPENSSL_wipe_cpu_begin:
235	xorl	%eax,%eax
236	xorl	%edx,%edx
237	call	.L015PIC_me_up
238.L015PIC_me_up:
239	popl	%ecx
240	leal	OPENSSL_ia32cap_P-.L015PIC_me_up(%ecx),%ecx
241	movl	(%ecx),%ecx
242	btl	$1,(%ecx)
243	jnc	.L016no_x87
244.long	4007259865,4007259865,4007259865,4007259865,2430851995
245.L016no_x87:
246	leal	4(%esp),%eax
247	ret
248.size	OPENSSL_wipe_cpu,.-.L_OPENSSL_wipe_cpu_begin
249.globl	OPENSSL_atomic_add
250.hidden	OPENSSL_atomic_add
251.type	OPENSSL_atomic_add,@function
252.align	16
253OPENSSL_atomic_add:
254.L_OPENSSL_atomic_add_begin:
255	movl	4(%esp),%edx
256	movl	8(%esp),%ecx
257	pushl	%ebx
258	nop
259	movl	(%edx),%eax
260.L017spin:
261	leal	(%eax,%ecx,1),%ebx
262	nop
263.long	447811568
264	jne	.L017spin
265	movl	%ebx,%eax
266	popl	%ebx
267	ret
268.size	OPENSSL_atomic_add,.-.L_OPENSSL_atomic_add_begin
269.globl	OPENSSL_indirect_call
270.hidden	OPENSSL_indirect_call
271.type	OPENSSL_indirect_call,@function
272.align	16
273OPENSSL_indirect_call:
274.L_OPENSSL_indirect_call_begin:
275	pushl	%ebp
276	movl	%esp,%ebp
277	subl	$28,%esp
278	movl	12(%ebp),%ecx
279	movl	%ecx,(%esp)
280	movl	16(%ebp),%edx
281	movl	%edx,4(%esp)
282	movl	20(%ebp),%eax
283	movl	%eax,8(%esp)
284	movl	24(%ebp),%eax
285	movl	%eax,12(%esp)
286	movl	28(%ebp),%eax
287	movl	%eax,16(%esp)
288	movl	32(%ebp),%eax
289	movl	%eax,20(%esp)
290	movl	36(%ebp),%eax
291	movl	%eax,24(%esp)
292	call	*8(%ebp)
293	movl	%ebp,%esp
294	popl	%ebp
295	ret
296.size	OPENSSL_indirect_call,.-.L_OPENSSL_indirect_call_begin
297.globl	OPENSSL_ia32_rdrand
298.hidden	OPENSSL_ia32_rdrand
299.type	OPENSSL_ia32_rdrand,@function
300.align	16
301OPENSSL_ia32_rdrand:
302.L_OPENSSL_ia32_rdrand_begin:
303	movl	$8,%ecx
304.L018loop:
305.byte	15,199,240
306	jc	.L019break
307	loop	.L018loop
308.L019break:
309	cmpl	$0,%eax
310	cmovel	%ecx,%eax
311	ret
312.size	OPENSSL_ia32_rdrand,.-.L_OPENSSL_ia32_rdrand_begin
313.hidden	OPENSSL_ia32cap_P
314#endif
315