Mercurial > mplayer.hg
annotate cpudetect.c @ 33671:a460339acfdf
Fix volume and balance bug.
Changing the volume changed the balance as well,
because the calculation for the balance was wrong.
Additionally, use macro FFMAX() and replace
identical code by a call to existing code.
author | ib |
---|---|
date | Tue, 28 Jun 2011 17:52:30 +0000 |
parents | 5e3f013bf4c2 |
children | 064be070d8c8 |
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 |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
19 #include "config.h" |
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
20 #include "cpudetect.h" |
5937 | 21 #include "mp_msg.h" |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
22 |
3146
3164eaa93396
non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents:
2417
diff
changeset
|
23 CpuCaps gCpuCaps; |
3164eaa93396
non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents:
2417
diff
changeset
|
24 |
3837 | 25 #include <stdlib.h> |
26 | |
28288
3ec634fbcd27
Fix first handful of #if vs. #ifdef for ARCH_, HAVE_SSE etc.
reimar
parents:
28285
diff
changeset
|
27 #if ARCH_X86 |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
28 |
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
29 #include <stdio.h> |
8123
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
6135
diff
changeset
|
30 #include <string.h> |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
31 |
12143 | 32 #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
|
33 #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
|
34 #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
|
35 #include <machine/cpu.h> |
28364
3e3bd9da4c7e
Use OS preprocessor checks with '#if defined()' consistently.
diego
parents:
28342
diff
changeset
|
36 #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
|
37 #include <sys/types.h> |
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
38 #include <sys/sysctl.h> |
28364
3e3bd9da4c7e
Use OS preprocessor checks with '#if defined()' consistently.
diego
parents:
28342
diff
changeset
|
39 #elif defined(__linux__) |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
40 #include <signal.h> |
28364
3e3bd9da4c7e
Use OS preprocessor checks with '#if defined()' consistently.
diego
parents:
28342
diff
changeset
|
41 #elif defined(__MINGW32__) || defined(__CYGWIN__) |
10440 | 42 #include <windows.h> |
28364
3e3bd9da4c7e
Use OS preprocessor checks with '#if defined()' consistently.
diego
parents:
28342
diff
changeset
|
43 #elif defined(__OS2__) |
26061 | 44 #define INCL_DOS |
45 #include <os2.h> | |
28364
3e3bd9da4c7e
Use OS preprocessor checks with '#if defined()' consistently.
diego
parents:
28342
diff
changeset
|
46 #elif defined(__AMIGAOS4__) |
17702
485f04e5a58c
add Amiga-style AltiVec detection, patch from andrea at amigasoft dot net
pacman
parents:
17566
diff
changeset
|
47 #include <proto/exec.h> |
485f04e5a58c
add Amiga-style AltiVec detection, patch from andrea at amigasoft dot net
pacman
parents:
17566
diff
changeset
|
48 #endif |
485f04e5a58c
add Amiga-style AltiVec detection, patch from andrea at amigasoft dot net
pacman
parents:
17566
diff
changeset
|
49 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29114
diff
changeset
|
50 /* Thanks to the FreeBSD project for some of this cpuid code, and |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29114
diff
changeset
|
51 * 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
|
52 * 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
|
53 */ |
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
54 |
33625
5e3f013bf4c2
Run OS support for SSE check only for runtime CPU detection.
reimar
parents:
32335
diff
changeset
|
55 #if CONFIG_RUNTIME_CPUDETECT |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
56 /* 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
|
57 |
32335
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
58 #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
|
59 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
|
60 { |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
61 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
|
62 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
63 /* 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
|
64 * 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
|
65 * 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
|
66 * instruction. |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
67 * |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
68 * 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
|
69 * 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
|
70 * 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
|
71 * 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
|
72 */ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
73 sc.eip += 3; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
74 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
75 gCpuCaps.hasSSE=0; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
76 } |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
77 #endif /* __linux__ && _POSIX_SOURCE */ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
78 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
79 #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
|
80 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
|
81 { |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
82 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
|
83 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
|
84 ep->ContextRecord->Eip +=3; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
85 gCpuCaps.hasSSE=0; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
86 return EXCEPTION_CONTINUE_EXECUTION; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
87 } |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
88 return EXCEPTION_CONTINUE_SEARCH; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
89 } |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
90 #endif /* defined(__MINGW32__) || defined(__CYGWIN__) */ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
91 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
92 #ifdef __OS2__ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
93 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
|
94 PEXCEPTIONREGISTRATIONRECORD p2, |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
95 PCONTEXTRECORD p3, |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
96 PVOID p4) |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
97 { |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
98 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
|
99 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
|
100 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
101 p3->ctx_RegEip += 3; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
102 gCpuCaps.hasSSE = 0; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
103 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
104 return XCPT_CONTINUE_EXECUTION; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
105 } |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
106 return XCPT_CONTINUE_SEARCH; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
107 } |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
108 #endif |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
109 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
110 /* 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
|
111 * 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
|
112 * 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
|
113 * 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
|
114 * 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
|
115 */ |
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 #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
|
118 #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
|
119 #elif defined(__APPLE__) |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
120 #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
|
121 #endif |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
122 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
123 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
|
124 { |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
125 #if ARCH_X86_64 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
126 gCpuCaps.hasSSE=1; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
127 gCpuCaps.hasSSE2=1; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
128 #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
|
129 int has_sse=0, ret; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
130 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
|
131 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
132 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
|
133 if (ret || !has_sse) |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
134 gCpuCaps.hasSSE=0; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
135 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
136 #elif defined(__NetBSD__) || defined (__OpenBSD__) |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
137 #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
|
138 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
|
139 size_t varlen; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
140 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
141 mib[0] = CTL_MACHDEP; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
142 mib[1] = CPU_SSE; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
143 varlen = sizeof(has_sse); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
144 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
145 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
|
146 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
|
147 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
|
148 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
|
149 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
150 mib[1] = CPU_SSE2; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
151 varlen = sizeof(has_sse2); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
152 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
|
153 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
|
154 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
|
155 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
|
156 #else |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
157 gCpuCaps.hasSSE = 0; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
158 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
|
159 #endif |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
160 #elif defined(__MINGW32__) || defined(__CYGWIN__) |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
161 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
|
162 if ( gCpuCaps.hasSSE ) { |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
163 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
|
164 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
|
165 __asm__ volatile ("xorps %xmm0, %xmm0"); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
166 SetUnhandledExceptionFilter(exc_fil); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
167 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
|
168 } |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
169 #elif defined(__OS2__) |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
170 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
|
171 if ( gCpuCaps.hasSSE ) { |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
172 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
|
173 DosSetExceptionHandler( &RegRec ); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
174 __asm__ volatile ("xorps %xmm0, %xmm0"); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
175 DosUnsetExceptionHandler( &RegRec ); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
176 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
|
177 } |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
178 #elif defined(__linux__) |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
179 #if defined(_POSIX_SOURCE) |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
180 struct sigaction saved_sigill; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
181 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
182 /* Save the original signal handlers. |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
183 */ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
184 sigaction( SIGILL, NULL, &saved_sigill ); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
185 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
186 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
|
187 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
188 /* 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
|
189 * 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
|
190 * 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
|
191 * 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
|
192 * does. |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
193 */ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
194 if ( gCpuCaps.hasSSE ) { |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
195 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
|
196 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
197 // __asm__ volatile ("xorps %%xmm0, %%xmm0"); |
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 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
200 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
|
201 } |
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 /* Restore the original signal handlers. |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
204 */ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
205 sigaction( SIGILL, &saved_sigill, NULL ); |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
206 |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
207 /* 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
|
208 * 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
|
209 */ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
210 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
|
211 #else |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
212 /* 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
|
213 * 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
|
214 */ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
215 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
|
216 gCpuCaps.hasSSE=0; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
217 #endif /* _POSIX_SOURCE */ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
218 #else |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
219 /* 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
|
220 */ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
221 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
|
222 gCpuCaps.hasSSE=0; |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
223 #endif /* __linux__ */ |
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
224 } |
33625
5e3f013bf4c2
Run OS support for SSE check only for runtime CPU detection.
reimar
parents:
32335
diff
changeset
|
225 #endif |
32335
fdf3f93c2828
Move some code around to avoid forward declarations in top-level .c files.
diego
parents:
31826
diff
changeset
|
226 |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
227 |
2272 | 228 // return TRUE if cpuid supported |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
16943
diff
changeset
|
229 static int has_cpuid(void) |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
230 { |
2272 | 231 // code from libavcodec: |
28288
3ec634fbcd27
Fix first handful of #if vs. #ifdef for ARCH_, HAVE_SSE etc.
reimar
parents:
28285
diff
changeset
|
232 #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
|
233 return 1; |
28003
2c3528928d6b
Replace pushf/popf by explicit pushfl/popfl (32 bit) or pushfq/popfq
cehoyos
parents:
27926
diff
changeset
|
234 #else |
31077 | 235 long a, c; |
236 __asm__ volatile ( | |
237 /* See if CPUID instruction is supported ... */ | |
238 /* ... Get copies of EFLAGS into eax and ecx */ | |
239 "pushfl\n\t" | |
240 "pop %0\n\t" | |
241 "mov %0, %1\n\t" | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29114
diff
changeset
|
242 |
31077 | 243 /* ... Toggle the ID bit in one copy and store */ |
244 /* to the EFLAGS reg */ | |
245 "xor $0x200000, %0\n\t" | |
246 "push %0\n\t" | |
247 "popfl\n\t" | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29114
diff
changeset
|
248 |
31077 | 249 /* ... Get the (hopefully modified) EFLAGS */ |
250 "pushfl\n\t" | |
251 "pop %0\n\t" | |
252 : "=a" (a), "=c" (c) | |
253 : | |
254 : "cc" | |
255 ); | |
2272 | 256 |
31077 | 257 return a != c; |
29034
8450a9da95f7
Sync cpuid detection code with libavcodec: assume it is always available on x86_64
reimar
parents:
28901
diff
changeset
|
258 #endif |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
259 } |
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
260 |
31826
f3aed7bffcbb
Reuse do_cpuid from cpudetect.c in loader/win32.c.
reimar
parents:
31825
diff
changeset
|
261 void |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
262 do_cpuid(unsigned int ax, unsigned int *p) |
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
263 { |
2272 | 264 // code from libavcodec: |
27757
b5a46071062a
Replace all occurrences of '__volatile__' and '__volatile' by plain 'volatile'.
diego
parents:
27754
diff
changeset
|
265 __asm__ volatile |
31077 | 266 ("mov %%"REG_b", %%"REG_S"\n\t" |
2272 | 267 "cpuid\n\t" |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13628
diff
changeset
|
268 "xchg %%"REG_b", %%"REG_S |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29114
diff
changeset
|
269 : "=a" (p[0]), "=S" (p[1]), |
2272 | 270 "=c" (p[2]), "=d" (p[3]) |
271 : "0" (ax)); | |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
272 } |
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 void GetCpuCaps( CpuCaps *caps) |
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
275 { |
31077 | 276 unsigned int regs[4]; |
277 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
|
278 |
31077 | 279 memset(caps, 0, sizeof(*caps)); |
280 caps->isX86=1; | |
281 caps->cl_size=32; /* default */ | |
282 if (!has_cpuid()) { | |
283 mp_msg(MSGT_CPUDETECT,MSGL_WARN,"CPUID not supported!??? (maybe an old 486?)\n"); | |
284 return; | |
285 } | |
286 do_cpuid(0x00000000, regs); // get _max_ cpuid level and vendor name | |
287 mp_msg(MSGT_CPUDETECT,MSGL_V,"CPU vendor name: %.4s%.4s%.4s max cpuid level: %d\n", | |
288 (char*) (regs+1),(char*) (regs+3),(char*) (regs+2), regs[0]); | |
289 if (regs[0]>=0x00000001) | |
290 { | |
291 char *tmpstr, *ptmpstr; | |
292 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
|
293 |
31077 | 294 do_cpuid(0x00000001, regs2); |
2301 | 295 |
31077 | 296 caps->cpuType=(regs2[0] >> 8)&0xf; |
297 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
|
298 |
77e35d3153b4
according to Intel/AMD official documentations, CPU family should be displayed as
gpoirier
parents:
15566
diff
changeset
|
299 // 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
|
300 // System Instructions, Table 3-2: Effective family computation, page 120. |
31077 | 301 if(caps->cpuType==0xf){ |
302 // use extended family (P4, IA64, K8) | |
303 caps->cpuType=0xf+((regs2[0]>>20)&255); | |
304 } | |
305 if(caps->cpuType==0xf || caps->cpuType==6) | |
306 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
|
307 |
31077 | 308 caps->cpuStepping=regs2[0] & 0xf; |
2288 | 309 |
31077 | 310 // general feature flags: |
311 caps->hasTSC = (regs2[3] & (1 << 8 )) >> 8; // 0x0000010 | |
312 caps->hasMMX = (regs2[3] & (1 << 23 )) >> 23; // 0x0800000 | |
313 caps->hasSSE = (regs2[3] & (1 << 25 )) >> 25; // 0x2000000 | |
314 caps->hasSSE2 = (regs2[3] & (1 << 26 )) >> 26; // 0x4000000 | |
315 caps->hasSSE3 = (regs2[2] & 1); // 0x0000001 | |
316 caps->hasSSSE3 = (regs2[2] & (1 << 9 )) >> 9; // 0x0000200 | |
317 caps->hasMMX2 = caps->hasSSE; // SSE cpus supports mmxext too | |
318 cl_size = ((regs2[1] >> 8) & 0xFF)*8; | |
319 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
|
320 |
31077 | 321 ptmpstr=tmpstr=GetCpuFriendlyName(regs, regs2); |
322 while(*ptmpstr == ' ') // strip leading spaces | |
323 ptmpstr++; | |
324 mp_msg(MSGT_CPUDETECT,MSGL_V,"CPU: %s ", ptmpstr); | |
325 free(tmpstr); | |
326 mp_msg(MSGT_CPUDETECT,MSGL_V,"(Family: %d, Model: %d, Stepping: %d)\n", | |
327 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
|
328 |
31077 | 329 } |
330 do_cpuid(0x80000000, regs); | |
331 if (regs[0]>=0x80000001) { | |
332 mp_msg(MSGT_CPUDETECT,MSGL_V,"extended cpuid-level: %d\n",regs[0]&0x7FFFFFFF); | |
333 do_cpuid(0x80000001, regs2); | |
334 caps->hasMMX |= (regs2[3] & (1 << 23 )) >> 23; // 0x0800000 | |
335 caps->hasMMX2 |= (regs2[3] & (1 << 22 )) >> 22; // 0x400000 | |
336 caps->has3DNow = (regs2[3] & (1 << 31 )) >> 31; //0x80000000 | |
337 caps->has3DNowExt = (regs2[3] & (1 << 30 )) >> 30; | |
338 caps->hasSSE4a = (regs2[2] & (1 << 6 )) >> 6; // 0x0000040 | |
339 } | |
340 if(regs[0]>=0x80000006) | |
341 { | |
342 do_cpuid(0x80000006, regs2); | |
343 mp_msg(MSGT_CPUDETECT,MSGL_V,"extended cache-info: %d\n",regs2[2]&0x7FFFFFFF); | |
344 caps->cl_size = regs2[2] & 0xFF; | |
345 } | |
346 mp_msg(MSGT_CPUDETECT,MSGL_V,"Detected cache-line size is %u bytes\n",caps->cl_size); | |
2288 | 347 #if 0 |
31077 | 348 mp_msg(MSGT_CPUDETECT,MSGL_INFO,"cpudetect: MMX=%d MMX2=%d SSE=%d SSE2=%d 3DNow=%d 3DNowExt=%d\n", |
349 gCpuCaps.hasMMX, | |
350 gCpuCaps.hasMMX2, | |
351 gCpuCaps.hasSSE, | |
352 gCpuCaps.hasSSE2, | |
353 gCpuCaps.has3DNow, | |
354 gCpuCaps.has3DNowExt); | |
2288 | 355 #endif |
356 | |
33625
5e3f013bf4c2
Run OS support for SSE check only for runtime CPU detection.
reimar
parents:
32335
diff
changeset
|
357 #if CONFIG_RUNTIME_CPUDETECT |
31077 | 358 /* FIXME: Does SSE2 need more OS support, too? */ |
359 if (caps->hasSSE) | |
360 check_os_katmai_support(); | |
361 if (!caps->hasSSE) | |
362 caps->hasSSE2 = 0; | |
363 // caps->has3DNow=1; | |
364 // caps->hasMMX2 = 0; | |
365 // caps->hasMMX = 0; | |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
366 |
33625
5e3f013bf4c2
Run OS support for SSE check only for runtime CPU detection.
reimar
parents:
32335
diff
changeset
|
367 #else |
28288
3ec634fbcd27
Fix first handful of #if vs. #ifdef for ARCH_, HAVE_SSE etc.
reimar
parents:
28285
diff
changeset
|
368 #if !HAVE_MMX |
31077 | 369 if(caps->hasMMX) mp_msg(MSGT_CPUDETECT,MSGL_WARN,"MMX supported but disabled\n"); |
370 caps->hasMMX=0; | |
4829 | 371 #endif |
28288
3ec634fbcd27
Fix first handful of #if vs. #ifdef for ARCH_, HAVE_SSE etc.
reimar
parents:
28285
diff
changeset
|
372 #if !HAVE_MMX2 |
31077 | 373 if(caps->hasMMX2) mp_msg(MSGT_CPUDETECT,MSGL_WARN,"MMX2 supported but disabled\n"); |
374 caps->hasMMX2=0; | |
4829 | 375 #endif |
28288
3ec634fbcd27
Fix first handful of #if vs. #ifdef for ARCH_, HAVE_SSE etc.
reimar
parents:
28285
diff
changeset
|
376 #if !HAVE_SSE |
31077 | 377 if(caps->hasSSE) mp_msg(MSGT_CPUDETECT,MSGL_WARN,"SSE supported but disabled\n"); |
378 caps->hasSSE=0; | |
4829 | 379 #endif |
28288
3ec634fbcd27
Fix first handful of #if vs. #ifdef for ARCH_, HAVE_SSE etc.
reimar
parents:
28285
diff
changeset
|
380 #if !HAVE_SSE2 |
31077 | 381 if(caps->hasSSE2) mp_msg(MSGT_CPUDETECT,MSGL_WARN,"SSE2 supported but disabled\n"); |
382 caps->hasSSE2=0; | |
4829 | 383 #endif |
28335 | 384 #if !HAVE_AMD3DNOW |
31077 | 385 if(caps->has3DNow) mp_msg(MSGT_CPUDETECT,MSGL_WARN,"3DNow supported but disabled\n"); |
386 caps->has3DNow=0; | |
4829 | 387 #endif |
28335 | 388 #if !HAVE_AMD3DNOWEXT |
31077 | 389 if(caps->has3DNowExt) mp_msg(MSGT_CPUDETECT,MSGL_WARN,"3DNowExt supported but disabled\n"); |
390 caps->has3DNowExt=0; | |
4829 | 391 #endif |
29114
06540eb5ef6a
Rename RUNTIME_CPUDETECT to CONFIG_RUNTIME_CPUDETECT and always define it.
ramiro
parents:
29087
diff
changeset
|
392 #endif // CONFIG_RUNTIME_CPUDETECT |
2268
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
393 } |
72ff2179d396
cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff
changeset
|
394 |
2301 | 395 char *GetCpuFriendlyName(unsigned int regs[], unsigned int regs2[]){ |
31077 | 396 char vendor[13]; |
397 char *retname; | |
398 int i; | |
2301 | 399 |
31077 | 400 if (NULL==(retname=malloc(256))) { |
401 mp_msg(MSGT_CPUDETECT,MSGL_FATAL,"Error: GetCpuFriendlyName() not enough memory\n"); | |
402 exit(1); | |
403 } | |
404 retname[0] = '\0'; | |
2303 | 405 |
31077 | 406 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
|
407 |
31077 | 408 do_cpuid(0x80000000,regs); |
409 if (regs[0] >= 0x80000004) | |
410 { | |
411 // CPU has built-in namestring | |
412 for (i = 0x80000002; i <= 0x80000004; i++) | |
413 { | |
414 do_cpuid(i, regs); | |
415 strncat(retname, (char*)regs, 16); | |
416 } | |
417 } | |
418 return retname; | |
2301 | 419 } |
420 | |
20577 | 421 #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
|
422 |
25329
676e2ace8a46
Replace SYS_DARWIN conditional by the more correct __APPLE__.
diego
parents:
24664
diff
changeset
|
423 #ifdef __APPLE__ |
9003 | 424 #include <sys/sysctl.h> |
28364
3e3bd9da4c7e
Use OS preprocessor checks with '#if defined()' consistently.
diego
parents:
28342
diff
changeset
|
425 #elif defined(__AMIGAOS4__) |
25338
dfba06821076
Ahem, fix breakage of last commit: The AltiVec detection code has three
diego
parents:
25330
diff
changeset
|
426 /* nothing */ |
dfba06821076
Ahem, fix breakage of last commit: The AltiVec detection code has three
diego
parents:
25330
diff
changeset
|
427 #else |
9003 | 428 #include <signal.h> |
429 #include <setjmp.h> | |
430 | |
431 static sigjmp_buf jmpbuf; | |
432 static volatile sig_atomic_t canjump = 0; | |
433 | |
434 static void sigill_handler (int sig) | |
435 { | |
436 if (!canjump) { | |
437 signal (sig, SIG_DFL); | |
438 raise (sig); | |
439 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29114
diff
changeset
|
440 |
9003 | 441 canjump = 0; |
442 siglongjmp (jmpbuf, 1); | |
443 } | |
25329
676e2ace8a46
Replace SYS_DARWIN conditional by the more correct __APPLE__.
diego
parents:
24664
diff
changeset
|
444 #endif /* __APPLE__ */ |
9003 | 445 |
3146
3164eaa93396
non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents:
2417
diff
changeset
|
446 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
|
447 { |
31077 | 448 caps->cpuType=0; |
449 caps->cpuModel=0; | |
450 caps->cpuStepping=0; | |
451 caps->hasMMX=0; | |
452 caps->hasMMX2=0; | |
453 caps->has3DNow=0; | |
454 caps->has3DNowExt=0; | |
455 caps->hasSSE=0; | |
456 caps->hasSSE2=0; | |
457 caps->hasSSE3=0; | |
458 caps->hasSSSE3=0; | |
459 caps->hasSSE4a=0; | |
460 caps->isX86=0; | |
461 caps->hasAltiVec = 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29114
diff
changeset
|
462 #if HAVE_ALTIVEC |
25329
676e2ace8a46
Replace SYS_DARWIN conditional by the more correct __APPLE__.
diego
parents:
24664
diff
changeset
|
463 #ifdef __APPLE__ |
9003 | 464 /* |
465 rip-off from ffmpeg altivec detection code. | |
466 this code also appears on Apple's AltiVec pages. | |
467 */ | |
31077 | 468 { |
469 int sels[2] = {CTL_HW, HW_VECTORUNIT}; | |
470 int has_vu = 0; | |
471 size_t len = sizeof(has_vu); | |
472 int err; | |
9003 | 473 |
31077 | 474 err = sysctl(sels, 2, &has_vu, &len, NULL, 0); |
9003 | 475 |
31077 | 476 if (err == 0) |
477 if (has_vu != 0) | |
478 caps->hasAltiVec = 1; | |
479 } | |
28364
3e3bd9da4c7e
Use OS preprocessor checks with '#if defined()' consistently.
diego
parents:
28342
diff
changeset
|
480 #elif defined(__AMIGAOS4__) |
31077 | 481 ULONG result = 0; |
17702
485f04e5a58c
add Amiga-style AltiVec detection, patch from andrea at amigasoft dot net
pacman
parents:
17566
diff
changeset
|
482 |
31077 | 483 GetCPUInfoTags(GCIT_VectorUnit, &result, TAG_DONE); |
484 if (result == VECTORTYPE_ALTIVEC) | |
485 caps->hasAltiVec = 1; | |
17702
485f04e5a58c
add Amiga-style AltiVec detection, patch from andrea at amigasoft dot net
pacman
parents:
17566
diff
changeset
|
486 #else |
9003 | 487 /* no Darwin, do it the brute-force way */ |
488 /* this is borrowed from the libmpeg2 library */ | |
31077 | 489 { |
490 signal (SIGILL, sigill_handler); | |
491 if (sigsetjmp (jmpbuf, 1)) { | |
9003 | 492 signal (SIGILL, SIG_DFL); |
31077 | 493 } else { |
9003 | 494 canjump = 1; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29114
diff
changeset
|
495 |
31077 | 496 __asm__ volatile ("mtspr 256, %0\n\t" |
9122 | 497 "vand %%v0, %%v0, %%v0" |
9003 | 498 : |
499 : "r" (-1)); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29114
diff
changeset
|
500 |
31077 | 501 signal (SIGILL, SIG_DFL); |
502 caps->hasAltiVec = 1; | |
9003 | 503 } |
31077 | 504 } |
25329
676e2ace8a46
Replace SYS_DARWIN conditional by the more correct __APPLE__.
diego
parents:
24664
diff
changeset
|
505 #endif /* __APPLE__ */ |
31077 | 506 mp_msg(MSGT_CPUDETECT,MSGL_V,"AltiVec %sfound\n", (caps->hasAltiVec ? "" : "not ")); |
9003 | 507 #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
|
508 |
31077 | 509 if (ARCH_IA64) |
510 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
|
511 |
31077 | 512 if (ARCH_SPARC) |
513 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
|
514 |
31077 | 515 if (ARCH_ARM) |
516 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
|
517 |
31077 | 518 if (ARCH_PPC) |
519 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
|
520 |
31077 | 521 if (ARCH_ALPHA) |
522 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
|
523 |
31077 | 524 if (ARCH_MIPS) |
525 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
|
526 |
31077 | 527 if (ARCH_PA_RISC) |
528 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
|
529 |
31077 | 530 if (ARCH_S390) |
531 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
|
532 |
31077 | 533 if (ARCH_S390X) |
534 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
|
535 |
31077 | 536 if (ARCH_VAX) |
537 mp_msg(MSGT_CPUDETECT,MSGL_V, "CPU: Digital VAX\n" ); | |
25340 | 538 |
31077 | 539 if (ARCH_XTENSA) |
540 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
|
541 } |
3164eaa93396
non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents:
2417
diff
changeset
|
542 #endif /* !ARCH_X86 */ |