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