1/ This Source Code Form is subject to the terms of the Mozilla Public
2/ License, v. 2.0. If a copy of the MPL was not distributed with this
3/ file, You can obtain one at http://mozilla.org/MPL/2.0/.
4
5	.file	"mpcpucache.c"
6/	.section	.rodata.str1.1,"aMS",@progbits,1
7	.section	.rodata
8.LC0:
9	.string	"GenuineIntel"
10.LC1:
11	.string	"AuthenticAMD"
12.LC2:
13	.string	"CyrixInstead"
14.LC3:
15	.string	"CentaurHauls"
16.LC4:
17	.string	"NexGenDriven"
18.LC5:
19	.string	"GenuineTMx86"
20.LC6:
21	.string	"RiseRiseRise"
22.LC7:
23	.string	"UMC UMC UMC "
24.LC8:
25	.string	"Sis Sis Sis "
26.LC9:
27	.string	"Geode by NSC"
28	.section	.data.rel.ro.local,"aw",@progbits
29	.align 32
30	.type	manMap, @object
31	.size	manMap, 80
32manMap:
33	.quad	.LC0
34	.quad	.LC1
35	.quad	.LC2
36	.quad	.LC3
37	.quad	.LC4
38	.quad	.LC5
39	.quad	.LC6
40	.quad	.LC7
41	.quad	.LC8
42	.quad	.LC9
43	.section	.rodata
44	.align 32
45	.type	CacheMap, @object
46	.size	CacheMap, 512
47CacheMap:
48	.byte	0
49	.byte	0
50	.byte	3
51	.byte	0
52	.byte	3
53	.byte	0
54	.byte	4
55	.byte	0
56	.byte	4
57	.zero	1
58	.byte	1
59	.byte	0
60	.byte	7
61	.byte	32
62	.byte	1
63	.byte	0
64	.byte	7
65	.byte	32
66	.byte	1
67	.byte	0
68	.byte	8
69	.byte	32
70	.byte	1
71	.byte	0
72	.byte	8
73	.byte	32
74	.byte	1
75	.byte	0
76	.byte	1
77	.byte	0
78	.byte	1
79	.byte	0
80	.byte	1
81	.byte	0
82	.byte	1
83	.byte	0
84	.byte	1
85	.byte	0
86	.byte	1
87	.byte	0
88	.byte	1
89	.byte	0
90	.byte	1
91	.byte	0
92	.byte	1
93	.byte	0
94	.byte	1
95	.byte	0
96	.byte	1
97	.byte	0
98	.byte	1
99	.byte	0
100	.byte	1
101	.byte	0
102	.byte	1
103	.byte	0
104	.byte	1
105	.byte	0
106	.byte	1
107	.byte	0
108	.byte	1
109	.byte	0
110	.byte	1
111	.byte	0
112	.byte	1
113	.byte	0
114	.byte	1
115	.byte	0
116	.byte	12
117	.byte	64
118	.byte	12
119	.byte	64
120	.byte	1
121	.byte	0
122	.byte	12
123	.byte	64
124	.byte	1
125	.byte	0
126	.byte	1
127	.byte	0
128	.byte	1
129	.byte	0
130	.byte	12
131	.byte	64
132	.byte	1
133	.byte	0
134	.byte	1
135	.byte	0
136	.byte	8
137	.byte	64
138	.byte	1
139	.byte	0
140	.byte	1
141	.byte	0
142	.byte	1
143	.byte	0
144	.byte	7
145	.byte	64
146	.byte	1
147	.byte	0
148	.byte	1
149	.byte	0
150	.byte	1
151	.byte	0
152	.byte	1
153	.byte	0
154	.byte	1
155	.byte	0
156	.byte	1
157	.byte	0
158	.byte	1
159	.byte	0
160	.byte	1
161	.byte	0
162	.byte	9
163	.byte	64
164	.byte	1
165	.byte	0
166	.byte	9
167	.byte	64
168	.byte	9
169	.byte	64
170	.byte	1
171	.byte	0
172	.byte	1
173	.byte	0
174	.byte	1
175	.byte	0
176	.byte	9
177	.byte	0
178	.byte	9
179	.byte	32
180	.byte	9
181	.byte	32
182	.byte	9
183	.byte	32
184	.byte	9
185	.byte	32
186	.byte	9
187	.byte	32
188	.byte	1
189	.byte	0
190	.byte	1
191	.byte	0
192	.byte	1
193	.byte	0
194	.byte	1
195	.byte	0
196	.byte	1
197	.byte	0
198	.byte	1
199	.byte	0
200	.byte	1
201	.byte	0
202	.byte	1
203	.byte	0
204	.byte	1
205	.byte	0
206	.byte	1
207	.byte	0
208	.byte	3
209	.byte	0
210	.byte	3
211	.byte	0
212	.byte	3
213	.byte	0
214	.byte	1
215	.byte	0
216	.byte	1
217	.byte	0
218	.byte	1
219	.byte	0
220	.byte	1
221	.byte	0
222	.byte	1
223	.byte	0
224	.byte	1
225	.byte	0
226	.byte	1
227	.byte	0
228	.byte	1
229	.byte	0
230	.byte	4
231	.byte	0
232	.byte	4
233	.byte	0
234	.byte	4
235	.byte	0
236	.byte	1
237	.byte	0
238	.byte	1
239	.byte	0
240	.byte	1
241	.byte	0
242	.byte	1
243	.byte	0
244	.byte	1
245	.byte	0
246	.byte	1
247	.byte	0
248	.byte	1
249	.byte	0
250	.byte	1
251	.byte	0
252	.byte	8
253	.byte	64
254	.byte	8
255	.byte	64
256	.byte	8
257	.byte	64
258	.byte	1
259	.byte	0
260	.byte	1
261	.byte	0
262	.byte	1
263	.byte	0
264	.byte	1
265	.byte	0
266	.byte	1
267	.byte	0
268	.byte	1
269	.byte	0
270	.byte	1
271	.byte	0
272	.byte	5
273	.byte	1
274	.byte	5
275	.byte	1
276	.byte	5
277	.byte	1
278	.byte	1
279	.byte	0
280	.byte	1
281	.byte	0
282	.byte	1
283	.byte	0
284	.byte	1
285	.byte	0
286	.byte	1
287	.byte	0
288	.byte	1
289	.byte	0
290	.byte	9
291	.byte	64
292	.byte	9
293	.byte	64
294	.byte	9
295	.byte	64
296	.byte	9
297	.byte	64
298	.byte	1
299	.byte	0
300	.byte	1
301	.byte	0
302	.byte	1
303	.byte	0
304	.byte	1
305	.byte	0
306	.byte	1
307	.byte	0
308	.byte	9
309	.byte	32
310	.byte	9
311	.byte	32
312	.byte	9
313	.byte	32
314	.byte	9
315	.byte	32
316	.byte	9
317	.byte	64
318	.byte	9
319	.byte	64
320	.byte	1
321	.byte	0
322	.byte	1
323	.byte	0
324	.byte	1
325	.byte	0
326	.byte	1
327	.byte	0
328	.byte	1
329	.byte	0
330	.byte	1
331	.byte	0
332	.byte	1
333	.byte	0
334	.byte	1
335	.byte	0
336	.byte	1
337	.byte	0
338	.byte	1
339	.byte	0
340	.byte	1
341	.byte	0
342	.byte	1
343	.byte	0
344	.byte	1
345	.byte	0
346	.byte	1
347	.byte	0
348	.byte	1
349	.byte	0
350	.byte	1
351	.byte	0
352	.byte	1
353	.byte	0
354	.byte	1
355	.byte	0
356	.byte	1
357	.byte	0
358	.byte	1
359	.byte	0
360	.byte	1
361	.byte	0
362	.byte	1
363	.byte	0
364	.byte	1
365	.byte	0
366	.byte	1
367	.byte	0
368	.byte	1
369	.byte	0
370	.byte	1
371	.byte	0
372	.byte	1
373	.byte	0
374	.byte	1
375	.byte	0
376	.byte	1
377	.byte	0
378	.byte	1
379	.byte	0
380	.byte	1
381	.byte	0
382	.byte	1
383	.byte	0
384	.byte	1
385	.byte	0
386	.byte	1
387	.byte	0
388	.byte	1
389	.byte	0
390	.byte	1
391	.byte	0
392	.byte	1
393	.byte	0
394	.byte	1
395	.byte	0
396	.byte	1
397	.byte	0
398	.byte	1
399	.byte	0
400	.byte	3
401	.byte	0
402	.byte	1
403	.byte	0
404	.byte	1
405	.byte	0
406	.byte	4
407	.byte	0
408	.byte	1
409	.byte	0
410	.byte	1
411	.byte	0
412	.byte	1
413	.byte	0
414	.byte	1
415	.byte	0
416	.byte	1
417	.byte	0
418	.byte	1
419	.byte	0
420	.byte	1
421	.byte	0
422	.byte	1
423	.byte	0
424	.byte	1
425	.byte	0
426	.byte	1
427	.byte	0
428	.byte	1
429	.byte	0
430	.byte	1
431	.byte	0
432	.byte	1
433	.byte	0
434	.byte	1
435	.byte	0
436	.byte	1
437	.byte	0
438	.byte	1
439	.byte	0
440	.byte	1
441	.byte	0
442	.byte	1
443	.byte	0
444	.byte	1
445	.byte	0
446	.byte	1
447	.byte	0
448	.byte	1
449	.byte	0
450	.byte	1
451	.byte	0
452	.byte	1
453	.byte	0
454	.byte	1
455	.byte	0
456	.byte	1
457	.byte	0
458	.byte	1
459	.byte	0
460	.byte	1
461	.byte	0
462	.byte	1
463	.byte	0
464	.byte	1
465	.byte	0
466	.byte	1
467	.byte	0
468	.byte	1
469	.byte	0
470	.byte	1
471	.byte	0
472	.byte	1
473	.byte	0
474	.byte	1
475	.byte	0
476	.byte	1
477	.byte	0
478	.byte	1
479	.byte	0
480	.byte	1
481	.byte	0
482	.byte	1
483	.byte	0
484	.byte	1
485	.byte	0
486	.byte	1
487	.byte	0
488	.byte	1
489	.byte	0
490	.byte	1
491	.byte	0
492	.byte	1
493	.byte	0
494	.byte	1
495	.byte	0
496	.byte	1
497	.byte	0
498	.byte	1
499	.byte	0
500	.byte	1
501	.byte	0
502	.byte	1
503	.byte	0
504	.byte	1
505	.byte	0
506	.byte	1
507	.byte	0
508	.byte	1
509	.byte	0
510	.byte	1
511	.byte	0
512	.byte	1
513	.byte	0
514	.byte	1
515	.byte	0
516	.byte	1
517	.byte	0
518	.byte	1
519	.byte	0
520	.byte	1
521	.byte	0
522	.byte	1
523	.byte	0
524	.byte	1
525	.byte	0
526	.byte	1
527	.byte	0
528	.byte	1
529	.byte	0
530	.byte	1
531	.byte	0
532	.byte	1
533	.byte	0
534	.byte	1
535	.byte	0
536	.byte	1
537	.byte	0
538	.byte	1
539	.byte	0
540	.byte	1
541	.byte	0
542	.byte	1
543	.byte	0
544	.byte	1
545	.byte	0
546	.byte	1
547	.byte	0
548	.byte	1
549	.byte	0
550	.byte	1
551	.byte	0
552	.byte	1
553	.byte	0
554	.byte	1
555	.byte	0
556	.byte	1
557	.byte	0
558	.byte	1
559	.byte	0
560	.text
561	.align	16
562.globl freebl_cpuid
563	.type	freebl_cpuid, @function
564freebl_cpuid:
565.LFB2:
566	movq	%rdx, %r10
567	pushq	%rbx
568.LCFI0:
569	movq	%rcx, %r11
570	movq	%rdi, %rax
571/APP
572	cpuid
573
574/NO_APP
575	movq	%rax, (%rsi)
576	movq	%rbx, (%r10)
577	popq	%rbx
578	movq	%rcx, (%r11)
579	movq	%rdx, (%r8)
580	ret
581.LFE2:
582	.size	freebl_cpuid, .-freebl_cpuid
583	.align	16
584	.type	getIntelCacheEntryLineSize, @function
585getIntelCacheEntryLineSize:
586.LFB3:
587	leaq	CacheMap(%rip), %r9
588	movq	%rdx, %r10
589	movzbl	1(%r9,%rdi,2), %ecx
590	movzbl	(%r9,%rdi,2), %r8d
591	testb	%cl, %cl
592	je	.L2
593	cmpl	$6, %r8d
594	sete	%dl
595	cmpl	$8, %r8d
596	sete	%al
597	orl	%edx, %eax
598	testb	$1, %al
599	je	.L4
600	movl	$1, (%rsi)
601.L9:
602	movzbl	%cl, %eax
603	movq	%rax, (%r10)
604	ret
605	.align	16
606.L4:
607	movl	(%rsi), %r11d
608	cmpl	$1, %r11d
609	jg	.L11
610.L6:
611	cmpl	$2, %r11d
612	jle	.L2
613	cmpl	$12, %r8d
614	sete	%dl
615	cmpl	$14, %r8d
616	sete	%al
617	orl	%edx, %eax
618	testb	$1, %al
619	je	.L2
620	movzbq	1(%r9,%rdi,2), %rax
621	movl	$3, (%rsi)
622	movq	%rax, (%r10)
623	.align	16
624.L2:
625	rep ; ret
626	.align	16
627.L11:
628	cmpl	$9, %r8d
629	sete	%dl
630	cmpl	$11, %r8d
631	sete	%al
632	orl	%edx, %eax
633	testb	$1, %al
634	je	.L6
635	movl	$2, (%rsi)
636	jmp	.L9
637.LFE3:
638	.size	getIntelCacheEntryLineSize, .-getIntelCacheEntryLineSize
639	.align	16
640	.type	getIntelRegisterCacheLineSize, @function
641getIntelRegisterCacheLineSize:
642.LFB4:
643	pushq	%rbp
644.LCFI1:
645	movq	%rsp, %rbp
646.LCFI2:
647	movq	%rbx, -24(%rbp)
648.LCFI3:
649	movq	%rdi, %rbx
650	shrq	$24, %rdi
651	movq	%r12, -16(%rbp)
652.LCFI4:
653	movq	%r13, -8(%rbp)
654.LCFI5:
655	andl	$255, %edi
656	subq	$24, %rsp
657.LCFI6:
658	movq	%rsi, %r13
659	movq	%rdx, %r12
660	call	getIntelCacheEntryLineSize
661	movq	%rbx, %rdi
662	movq	%r12, %rdx
663	movq	%r13, %rsi
664	shrq	$16, %rdi
665	andl	$255, %edi
666	call	getIntelCacheEntryLineSize
667	movq	%rbx, %rdi
668	movq	%r12, %rdx
669	movq	%r13, %rsi
670	shrq	$8, %rdi
671	andl	$255, %ebx
672	andl	$255, %edi
673	call	getIntelCacheEntryLineSize
674	movq	%r12, %rdx
675	movq	%r13, %rsi
676	movq	%rbx, %rdi
677	movq	8(%rsp), %r12
678	movq	(%rsp), %rbx
679	movq	16(%rsp), %r13
680	leave
681	jmp	getIntelCacheEntryLineSize
682.LFE4:
683	.size	getIntelRegisterCacheLineSize, .-getIntelRegisterCacheLineSize
684	.align	16
685.globl s_mpi_getProcessorLineSize
686	.type	s_mpi_getProcessorLineSize, @function
687s_mpi_getProcessorLineSize:
688.LFB7:
689	pushq	%rbp
690.LCFI7:
691	xorl	%edi, %edi
692	movq	%rsp, %rbp
693.LCFI8:
694	pushq	%r15
695.LCFI9:
696	leaq	-136(%rbp), %r8
697	leaq	-144(%rbp), %rcx
698	leaq	-152(%rbp), %rdx
699	pushq	%r14
700.LCFI10:
701	leaq	-160(%rbp), %rsi
702	leaq	-128(%rbp), %r14
703	pushq	%r13
704.LCFI11:
705	leaq	manMap(%rip), %r13
706	pushq	%r12
707.LCFI12:
708	movl	$9, %r12d
709	pushq	%rbx
710.LCFI13:
711	xorl	%ebx, %ebx
712	subq	$200, %rsp
713.LCFI14:
714	call	freebl_cpuid
715	movq	-152(%rbp), %rax
716	movq	-160(%rbp), %r15
717	movb	$0, -116(%rbp)
718	movl	%eax, -128(%rbp)
719	movq	-136(%rbp), %rax
720	movl	%eax, -124(%rbp)
721	movq	-144(%rbp), %rax
722	movl	%eax, -120(%rbp)
723	.align	16
724.L18:
725	movslq	%ebx,%rax
726	movq	%r14, %rsi
727	movq	(%r13,%rax,8), %rdi
728	call	strcmp@PLT
729	testl	%eax, %eax
730	cmove	%ebx, %r12d
731	incl	%ebx
732	cmpl	$9, %ebx
733	jle	.L18
734	testl	%r12d, %r12d
735	jne	.L19
736	xorl	%eax, %eax
737	decl	%r15d
738	movl	$4, -204(%rbp)
739	movq	$0, -200(%rbp)
740	jle	.L21
741	leaq	-168(%rbp), %r8
742	leaq	-176(%rbp), %rcx
743	leaq	-184(%rbp), %rdx
744	leaq	-192(%rbp), %rsi
745	movl	$2, %edi
746	xorl	%ebx, %ebx
747	call	freebl_cpuid
748	movq	-192(%rbp), %rdi
749	movl	%edi, %r12d
750	andl	$15, %r12d
751	cmpl	%r12d, %ebx
752	jl	.L30
753	jmp	.L38
754	.align	16
755.L25:
756	movq	-184(%rbp), %rdi
757	testl	$2147483648, %edi
758	je	.L40
759.L26:
760	movq	-176(%rbp), %rdi
761	testl	$2147483648, %edi
762	je	.L41
763.L27:
764	movq	-168(%rbp), %rdi
765	testl	$2147483648, %edi
766	je	.L42
767.L28:
768	incl	%ebx
769	cmpl	%r12d, %ebx
770	je	.L24
771	leaq	-168(%rbp), %r8
772	leaq	-176(%rbp), %rcx
773	leaq	-184(%rbp), %rdx
774	leaq	-192(%rbp), %rsi
775	movl	$2, %edi
776	call	freebl_cpuid
777.L24:
778	cmpl	%r12d, %ebx
779	jge	.L38
780	movq	-192(%rbp), %rdi
781.L30:
782	testl	$2147483648, %edi
783	jne	.L25
784	leaq	-200(%rbp), %rdx
785	leaq	-204(%rbp), %rsi
786	andl	$4294967040, %edi
787	call	getIntelRegisterCacheLineSize
788	movq	-184(%rbp), %rdi
789	testl	$2147483648, %edi
790	jne	.L26
791.L40:
792	leaq	-200(%rbp), %rdx
793	leaq	-204(%rbp), %rsi
794	call	getIntelRegisterCacheLineSize
795	movq	-176(%rbp), %rdi
796	testl	$2147483648, %edi
797	jne	.L27
798.L41:
799	leaq	-200(%rbp), %rdx
800	leaq	-204(%rbp), %rsi
801	call	getIntelRegisterCacheLineSize
802	movq	-168(%rbp), %rdi
803	testl	$2147483648, %edi
804	jne	.L28
805.L42:
806	leaq	-200(%rbp), %rdx
807	leaq	-204(%rbp), %rsi
808	call	getIntelRegisterCacheLineSize
809	jmp	.L28
810.L38:
811	movq	-200(%rbp), %rax
812.L21:
813	movq	%rax, %rdx
814	movl	$32, %eax
815	testq	%rdx, %rdx
816	cmoveq	%rax, %rdx
817	addq	$200, %rsp
818	popq	%rbx
819	popq	%r12
820	popq	%r13
821	popq	%r14
822	popq	%r15
823	leave
824	movq	%rdx, %rax
825	ret
826.L19:
827	leaq	-216(%rbp), %r8
828	leaq	-224(%rbp), %rcx
829	leaq	-232(%rbp), %rdx
830	leaq	-240(%rbp), %rsi
831	movl	$2147483648, %edi
832	xorl	%ebx, %ebx
833	call	freebl_cpuid
834	movl	$2147483652, %eax
835	cmpq	%rax, -240(%rbp)
836	ja	.L43
837.L32:
838	movq	%rbx, %rdx
839	movl	$32, %eax
840	testq	%rdx, %rdx
841	cmoveq	%rax, %rdx
842	addq	$200, %rsp
843	popq	%rbx
844	popq	%r12
845	popq	%r13
846	popq	%r14
847	popq	%r15
848	leave
849	movq	%rdx, %rax
850	ret
851.L43:
852	leaq	-216(%rbp), %r8
853	leaq	-224(%rbp), %rcx
854	leaq	-232(%rbp), %rdx
855	leaq	-240(%rbp), %rsi
856	movl	$2147483653, %edi
857	call	freebl_cpuid
858	movzbq	-224(%rbp), %rbx
859	jmp	.L32
860.LFE7:
861	.size	s_mpi_getProcessorLineSize, .-s_mpi_getProcessorLineSize
862