xref: /netbsd-src/crypto/external/bsd/openssl/lib/libcrypto/arch/i386/x86cpuid.S (revision bdc22b2e01993381dcefeff2bc9b56ca75a4235c)
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_indirect_call
274.type	OPENSSL_indirect_call,@function
275.align	16
276OPENSSL_indirect_call:
277.L_OPENSSL_indirect_call_begin:
278	pushl	%ebp
279	movl	%esp,%ebp
280	subl	$28,%esp
281	movl	12(%ebp),%ecx
282	movl	%ecx,(%esp)
283	movl	16(%ebp),%edx
284	movl	%edx,4(%esp)
285	movl	20(%ebp),%eax
286	movl	%eax,8(%esp)
287	movl	24(%ebp),%eax
288	movl	%eax,12(%esp)
289	movl	28(%ebp),%eax
290	movl	%eax,16(%esp)
291	movl	32(%ebp),%eax
292	movl	%eax,20(%esp)
293	movl	36(%ebp),%eax
294	movl	%eax,24(%esp)
295	call	*8(%ebp)
296	movl	%ebp,%esp
297	popl	%ebp
298	ret
299.size	OPENSSL_indirect_call,.-.L_OPENSSL_indirect_call_begin
300.globl	OPENSSL_cleanse
301.type	OPENSSL_cleanse,@function
302.align	16
303OPENSSL_cleanse:
304.L_OPENSSL_cleanse_begin:
305	movl	4(%esp),%edx
306	movl	8(%esp),%ecx
307	xorl	%eax,%eax
308	cmpl	$7,%ecx
309	jae	.L019lot
310	cmpl	$0,%ecx
311	je	.L020ret
312.L021little:
313	movb	%al,(%edx)
314	subl	$1,%ecx
315	leal	1(%edx),%edx
316	jnz	.L021little
317.L020ret:
318	ret
319.align	16
320.L019lot:
321	testl	$3,%edx
322	jz	.L022aligned
323	movb	%al,(%edx)
324	leal	-1(%ecx),%ecx
325	leal	1(%edx),%edx
326	jmp	.L019lot
327.L022aligned:
328	movl	%eax,(%edx)
329	leal	-4(%ecx),%ecx
330	testl	$-4,%ecx
331	leal	4(%edx),%edx
332	jnz	.L022aligned
333	cmpl	$0,%ecx
334	jne	.L021little
335	ret
336.size	OPENSSL_cleanse,.-.L_OPENSSL_cleanse_begin
337.globl	CRYPTO_memcmp
338.type	CRYPTO_memcmp,@function
339.align	16
340CRYPTO_memcmp:
341.L_CRYPTO_memcmp_begin:
342	pushl	%esi
343	pushl	%edi
344	movl	12(%esp),%esi
345	movl	16(%esp),%edi
346	movl	20(%esp),%ecx
347	xorl	%eax,%eax
348	xorl	%edx,%edx
349	cmpl	$0,%ecx
350	je	.L023no_data
351.L024loop:
352	movb	(%esi),%dl
353	leal	1(%esi),%esi
354	xorb	(%edi),%dl
355	leal	1(%edi),%edi
356	orb	%dl,%al
357	decl	%ecx
358	jnz	.L024loop
359	negl	%eax
360	shrl	$31,%eax
361.L023no_data:
362	popl	%edi
363	popl	%esi
364	ret
365.size	CRYPTO_memcmp,.-.L_CRYPTO_memcmp_begin
366.globl	OPENSSL_instrument_bus
367.type	OPENSSL_instrument_bus,@function
368.align	16
369OPENSSL_instrument_bus:
370.L_OPENSSL_instrument_bus_begin:
371	pushl	%ebp
372	pushl	%ebx
373	pushl	%esi
374	pushl	%edi
375	movl	$0,%eax
376	call	.L025PIC_me_up
377.L025PIC_me_up:
378	popl	%edx
379	leal	OPENSSL_ia32cap_P-.L025PIC_me_up(%edx),%edx
380	btl	$4,(%edx)
381	jnc	.L026nogo
382	btl	$19,(%edx)
383	jnc	.L026nogo
384	movl	20(%esp),%edi
385	movl	24(%esp),%ecx
386	.byte	0x0f,0x31
387	movl	%eax,%esi
388	movl	$0,%ebx
389	clflush	(%edi)
390.byte	240
391	addl	%ebx,(%edi)
392	jmp	.L027loop
393.align	16
394.L027loop:
395	.byte	0x0f,0x31
396	movl	%eax,%edx
397	subl	%esi,%eax
398	movl	%edx,%esi
399	movl	%eax,%ebx
400	clflush	(%edi)
401.byte	240
402	addl	%eax,(%edi)
403	leal	4(%edi),%edi
404	subl	$1,%ecx
405	jnz	.L027loop
406	movl	24(%esp),%eax
407.L026nogo:
408	popl	%edi
409	popl	%esi
410	popl	%ebx
411	popl	%ebp
412	ret
413.size	OPENSSL_instrument_bus,.-.L_OPENSSL_instrument_bus_begin
414.globl	OPENSSL_instrument_bus2
415.type	OPENSSL_instrument_bus2,@function
416.align	16
417OPENSSL_instrument_bus2:
418.L_OPENSSL_instrument_bus2_begin:
419	pushl	%ebp
420	pushl	%ebx
421	pushl	%esi
422	pushl	%edi
423	movl	$0,%eax
424	call	.L028PIC_me_up
425.L028PIC_me_up:
426	popl	%edx
427	leal	OPENSSL_ia32cap_P-.L028PIC_me_up(%edx),%edx
428	btl	$4,(%edx)
429	jnc	.L029nogo
430	btl	$19,(%edx)
431	jnc	.L029nogo
432	movl	20(%esp),%edi
433	movl	24(%esp),%ecx
434	movl	28(%esp),%ebp
435	.byte	0x0f,0x31
436	movl	%eax,%esi
437	movl	$0,%ebx
438	clflush	(%edi)
439.byte	240
440	addl	%ebx,(%edi)
441	.byte	0x0f,0x31
442	movl	%eax,%edx
443	subl	%esi,%eax
444	movl	%edx,%esi
445	movl	%eax,%ebx
446	jmp	.L030loop2
447.align	16
448.L030loop2:
449	clflush	(%edi)
450.byte	240
451	addl	%eax,(%edi)
452	subl	$1,%ebp
453	jz	.L031done2
454	.byte	0x0f,0x31
455	movl	%eax,%edx
456	subl	%esi,%eax
457	movl	%edx,%esi
458	cmpl	%ebx,%eax
459	movl	%eax,%ebx
460	movl	$0,%edx
461	setne	%dl
462	subl	%edx,%ecx
463	leal	(%edi,%edx,4),%edi
464	jnz	.L030loop2
465.L031done2:
466	movl	24(%esp),%eax
467	subl	%ecx,%eax
468.L029nogo:
469	popl	%edi
470	popl	%esi
471	popl	%ebx
472	popl	%ebp
473	ret
474.size	OPENSSL_instrument_bus2,.-.L_OPENSSL_instrument_bus2_begin
475.globl	OPENSSL_ia32_rdrand
476.type	OPENSSL_ia32_rdrand,@function
477.align	16
478OPENSSL_ia32_rdrand:
479.L_OPENSSL_ia32_rdrand_begin:
480	movl	$8,%ecx
481.L032loop:
482.byte	15,199,240
483	jc	.L033break
484	loop	.L032loop
485.L033break:
486	cmpl	$0,%eax
487	cmovel	%ecx,%eax
488	ret
489.size	OPENSSL_ia32_rdrand,.-.L_OPENSSL_ia32_rdrand_begin
490.globl	OPENSSL_ia32_rdrand_bytes
491.type	OPENSSL_ia32_rdrand_bytes,@function
492.align	16
493OPENSSL_ia32_rdrand_bytes:
494.L_OPENSSL_ia32_rdrand_bytes_begin:
495	pushl	%edi
496	pushl	%ebx
497	xorl	%eax,%eax
498	movl	12(%esp),%edi
499	movl	16(%esp),%ebx
500	cmpl	$0,%ebx
501	je	.L034done
502	movl	$8,%ecx
503.L035loop:
504.byte	15,199,242
505	jc	.L036break
506	loop	.L035loop
507	jmp	.L034done
508.align	16
509.L036break:
510	cmpl	$4,%ebx
511	jb	.L037tail
512	movl	%edx,(%edi)
513	leal	4(%edi),%edi
514	addl	$4,%eax
515	subl	$4,%ebx
516	jz	.L034done
517	movl	$8,%ecx
518	jmp	.L035loop
519.align	16
520.L037tail:
521	movb	%dl,(%edi)
522	leal	1(%edi),%edi
523	incl	%eax
524	shrl	$8,%edx
525	decl	%ebx
526	jnz	.L037tail
527.L034done:
528	popl	%ebx
529	popl	%edi
530	ret
531.size	OPENSSL_ia32_rdrand_bytes,.-.L_OPENSSL_ia32_rdrand_bytes_begin
532.globl	OPENSSL_ia32_rdseed
533.type	OPENSSL_ia32_rdseed,@function
534.align	16
535OPENSSL_ia32_rdseed:
536.L_OPENSSL_ia32_rdseed_begin:
537	movl	$8,%ecx
538.L038loop:
539.byte	15,199,248
540	jc	.L039break
541	loop	.L038loop
542.L039break:
543	cmpl	$0,%eax
544	cmovel	%ecx,%eax
545	ret
546.size	OPENSSL_ia32_rdseed,.-.L_OPENSSL_ia32_rdseed_begin
547.globl	OPENSSL_ia32_rdseed_bytes
548.type	OPENSSL_ia32_rdseed_bytes,@function
549.align	16
550OPENSSL_ia32_rdseed_bytes:
551.L_OPENSSL_ia32_rdseed_bytes_begin:
552	pushl	%edi
553	pushl	%ebx
554	xorl	%eax,%eax
555	movl	12(%esp),%edi
556	movl	16(%esp),%ebx
557	cmpl	$0,%ebx
558	je	.L040done
559	movl	$8,%ecx
560.L041loop:
561.byte	15,199,250
562	jc	.L042break
563	loop	.L041loop
564	jmp	.L040done
565.align	16
566.L042break:
567	cmpl	$4,%ebx
568	jb	.L043tail
569	movl	%edx,(%edi)
570	leal	4(%edi),%edi
571	addl	$4,%eax
572	subl	$4,%ebx
573	jz	.L040done
574	movl	$8,%ecx
575	jmp	.L041loop
576.align	16
577.L043tail:
578	movb	%dl,(%edi)
579	leal	1(%edi),%edi
580	incl	%eax
581	shrl	$8,%edx
582	decl	%ebx
583	jnz	.L043tail
584.L040done:
585	popl	%ebx
586	popl	%edi
587	ret
588.size	OPENSSL_ia32_rdseed_bytes,.-.L_OPENSSL_ia32_rdseed_bytes_begin
589.hidden	OPENSSL_cpuid_setup
590.hidden	OPENSSL_ia32cap_P
591.comm	OPENSSL_ia32cap_P,16,4
592.section	.init
593	PIC_PROLOGUE
594	call	PIC_PLT(OPENSSL_cpuid_setup)
595	PIC_EPILOGUE
596