1#include <machine/asm.h>
2.text
3.globl	OPENSSL_ia32_cpuid
4.type	OPENSSL_ia32_cpuid,@function
5.align	16
6OPENSSL_ia32_cpuid:
7.L_OPENSSL_ia32_cpuid_begin:
8	pushl	%ebp
9	pushl	%ebx
10	pushl	%esi
11	pushl	%edi
12	xorl	%edx,%edx
13	pushfl
14	popl	%eax
15	movl	%eax,%ecx
16	xorl	$2097152,%eax
17	pushl	%eax
18	popfl
19	pushfl
20	popl	%eax
21	xorl	%eax,%ecx
22	xorl	%eax,%eax
23	movl	20(%esp),%esi
24	movl	%eax,8(%esi)
25	btl	$21,%ecx
26	jnc	.L000nocpuid
27	.byte	0x0f,0xa2
28	movl	%eax,%edi
29	xorl	%eax,%eax
30	cmpl	$1970169159,%ebx
31	setne	%al
32	movl	%eax,%ebp
33	cmpl	$1231384169,%edx
34	setne	%al
35	orl	%eax,%ebp
36	cmpl	$1818588270,%ecx
37	setne	%al
38	orl	%eax,%ebp
39	jz	.L001intel
40	cmpl	$1752462657,%ebx
41	setne	%al
42	movl	%eax,%esi
43	cmpl	$1769238117,%edx
44	setne	%al
45	orl	%eax,%esi
46	cmpl	$1145913699,%ecx
47	setne	%al
48	orl	%eax,%esi
49	jnz	.L001intel
50	movl	$2147483648,%eax
51	.byte	0x0f,0xa2
52	cmpl	$2147483649,%eax
53	jb	.L001intel
54	movl	%eax,%esi
55	movl	$2147483649,%eax
56	.byte	0x0f,0xa2
57	orl	%ecx,%ebp
58	andl	$2049,%ebp
59	cmpl	$2147483656,%esi
60	jb	.L001intel
61	movl	$2147483656,%eax
62	.byte	0x0f,0xa2
63	movzbl	%cl,%esi
64	incl	%esi
65	movl	$1,%eax
66	xorl	%ecx,%ecx
67	.byte	0x0f,0xa2
68	btl	$28,%edx
69	jnc	.L002generic
70	shrl	$16,%ebx
71	andl	$255,%ebx
72	cmpl	%esi,%ebx
73	ja	.L002generic
74	andl	$4026531839,%edx
75	jmp	.L002generic
76.L001intel:
77	cmpl	$4,%edi
78	movl	$-1,%esi
79	jb	.L003nocacheinfo
80	movl	$4,%eax
81	movl	$0,%ecx
82	.byte	0x0f,0xa2
83	movl	%eax,%esi
84	shrl	$14,%esi
85	andl	$4095,%esi
86.L003nocacheinfo:
87	movl	$1,%eax
88	xorl	%ecx,%ecx
89	.byte	0x0f,0xa2
90	andl	$3220176895,%edx
91	cmpl	$0,%ebp
92	jne	.L004notintel
93	orl	$1073741824,%edx
94	andb	$15,%ah
95	cmpb	$15,%ah
96	jne	.L004notintel
97	orl	$1048576,%edx
98.L004notintel:
99	btl	$28,%edx
100	jnc	.L002generic
101	andl	$4026531839,%edx
102	cmpl	$0,%esi
103	je	.L002generic
104	orl	$268435456,%edx
105	shrl	$16,%ebx
106	cmpb	$1,%bl
107	ja	.L002generic
108	andl	$4026531839,%edx
109.L002generic:
110	andl	$2048,%ebp
111	andl	$4294965247,%ecx
112	movl	%edx,%esi
113	orl	%ecx,%ebp
114	cmpl	$7,%edi
115	movl	20(%esp),%edi
116	jb	.L005no_extended_info
117	movl	$7,%eax
118	xorl	%ecx,%ecx
119	.byte	0x0f,0xa2
120	movl	%ebx,8(%edi)
121.L005no_extended_info:
122	btl	$27,%ebp
123	jnc	.L006clear_avx
124	xorl	%ecx,%ecx
125.byte	15,1,208
126	andl	$6,%eax
127	cmpl	$6,%eax
128	je	.L007done
129	cmpl	$2,%eax
130	je	.L006clear_avx
131.L008clear_xmm:
132	andl	$4261412861,%ebp
133	andl	$4278190079,%esi
134.L006clear_avx:
135	andl	$4026525695,%ebp
136	andl	$4294967263,8(%edi)
137.L007done:
138	movl	%esi,%eax
139	movl	%ebp,%edx
140.L000nocpuid:
141	popl	%edi
142	popl	%esi
143	popl	%ebx
144	popl	%ebp
145	ret
146.size	OPENSSL_ia32_cpuid,.-.L_OPENSSL_ia32_cpuid_begin
147.globl	OPENSSL_rdtsc
148.type	OPENSSL_rdtsc,@function
149.align	16
150OPENSSL_rdtsc:
151.L_OPENSSL_rdtsc_begin:
152	xorl	%eax,%eax
153	xorl	%edx,%edx
154	call	.L009PIC_me_up
155.L009PIC_me_up:
156	popl	%ecx
157	leal	OPENSSL_ia32cap_P-.L009PIC_me_up(%ecx),%ecx
158	btl	$4,(%ecx)
159	jnc	.L010notsc
160	.byte	0x0f,0x31
161.L010notsc:
162	ret
163.size	OPENSSL_rdtsc,.-.L_OPENSSL_rdtsc_begin
164.globl	OPENSSL_instrument_halt
165.type	OPENSSL_instrument_halt,@function
166.align	16
167OPENSSL_instrument_halt:
168.L_OPENSSL_instrument_halt_begin:
169	call	.L011PIC_me_up
170.L011PIC_me_up:
171	popl	%ecx
172	leal	OPENSSL_ia32cap_P-.L011PIC_me_up(%ecx),%ecx
173	btl	$4,(%ecx)
174	jnc	.L012nohalt
175.long	2421723150
176	andl	$3,%eax
177	jnz	.L012nohalt
178	pushfl
179	popl	%eax
180	btl	$9,%eax
181	jnc	.L012nohalt
182	.byte	0x0f,0x31
183	pushl	%edx
184	pushl	%eax
185	hlt
186	.byte	0x0f,0x31
187	subl	(%esp),%eax
188	sbbl	4(%esp),%edx
189	addl	$8,%esp
190	ret
191.L012nohalt:
192	xorl	%eax,%eax
193	xorl	%edx,%edx
194	ret
195.size	OPENSSL_instrument_halt,.-.L_OPENSSL_instrument_halt_begin
196.globl	OPENSSL_far_spin
197.type	OPENSSL_far_spin,@function
198.align	16
199OPENSSL_far_spin:
200.L_OPENSSL_far_spin_begin:
201	pushfl
202	popl	%eax
203	btl	$9,%eax
204	jnc	.L013nospin
205	movl	4(%esp),%eax
206	movl	8(%esp),%ecx
207.long	2430111262
208	xorl	%eax,%eax
209	movl	(%ecx),%edx
210	jmp	.L014spin
211.align	16
212.L014spin:
213	incl	%eax
214	cmpl	(%ecx),%edx
215	je	.L014spin
216.long	529567888
217	ret
218.L013nospin:
219	xorl	%eax,%eax
220	xorl	%edx,%edx
221	ret
222.size	OPENSSL_far_spin,.-.L_OPENSSL_far_spin_begin
223.globl	OPENSSL_wipe_cpu
224.type	OPENSSL_wipe_cpu,@function
225.align	16
226OPENSSL_wipe_cpu:
227.L_OPENSSL_wipe_cpu_begin:
228	xorl	%eax,%eax
229	xorl	%edx,%edx
230	call	.L015PIC_me_up
231.L015PIC_me_up:
232	popl	%ecx
233	leal	OPENSSL_ia32cap_P-.L015PIC_me_up(%ecx),%ecx
234	movl	(%ecx),%ecx
235	btl	$1,(%ecx)
236	jnc	.L016no_x87
237	andl	$83886080,%ecx
238	cmpl	$83886080,%ecx
239	jne	.L017no_sse2
240	pxor	%xmm0,%xmm0
241	pxor	%xmm1,%xmm1
242	pxor	%xmm2,%xmm2
243	pxor	%xmm3,%xmm3
244	pxor	%xmm4,%xmm4
245	pxor	%xmm5,%xmm5
246	pxor	%xmm6,%xmm6
247	pxor	%xmm7,%xmm7
248.L017no_sse2:
249.long	4007259865,4007259865,4007259865,4007259865,2430851995
250.L016no_x87:
251	leal	4(%esp),%eax
252	ret
253.size	OPENSSL_wipe_cpu,.-.L_OPENSSL_wipe_cpu_begin
254.globl	OPENSSL_atomic_add
255.type	OPENSSL_atomic_add,@function
256.align	16
257OPENSSL_atomic_add:
258.L_OPENSSL_atomic_add_begin:
259	movl	4(%esp),%edx
260	movl	8(%esp),%ecx
261	pushl	%ebx
262	nop
263	movl	(%edx),%eax
264.L018spin:
265	leal	(%eax,%ecx,1),%ebx
266	nop
267.long	447811568
268	jne	.L018spin
269	movl	%ebx,%eax
270	popl	%ebx
271	ret
272.size	OPENSSL_atomic_add,.-.L_OPENSSL_atomic_add_begin
273.globl	OPENSSL_cleanse
274.type	OPENSSL_cleanse,@function
275.align	16
276OPENSSL_cleanse:
277.L_OPENSSL_cleanse_begin:
278	movl	4(%esp),%edx
279	movl	8(%esp),%ecx
280	xorl	%eax,%eax
281	cmpl	$7,%ecx
282	jae	.L019lot
283	cmpl	$0,%ecx
284	je	.L020ret
285.L021little:
286	movb	%al,(%edx)
287	subl	$1,%ecx
288	leal	1(%edx),%edx
289	jnz	.L021little
290.L020ret:
291	ret
292.align	16
293.L019lot:
294	testl	$3,%edx
295	jz	.L022aligned
296	movb	%al,(%edx)
297	leal	-1(%ecx),%ecx
298	leal	1(%edx),%edx
299	jmp	.L019lot
300.L022aligned:
301	movl	%eax,(%edx)
302	leal	-4(%ecx),%ecx
303	testl	$-4,%ecx
304	leal	4(%edx),%edx
305	jnz	.L022aligned
306	cmpl	$0,%ecx
307	jne	.L021little
308	ret
309.size	OPENSSL_cleanse,.-.L_OPENSSL_cleanse_begin
310.globl	CRYPTO_memcmp
311.type	CRYPTO_memcmp,@function
312.align	16
313CRYPTO_memcmp:
314.L_CRYPTO_memcmp_begin:
315	pushl	%esi
316	pushl	%edi
317	movl	12(%esp),%esi
318	movl	16(%esp),%edi
319	movl	20(%esp),%ecx
320	xorl	%eax,%eax
321	xorl	%edx,%edx
322	cmpl	$0,%ecx
323	je	.L023no_data
324.L024loop:
325	movb	(%esi),%dl
326	leal	1(%esi),%esi
327	xorb	(%edi),%dl
328	leal	1(%edi),%edi
329	orb	%dl,%al
330	decl	%ecx
331	jnz	.L024loop
332	negl	%eax
333	shrl	$31,%eax
334.L023no_data:
335	popl	%edi
336	popl	%esi
337	ret
338.size	CRYPTO_memcmp,.-.L_CRYPTO_memcmp_begin
339.globl	OPENSSL_instrument_bus
340.type	OPENSSL_instrument_bus,@function
341.align	16
342OPENSSL_instrument_bus:
343.L_OPENSSL_instrument_bus_begin:
344	pushl	%ebp
345	pushl	%ebx
346	pushl	%esi
347	pushl	%edi
348	movl	$0,%eax
349	call	.L025PIC_me_up
350.L025PIC_me_up:
351	popl	%edx
352	leal	OPENSSL_ia32cap_P-.L025PIC_me_up(%edx),%edx
353	btl	$4,(%edx)
354	jnc	.L026nogo
355	btl	$19,(%edx)
356	jnc	.L026nogo
357	movl	20(%esp),%edi
358	movl	24(%esp),%ecx
359	.byte	0x0f,0x31
360	movl	%eax,%esi
361	movl	$0,%ebx
362	clflush	(%edi)
363.byte	240
364	addl	%ebx,(%edi)
365	jmp	.L027loop
366.align	16
367.L027loop:
368	.byte	0x0f,0x31
369	movl	%eax,%edx
370	subl	%esi,%eax
371	movl	%edx,%esi
372	movl	%eax,%ebx
373	clflush	(%edi)
374.byte	240
375	addl	%eax,(%edi)
376	leal	4(%edi),%edi
377	subl	$1,%ecx
378	jnz	.L027loop
379	movl	24(%esp),%eax
380.L026nogo:
381	popl	%edi
382	popl	%esi
383	popl	%ebx
384	popl	%ebp
385	ret
386.size	OPENSSL_instrument_bus,.-.L_OPENSSL_instrument_bus_begin
387.globl	OPENSSL_instrument_bus2
388.type	OPENSSL_instrument_bus2,@function
389.align	16
390OPENSSL_instrument_bus2:
391.L_OPENSSL_instrument_bus2_begin:
392	pushl	%ebp
393	pushl	%ebx
394	pushl	%esi
395	pushl	%edi
396	movl	$0,%eax
397	call	.L028PIC_me_up
398.L028PIC_me_up:
399	popl	%edx
400	leal	OPENSSL_ia32cap_P-.L028PIC_me_up(%edx),%edx
401	btl	$4,(%edx)
402	jnc	.L029nogo
403	btl	$19,(%edx)
404	jnc	.L029nogo
405	movl	20(%esp),%edi
406	movl	24(%esp),%ecx
407	movl	28(%esp),%ebp
408	.byte	0x0f,0x31
409	movl	%eax,%esi
410	movl	$0,%ebx
411	clflush	(%edi)
412.byte	240
413	addl	%ebx,(%edi)
414	.byte	0x0f,0x31
415	movl	%eax,%edx
416	subl	%esi,%eax
417	movl	%edx,%esi
418	movl	%eax,%ebx
419	jmp	.L030loop2
420.align	16
421.L030loop2:
422	clflush	(%edi)
423.byte	240
424	addl	%eax,(%edi)
425	subl	$1,%ebp
426	jz	.L031done2
427	.byte	0x0f,0x31
428	movl	%eax,%edx
429	subl	%esi,%eax
430	movl	%edx,%esi
431	cmpl	%ebx,%eax
432	movl	%eax,%ebx
433	movl	$0,%edx
434	setne	%dl
435	subl	%edx,%ecx
436	leal	(%edi,%edx,4),%edi
437	jnz	.L030loop2
438.L031done2:
439	movl	24(%esp),%eax
440	subl	%ecx,%eax
441.L029nogo:
442	popl	%edi
443	popl	%esi
444	popl	%ebx
445	popl	%ebp
446	ret
447.size	OPENSSL_instrument_bus2,.-.L_OPENSSL_instrument_bus2_begin
448.globl	OPENSSL_ia32_rdrand_bytes
449.type	OPENSSL_ia32_rdrand_bytes,@function
450.align	16
451OPENSSL_ia32_rdrand_bytes:
452.L_OPENSSL_ia32_rdrand_bytes_begin:
453	pushl	%edi
454	pushl	%ebx
455	xorl	%eax,%eax
456	movl	12(%esp),%edi
457	movl	16(%esp),%ebx
458	cmpl	$0,%ebx
459	je	.L032done
460	movl	$8,%ecx
461.L033loop:
462.byte	15,199,242
463	jc	.L034break
464	loop	.L033loop
465	jmp	.L032done
466.align	16
467.L034break:
468	cmpl	$4,%ebx
469	jb	.L035tail
470	movl	%edx,(%edi)
471	leal	4(%edi),%edi
472	addl	$4,%eax
473	subl	$4,%ebx
474	jz	.L032done
475	movl	$8,%ecx
476	jmp	.L033loop
477.align	16
478.L035tail:
479	movb	%dl,(%edi)
480	leal	1(%edi),%edi
481	incl	%eax
482	shrl	$8,%edx
483	decl	%ebx
484	jnz	.L035tail
485.L032done:
486	xorl	%edx,%edx
487	popl	%ebx
488	popl	%edi
489	ret
490.size	OPENSSL_ia32_rdrand_bytes,.-.L_OPENSSL_ia32_rdrand_bytes_begin
491.globl	OPENSSL_ia32_rdseed_bytes
492.type	OPENSSL_ia32_rdseed_bytes,@function
493.align	16
494OPENSSL_ia32_rdseed_bytes:
495.L_OPENSSL_ia32_rdseed_bytes_begin:
496	pushl	%edi
497	pushl	%ebx
498	xorl	%eax,%eax
499	movl	12(%esp),%edi
500	movl	16(%esp),%ebx
501	cmpl	$0,%ebx
502	je	.L036done
503	movl	$8,%ecx
504.L037loop:
505.byte	15,199,250
506	jc	.L038break
507	loop	.L037loop
508	jmp	.L036done
509.align	16
510.L038break:
511	cmpl	$4,%ebx
512	jb	.L039tail
513	movl	%edx,(%edi)
514	leal	4(%edi),%edi
515	addl	$4,%eax
516	subl	$4,%ebx
517	jz	.L036done
518	movl	$8,%ecx
519	jmp	.L037loop
520.align	16
521.L039tail:
522	movb	%dl,(%edi)
523	leal	1(%edi),%edi
524	incl	%eax
525	shrl	$8,%edx
526	decl	%ebx
527	jnz	.L039tail
528.L036done:
529	xorl	%edx,%edx
530	popl	%ebx
531	popl	%edi
532	ret
533.size	OPENSSL_ia32_rdseed_bytes,.-.L_OPENSSL_ia32_rdseed_bytes_begin
534.hidden	OPENSSL_cpuid_setup
535.hidden	OPENSSL_ia32cap_P
536.comm	OPENSSL_ia32cap_P,16,4
537.section	.init
538	PIC_PROLOGUE
539	call	PIC_PLT(OPENSSL_cpuid_setup)
540	PIC_EPILOGUE
541