ffmpeg / libavcodec / ppc / check_altivec.c @ ccf22d3e
History | View | Annotate | Download (2.52 KB)
1 |
/*
|
---|---|
2 |
* This file is part of FFmpeg.
|
3 |
*
|
4 |
* FFmpeg is free software; you can redistribute it and/or
|
5 |
* modify it under the terms of the GNU Lesser General Public
|
6 |
* License as published by the Free Software Foundation; either
|
7 |
* version 2.1 of the License, or (at your option) any later version.
|
8 |
*
|
9 |
* FFmpeg is distributed in the hope that it will be useful,
|
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
12 |
* Lesser General Public License for more details.
|
13 |
*
|
14 |
* You should have received a copy of the GNU Lesser General Public
|
15 |
* License along with FFmpeg; if not, write to the Free Software
|
16 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
17 |
*/
|
18 |
|
19 |
|
20 |
/**
|
21 |
* @file
|
22 |
* Check for AltiVec presence.
|
23 |
*/
|
24 |
|
25 |
#ifdef __APPLE__
|
26 |
#undef _POSIX_C_SOURCE
|
27 |
#include <sys/sysctl.h> |
28 |
#elif defined(__OpenBSD__)
|
29 |
#include <sys/param.h> |
30 |
#include <sys/sysctl.h> |
31 |
#include <machine/cpu.h> |
32 |
#elif defined(__AMIGAOS4__)
|
33 |
#include <exec/exec.h> |
34 |
#include <interfaces/exec.h> |
35 |
#include <proto/exec.h> |
36 |
#endif /* __APPLE__ */ |
37 |
|
38 |
#include "config.h" |
39 |
#include "dsputil_altivec.h" |
40 |
|
41 |
/**
|
42 |
* This function MAY rely on signal() or fork() in order to make sure AltiVec
|
43 |
* is present.
|
44 |
*/
|
45 |
|
46 |
int mm_support(void) |
47 |
{ |
48 |
#if HAVE_ALTIVEC
|
49 |
#ifdef __AMIGAOS4__
|
50 |
ULONG result = 0;
|
51 |
extern struct ExecIFace *IExec; |
52 |
|
53 |
IExec->GetCPUInfoTags(GCIT_VectorUnit, &result, TAG_DONE); |
54 |
if (result == VECTORTYPE_ALTIVEC)
|
55 |
return AV_CPU_FLAG_ALTIVEC;
|
56 |
return 0; |
57 |
#elif defined(__APPLE__) || defined(__OpenBSD__)
|
58 |
#ifdef __OpenBSD__
|
59 |
int sels[2] = {CTL_MACHDEP, CPU_ALTIVEC}; |
60 |
#else
|
61 |
int sels[2] = {CTL_HW, HW_VECTORUNIT}; |
62 |
#endif
|
63 |
int has_vu = 0; |
64 |
size_t len = sizeof(has_vu);
|
65 |
int err;
|
66 |
|
67 |
err = sysctl(sels, 2, &has_vu, &len, NULL, 0); |
68 |
|
69 |
if (err == 0) |
70 |
return has_vu ? AV_CPU_FLAG_ALTIVEC : 0; |
71 |
return 0; |
72 |
#elif CONFIG_RUNTIME_CPUDETECT
|
73 |
int proc_ver;
|
74 |
// Support of mfspr PVR emulation added in Linux 2.6.17.
|
75 |
__asm__ volatile("mfspr %0, 287" : "=r" (proc_ver)); |
76 |
proc_ver >>= 16;
|
77 |
if (proc_ver & 0x8000 || |
78 |
proc_ver == 0x000c ||
|
79 |
proc_ver == 0x0039 || proc_ver == 0x003c || |
80 |
proc_ver == 0x0044 || proc_ver == 0x0045 || |
81 |
proc_ver == 0x0070)
|
82 |
return AV_CPU_FLAG_ALTIVEC;
|
83 |
return 0; |
84 |
#else
|
85 |
// Since we were compiled for AltiVec, just assume we have it
|
86 |
// until someone comes up with a proper way (not involving signal hacks).
|
87 |
return AV_CPU_FLAG_ALTIVEC;
|
88 |
#endif /* __AMIGAOS4__ */ |
89 |
#endif /* HAVE_ALTIVEC */ |
90 |
return 0; |
91 |
} |
92 |
|