1305153Sjkim/* $FreeBSD: stable/11/secure/lib/libcrypto/i386/x86cpuid.S 325335 2017-11-02 18:22:53Z jkim $ */
2305153Sjkim/* Do not modify. This file is auto-generated from x86cpuid.pl. */
3299389Sjkim#ifdef PIC
4299389Sjkim.file	"x86cpuid.S"
5238405Sjkim.text
6238405Sjkim.globl	OPENSSL_ia32_cpuid
7238405Sjkim.type	OPENSSL_ia32_cpuid,@function
8238405Sjkim.align	16
9238405SjkimOPENSSL_ia32_cpuid:
10238405Sjkim.L_OPENSSL_ia32_cpuid_begin:
11238405Sjkim	pushl	%ebp
12238405Sjkim	pushl	%ebx
13238405Sjkim	pushl	%esi
14238405Sjkim	pushl	%edi
15238405Sjkim	xorl	%edx,%edx
16238405Sjkim	pushfl
17238405Sjkim	popl	%eax
18238405Sjkim	movl	%eax,%ecx
19238405Sjkim	xorl	$2097152,%eax
20238405Sjkim	pushl	%eax
21238405Sjkim	popfl
22238405Sjkim	pushfl
23238405Sjkim	popl	%eax
24238405Sjkim	xorl	%eax,%ecx
25238405Sjkim	xorl	%eax,%eax
26325335Sjkim	movl	20(%esp),%esi
27325335Sjkim	movl	%eax,8(%esi)
28238405Sjkim	btl	$21,%ecx
29238405Sjkim	jnc	.L000nocpuid
30238405Sjkim	.byte	0x0f,0xa2
31238405Sjkim	movl	%eax,%edi
32238405Sjkim	xorl	%eax,%eax
33238405Sjkim	cmpl	$1970169159,%ebx
34238405Sjkim	setne	%al
35238405Sjkim	movl	%eax,%ebp
36238405Sjkim	cmpl	$1231384169,%edx
37238405Sjkim	setne	%al
38238405Sjkim	orl	%eax,%ebp
39238405Sjkim	cmpl	$1818588270,%ecx
40238405Sjkim	setne	%al
41238405Sjkim	orl	%eax,%ebp
42238405Sjkim	jz	.L001intel
43238405Sjkim	cmpl	$1752462657,%ebx
44238405Sjkim	setne	%al
45238405Sjkim	movl	%eax,%esi
46238405Sjkim	cmpl	$1769238117,%edx
47238405Sjkim	setne	%al
48238405Sjkim	orl	%eax,%esi
49238405Sjkim	cmpl	$1145913699,%ecx
50238405Sjkim	setne	%al
51238405Sjkim	orl	%eax,%esi
52238405Sjkim	jnz	.L001intel
53238405Sjkim	movl	$2147483648,%eax
54238405Sjkim	.byte	0x0f,0xa2
55238405Sjkim	cmpl	$2147483649,%eax
56238405Sjkim	jb	.L001intel
57238405Sjkim	movl	%eax,%esi
58238405Sjkim	movl	$2147483649,%eax
59238405Sjkim	.byte	0x0f,0xa2
60238405Sjkim	orl	%ecx,%ebp
61238405Sjkim	andl	$2049,%ebp
62238405Sjkim	cmpl	$2147483656,%esi
63238405Sjkim	jb	.L001intel
64238405Sjkim	movl	$2147483656,%eax
65238405Sjkim	.byte	0x0f,0xa2
66238405Sjkim	movzbl	%cl,%esi
67238405Sjkim	incl	%esi
68238405Sjkim	movl	$1,%eax
69261037Sjkim	xorl	%ecx,%ecx
70238405Sjkim	.byte	0x0f,0xa2
71238405Sjkim	btl	$28,%edx
72238405Sjkim	jnc	.L002generic
73238405Sjkim	shrl	$16,%ebx
74238405Sjkim	andl	$255,%ebx
75238405Sjkim	cmpl	%esi,%ebx
76238405Sjkim	ja	.L002generic
77238405Sjkim	andl	$4026531839,%edx
78238405Sjkim	jmp	.L002generic
79238405Sjkim.L001intel:
80238405Sjkim	cmpl	$4,%edi
81325335Sjkim	movl	$-1,%esi
82325335Sjkim	jb	.L003nocacheinfo
83238405Sjkim	movl	$4,%eax
84238405Sjkim	movl	$0,%ecx
85238405Sjkim	.byte	0x0f,0xa2
86325335Sjkim	movl	%eax,%esi
87325335Sjkim	shrl	$14,%esi
88325335Sjkim	andl	$4095,%esi
89325335Sjkim.L003nocacheinfo:
90238405Sjkim	movl	$1,%eax
91261037Sjkim	xorl	%ecx,%ecx
92238405Sjkim	.byte	0x0f,0xa2
93238405Sjkim	andl	$3220176895,%edx
94238405Sjkim	cmpl	$0,%ebp
95325335Sjkim	jne	.L004notintel
96238405Sjkim	orl	$1073741824,%edx
97238405Sjkim	andb	$15,%ah
98238405Sjkim	cmpb	$15,%ah
99325335Sjkim	jne	.L004notintel
100238405Sjkim	orl	$1048576,%edx
101325335Sjkim.L004notintel:
102238405Sjkim	btl	$28,%edx
103238405Sjkim	jnc	.L002generic
104238405Sjkim	andl	$4026531839,%edx
105325335Sjkim	cmpl	$0,%esi
106238405Sjkim	je	.L002generic
107238405Sjkim	orl	$268435456,%edx
108238405Sjkim	shrl	$16,%ebx
109238405Sjkim	cmpb	$1,%bl
110238405Sjkim	ja	.L002generic
111238405Sjkim	andl	$4026531839,%edx
112238405Sjkim.L002generic:
113238405Sjkim	andl	$2048,%ebp
114238405Sjkim	andl	$4294965247,%ecx
115238405Sjkim	movl	%edx,%esi
116238405Sjkim	orl	%ecx,%ebp
117325335Sjkim	cmpl	$7,%edi
118325335Sjkim	movl	20(%esp),%edi
119325335Sjkim	jb	.L005no_extended_info
120325335Sjkim	movl	$7,%eax
121325335Sjkim	xorl	%ecx,%ecx
122325335Sjkim	.byte	0x0f,0xa2
123325335Sjkim	movl	%ebx,8(%edi)
124325335Sjkim.L005no_extended_info:
125325335Sjkim	btl	$27,%ebp
126290207Sjkim	jnc	.L006clear_avx
127238405Sjkim	xorl	%ecx,%ecx
128238405Sjkim.byte	15,1,208
129238405Sjkim	andl	$6,%eax
130238405Sjkim	cmpl	$6,%eax
131290207Sjkim	je	.L007done
132238405Sjkim	cmpl	$2,%eax
133290207Sjkim	je	.L006clear_avx
134290207Sjkim.L008clear_xmm:
135238405Sjkim	andl	$4261412861,%ebp
136238405Sjkim	andl	$4278190079,%esi
137290207Sjkim.L006clear_avx:
138238405Sjkim	andl	$4026525695,%ebp
139290207Sjkim	andl	$4294967263,8(%edi)
140290207Sjkim.L007done:
141238405Sjkim	movl	%esi,%eax
142238405Sjkim	movl	%ebp,%edx
143238405Sjkim.L000nocpuid:
144238405Sjkim	popl	%edi
145238405Sjkim	popl	%esi
146238405Sjkim	popl	%ebx
147238405Sjkim	popl	%ebp
148238405Sjkim	ret
149238405Sjkim.size	OPENSSL_ia32_cpuid,.-.L_OPENSSL_ia32_cpuid_begin
150238405Sjkim.globl	OPENSSL_rdtsc
151238405Sjkim.type	OPENSSL_rdtsc,@function
152238405Sjkim.align	16
153238405SjkimOPENSSL_rdtsc:
154238405Sjkim.L_OPENSSL_rdtsc_begin:
155238405Sjkim	xorl	%eax,%eax
156238405Sjkim	xorl	%edx,%edx
157299389Sjkim	call	.L009PIC_me_up
158299389Sjkim.L009PIC_me_up:
159299389Sjkim	popl	%ecx
160299389Sjkim	leal	OPENSSL_ia32cap_P-.L009PIC_me_up(%ecx),%ecx
161299389Sjkim	btl	$4,(%ecx)
162299389Sjkim	jnc	.L010notsc
163299389Sjkim	.byte	0x0f,0x31
164299389Sjkim.L010notsc:
165299389Sjkim	ret
166299389Sjkim.size	OPENSSL_rdtsc,.-.L_OPENSSL_rdtsc_begin
167299389Sjkim.globl	OPENSSL_instrument_halt
168299389Sjkim.type	OPENSSL_instrument_halt,@function
169299389Sjkim.align	16
170299389SjkimOPENSSL_instrument_halt:
171299389Sjkim.L_OPENSSL_instrument_halt_begin:
172299389Sjkim	call	.L011PIC_me_up
173299389Sjkim.L011PIC_me_up:
174299389Sjkim	popl	%ecx
175299389Sjkim	leal	OPENSSL_ia32cap_P-.L011PIC_me_up(%ecx),%ecx
176299389Sjkim	btl	$4,(%ecx)
177299389Sjkim	jnc	.L012nohalt
178299389Sjkim.long	2421723150
179299389Sjkim	andl	$3,%eax
180299389Sjkim	jnz	.L012nohalt
181299389Sjkim	pushfl
182299389Sjkim	popl	%eax
183299389Sjkim	btl	$9,%eax
184299389Sjkim	jnc	.L012nohalt
185299389Sjkim	.byte	0x0f,0x31
186299389Sjkim	pushl	%edx
187299389Sjkim	pushl	%eax
188299389Sjkim	hlt
189299389Sjkim	.byte	0x0f,0x31
190299389Sjkim	subl	(%esp),%eax
191299389Sjkim	sbbl	4(%esp),%edx
192299389Sjkim	addl	$8,%esp
193299389Sjkim	ret
194299389Sjkim.L012nohalt:
195299389Sjkim	xorl	%eax,%eax
196299389Sjkim	xorl	%edx,%edx
197299389Sjkim	ret
198299389Sjkim.size	OPENSSL_instrument_halt,.-.L_OPENSSL_instrument_halt_begin
199299389Sjkim.globl	OPENSSL_far_spin
200299389Sjkim.type	OPENSSL_far_spin,@function
201299389Sjkim.align	16
202299389SjkimOPENSSL_far_spin:
203299389Sjkim.L_OPENSSL_far_spin_begin:
204299389Sjkim	pushfl
205299389Sjkim	popl	%eax
206299389Sjkim	btl	$9,%eax
207299389Sjkim	jnc	.L013nospin
208299389Sjkim	movl	4(%esp),%eax
209299389Sjkim	movl	8(%esp),%ecx
210299389Sjkim.long	2430111262
211299389Sjkim	xorl	%eax,%eax
212299389Sjkim	movl	(%ecx),%edx
213299389Sjkim	jmp	.L014spin
214299389Sjkim.align	16
215299389Sjkim.L014spin:
216299389Sjkim	incl	%eax
217299389Sjkim	cmpl	(%ecx),%edx
218299389Sjkim	je	.L014spin
219299389Sjkim.long	529567888
220299389Sjkim	ret
221299389Sjkim.L013nospin:
222299389Sjkim	xorl	%eax,%eax
223299389Sjkim	xorl	%edx,%edx
224299389Sjkim	ret
225299389Sjkim.size	OPENSSL_far_spin,.-.L_OPENSSL_far_spin_begin
226299389Sjkim.globl	OPENSSL_wipe_cpu
227299389Sjkim.type	OPENSSL_wipe_cpu,@function
228299389Sjkim.align	16
229299389SjkimOPENSSL_wipe_cpu:
230299389Sjkim.L_OPENSSL_wipe_cpu_begin:
231299389Sjkim	xorl	%eax,%eax
232299389Sjkim	xorl	%edx,%edx
233299389Sjkim	call	.L015PIC_me_up
234299389Sjkim.L015PIC_me_up:
235299389Sjkim	popl	%ecx
236299389Sjkim	leal	OPENSSL_ia32cap_P-.L015PIC_me_up(%ecx),%ecx
237299389Sjkim	movl	(%ecx),%ecx
238299389Sjkim	btl	$1,(%ecx)
239299389Sjkim	jnc	.L016no_x87
240299389Sjkim	andl	$83886080,%ecx
241299389Sjkim	cmpl	$83886080,%ecx
242299389Sjkim	jne	.L017no_sse2
243299389Sjkim	pxor	%xmm0,%xmm0
244299389Sjkim	pxor	%xmm1,%xmm1
245299389Sjkim	pxor	%xmm2,%xmm2
246299389Sjkim	pxor	%xmm3,%xmm3
247299389Sjkim	pxor	%xmm4,%xmm4
248299389Sjkim	pxor	%xmm5,%xmm5
249299389Sjkim	pxor	%xmm6,%xmm6
250299389Sjkim	pxor	%xmm7,%xmm7
251299389Sjkim.L017no_sse2:
252299389Sjkim.long	4007259865,4007259865,4007259865,4007259865,2430851995
253299389Sjkim.L016no_x87:
254299389Sjkim	leal	4(%esp),%eax
255299389Sjkim	ret
256299389Sjkim.size	OPENSSL_wipe_cpu,.-.L_OPENSSL_wipe_cpu_begin
257299389Sjkim.globl	OPENSSL_atomic_add
258299389Sjkim.type	OPENSSL_atomic_add,@function
259299389Sjkim.align	16
260299389SjkimOPENSSL_atomic_add:
261299389Sjkim.L_OPENSSL_atomic_add_begin:
262299389Sjkim	movl	4(%esp),%edx
263299389Sjkim	movl	8(%esp),%ecx
264299389Sjkim	pushl	%ebx
265299389Sjkim	nop
266299389Sjkim	movl	(%edx),%eax
267299389Sjkim.L018spin:
268299389Sjkim	leal	(%eax,%ecx,1),%ebx
269299389Sjkim	nop
270299389Sjkim.long	447811568
271299389Sjkim	jne	.L018spin
272299389Sjkim	movl	%ebx,%eax
273299389Sjkim	popl	%ebx
274299389Sjkim	ret
275299389Sjkim.size	OPENSSL_atomic_add,.-.L_OPENSSL_atomic_add_begin
276299389Sjkim.globl	OPENSSL_indirect_call
277299389Sjkim.type	OPENSSL_indirect_call,@function
278299389Sjkim.align	16
279299389SjkimOPENSSL_indirect_call:
280299389Sjkim.L_OPENSSL_indirect_call_begin:
281299389Sjkim	pushl	%ebp
282299389Sjkim	movl	%esp,%ebp
283299389Sjkim	subl	$28,%esp
284299389Sjkim	movl	12(%ebp),%ecx
285299389Sjkim	movl	%ecx,(%esp)
286299389Sjkim	movl	16(%ebp),%edx
287299389Sjkim	movl	%edx,4(%esp)
288299389Sjkim	movl	20(%ebp),%eax
289299389Sjkim	movl	%eax,8(%esp)
290299389Sjkim	movl	24(%ebp),%eax
291299389Sjkim	movl	%eax,12(%esp)
292299389Sjkim	movl	28(%ebp),%eax
293299389Sjkim	movl	%eax,16(%esp)
294299389Sjkim	movl	32(%ebp),%eax
295299389Sjkim	movl	%eax,20(%esp)
296299389Sjkim	movl	36(%ebp),%eax
297299389Sjkim	movl	%eax,24(%esp)
298299389Sjkim	call	*8(%ebp)
299299389Sjkim	movl	%ebp,%esp
300299389Sjkim	popl	%ebp
301299389Sjkim	ret
302299389Sjkim.size	OPENSSL_indirect_call,.-.L_OPENSSL_indirect_call_begin
303299389Sjkim.globl	OPENSSL_cleanse
304299389Sjkim.type	OPENSSL_cleanse,@function
305299389Sjkim.align	16
306299389SjkimOPENSSL_cleanse:
307299389Sjkim.L_OPENSSL_cleanse_begin:
308299389Sjkim	movl	4(%esp),%edx
309299389Sjkim	movl	8(%esp),%ecx
310299389Sjkim	xorl	%eax,%eax
311299389Sjkim	cmpl	$7,%ecx
312299389Sjkim	jae	.L019lot
313299389Sjkim	cmpl	$0,%ecx
314299389Sjkim	je	.L020ret
315299389Sjkim.L021little:
316299389Sjkim	movb	%al,(%edx)
317299389Sjkim	subl	$1,%ecx
318299389Sjkim	leal	1(%edx),%edx
319299389Sjkim	jnz	.L021little
320299389Sjkim.L020ret:
321299389Sjkim	ret
322299389Sjkim.align	16
323299389Sjkim.L019lot:
324299389Sjkim	testl	$3,%edx
325299389Sjkim	jz	.L022aligned
326299389Sjkim	movb	%al,(%edx)
327299389Sjkim	leal	-1(%ecx),%ecx
328299389Sjkim	leal	1(%edx),%edx
329299389Sjkim	jmp	.L019lot
330299389Sjkim.L022aligned:
331299389Sjkim	movl	%eax,(%edx)
332299389Sjkim	leal	-4(%ecx),%ecx
333299389Sjkim	testl	$-4,%ecx
334299389Sjkim	leal	4(%edx),%edx
335299389Sjkim	jnz	.L022aligned
336299389Sjkim	cmpl	$0,%ecx
337299389Sjkim	jne	.L021little
338299389Sjkim	ret
339299389Sjkim.size	OPENSSL_cleanse,.-.L_OPENSSL_cleanse_begin
340299389Sjkim.globl	OPENSSL_ia32_rdrand
341299389Sjkim.type	OPENSSL_ia32_rdrand,@function
342299389Sjkim.align	16
343299389SjkimOPENSSL_ia32_rdrand:
344299389Sjkim.L_OPENSSL_ia32_rdrand_begin:
345299389Sjkim	movl	$8,%ecx
346299389Sjkim.L023loop:
347299389Sjkim.byte	15,199,240
348299389Sjkim	jc	.L024break
349299389Sjkim	loop	.L023loop
350299389Sjkim.L024break:
351299389Sjkim	cmpl	$0,%eax
352299389Sjkim	cmovel	%ecx,%eax
353299389Sjkim	ret
354299389Sjkim.size	OPENSSL_ia32_rdrand,.-.L_OPENSSL_ia32_rdrand_begin
355299389Sjkim.globl	OPENSSL_ia32_rdseed
356299389Sjkim.type	OPENSSL_ia32_rdseed,@function
357299389Sjkim.align	16
358299389SjkimOPENSSL_ia32_rdseed:
359299389Sjkim.L_OPENSSL_ia32_rdseed_begin:
360299389Sjkim	movl	$8,%ecx
361299389Sjkim.L025loop:
362299389Sjkim.byte	15,199,248
363299389Sjkim	jc	.L026break
364299389Sjkim	loop	.L025loop
365299389Sjkim.L026break:
366299389Sjkim	cmpl	$0,%eax
367299389Sjkim	cmovel	%ecx,%eax
368299389Sjkim	ret
369299389Sjkim.size	OPENSSL_ia32_rdseed,.-.L_OPENSSL_ia32_rdseed_begin
370299389Sjkim.hidden	OPENSSL_cpuid_setup
371299389Sjkim.hidden	OPENSSL_ia32cap_P
372299389Sjkim.comm	OPENSSL_ia32cap_P,16,4
373299389Sjkim.section	.init
374299389Sjkim	call	OPENSSL_cpuid_setup
375299389Sjkim#else
376299389Sjkim.file	"x86cpuid.S"
377299389Sjkim.text
378299389Sjkim.globl	OPENSSL_ia32_cpuid
379299389Sjkim.type	OPENSSL_ia32_cpuid,@function
380299389Sjkim.align	16
381299389SjkimOPENSSL_ia32_cpuid:
382299389Sjkim.L_OPENSSL_ia32_cpuid_begin:
383299389Sjkim	pushl	%ebp
384299389Sjkim	pushl	%ebx
385299389Sjkim	pushl	%esi
386299389Sjkim	pushl	%edi
387299389Sjkim	xorl	%edx,%edx
388299389Sjkim	pushfl
389299389Sjkim	popl	%eax
390299389Sjkim	movl	%eax,%ecx
391299389Sjkim	xorl	$2097152,%eax
392299389Sjkim	pushl	%eax
393299389Sjkim	popfl
394299389Sjkim	pushfl
395299389Sjkim	popl	%eax
396299389Sjkim	xorl	%eax,%ecx
397299389Sjkim	xorl	%eax,%eax
398325335Sjkim	movl	20(%esp),%esi
399325335Sjkim	movl	%eax,8(%esi)
400299389Sjkim	btl	$21,%ecx
401299389Sjkim	jnc	.L000nocpuid
402299389Sjkim	.byte	0x0f,0xa2
403299389Sjkim	movl	%eax,%edi
404299389Sjkim	xorl	%eax,%eax
405299389Sjkim	cmpl	$1970169159,%ebx
406299389Sjkim	setne	%al
407299389Sjkim	movl	%eax,%ebp
408299389Sjkim	cmpl	$1231384169,%edx
409299389Sjkim	setne	%al
410299389Sjkim	orl	%eax,%ebp
411299389Sjkim	cmpl	$1818588270,%ecx
412299389Sjkim	setne	%al
413299389Sjkim	orl	%eax,%ebp
414299389Sjkim	jz	.L001intel
415299389Sjkim	cmpl	$1752462657,%ebx
416299389Sjkim	setne	%al
417299389Sjkim	movl	%eax,%esi
418299389Sjkim	cmpl	$1769238117,%edx
419299389Sjkim	setne	%al
420299389Sjkim	orl	%eax,%esi
421299389Sjkim	cmpl	$1145913699,%ecx
422299389Sjkim	setne	%al
423299389Sjkim	orl	%eax,%esi
424299389Sjkim	jnz	.L001intel
425299389Sjkim	movl	$2147483648,%eax
426299389Sjkim	.byte	0x0f,0xa2
427299389Sjkim	cmpl	$2147483649,%eax
428299389Sjkim	jb	.L001intel
429299389Sjkim	movl	%eax,%esi
430299389Sjkim	movl	$2147483649,%eax
431299389Sjkim	.byte	0x0f,0xa2
432299389Sjkim	orl	%ecx,%ebp
433299389Sjkim	andl	$2049,%ebp
434299389Sjkim	cmpl	$2147483656,%esi
435299389Sjkim	jb	.L001intel
436299389Sjkim	movl	$2147483656,%eax
437299389Sjkim	.byte	0x0f,0xa2
438299389Sjkim	movzbl	%cl,%esi
439299389Sjkim	incl	%esi
440299389Sjkim	movl	$1,%eax
441299389Sjkim	xorl	%ecx,%ecx
442299389Sjkim	.byte	0x0f,0xa2
443299389Sjkim	btl	$28,%edx
444299389Sjkim	jnc	.L002generic
445299389Sjkim	shrl	$16,%ebx
446299389Sjkim	andl	$255,%ebx
447299389Sjkim	cmpl	%esi,%ebx
448299389Sjkim	ja	.L002generic
449299389Sjkim	andl	$4026531839,%edx
450299389Sjkim	jmp	.L002generic
451299389Sjkim.L001intel:
452299389Sjkim	cmpl	$4,%edi
453325335Sjkim	movl	$-1,%esi
454325335Sjkim	jb	.L003nocacheinfo
455299389Sjkim	movl	$4,%eax
456299389Sjkim	movl	$0,%ecx
457299389Sjkim	.byte	0x0f,0xa2
458325335Sjkim	movl	%eax,%esi
459325335Sjkim	shrl	$14,%esi
460325335Sjkim	andl	$4095,%esi
461325335Sjkim.L003nocacheinfo:
462299389Sjkim	movl	$1,%eax
463299389Sjkim	xorl	%ecx,%ecx
464299389Sjkim	.byte	0x0f,0xa2
465299389Sjkim	andl	$3220176895,%edx
466299389Sjkim	cmpl	$0,%ebp
467325335Sjkim	jne	.L004notintel
468299389Sjkim	orl	$1073741824,%edx
469299389Sjkim	andb	$15,%ah
470299389Sjkim	cmpb	$15,%ah
471325335Sjkim	jne	.L004notintel
472299389Sjkim	orl	$1048576,%edx
473325335Sjkim.L004notintel:
474299389Sjkim	btl	$28,%edx
475299389Sjkim	jnc	.L002generic
476299389Sjkim	andl	$4026531839,%edx
477325335Sjkim	cmpl	$0,%esi
478299389Sjkim	je	.L002generic
479299389Sjkim	orl	$268435456,%edx
480299389Sjkim	shrl	$16,%ebx
481299389Sjkim	cmpb	$1,%bl
482299389Sjkim	ja	.L002generic
483299389Sjkim	andl	$4026531839,%edx
484299389Sjkim.L002generic:
485299389Sjkim	andl	$2048,%ebp
486299389Sjkim	andl	$4294965247,%ecx
487299389Sjkim	movl	%edx,%esi
488299389Sjkim	orl	%ecx,%ebp
489325335Sjkim	cmpl	$7,%edi
490325335Sjkim	movl	20(%esp),%edi
491325335Sjkim	jb	.L005no_extended_info
492325335Sjkim	movl	$7,%eax
493325335Sjkim	xorl	%ecx,%ecx
494325335Sjkim	.byte	0x0f,0xa2
495325335Sjkim	movl	%ebx,8(%edi)
496325335Sjkim.L005no_extended_info:
497325335Sjkim	btl	$27,%ebp
498299389Sjkim	jnc	.L006clear_avx
499299389Sjkim	xorl	%ecx,%ecx
500299389Sjkim.byte	15,1,208
501299389Sjkim	andl	$6,%eax
502299389Sjkim	cmpl	$6,%eax
503299389Sjkim	je	.L007done
504299389Sjkim	cmpl	$2,%eax
505299389Sjkim	je	.L006clear_avx
506299389Sjkim.L008clear_xmm:
507299389Sjkim	andl	$4261412861,%ebp
508299389Sjkim	andl	$4278190079,%esi
509299389Sjkim.L006clear_avx:
510299389Sjkim	andl	$4026525695,%ebp
511299389Sjkim	andl	$4294967263,8(%edi)
512299389Sjkim.L007done:
513299389Sjkim	movl	%esi,%eax
514299389Sjkim	movl	%ebp,%edx
515299389Sjkim.L000nocpuid:
516299389Sjkim	popl	%edi
517299389Sjkim	popl	%esi
518299389Sjkim	popl	%ebx
519299389Sjkim	popl	%ebp
520299389Sjkim	ret
521299389Sjkim.size	OPENSSL_ia32_cpuid,.-.L_OPENSSL_ia32_cpuid_begin
522299389Sjkim.globl	OPENSSL_rdtsc
523299389Sjkim.type	OPENSSL_rdtsc,@function
524299389Sjkim.align	16
525299389SjkimOPENSSL_rdtsc:
526299389Sjkim.L_OPENSSL_rdtsc_begin:
527299389Sjkim	xorl	%eax,%eax
528299389Sjkim	xorl	%edx,%edx
529238405Sjkim	leal	OPENSSL_ia32cap_P,%ecx
530238405Sjkim	btl	$4,(%ecx)
531290207Sjkim	jnc	.L009notsc
532238405Sjkim	.byte	0x0f,0x31
533290207Sjkim.L009notsc:
534238405Sjkim	ret
535238405Sjkim.size	OPENSSL_rdtsc,.-.L_OPENSSL_rdtsc_begin
536238405Sjkim.globl	OPENSSL_instrument_halt
537238405Sjkim.type	OPENSSL_instrument_halt,@function
538238405Sjkim.align	16
539238405SjkimOPENSSL_instrument_halt:
540238405Sjkim.L_OPENSSL_instrument_halt_begin:
541238405Sjkim	leal	OPENSSL_ia32cap_P,%ecx
542238405Sjkim	btl	$4,(%ecx)
543290207Sjkim	jnc	.L010nohalt
544238405Sjkim.long	2421723150
545238405Sjkim	andl	$3,%eax
546290207Sjkim	jnz	.L010nohalt
547238405Sjkim	pushfl
548238405Sjkim	popl	%eax
549238405Sjkim	btl	$9,%eax
550290207Sjkim	jnc	.L010nohalt
551238405Sjkim	.byte	0x0f,0x31
552238405Sjkim	pushl	%edx
553238405Sjkim	pushl	%eax
554238405Sjkim	hlt
555238405Sjkim	.byte	0x0f,0x31
556238405Sjkim	subl	(%esp),%eax
557238405Sjkim	sbbl	4(%esp),%edx
558238405Sjkim	addl	$8,%esp
559238405Sjkim	ret
560290207Sjkim.L010nohalt:
561238405Sjkim	xorl	%eax,%eax
562238405Sjkim	xorl	%edx,%edx
563238405Sjkim	ret
564238405Sjkim.size	OPENSSL_instrument_halt,.-.L_OPENSSL_instrument_halt_begin
565238405Sjkim.globl	OPENSSL_far_spin
566238405Sjkim.type	OPENSSL_far_spin,@function
567238405Sjkim.align	16
568238405SjkimOPENSSL_far_spin:
569238405Sjkim.L_OPENSSL_far_spin_begin:
570238405Sjkim	pushfl
571238405Sjkim	popl	%eax
572238405Sjkim	btl	$9,%eax
573290207Sjkim	jnc	.L011nospin
574238405Sjkim	movl	4(%esp),%eax
575238405Sjkim	movl	8(%esp),%ecx
576238405Sjkim.long	2430111262
577238405Sjkim	xorl	%eax,%eax
578238405Sjkim	movl	(%ecx),%edx
579290207Sjkim	jmp	.L012spin
580238405Sjkim.align	16
581290207Sjkim.L012spin:
582238405Sjkim	incl	%eax
583238405Sjkim	cmpl	(%ecx),%edx
584290207Sjkim	je	.L012spin
585238405Sjkim.long	529567888
586238405Sjkim	ret
587290207Sjkim.L011nospin:
588238405Sjkim	xorl	%eax,%eax
589238405Sjkim	xorl	%edx,%edx
590238405Sjkim	ret
591238405Sjkim.size	OPENSSL_far_spin,.-.L_OPENSSL_far_spin_begin
592238405Sjkim.globl	OPENSSL_wipe_cpu
593238405Sjkim.type	OPENSSL_wipe_cpu,@function
594238405Sjkim.align	16
595238405SjkimOPENSSL_wipe_cpu:
596238405Sjkim.L_OPENSSL_wipe_cpu_begin:
597238405Sjkim	xorl	%eax,%eax
598238405Sjkim	xorl	%edx,%edx
599238405Sjkim	leal	OPENSSL_ia32cap_P,%ecx
600238405Sjkim	movl	(%ecx),%ecx
601238405Sjkim	btl	$1,(%ecx)
602290207Sjkim	jnc	.L013no_x87
603238405Sjkim	andl	$83886080,%ecx
604238405Sjkim	cmpl	$83886080,%ecx
605290207Sjkim	jne	.L014no_sse2
606238405Sjkim	pxor	%xmm0,%xmm0
607238405Sjkim	pxor	%xmm1,%xmm1
608238405Sjkim	pxor	%xmm2,%xmm2
609238405Sjkim	pxor	%xmm3,%xmm3
610238405Sjkim	pxor	%xmm4,%xmm4
611238405Sjkim	pxor	%xmm5,%xmm5
612238405Sjkim	pxor	%xmm6,%xmm6
613238405Sjkim	pxor	%xmm7,%xmm7
614290207Sjkim.L014no_sse2:
615238405Sjkim.long	4007259865,4007259865,4007259865,4007259865,2430851995
616290207Sjkim.L013no_x87:
617238405Sjkim	leal	4(%esp),%eax
618238405Sjkim	ret
619238405Sjkim.size	OPENSSL_wipe_cpu,.-.L_OPENSSL_wipe_cpu_begin
620238405Sjkim.globl	OPENSSL_atomic_add
621238405Sjkim.type	OPENSSL_atomic_add,@function
622238405Sjkim.align	16
623238405SjkimOPENSSL_atomic_add:
624238405Sjkim.L_OPENSSL_atomic_add_begin:
625238405Sjkim	movl	4(%esp),%edx
626238405Sjkim	movl	8(%esp),%ecx
627238405Sjkim	pushl	%ebx
628238405Sjkim	nop
629238405Sjkim	movl	(%edx),%eax
630290207Sjkim.L015spin:
631238405Sjkim	leal	(%eax,%ecx,1),%ebx
632238405Sjkim	nop
633238405Sjkim.long	447811568
634290207Sjkim	jne	.L015spin
635238405Sjkim	movl	%ebx,%eax
636238405Sjkim	popl	%ebx
637238405Sjkim	ret
638238405Sjkim.size	OPENSSL_atomic_add,.-.L_OPENSSL_atomic_add_begin
639238405Sjkim.globl	OPENSSL_indirect_call
640238405Sjkim.type	OPENSSL_indirect_call,@function
641238405Sjkim.align	16
642238405SjkimOPENSSL_indirect_call:
643238405Sjkim.L_OPENSSL_indirect_call_begin:
644238405Sjkim	pushl	%ebp
645238405Sjkim	movl	%esp,%ebp
646238405Sjkim	subl	$28,%esp
647238405Sjkim	movl	12(%ebp),%ecx
648238405Sjkim	movl	%ecx,(%esp)
649238405Sjkim	movl	16(%ebp),%edx
650238405Sjkim	movl	%edx,4(%esp)
651238405Sjkim	movl	20(%ebp),%eax
652238405Sjkim	movl	%eax,8(%esp)
653238405Sjkim	movl	24(%ebp),%eax
654238405Sjkim	movl	%eax,12(%esp)
655238405Sjkim	movl	28(%ebp),%eax
656238405Sjkim	movl	%eax,16(%esp)
657238405Sjkim	movl	32(%ebp),%eax
658238405Sjkim	movl	%eax,20(%esp)
659238405Sjkim	movl	36(%ebp),%eax
660238405Sjkim	movl	%eax,24(%esp)
661238405Sjkim	call	*8(%ebp)
662238405Sjkim	movl	%ebp,%esp
663238405Sjkim	popl	%ebp
664238405Sjkim	ret
665238405Sjkim.size	OPENSSL_indirect_call,.-.L_OPENSSL_indirect_call_begin
666238405Sjkim.globl	OPENSSL_cleanse
667238405Sjkim.type	OPENSSL_cleanse,@function
668238405Sjkim.align	16
669238405SjkimOPENSSL_cleanse:
670238405Sjkim.L_OPENSSL_cleanse_begin:
671238405Sjkim	movl	4(%esp),%edx
672238405Sjkim	movl	8(%esp),%ecx
673238405Sjkim	xorl	%eax,%eax
674238405Sjkim	cmpl	$7,%ecx
675290207Sjkim	jae	.L016lot
676238405Sjkim	cmpl	$0,%ecx
677290207Sjkim	je	.L017ret
678290207Sjkim.L018little:
679238405Sjkim	movb	%al,(%edx)
680238405Sjkim	subl	$1,%ecx
681238405Sjkim	leal	1(%edx),%edx
682290207Sjkim	jnz	.L018little
683290207Sjkim.L017ret:
684238405Sjkim	ret
685238405Sjkim.align	16
686290207Sjkim.L016lot:
687238405Sjkim	testl	$3,%edx
688290207Sjkim	jz	.L019aligned
689238405Sjkim	movb	%al,(%edx)
690238405Sjkim	leal	-1(%ecx),%ecx
691238405Sjkim	leal	1(%edx),%edx
692290207Sjkim	jmp	.L016lot
693290207Sjkim.L019aligned:
694238405Sjkim	movl	%eax,(%edx)
695238405Sjkim	leal	-4(%ecx),%ecx
696238405Sjkim	testl	$-4,%ecx
697238405Sjkim	leal	4(%edx),%edx
698290207Sjkim	jnz	.L019aligned
699238405Sjkim	cmpl	$0,%ecx
700290207Sjkim	jne	.L018little
701238405Sjkim	ret
702238405Sjkim.size	OPENSSL_cleanse,.-.L_OPENSSL_cleanse_begin
703238405Sjkim.globl	OPENSSL_ia32_rdrand
704238405Sjkim.type	OPENSSL_ia32_rdrand,@function
705238405Sjkim.align	16
706238405SjkimOPENSSL_ia32_rdrand:
707238405Sjkim.L_OPENSSL_ia32_rdrand_begin:
708238405Sjkim	movl	$8,%ecx
709290207Sjkim.L020loop:
710238405Sjkim.byte	15,199,240
711290207Sjkim	jc	.L021break
712290207Sjkim	loop	.L020loop
713290207Sjkim.L021break:
714238405Sjkim	cmpl	$0,%eax
715238405Sjkim	cmovel	%ecx,%eax
716238405Sjkim	ret
717238405Sjkim.size	OPENSSL_ia32_rdrand,.-.L_OPENSSL_ia32_rdrand_begin
718290207Sjkim.globl	OPENSSL_ia32_rdseed
719290207Sjkim.type	OPENSSL_ia32_rdseed,@function
720290207Sjkim.align	16
721290207SjkimOPENSSL_ia32_rdseed:
722290207Sjkim.L_OPENSSL_ia32_rdseed_begin:
723290207Sjkim	movl	$8,%ecx
724290207Sjkim.L022loop:
725290207Sjkim.byte	15,199,248
726290207Sjkim	jc	.L023break
727290207Sjkim	loop	.L022loop
728290207Sjkim.L023break:
729290207Sjkim	cmpl	$0,%eax
730290207Sjkim	cmovel	%ecx,%eax
731290207Sjkim	ret
732290207Sjkim.size	OPENSSL_ia32_rdseed,.-.L_OPENSSL_ia32_rdseed_begin
733290207Sjkim.hidden	OPENSSL_cpuid_setup
734290207Sjkim.hidden	OPENSSL_ia32cap_P
735290207Sjkim.comm	OPENSSL_ia32cap_P,16,4
736238405Sjkim.section	.init
737238405Sjkim	call	OPENSSL_cpuid_setup
738299389Sjkim#endif
739