Mercurial > mplayer.hg
annotate cpudetect.c @ 34548:215379500aac
Do not apply writing order via fribidi when libass will be doing it.
This lead to the order being flipped twice, and thus looking
as if it was not done at all.
author | reimar |
---|---|
date | Sat, 28 Jan 2012 14:24:59 +0000 |
parents | 064be070d8c8 |
children | 3e1a4184b70e |
rev | line source |
---|---|
30429
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
1 /* |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
2 * This file is part of MPlayer. |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
3 * |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
7 * (at your option) any later version. |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
8 * |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
12 * GNU General Public License for more details. |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
13 * |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
17 */ |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
18 |
34198 | 19 #include "libavutil/x86_cpu.h" |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
20 #include "config.h" |
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
21 #include "cpudetect.h" |
5937 | 22 #include "mp_msg.h" |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
23 |
3146
3164eaa93396
non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents:
2417
diff
changeset
|
24 CpuCaps gCpuCaps; |
3164eaa93396
non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents:
2417
diff
changeset
|
25 |
3837 | 26 #include <stdlib.h> |
27 | |
28288
3ec634fbcd27
Fix first handful of #if vs. #ifdef for ARCH_, HAVE_SSE etc.
reimar
parents:
28285
diff
changeset
|
28 #if ARCH_X86 |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
29 |
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
30 #include <stdio.h> |
8123
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
6135
diff
changeset
|
31 #include <string.h> |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
32 |
12143 | 33 #if defined (__NetBSD__) || defined(__OpenBSD__) |
8401
1b2fc92980d9
Runtime SSE detection for NEtBSD, patch by Nick Hudson <skrll at netbsd.org>
atmos4
parents:
8123
diff
changeset
|
34 #include <sys/param.h> |
8533
9b73b801af55
Ok, here is a better patch, which even adds a fix to compile it on older
arpi
parents:
8401
diff
changeset
|
35 #include <sys/sysctl.h> |
9b73b801af55
Ok, here is a better patch, which even adds a fix to compile it on older
arpi
parents:
8401
diff
changeset
|
36 #include <machine/cpu.h> |
28364
3e3bd9da4c7e
Use OS preprocessor checks with '#if defined()' consistently.
diego
parents:
28342
diff
changeset
|
37 #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) || defined(__APPLE__) |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
38 #include <sys/types.h> |
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
39 #include <sys/sysctl.h> |
28364
3e3bd9da4c7e
Use OS preprocessor checks with '#if defined()' consistently.
diego
parents:
28342
diff
changeset
|
40 #elif defined(__linux__) |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
41 #include <signal.h> |
28364
3e3bd9da4c7e
Use OS preprocessor checks with '#if defined()' consistently.
diego
parents:
28342
diff
changeset
|
42 #elif defined(__MINGW32__) || defined(__CYGWIN__) |
10440 | 43 #include <windows.h> |
28364
3e3bd9da4c7e
Use OS preprocessor checks with '#if defined()' consistently.
diego
parents:
28342
diff
changeset
|
44 #elif defined(__OS2__) |
26061 | 45 #define INCL_DOS |
46 #include <os2.h> | |
28364
3e3bd9da4c7e
Use OS preprocessor checks with '#if defined()' consistently.
diego
parents:
28342
diff
changeset
|
47 #elif defined(__AMIGAOS4__) |
17702
485f04e5a58c
add Amiga-style AltiVec detection, patch from andrea at amigasoft dot net
pacman
parents:
17566
diff
changeset
|
48 #include <proto/exec.h> |
485f04e5a58c
add Amiga-style AltiVec detection, patch from andrea at amigasoft dot net
pacman
parents:
17566
diff
changeset
|
49 #endif |
485f04e5a58c
add Amiga-style AltiVec detection, patch from andrea at amigasoft dot net
pacman
parents:
17566
diff
changeset
|
50 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29114
diff
changeset
|
51 /* Thanks to the FreeBSD project for some of this cpuid code, and |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29114
diff
changeset
|
52 * help understanding how to use it. Thanks to the Mesa |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
53 * team for SSE support detection and more cpu detect code. |
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
54 */ |
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
55 |
33625
5e3f013bf4c2
Run OS support for SSE check only for runtime CPU detection.
reimar
parents:
32335
diff
changeset
|
56 #if CONFIG_RUNTIME_CPUDETECT |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
57 /* I believe this code works. However, it has only been used on a PII and PIII */ |
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
58 |
32335
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
59 #if defined(__linux__) && defined(_POSIX_SOURCE) && !ARCH_X86_64 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
60 static void sigill_handler_sse( int signal, struct sigcontext sc ) |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
61 { |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
62 mp_msg(MSGT_CPUDETECT,MSGL_V, "SIGILL, " ); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
63 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
64 /* Both the "xorps %%xmm0,%%xmm0" and "divps %xmm0,%%xmm1" |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
65 * instructions are 3 bytes long. We must increment the instruction |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
66 * pointer manually to avoid repeated execution of the offending |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
67 * instruction. |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
68 * |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
69 * If the SIGILL is caused by a divide-by-zero when unmasked |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
70 * exceptions aren't supported, the SIMD FPU status and control |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
71 * word will be restored at the end of the test, so we don't need |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
72 * to worry about doing it here. Besides, we may not be able to... |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
73 */ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
74 sc.eip += 3; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
75 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
76 gCpuCaps.hasSSE=0; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
77 } |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
78 #endif /* __linux__ && _POSIX_SOURCE */ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
79 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
80 #if (defined(__MINGW32__) || defined(__CYGWIN__)) && !ARCH_X86_64 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
81 LONG CALLBACK win32_sig_handler_sse(EXCEPTION_POINTERS* ep) |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
82 { |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
83 if(ep->ExceptionRecord->ExceptionCode==EXCEPTION_ILLEGAL_INSTRUCTION){ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
84 mp_msg(MSGT_CPUDETECT,MSGL_V, "SIGILL, " ); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
85 ep->ContextRecord->Eip +=3; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
86 gCpuCaps.hasSSE=0; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
87 return EXCEPTION_CONTINUE_EXECUTION; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
88 } |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
89 return EXCEPTION_CONTINUE_SEARCH; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
90 } |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
91 #endif /* defined(__MINGW32__) || defined(__CYGWIN__) */ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
92 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
93 #ifdef __OS2__ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
94 ULONG _System os2_sig_handler_sse(PEXCEPTIONREPORTRECORD p1, |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
95 PEXCEPTIONREGISTRATIONRECORD p2, |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
96 PCONTEXTRECORD p3, |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
97 PVOID p4) |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
98 { |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
99 if(p1->ExceptionNum == XCPT_ILLEGAL_INSTRUCTION){ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
100 mp_msg(MSGT_CPUDETECT, MSGL_V, "SIGILL, "); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
101 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
102 p3->ctx_RegEip += 3; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
103 gCpuCaps.hasSSE = 0; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
104 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
105 return XCPT_CONTINUE_EXECUTION; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
106 } |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
107 return XCPT_CONTINUE_SEARCH; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
108 } |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
109 #endif |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
110 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
111 /* If we're running on a processor that can do SSE, let's see if we |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
112 * are allowed to or not. This will catch 2.4.0 or later kernels that |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
113 * haven't been configured for a Pentium III but are running on one, |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
114 * and RedHat patched 2.2 kernels that have broken exception handling |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
115 * support for user space apps that do SSE. |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
116 */ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
117 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
118 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
119 #define SSE_SYSCTL_NAME "hw.instruction_sse" |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
120 #elif defined(__APPLE__) |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
121 #define SSE_SYSCTL_NAME "hw.optional.sse" |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
122 #endif |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
123 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
124 static void check_os_katmai_support( void ) |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
125 { |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
126 #if ARCH_X86_64 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
127 gCpuCaps.hasSSE=1; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
128 gCpuCaps.hasSSE2=1; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
129 #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) || defined(__APPLE__) |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
130 int has_sse=0, ret; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
131 size_t len=sizeof(has_sse); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
132 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
133 ret = sysctlbyname(SSE_SYSCTL_NAME, &has_sse, &len, NULL, 0); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
134 if (ret || !has_sse) |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
135 gCpuCaps.hasSSE=0; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
136 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
137 #elif defined(__NetBSD__) || defined (__OpenBSD__) |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
138 #if __NetBSD_Version__ >= 105250000 || (defined __OpenBSD__) |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
139 int has_sse, has_sse2, ret, mib[2]; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
140 size_t varlen; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
141 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
142 mib[0] = CTL_MACHDEP; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
143 mib[1] = CPU_SSE; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
144 varlen = sizeof(has_sse); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
145 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
146 mp_msg(MSGT_CPUDETECT,MSGL_V, "Testing OS support for SSE... " ); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
147 ret = sysctl(mib, 2, &has_sse, &varlen, NULL, 0); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
148 gCpuCaps.hasSSE = ret >= 0 && has_sse; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
149 mp_msg(MSGT_CPUDETECT,MSGL_V, gCpuCaps.hasSSE ? "yes.\n" : "no!\n" ); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
150 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
151 mib[1] = CPU_SSE2; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
152 varlen = sizeof(has_sse2); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
153 mp_msg(MSGT_CPUDETECT,MSGL_V, "Testing OS support for SSE2... " ); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
154 ret = sysctl(mib, 2, &has_sse2, &varlen, NULL, 0); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
155 gCpuCaps.hasSSE2 = ret >= 0 && has_sse2; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
156 mp_msg(MSGT_CPUDETECT,MSGL_V, gCpuCaps.hasSSE2 ? "yes.\n" : "no!\n" ); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
157 #else |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
158 gCpuCaps.hasSSE = 0; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
159 mp_msg(MSGT_CPUDETECT,MSGL_WARN, "No OS support for SSE, disabling to be safe.\n" ); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
160 #endif |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
161 #elif defined(__MINGW32__) || defined(__CYGWIN__) |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
162 LPTOP_LEVEL_EXCEPTION_FILTER exc_fil; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
163 if ( gCpuCaps.hasSSE ) { |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
164 mp_msg(MSGT_CPUDETECT,MSGL_V, "Testing OS support for SSE... " ); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
165 exc_fil = SetUnhandledExceptionFilter(win32_sig_handler_sse); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
166 __asm__ volatile ("xorps %xmm0, %xmm0"); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
167 SetUnhandledExceptionFilter(exc_fil); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
168 mp_msg(MSGT_CPUDETECT,MSGL_V, gCpuCaps.hasSSE ? "yes.\n" : "no!\n" ); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
169 } |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
170 #elif defined(__OS2__) |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
171 EXCEPTIONREGISTRATIONRECORD RegRec = { 0, &os2_sig_handler_sse }; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
172 if ( gCpuCaps.hasSSE ) { |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
173 mp_msg(MSGT_CPUDETECT,MSGL_V, "Testing OS support for SSE... " ); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
174 DosSetExceptionHandler( &RegRec ); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
175 __asm__ volatile ("xorps %xmm0, %xmm0"); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
176 DosUnsetExceptionHandler( &RegRec ); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
177 mp_msg(MSGT_CPUDETECT,MSGL_V, gCpuCaps.hasSSE ? "yes.\n" : "no!\n" ); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
178 } |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
179 #elif defined(__linux__) |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
180 #if defined(_POSIX_SOURCE) |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
181 struct sigaction saved_sigill; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
182 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
183 /* Save the original signal handlers. |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
184 */ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
185 sigaction( SIGILL, NULL, &saved_sigill ); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
186 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
187 signal( SIGILL, (void (*)(int))sigill_handler_sse ); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
188 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
189 /* Emulate test for OSFXSR in CR4. The OS will set this bit if it |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
190 * supports the extended FPU save and restore required for SSE. If |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
191 * we execute an SSE instruction on a PIII and get a SIGILL, the OS |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
192 * doesn't support Streaming SIMD Exceptions, even if the processor |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
193 * does. |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
194 */ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
195 if ( gCpuCaps.hasSSE ) { |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
196 mp_msg(MSGT_CPUDETECT,MSGL_V, "Testing OS support for SSE... " ); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
197 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
198 // __asm__ volatile ("xorps %%xmm0, %%xmm0"); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
199 __asm__ volatile ("xorps %xmm0, %xmm0"); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
200 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
201 mp_msg(MSGT_CPUDETECT,MSGL_V, gCpuCaps.hasSSE ? "yes.\n" : "no!\n" ); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
202 } |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
203 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
204 /* Restore the original signal handlers. |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
205 */ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
206 sigaction( SIGILL, &saved_sigill, NULL ); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
207 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
208 /* If we've gotten to here and the XMM CPUID bit is still set, we're |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
209 * safe to go ahead and hook out the SSE code throughout Mesa. |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
210 */ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
211 mp_msg(MSGT_CPUDETECT,MSGL_V, "Tests of OS support for SSE %s\n", gCpuCaps.hasSSE ? "passed." : "failed!" ); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
212 #else |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
213 /* We can't use POSIX signal handling to test the availability of |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
214 * SSE, so we disable it by default. |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
215 */ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
216 mp_msg(MSGT_CPUDETECT,MSGL_WARN, "Cannot test OS support for SSE, disabling to be safe.\n" ); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
217 gCpuCaps.hasSSE=0; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
218 #endif /* _POSIX_SOURCE */ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
219 #else |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
220 /* Do nothing on other platforms for now. |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
221 */ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
222 mp_msg(MSGT_CPUDETECT,MSGL_WARN, "Cannot test OS support for SSE, leaving disabled.\n" ); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
223 gCpuCaps.hasSSE=0; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
224 #endif /* __linux__ */ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
225 } |
33625
5e3f013bf4c2
Run OS support for SSE check only for runtime CPU detection.
reimar
parents:
32335
diff
changeset
|
226 #endif |
32335
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
227 |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
228 |
2272 | 229 // return TRUE if cpuid supported |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
16943
diff
changeset
|
230 static int has_cpuid(void) |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
231 { |
2272 | 232 // code from libavcodec: |
28288
3ec634fbcd27
Fix first handful of #if vs. #ifdef for ARCH_, HAVE_SSE etc.
reimar
parents:
28285
diff
changeset
|
233 #if ARCH_X86_64 |
29034
8450a9da95f7
Sync cpuid detection code with libavcodec: assume it is always available on x86_64
reimar
parents:
28901
diff
changeset
|
234 return 1; |
28003
2c3528928d6b
Replace pushf/popf by explicit pushfl/popfl (32 bit) or pushfq/popfq
cehoyos
parents:
27926
diff
changeset
|
235 #else |
31077 | 236 long a, c; |
237 __asm__ volatile ( | |
238 /* See if CPUID instruction is supported ... */ | |
239 /* ... Get copies of EFLAGS into eax and ecx */ | |
240 "pushfl\n\t" | |
241 "pop %0\n\t" | |
242 "mov %0, %1\n\t" | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29114
diff
changeset
|
243 |
31077 | 244 /* ... Toggle the ID bit in one copy and store */ |
245 /* to the EFLAGS reg */ | |
246 "xor $0x200000, %0\n\t" | |
247 "push %0\n\t" | |
248 "popfl\n\t" | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29114
diff
changeset
|
249 |
31077 | 250 /* ... Get the (hopefully modified) EFLAGS */ |
251 "pushfl\n\t" | |
252 "pop %0\n\t" | |
253 : "=a" (a), "=c" (c) | |
254 : | |
255 : "cc" | |
256 ); | |
2272 | 257 |
31077 | 258 return a != c; |
29034
8450a9da95f7
Sync cpuid detection code with libavcodec: assume it is always available on x86_64
reimar
parents:
28901
diff
changeset
|
259 #endif |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
260 } |
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
261 |
31826
f3aed7bffcbb
Reuse do_cpuid from cpudetect.c in loader/win32.c.
reimar
parents:
31825
diff
changeset
|
262 void |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
263 do_cpuid(unsigned int ax, unsigned int *p) |
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
264 { |
2272 | 265 // code from libavcodec: |
27757
b5a46071062a
Replace all occurrences of '__volatile__' and '__volatile' by plain 'volatile'.
diego
parents:
27754
diff
changeset
|
266 __asm__ volatile |
31077 | 267 ("mov %%"REG_b", %%"REG_S"\n\t" |
2272 | 268 "cpuid\n\t" |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13628
diff
changeset
|
269 "xchg %%"REG_b", %%"REG_S |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29114
diff
changeset
|
270 : "=a" (p[0]), "=S" (p[1]), |
2272 | 271 "=c" (p[2]), "=d" (p[3]) |
272 : "0" (ax)); | |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
273 } |
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
274 |
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
275 void GetCpuCaps( CpuCaps *caps) |
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
276 { |
31077 | 277 unsigned int regs[4]; |
278 unsigned int regs2[4]; | |
3146
3164eaa93396
non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents:
2417
diff
changeset
|
279 |
31077 | 280 memset(caps, 0, sizeof(*caps)); |
281 caps->isX86=1; | |
282 caps->cl_size=32; /* default */ | |
283 if (!has_cpuid()) { | |
284 mp_msg(MSGT_CPUDETECT,MSGL_WARN,"CPUID not supported!??? (maybe an old 486?)\n"); | |
285 return; | |
286 } | |
287 do_cpuid(0x00000000, regs); // get _max_ cpuid level and vendor name | |
288 mp_msg(MSGT_CPUDETECT,MSGL_V,"CPU vendor name: %.4s%.4s%.4s max cpuid level: %d\n", | |
289 (char*) (regs+1),(char*) (regs+3),(char*) (regs+2), regs[0]); | |
290 if (regs[0]>=0x00000001) | |
291 { | |
292 char *tmpstr, *ptmpstr; | |
293 unsigned cl_size; | |
3146
3164eaa93396
non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents:
2417
diff
changeset
|
294 |
31077 | 295 do_cpuid(0x00000001, regs2); |
2301 | 296 |
31077 | 297 caps->cpuType=(regs2[0] >> 8)&0xf; |
298 caps->cpuModel=(regs2[0] >> 4)&0xf; | |
16662
77e35d3153b4
according to Intel/AMD official documentations, CPU family should be displayed as
gpoirier
parents:
15566
diff
changeset
|
299 |
77e35d3153b4
according to Intel/AMD official documentations, CPU family should be displayed as
gpoirier
parents:
15566
diff
changeset
|
300 // see AMD64 Architecture Programmer's Manual, Volume 3: General-purpose and |
77e35d3153b4
according to Intel/AMD official documentations, CPU family should be displayed as
gpoirier
parents:
15566
diff
changeset
|
301 // System Instructions, Table 3-2: Effective family computation, page 120. |
31077 | 302 if(caps->cpuType==0xf){ |
303 // use extended family (P4, IA64, K8) | |
304 caps->cpuType=0xf+((regs2[0]>>20)&255); | |
305 } | |
306 if(caps->cpuType==0xf || caps->cpuType==6) | |
307 caps->cpuModel |= ((regs2[0]>>16)&0xf) << 4; | |
18538
739849dfb699
Retrieve CPU built-in namestring, and if it exists, print it during cpu detection; t it doesn't exist, fallback to the cpu table. Patch by Zuxy Meng
gpoirier
parents:
17702
diff
changeset
|
308 |
31077 | 309 caps->cpuStepping=regs2[0] & 0xf; |
2288 | 310 |
31077 | 311 // general feature flags: |
312 caps->hasTSC = (regs2[3] & (1 << 8 )) >> 8; // 0x0000010 | |
313 caps->hasMMX = (regs2[3] & (1 << 23 )) >> 23; // 0x0800000 | |
314 caps->hasSSE = (regs2[3] & (1 << 25 )) >> 25; // 0x2000000 | |
315 caps->hasSSE2 = (regs2[3] & (1 << 26 )) >> 26; // 0x4000000 | |
316 caps->hasSSE3 = (regs2[2] & 1); // 0x0000001 | |
317 caps->hasSSSE3 = (regs2[2] & (1 << 9 )) >> 9; // 0x0000200 | |
318 caps->hasMMX2 = caps->hasSSE; // SSE cpus supports mmxext too | |
319 cl_size = ((regs2[1] >> 8) & 0xFF)*8; | |
320 if(cl_size) caps->cl_size = cl_size; | |
10885
685c416f12b5
cpuspeed detection for X86 TSC capable CPUs (also added TSC detection, should best be verified by some people with TSC/nonTSC capable CPUs)
atmos4
parents:
10823
diff
changeset
|
321 |
31077 | 322 ptmpstr=tmpstr=GetCpuFriendlyName(regs, regs2); |
323 while(*ptmpstr == ' ') // strip leading spaces | |
324 ptmpstr++; | |
325 mp_msg(MSGT_CPUDETECT,MSGL_V,"CPU: %s ", ptmpstr); | |
326 free(tmpstr); | |
327 mp_msg(MSGT_CPUDETECT,MSGL_V,"(Family: %d, Model: %d, Stepping: %d)\n", | |
328 caps->cpuType, caps->cpuModel, caps->cpuStepping); | |
10885
685c416f12b5
cpuspeed detection for X86 TSC capable CPUs (also added TSC detection, should best be verified by some people with TSC/nonTSC capable CPUs)
atmos4
parents:
10823
diff
changeset
|
329 |
31077 | 330 } |
331 do_cpuid(0x80000000, regs); | |
332 if (regs[0]>=0x80000001) { | |
333 mp_msg(MSGT_CPUDETECT,MSGL_V,"extended cpuid-level: %d\n",regs[0]&0x7FFFFFFF); | |
334 do_cpuid(0x80000001, regs2); | |
335 caps->hasMMX |= (regs2[3] & (1 << 23 )) >> 23; // 0x0800000 | |
336 caps->hasMMX2 |= (regs2[3] & (1 << 22 )) >> 22; // 0x400000 | |
337 caps->has3DNow = (regs2[3] & (1 << 31 )) >> 31; //0x80000000 | |
338 caps->has3DNowExt = (regs2[3] & (1 << 30 )) >> 30; | |
339 caps->hasSSE4a = (regs2[2] & (1 << 6 )) >> 6; // 0x0000040 | |
340 } | |
341 if(regs[0]>=0x80000006) | |
342 { | |
343 do_cpuid(0x80000006, regs2); | |
344 mp_msg(MSGT_CPUDETECT,MSGL_V,"extended cache-info: %d\n",regs2[2]&0x7FFFFFFF); | |
345 caps->cl_size = regs2[2] & 0xFF; | |
346 } | |
347 mp_msg(MSGT_CPUDETECT,MSGL_V,"Detected cache-line size is %u bytes\n",caps->cl_size); | |
2288 | 348 #if 0 |
31077 | 349 mp_msg(MSGT_CPUDETECT,MSGL_INFO,"cpudetect: MMX=%d MMX2=%d SSE=%d SSE2=%d 3DNow=%d 3DNowExt=%d\n", |
350 gCpuCaps.hasMMX, | |
351 gCpuCaps.hasMMX2, | |
352 gCpuCaps.hasSSE, | |
353 gCpuCaps.hasSSE2, | |
354 gCpuCaps.has3DNow, | |
355 gCpuCaps.has3DNowExt); | |
2288 | 356 #endif |
357 | |
33625
5e3f013bf4c2
Run OS support for SSE check only for runtime CPU detection.
reimar
parents:
32335
diff
changeset
|
358 #if CONFIG_RUNTIME_CPUDETECT |
31077 | 359 /* FIXME: Does SSE2 need more OS support, too? */ |
360 if (caps->hasSSE) | |
361 check_os_katmai_support(); | |
362 if (!caps->hasSSE) | |
363 caps->hasSSE2 = 0; | |
364 // caps->has3DNow=1; | |
365 // caps->hasMMX2 = 0; | |
366 // caps->hasMMX = 0; | |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
367 |
33625
5e3f013bf4c2
Run OS support for SSE check only for runtime CPU detection.
reimar
parents:
32335
diff
changeset
|
368 #else |
28288
3ec634fbcd27
Fix first handful of #if vs. #ifdef for ARCH_, HAVE_SSE etc.
reimar
parents:
28285
diff
changeset
|
369 #if !HAVE_MMX |
31077 | 370 if(caps->hasMMX) mp_msg(MSGT_CPUDETECT,MSGL_WARN,"MMX supported but disabled\n"); |
371 caps->hasMMX=0; | |
4829 | 372 #endif |
28288
3ec634fbcd27
Fix first handful of #if vs. #ifdef for ARCH_, HAVE_SSE etc.
reimar
parents:
28285
diff
changeset
|
373 #if !HAVE_MMX2 |
31077 | 374 if(caps->hasMMX2) mp_msg(MSGT_CPUDETECT,MSGL_WARN,"MMX2 supported but disabled\n"); |
375 caps->hasMMX2=0; | |
4829 | 376 #endif |
28288
3ec634fbcd27
Fix first handful of #if vs. #ifdef for ARCH_, HAVE_SSE etc.
reimar
parents:
28285
diff
changeset
|
377 #if !HAVE_SSE |
31077 | 378 if(caps->hasSSE) mp_msg(MSGT_CPUDETECT,MSGL_WARN,"SSE supported but disabled\n"); |
379 caps->hasSSE=0; | |
4829 | 380 #endif |
28288
3ec634fbcd27
Fix first handful of #if vs. #ifdef for ARCH_, HAVE_SSE etc.
reimar
parents:
28285
diff
changeset
|
381 #if !HAVE_SSE2 |
31077 | 382 if(caps->hasSSE2) mp_msg(MSGT_CPUDETECT,MSGL_WARN,"SSE2 supported but disabled\n"); |
383 caps->hasSSE2=0; | |
4829 | 384 #endif |
28335 | 385 #if !HAVE_AMD3DNOW |
31077 | 386 if(caps->has3DNow) mp_msg(MSGT_CPUDETECT,MSGL_WARN,"3DNow supported but disabled\n"); |
387 caps->has3DNow=0; | |
4829 | 388 #endif |
28335 | 389 #if !HAVE_AMD3DNOWEXT |
31077 | 390 if(caps->has3DNowExt) mp_msg(MSGT_CPUDETECT,MSGL_WARN,"3DNowExt supported but disabled\n"); |
391 caps->has3DNowExt=0; | |
4829 | 392 #endif |
29114
06540eb5ef6a
Rename RUNTIME_CPUDETECT to CONFIG_RUNTIME_CPUDETECT and always define it.
ramiro
parents:
29087
diff
changeset
|
393 #endif // CONFIG_RUNTIME_CPUDETECT |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
394 } |
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
395 |
2301 | 396 char *GetCpuFriendlyName(unsigned int regs[], unsigned int regs2[]){ |
31077 | 397 char vendor[13]; |
398 char *retname; | |
399 int i; | |
2301 | 400 |
31077 | 401 if (NULL==(retname=malloc(256))) { |
402 mp_msg(MSGT_CPUDETECT,MSGL_FATAL,"Error: GetCpuFriendlyName() not enough memory\n"); | |
403 exit(1); | |
404 } | |
405 retname[0] = '\0'; | |
2303 | 406 |
31077 | 407 sprintf(vendor,"%.4s%.4s%.4s",(char*)(regs+1),(char*)(regs+3),(char*)(regs+2)); |
3146
3164eaa93396
non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents:
2417
diff
changeset
|
408 |
31077 | 409 do_cpuid(0x80000000,regs); |
410 if (regs[0] >= 0x80000004) | |
411 { | |
412 // CPU has built-in namestring | |
413 for (i = 0x80000002; i <= 0x80000004; i++) | |
414 { | |
415 do_cpuid(i, regs); | |
416 strncat(retname, (char*)regs, 16); | |
417 } | |
418 } | |
419 return retname; | |
2301 | 420 } |
421 | |
20577 | 422 #else /* ARCH_X86 */ |
3146
3164eaa93396
non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents:
2417
diff
changeset
|
423 |
25329
676e2ace8a46
Replace SYS_DARWIN conditional by the more correct __APPLE__.
diego
parents:
24664
diff
changeset
|
424 #ifdef __APPLE__ |
9003 | 425 #include <sys/sysctl.h> |
28364
3e3bd9da4c7e
Use OS preprocessor checks with '#if defined()' consistently.
diego
parents:
28342
diff
changeset
|
426 #elif defined(__AMIGAOS4__) |
25338
dfba06821076
Ahem, fix breakage of last commit: The AltiVec detection code has three
diego
parents:
25330
diff
changeset
|
427 /* nothing */ |
dfba06821076
Ahem, fix breakage of last commit: The AltiVec detection code has three
diego
parents:
25330
diff
changeset
|
428 #else |
9003 | 429 #include <signal.h> |
430 #include <setjmp.h> | |
431 | |
432 static sigjmp_buf jmpbuf; | |
433 static volatile sig_atomic_t canjump = 0; | |
434 | |
435 static void sigill_handler (int sig) | |
436 { | |
437 if (!canjump) { | |
438 signal (sig, SIG_DFL); | |
439 raise (sig); | |
440 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29114
diff
changeset
|
441 |
9003 | 442 canjump = 0; |
443 siglongjmp (jmpbuf, 1); | |
444 } | |
25329
676e2ace8a46
Replace SYS_DARWIN conditional by the more correct __APPLE__.
diego
parents:
24664
diff
changeset
|
445 #endif /* __APPLE__ */ |
9003 | 446 |
3146
3164eaa93396
non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents:
2417
diff
changeset
|
447 void GetCpuCaps( CpuCaps *caps) |
3164eaa93396
non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents:
2417
diff
changeset
|
448 { |
31077 | 449 caps->cpuType=0; |
450 caps->cpuModel=0; | |
451 caps->cpuStepping=0; | |
452 caps->hasMMX=0; | |
453 caps->hasMMX2=0; | |
454 caps->has3DNow=0; | |
455 caps->has3DNowExt=0; | |
456 caps->hasSSE=0; | |
457 caps->hasSSE2=0; | |
458 caps->hasSSE3=0; | |
459 caps->hasSSSE3=0; | |
460 caps->hasSSE4a=0; | |
461 caps->isX86=0; | |
462 caps->hasAltiVec = 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29114
diff
changeset
|
463 #if HAVE_ALTIVEC |
25329
676e2ace8a46
Replace SYS_DARWIN conditional by the more correct __APPLE__.
diego
parents:
24664
diff
changeset
|
464 #ifdef __APPLE__ |
9003 | 465 /* |
466 rip-off from ffmpeg altivec detection code. | |
467 this code also appears on Apple's AltiVec pages. | |
468 */ | |
31077 | 469 { |
470 int sels[2] = {CTL_HW, HW_VECTORUNIT}; | |
471 int has_vu = 0; | |
472 size_t len = sizeof(has_vu); | |
473 int err; | |
9003 | 474 |
31077 | 475 err = sysctl(sels, 2, &has_vu, &len, NULL, 0); |
9003 | 476 |
31077 | 477 if (err == 0) |
478 if (has_vu != 0) | |
479 caps->hasAltiVec = 1; | |
480 } | |
28364
3e3bd9da4c7e
Use OS preprocessor checks with '#if defined()' consistently.
diego
parents:
28342
diff
changeset
|
481 #elif defined(__AMIGAOS4__) |
31077 | 482 ULONG result = 0; |
17702
485f04e5a58c
add Amiga-style AltiVec detection, patch from andrea at amigasoft dot net
pacman
parents:
17566
diff
changeset
|
483 |
31077 | 484 GetCPUInfoTags(GCIT_VectorUnit, &result, TAG_DONE); |
485 if (result == VECTORTYPE_ALTIVEC) | |
486 caps->hasAltiVec = 1; | |
17702
485f04e5a58c
add Amiga-style AltiVec detection, patch from andrea at amigasoft dot net
pacman
parents:
17566
diff
changeset
|
487 #else |
9003 | 488 /* no Darwin, do it the brute-force way */ |
489 /* this is borrowed from the libmpeg2 library */ | |
31077 | 490 { |
491 signal (SIGILL, sigill_handler); | |
492 if (sigsetjmp (jmpbuf, 1)) { | |
9003 | 493 signal (SIGILL, SIG_DFL); |
31077 | 494 } else { |
9003 | 495 canjump = 1; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29114
diff
changeset
|
496 |
31077 | 497 __asm__ volatile ("mtspr 256, %0\n\t" |
9122 | 498 "vand %%v0, %%v0, %%v0" |
9003 | 499 : |
500 : "r" (-1)); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29114
diff
changeset
|
501 |
31077 | 502 signal (SIGILL, SIG_DFL); |
503 caps->hasAltiVec = 1; | |
9003 | 504 } |
31077 | 505 } |
25329
676e2ace8a46
Replace SYS_DARWIN conditional by the more correct __APPLE__.
diego
parents:
24664
diff
changeset
|
506 #endif /* __APPLE__ */ |
31077 | 507 mp_msg(MSGT_CPUDETECT,MSGL_V,"AltiVec %sfound\n", (caps->hasAltiVec ? "" : "not ")); |
9003 | 508 #endif /* HAVE_ALTIVEC */ |
11962
909093c314e9
architecture type reporting for non-x86 CPUs (try 2, tested on x86 and x86-64)
gabucino
parents:
10955
diff
changeset
|
509 |
31077 | 510 if (ARCH_IA64) |
511 mp_msg(MSGT_CPUDETECT,MSGL_V,"CPU: Intel Itanium\n"); | |
11962
909093c314e9
architecture type reporting for non-x86 CPUs (try 2, tested on x86 and x86-64)
gabucino
parents:
10955
diff
changeset
|
512 |
31077 | 513 if (ARCH_SPARC) |
514 mp_msg(MSGT_CPUDETECT,MSGL_V,"CPU: Sun Sparc\n"); | |
11962
909093c314e9
architecture type reporting for non-x86 CPUs (try 2, tested on x86 and x86-64)
gabucino
parents:
10955
diff
changeset
|
515 |
31077 | 516 if (ARCH_ARM) |
517 mp_msg(MSGT_CPUDETECT,MSGL_V,"CPU: ARM\n"); | |
11962
909093c314e9
architecture type reporting for non-x86 CPUs (try 2, tested on x86 and x86-64)
gabucino
parents:
10955
diff
changeset
|
518 |
31077 | 519 if (ARCH_PPC) |
520 mp_msg(MSGT_CPUDETECT,MSGL_V,"CPU: PowerPC\n"); | |
11962
909093c314e9
architecture type reporting for non-x86 CPUs (try 2, tested on x86 and x86-64)
gabucino
parents:
10955
diff
changeset
|
521 |
31077 | 522 if (ARCH_ALPHA) |
523 mp_msg(MSGT_CPUDETECT,MSGL_V,"CPU: Digital Alpha\n"); | |
11962
909093c314e9
architecture type reporting for non-x86 CPUs (try 2, tested on x86 and x86-64)
gabucino
parents:
10955
diff
changeset
|
524 |
31077 | 525 if (ARCH_MIPS) |
526 mp_msg(MSGT_CPUDETECT,MSGL_V,"CPU: MIPS\n"); | |
11962
909093c314e9
architecture type reporting for non-x86 CPUs (try 2, tested on x86 and x86-64)
gabucino
parents:
10955
diff
changeset
|
527 |
31077 | 528 if (ARCH_PA_RISC) |
529 mp_msg(MSGT_CPUDETECT,MSGL_V,"CPU: Hewlett-Packard PA-RISC\n"); | |
11962
909093c314e9
architecture type reporting for non-x86 CPUs (try 2, tested on x86 and x86-64)
gabucino
parents:
10955
diff
changeset
|
530 |
31077 | 531 if (ARCH_S390) |
532 mp_msg(MSGT_CPUDETECT,MSGL_V,"CPU: IBM S/390\n"); | |
11962
909093c314e9
architecture type reporting for non-x86 CPUs (try 2, tested on x86 and x86-64)
gabucino
parents:
10955
diff
changeset
|
533 |
31077 | 534 if (ARCH_S390X) |
535 mp_msg(MSGT_CPUDETECT,MSGL_V,"CPU: IBM S/390X\n"); | |
11962
909093c314e9
architecture type reporting for non-x86 CPUs (try 2, tested on x86 and x86-64)
gabucino
parents:
10955
diff
changeset
|
536 |
31077 | 537 if (ARCH_VAX) |
538 mp_msg(MSGT_CPUDETECT,MSGL_V, "CPU: Digital VAX\n" ); | |
25340 | 539 |
31077 | 540 if (ARCH_XTENSA) |
541 mp_msg(MSGT_CPUDETECT,MSGL_V, "CPU: Tensilica Xtensa\n" ); | |
3146
3164eaa93396
non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents:
2417
diff
changeset
|
542 } |
3164eaa93396
non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents:
2417
diff
changeset
|
543 #endif /* !ARCH_X86 */ |