xref: /netbsd-src/crypto/external/bsd/openssl/lib/libcrypto/arch/i386/x86cpuid.S (revision 1b9578b8c2c1f848eeb16dabbfd7d1f0d9fdefbd)
1.file	"x86cpuid.s"
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	btl	$21,%ecx
23	jnc	.L000done
24	xorl	%eax,%eax
25	.byte	0x0f,0xa2
26	movl	%eax,%edi
27	xorl	%eax,%eax
28	cmpl	$1970169159,%ebx
29	setne	%al
30	movl	%eax,%ebp
31	cmpl	$1231384169,%edx
32	setne	%al
33	orl	%eax,%ebp
34	cmpl	$1818588270,%ecx
35	setne	%al
36	orl	%eax,%ebp
37	jz	.L001intel
38	cmpl	$1752462657,%ebx
39	setne	%al
40	movl	%eax,%esi
41	cmpl	$1769238117,%edx
42	setne	%al
43	orl	%eax,%esi
44	cmpl	$1145913699,%ecx
45	setne	%al
46	orl	%eax,%esi
47	jnz	.L001intel
48	movl	$2147483648,%eax
49	.byte	0x0f,0xa2
50	cmpl	$2147483656,%eax
51	jb	.L001intel
52	movl	$2147483656,%eax
53	.byte	0x0f,0xa2
54	movzbl	%cl,%esi
55	incl	%esi
56	movl	$1,%eax
57	.byte	0x0f,0xa2
58	btl	$28,%edx
59	jnc	.L000done
60	shrl	$16,%ebx
61	andl	$255,%ebx
62	cmpl	%esi,%ebx
63	ja	.L000done
64	andl	$4026531839,%edx
65	jmp	.L000done
66.L001intel:
67	cmpl	$4,%edi
68	movl	$-1,%edi
69	jb	.L002nocacheinfo
70	movl	$4,%eax
71	movl	$0,%ecx
72	.byte	0x0f,0xa2
73	movl	%eax,%edi
74	shrl	$14,%edi
75	andl	$4095,%edi
76.L002nocacheinfo:
77	movl	$1,%eax
78	.byte	0x0f,0xa2
79	cmpl	$0,%ebp
80	jne	.L003notP4
81	andb	$15,%ah
82	cmpb	$15,%ah
83	jne	.L003notP4
84	orl	$1048576,%edx
85.L003notP4:
86	btl	$28,%edx
87	jnc	.L000done
88	andl	$4026531839,%edx
89	cmpl	$0,%edi
90	je	.L000done
91	orl	$268435456,%edx
92	shrl	$16,%ebx
93	cmpb	$1,%bl
94	ja	.L000done
95	andl	$4026531839,%edx
96.L000done:
97	movl	%edx,%eax
98	movl	%ecx,%edx
99	popl	%edi
100	popl	%esi
101	popl	%ebx
102	popl	%ebp
103	ret
104.size	OPENSSL_ia32_cpuid,.-.L_OPENSSL_ia32_cpuid_begin
105.globl	OPENSSL_rdtsc
106.type	OPENSSL_rdtsc,@function
107.align	16
108OPENSSL_rdtsc:
109.L_OPENSSL_rdtsc_begin:
110	xorl	%eax,%eax
111	xorl	%edx,%edx
112	call	.L004PIC_me_up
113.L004PIC_me_up:
114	popl	%ecx
115	leal	_GLOBAL_OFFSET_TABLE_+[.-.L004PIC_me_up](%ecx),%ecx
116	movl	OPENSSL_ia32cap_P@GOT(%ecx),%ecx
117	btl	$4,(%ecx)
118	jnc	.L005notsc
119	.byte	0x0f,0x31
120.L005notsc:
121	ret
122.size	OPENSSL_rdtsc,.-.L_OPENSSL_rdtsc_begin
123.globl	OPENSSL_instrument_halt
124.type	OPENSSL_instrument_halt,@function
125.align	16
126OPENSSL_instrument_halt:
127.L_OPENSSL_instrument_halt_begin:
128	call	.L006PIC_me_up
129.L006PIC_me_up:
130	popl	%ecx
131	leal	_GLOBAL_OFFSET_TABLE_+[.-.L006PIC_me_up](%ecx),%ecx
132	movl	OPENSSL_ia32cap_P@GOT(%ecx),%ecx
133	btl	$4,(%ecx)
134	jnc	.L007nohalt
135.long	2421723150
136	andl	$3,%eax
137	jnz	.L007nohalt
138	pushfl
139	popl	%eax
140	btl	$9,%eax
141	jnc	.L007nohalt
142	.byte	0x0f,0x31
143	pushl	%edx
144	pushl	%eax
145	hlt
146	.byte	0x0f,0x31
147	subl	(%esp),%eax
148	sbbl	4(%esp),%edx
149	addl	$8,%esp
150	ret
151.L007nohalt:
152	xorl	%eax,%eax
153	xorl	%edx,%edx
154	ret
155.size	OPENSSL_instrument_halt,.-.L_OPENSSL_instrument_halt_begin
156.globl	OPENSSL_far_spin
157.type	OPENSSL_far_spin,@function
158.align	16
159OPENSSL_far_spin:
160.L_OPENSSL_far_spin_begin:
161	pushfl
162	popl	%eax
163	btl	$9,%eax
164	jnc	.L008nospin
165	movl	4(%esp),%eax
166	movl	8(%esp),%ecx
167.long	2430111262
168	xorl	%eax,%eax
169	movl	(%ecx),%edx
170	jmp	.L009spin
171.align	16
172.L009spin:
173	incl	%eax
174	cmpl	(%ecx),%edx
175	je	.L009spin
176.long	529567888
177	ret
178.L008nospin:
179	xorl	%eax,%eax
180	xorl	%edx,%edx
181	ret
182.size	OPENSSL_far_spin,.-.L_OPENSSL_far_spin_begin
183.globl	OPENSSL_wipe_cpu
184.type	OPENSSL_wipe_cpu,@function
185.align	16
186OPENSSL_wipe_cpu:
187.L_OPENSSL_wipe_cpu_begin:
188	xorl	%eax,%eax
189	xorl	%edx,%edx
190	call	.L010PIC_me_up
191.L010PIC_me_up:
192	popl	%ecx
193	leal	_GLOBAL_OFFSET_TABLE_+[.-.L010PIC_me_up](%ecx),%ecx
194	movl	OPENSSL_ia32cap_P@GOT(%ecx),%ecx
195	movl	(%ecx),%ecx
196	btl	$1,(%ecx)
197	jnc	.L011no_x87
198.long	4007259865,4007259865,4007259865,4007259865,2430851995
199.L011no_x87:
200	leal	4(%esp),%eax
201	ret
202.size	OPENSSL_wipe_cpu,.-.L_OPENSSL_wipe_cpu_begin
203.globl	OPENSSL_atomic_add
204.type	OPENSSL_atomic_add,@function
205.align	16
206OPENSSL_atomic_add:
207.L_OPENSSL_atomic_add_begin:
208	movl	4(%esp),%edx
209	movl	8(%esp),%ecx
210	pushl	%ebx
211	nop
212	movl	(%edx),%eax
213.L012spin:
214	leal	(%eax,%ecx,1),%ebx
215	nop
216.long	447811568
217	jne	.L012spin
218	movl	%ebx,%eax
219	popl	%ebx
220	ret
221.size	OPENSSL_atomic_add,.-.L_OPENSSL_atomic_add_begin
222.globl	OPENSSL_indirect_call
223.type	OPENSSL_indirect_call,@function
224.align	16
225OPENSSL_indirect_call:
226.L_OPENSSL_indirect_call_begin:
227	pushl	%ebp
228	movl	%esp,%ebp
229	subl	$28,%esp
230	movl	12(%ebp),%ecx
231	movl	%ecx,(%esp)
232	movl	16(%ebp),%edx
233	movl	%edx,4(%esp)
234	movl	20(%ebp),%eax
235	movl	%eax,8(%esp)
236	movl	24(%ebp),%eax
237	movl	%eax,12(%esp)
238	movl	28(%ebp),%eax
239	movl	%eax,16(%esp)
240	movl	32(%ebp),%eax
241	movl	%eax,20(%esp)
242	movl	36(%ebp),%eax
243	movl	%eax,24(%esp)
244	call	*8(%ebp)
245	movl	%ebp,%esp
246	popl	%ebp
247	ret
248.size	OPENSSL_indirect_call,.-.L_OPENSSL_indirect_call_begin
249.globl	OPENSSL_cleanse
250.type	OPENSSL_cleanse,@function
251.align	16
252OPENSSL_cleanse:
253.L_OPENSSL_cleanse_begin:
254	movl	4(%esp),%edx
255	movl	8(%esp),%ecx
256	xorl	%eax,%eax
257	cmpl	$7,%ecx
258	jae	.L013lot
259	cmpl	$0,%ecx
260	je	.L014ret
261.L015little:
262	movb	%al,(%edx)
263	subl	$1,%ecx
264	leal	1(%edx),%edx
265	jnz	.L015little
266.L014ret:
267	ret
268.align	16
269.L013lot:
270	testl	$3,%edx
271	jz	.L016aligned
272	movb	%al,(%edx)
273	leal	-1(%ecx),%ecx
274	leal	1(%edx),%edx
275	jmp	.L013lot
276.L016aligned:
277	movl	%eax,(%edx)
278	leal	-4(%ecx),%ecx
279	testl	$-4,%ecx
280	leal	4(%edx),%edx
281	jnz	.L016aligned
282	cmpl	$0,%ecx
283	jne	.L015little
284	ret
285.size	OPENSSL_cleanse,.-.L_OPENSSL_cleanse_begin
286.comm	OPENSSL_ia32cap_P,4,4
287.section	.init
288	call	OPENSSL_cpuid_setup
289	jmp	.Linitalign
290.align	16
291.Linitalign:
292