annotate cpudetect.c @ 33023:ba432e34dc7e

Add message showing function. In some cases it is necessary to show messages to the GUI users as well or they will wonder why the GUI didn't show up.
author ib
date Fri, 25 Mar 2011 10:33:48 +0000
parents fdf3f93c2828
children 5e3f013bf4c2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
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
6659db99f200 warning fix
pl
parents: 3700
diff changeset
25 #include <stdlib.h>
6659db99f200 warning fix
pl
parents: 3700
diff changeset
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
da228f2485d9 SSE support under OpenBSD, patch by Bjorn Sandell
alex
parents: 12087
diff changeset
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
890f35b31edd SSE os support detection for windows
faust3
parents: 9324
diff changeset
42 #include <windows.h>
28364
3e3bd9da4c7e Use OS preprocessor checks with '#if defined()' consistently.
diego
parents: 28342
diff changeset
43 #elif defined(__OS2__)
26061
6ede4d6afa41 Enable SSE detection on OS/2.
diego
parents: 26060
diff changeset
44 #define INCL_DOS
6ede4d6afa41 Enable SSE detection on OS/2.
diego
parents: 26060
diff changeset
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
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
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
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
233 long a, c;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
234 __asm__ volatile (
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
235 /* See if CPUID instruction is supported ... */
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
236 /* ... Get copies of EFLAGS into eax and ecx */
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
237 "pushfl\n\t"
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
238 "pop %0\n\t"
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
239 "mov %0, %1\n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29114
diff changeset
240
31077
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
241 /* ... Toggle the ID bit in one copy and store */
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
242 /* to the EFLAGS reg */
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
243 "xor $0x200000, %0\n\t"
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
244 "push %0\n\t"
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
245 "popfl\n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29114
diff changeset
246
31077
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
247 /* ... Get the (hopefully modified) EFLAGS */
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
248 "pushfl\n\t"
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
249 "pop %0\n\t"
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
250 : "=a" (a), "=c" (c)
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
251 :
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
252 : "cc"
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
253 );
2272
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
254
31077
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
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
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
264 ("mov %%"REG_b", %%"REG_S"\n\t"
2272
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
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
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
268 "=c" (p[2]), "=d" (p[3])
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
274 unsigned int regs[4];
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
277 memset(caps, 0, sizeof(*caps));
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
278 caps->isX86=1;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
279 caps->cl_size=32; /* default */
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
280 if (!has_cpuid()) {
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
281 mp_msg(MSGT_CPUDETECT,MSGL_WARN,"CPUID not supported!??? (maybe an old 486?)\n");
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
282 return;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
283 }
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
284 do_cpuid(0x00000000, regs); // get _max_ cpuid level and vendor name
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
285 mp_msg(MSGT_CPUDETECT,MSGL_V,"CPU vendor name: %.4s%.4s%.4s max cpuid level: %d\n",
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
286 (char*) (regs+1),(char*) (regs+3),(char*) (regs+2), regs[0]);
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
287 if (regs[0]>=0x00000001)
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
288 {
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
289 char *tmpstr, *ptmpstr;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
292 do_cpuid(0x00000001, regs2);
2301
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
293
31077
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
294 caps->cpuType=(regs2[0] >> 8)&0xf;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
299 if(caps->cpuType==0xf){
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
300 // use extended family (P4, IA64, K8)
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
301 caps->cpuType=0xf+((regs2[0]>>20)&255);
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
302 }
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
303 if(caps->cpuType==0xf || caps->cpuType==6)
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
306 caps->cpuStepping=regs2[0] & 0xf;
2288
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
307
31077
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
308 // general feature flags:
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
309 caps->hasTSC = (regs2[3] & (1 << 8 )) >> 8; // 0x0000010
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
310 caps->hasMMX = (regs2[3] & (1 << 23 )) >> 23; // 0x0800000
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
311 caps->hasSSE = (regs2[3] & (1 << 25 )) >> 25; // 0x2000000
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
312 caps->hasSSE2 = (regs2[3] & (1 << 26 )) >> 26; // 0x4000000
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
313 caps->hasSSE3 = (regs2[2] & 1); // 0x0000001
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
314 caps->hasSSSE3 = (regs2[2] & (1 << 9 )) >> 9; // 0x0000200
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
315 caps->hasMMX2 = caps->hasSSE; // SSE cpus supports mmxext too
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
316 cl_size = ((regs2[1] >> 8) & 0xFF)*8;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
319 ptmpstr=tmpstr=GetCpuFriendlyName(regs, regs2);
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
320 while(*ptmpstr == ' ') // strip leading spaces
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
321 ptmpstr++;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
322 mp_msg(MSGT_CPUDETECT,MSGL_V,"CPU: %s ", ptmpstr);
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
323 free(tmpstr);
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
324 mp_msg(MSGT_CPUDETECT,MSGL_V,"(Family: %d, Model: %d, Stepping: %d)\n",
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
327 }
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
328 do_cpuid(0x80000000, regs);
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
329 if (regs[0]>=0x80000001) {
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
330 mp_msg(MSGT_CPUDETECT,MSGL_V,"extended cpuid-level: %d\n",regs[0]&0x7FFFFFFF);
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
331 do_cpuid(0x80000001, regs2);
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
332 caps->hasMMX |= (regs2[3] & (1 << 23 )) >> 23; // 0x0800000
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
333 caps->hasMMX2 |= (regs2[3] & (1 << 22 )) >> 22; // 0x400000
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
334 caps->has3DNow = (regs2[3] & (1 << 31 )) >> 31; //0x80000000
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
335 caps->has3DNowExt = (regs2[3] & (1 << 30 )) >> 30;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
336 caps->hasSSE4a = (regs2[2] & (1 << 6 )) >> 6; // 0x0000040
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
337 }
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
338 if(regs[0]>=0x80000006)
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
339 {
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
340 do_cpuid(0x80000006, regs2);
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
341 mp_msg(MSGT_CPUDETECT,MSGL_V,"extended cache-info: %d\n",regs2[2]&0x7FFFFFFF);
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
342 caps->cl_size = regs2[2] & 0xFF;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
343 }
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
344 mp_msg(MSGT_CPUDETECT,MSGL_V,"Detected cache-line size is %u bytes\n",caps->cl_size);
2288
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
345 #if 0
31077
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
346 mp_msg(MSGT_CPUDETECT,MSGL_INFO,"cpudetect: MMX=%d MMX2=%d SSE=%d SSE2=%d 3DNow=%d 3DNowExt=%d\n",
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
347 gCpuCaps.hasMMX,
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
348 gCpuCaps.hasMMX2,
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
349 gCpuCaps.hasSSE,
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
350 gCpuCaps.hasSSE2,
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
351 gCpuCaps.has3DNow,
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
352 gCpuCaps.has3DNowExt);
2288
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
353 #endif
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
354
31077
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
355 /* FIXME: Does SSE2 need more OS support, too? */
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
356 if (caps->hasSSE)
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
357 check_os_katmai_support();
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
358 if (!caps->hasSSE)
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
359 caps->hasSSE2 = 0;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
360 // caps->has3DNow=1;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
361 // caps->hasMMX2 = 0;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
366 if(caps->hasMMX) mp_msg(MSGT_CPUDETECT,MSGL_WARN,"MMX supported but disabled\n");
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
367 caps->hasMMX=0;
4829
35ed5387b804 dont ignore --disable-mmx, ...
michael
parents: 3850
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
370 if(caps->hasMMX2) mp_msg(MSGT_CPUDETECT,MSGL_WARN,"MMX2 supported but disabled\n");
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
371 caps->hasMMX2=0;
4829
35ed5387b804 dont ignore --disable-mmx, ...
michael
parents: 3850
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
374 if(caps->hasSSE) mp_msg(MSGT_CPUDETECT,MSGL_WARN,"SSE supported but disabled\n");
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
375 caps->hasSSE=0;
4829
35ed5387b804 dont ignore --disable-mmx, ...
michael
parents: 3850
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
378 if(caps->hasSSE2) mp_msg(MSGT_CPUDETECT,MSGL_WARN,"SSE2 supported but disabled\n");
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
379 caps->hasSSE2=0;
4829
35ed5387b804 dont ignore --disable-mmx, ...
michael
parents: 3850
diff changeset
380 #endif
28335
31287e75b5d8 HAVE_3DNOW --> HAVE_AMD3DNOW
diego
parents: 28326
diff changeset
381 #if !HAVE_AMD3DNOW
31077
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
382 if(caps->has3DNow) mp_msg(MSGT_CPUDETECT,MSGL_WARN,"3DNow supported but disabled\n");
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
383 caps->has3DNow=0;
4829
35ed5387b804 dont ignore --disable-mmx, ...
michael
parents: 3850
diff changeset
384 #endif
28335
31287e75b5d8 HAVE_3DNOW --> HAVE_AMD3DNOW
diego
parents: 28326
diff changeset
385 #if !HAVE_AMD3DNOWEXT
31077
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
386 if(caps->has3DNowExt) mp_msg(MSGT_CPUDETECT,MSGL_WARN,"3DNowExt supported but disabled\n");
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
387 caps->has3DNowExt=0;
4829
35ed5387b804 dont ignore --disable-mmx, ...
michael
parents: 3850
diff changeset
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
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
392 char *GetCpuFriendlyName(unsigned int regs[], unsigned int regs2[]){
31077
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
393 char vendor[13];
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
394 char *retname;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
395 int i;
2301
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
396
31077
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
397 if (NULL==(retname=malloc(256))) {
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
398 mp_msg(MSGT_CPUDETECT,MSGL_FATAL,"Error: GetCpuFriendlyName() not enough memory\n");
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
399 exit(1);
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
400 }
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
401 retname[0] = '\0';
2303
456e22bfb147 returns a malloc()'ed string instead of an auto char[]
pl
parents: 2301
diff changeset
402
31077
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
405 do_cpuid(0x80000000,regs);
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
406 if (regs[0] >= 0x80000004)
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
407 {
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
408 // CPU has built-in namestring
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
409 for (i = 0x80000002; i <= 0x80000004; i++)
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
410 {
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
411 do_cpuid(i, regs);
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
412 strncat(retname, (char*)regs, 16);
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
413 }
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
414 }
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
415 return retname;
2301
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
416 }
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
417
20577
6289755ce7c7 ARCH_X86 simplifications
reimar
parents: 20052
diff changeset
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
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
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
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
425 #include <signal.h>
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
426 #include <setjmp.h>
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
427
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
428 static sigjmp_buf jmpbuf;
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
429 static volatile sig_atomic_t canjump = 0;
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
430
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
431 static void sigill_handler (int sig)
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
432 {
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
433 if (!canjump) {
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
434 signal (sig, SIG_DFL);
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
435 raise (sig);
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
436 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29114
diff changeset
437
9003
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
438 canjump = 0;
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
439 siglongjmp (jmpbuf, 1);
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
440 }
25329
676e2ace8a46 Replace SYS_DARWIN conditional by the more correct __APPLE__.
diego
parents: 24664
diff changeset
441 #endif /* __APPLE__ */
9003
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
445 caps->cpuType=0;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
446 caps->cpuModel=0;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
447 caps->cpuStepping=0;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
448 caps->hasMMX=0;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
449 caps->hasMMX2=0;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
450 caps->has3DNow=0;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
451 caps->has3DNowExt=0;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
452 caps->hasSSE=0;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
453 caps->hasSSE2=0;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
454 caps->hasSSE3=0;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
455 caps->hasSSSE3=0;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
456 caps->hasSSE4a=0;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
457 caps->isX86=0;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
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
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
461 /*
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
462 rip-off from ffmpeg altivec detection code.
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
463 this code also appears on Apple's AltiVec pages.
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
464 */
31077
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
465 {
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
466 int sels[2] = {CTL_HW, HW_VECTORUNIT};
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
467 int has_vu = 0;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
468 size_t len = sizeof(has_vu);
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
469 int err;
9003
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
470
31077
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
471 err = sysctl(sels, 2, &has_vu, &len, NULL, 0);
9003
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
472
31077
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
473 if (err == 0)
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
474 if (has_vu != 0)
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
475 caps->hasAltiVec = 1;
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
476 }
28364
3e3bd9da4c7e Use OS preprocessor checks with '#if defined()' consistently.
diego
parents: 28342
diff changeset
477 #elif defined(__AMIGAOS4__)
31077
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
480 GetCPUInfoTags(GCIT_VectorUnit, &result, TAG_DONE);
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
481 if (result == VECTORTYPE_ALTIVEC)
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
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
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
484 /* no Darwin, do it the brute-force way */
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
485 /* this is borrowed from the libmpeg2 library */
31077
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
486 {
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
487 signal (SIGILL, sigill_handler);
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
488 if (sigsetjmp (jmpbuf, 1)) {
9003
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
489 signal (SIGILL, SIG_DFL);
31077
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
490 } else {
9003
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
491 canjump = 1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29114
diff changeset
492
31077
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
493 __asm__ volatile ("mtspr 256, %0\n\t"
9122
5ba896a38d75 The two attached patches *should* allow for proper
arpi
parents: 9003
diff changeset
494 "vand %%v0, %%v0, %%v0"
9003
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
495 :
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
496 : "r" (-1));
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29114
diff changeset
497
31077
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
498 signal (SIGILL, SIG_DFL);
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
499 caps->hasAltiVec = 1;
9003
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
500 }
31077
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
501 }
25329
676e2ace8a46 Replace SYS_DARWIN conditional by the more correct __APPLE__.
diego
parents: 24664
diff changeset
502 #endif /* __APPLE__ */
31077
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
503 mp_msg(MSGT_CPUDETECT,MSGL_V,"AltiVec %sfound\n", (caps->hasAltiVec ? "" : "not "));
9003
c428933c7e54 AltiVec detection code ("borrowed" from FFmpeg and
arpi
parents: 8860
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
506 if (ARCH_IA64)
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
509 if (ARCH_SPARC)
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
512 if (ARCH_ARM)
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
515 if (ARCH_PPC)
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
518 if (ARCH_ALPHA)
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
521 if (ARCH_MIPS)
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
524 if (ARCH_PA_RISC)
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
527 if (ARCH_S390)
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
530 if (ARCH_S390X)
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
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
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
533 if (ARCH_VAX)
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
534 mp_msg(MSGT_CPUDETECT,MSGL_V, "CPU: Digital VAX\n" );
25340
b6107034e981 support for xtensa CPU architecture
diego
parents: 25339
diff changeset
535
31077
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
536 if (ARCH_XTENSA)
dd7f15a3fb1b the great MPlayer tab removal: part II
diego
parents: 30929
diff changeset
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 */