Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
b821b669
Commit
b821b669
authored
Nov 24, 2011
by
Rémi Denis-Courmont
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Set VLC_MMX and VLC_SSE where needed while testing the CPU features
parent
96447a8a
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
88 additions
and
50 deletions
+88
-50
src/misc/cpu.c
src/misc/cpu.c
+88
-50
No files found.
src/misc/cpu.c
View file @
b821b669
...
...
@@ -51,45 +51,91 @@
static
uint32_t
cpu_flags
;
#if defined
( __i386__ ) || defined( __x86_64__ ) || defined( __powerpc__
) \
|| defined
( __ppc__ ) || defined( __ppc64__ ) || defined( __powerpc64__
)
# if !defined
( WIN32 ) && !defined( __OS2__
)
static
bool
check_OS_capability
(
const
char
*
psz_capability
,
pid_t
pid
)
#if defined
(__i386__) || defined (__x86_64__) || defined (__powerpc__
) \
|| defined
(__ppc__) || defined (__ppc64__) || defined (__powerpc64__
)
# if !defined
(WIN32) && !defined (__OS2__
)
static
bool
vlc_CPU_check
(
const
char
*
name
,
void
(
*
func
)
(
void
)
)
{
int
status
;
pid_t
pid
=
fork
()
;
if
(
pid
==
-
1
)
return
false
;
/* fail safe :-/ */
switch
(
pid
)
{
case
0
:
signal
(
SIGILL
,
SIG_DFL
);
func
();
//__asm__ __volatile__ ( code : : input );
_exit
(
0
);
case
-
1
:
return
false
;
}
//i_capabilities |= (flag);
int
status
;
while
(
waitpid
(
pid
,
&
status
,
0
)
==
-
1
);
if
(
WIFEXITED
(
status
)
&&
WEXITSTATUS
(
status
)
==
0
)
return
true
;
fprintf
(
stderr
,
"w
arning: your CPU has %s instructions, but not your "
"operating system.
\n
"
,
psz_capability
);
fprintf
(
stderr
,
"W
arning: your CPU has %s instructions, but not your "
"operating system.
\n
"
,
name
);
fprintf
(
stderr
,
" some optimizations will be disabled unless "
"you upgrade your OS
\n
"
);
return
false
;
}
# define check_capability(name, flag, code, input) \
do { \
pid_t pid = fork(); \
if( pid == 0 ) \
{ \
signal(SIGILL, SIG_DFL); \
__asm__ __volatile__ ( code : : input ); \
_exit(0); \
} \
if( check_OS_capability((name), pid )) \
i_capabilities |= (flag); \
} while(0)
# else
/* WIN32 || __OS2__ */
# define check_capability(name, flag, code, input) \
i_capabilities |= (flag);
# endif
#if defined (CAN_COMPILE_SSE) && !defined (__SSE__)
VLC_SSE
static
void
SSE_test
(
void
)
{
asm
volatile
(
"xorps %%xmm0,%%xmm0
\n
"
:
:
:
"xmm0"
,
"xmm1"
);
}
#endif
#if defined (CAN_COMPILE_SSE2) && !defined (__SSE2__)
VLC_SSE
static
void
SSE2_test
(
void
)
{
asm
volatile
(
"movupd %%xmm0, %%xmm0
\n
"
:
:
:
"xmm0"
,
"xmm1"
);
}
#endif
#if defined (CAN_COMPILE_SSE3) && !defined (__SSE3__)
VLC_SSE
static
void
SSE3_test
(
void
)
{
asm
volatile
(
"movsldup %%xmm1, %%xmm0
\n
"
:
:
:
"xmm0"
,
"xmm1"
);
}
#endif
#if defined (CAN_COMPILE_SSSE3) && !defined (__SSSE3__)
VLC_SSE
static
void
SSSE3_test
(
void
)
{
asm
volatile
(
"pabsw %%xmm1, %%xmm0
\n
"
:
:
:
"xmm0"
,
"xmm1"
);
}
#endif
#if defined (CAN_COMPILE_SSE4_1) && !defined (__SSE4_1__)
VLC_SSE
static
void
SSE4_1_test
(
void
)
{
asm
volatile
(
"pmaxsb %%xmm1, %%xmm0
\n
"
:
:
:
"xmm0"
,
"xmm1"
);
}
#endif
#if defined (CAN_COMPILE_SSE4_2) && !defined (__SSE4_2__)
VLC_SSE
static
void
SSE4_2_test
(
void
)
{
asm
volatile
(
"pcmpgtq %%xmm1, %%xmm0
\n
"
:
:
:
"xmm0"
,
"xmm1"
);
}
#endif
#if defined (CAN_COMPILE_3DNOW) && !defined (__3dNOW__)
VLC_MMX
static
void
ThreeD_Now_test
(
void
)
{
asm
volatile
(
"pfadd %%mm0,%%mm0
\n
"
"femms
\n
"
:
:
:
"mm0"
);
}
#endif
#if defined (CAN_COMPILE_ALTIVEC)
static
void
Altivec_text
(
void
)
{
asm
volatile
(
"mtspr 256, %0
\n
"
"vand %%v0, %%v0, %%v0
\n
"
:
:
"r"
(
-
1
));
}
#endif
#else
/* WIN32 || __OS2__ */
# define vlc_CPU_check(name, func) (1)
#endif
#endif
/**
...
...
@@ -175,8 +221,8 @@ void vlc_CPU_init (void)
i_capabilities
|=
CPU_CAPABILITY_MMXEXT
;
# ifdef CAN_COMPILE_SSE
check_capability
(
"SSE"
,
CPU_CAPABILITY_SSE
,
"xorps %%xmm0,%%xmm0
\n
"
,
)
;
if
(
vlc_CPU_check
(
"SSE"
,
SSE_test
))
i_capabilities
|=
CPU_CAPABILITY_SSE
;
# endif
}
# endif
...
...
@@ -184,41 +230,36 @@ void vlc_CPU_init (void)
# if defined (__SSE2__)
i_capabilities
|=
CPU_CAPABILITY_SSE2
;
# elif defined (CAN_COMPILE_SSE2)
if
(
i_edx
&
0x04000000
)
check_capability
(
"SSE2"
,
CPU_CAPABILITY_SSE2
,
"movupd %%xmm0, %%xmm0
\n
"
,
);
if
((
i_edx
&
0x04000000
)
&&
vlc_CPU_check
(
"SSE2"
,
SSE2_test
))
i_capabilities
|=
CPU_CAPABILITY_SSE2
;
# endif
# if defined (__SSE3__)
i_capabilities
|=
CPU_CAPABILITY_SSE3
;
# elif defined (CAN_COMPILE_SSE3)
if
(
i_ecx
&
0x00000001
)
check_capability
(
"SSE3"
,
CPU_CAPABILITY_SSE3
,
"movsldup %%xmm1, %%xmm0
\n
"
,
);
if
((
i_ecx
&
0x00000001
)
&&
vlc_CPU_check
(
"SSE3"
,
SSE3_test
))
i_capabilities
|=
CPU_CAPABILITY_SSE3
;
# endif
# if defined (__SSSE3__)
i_capabilities
|=
CPU_CAPABILITY_SSSE3
;
# elif defined (CAN_COMPILE_SSSE3)
if
(
i_ecx
&
0x00000200
)
check_capability
(
"SSSE3"
,
CPU_CAPABILITY_SSSE3
,
"pabsw %%xmm1, %%xmm0
\n
"
,
);
if
((
i_ecx
&
0x00000200
)
&&
vlc_CPU_check
(
"SSSE3"
,
SSSE3_test
))
i_capabilities
|=
CPU_CAPABILITY_SSSE3
;
# endif
# if defined (__SSE4_1__)
i_capabilities
|=
CPU_CAPABILITY_SSE4_1
;
# elif defined (CAN_COMPILE_SSE4_1)
if
(
i_ecx
&
0x00080000
)
check_capability
(
"SSE4.1"
,
CPU_CAPABILITY_SSE4_1
,
"pmaxsb %%xmm1, %%xmm0
\n
"
,
);
if
((
i_ecx
&
0x00080000
)
&&
vlc_CPU_check
(
"SSE4.1"
,
SSE4_1_test
))
i_capabilities
|=
CPU_CAPABILITY_SSE4_1
;
# endif
# if defined (__SSE4_2__)
i_capabilities
|=
CPU_CAPABILITY_SSE4_2
;
# elif defined (CAN_COMPILE_SSE4_2)
if
(
i_ecx
&
0x00100000
)
check_capability
(
"SSE4.2"
,
CPU_CAPABILITY_SSE4_2
,
"pcmpgtq %%xmm1, %%xmm0
\n
"
,
);
if
((
i_ecx
&
0x00100000
)
&&
vlc_CPU_check
(
"SSE4.2"
,
SSE4_2_test
))
i_capabilities
|=
CPU_CAPABILITY_SSE4_2
;
# endif
/* test for additional capabilities */
...
...
@@ -233,9 +274,8 @@ void vlc_CPU_init (void)
# if defined (__3dNOW__)
i_capabilities
|=
CPU_CAPABILITY_3DNOW
;
# elif defined (CAN_COMPILE_3DNOW)
if
(
i_edx
&
0x80000000
)
check_capability
(
"3D Now!"
,
CPU_CAPABILITY_3DNOW
,
"pfadd %%mm0,%%mm0
\n
"
"femms
\n
"
,
);
if
((
i_edx
&
0x80000000
)
&&
vlc_CPU_check
(
"3D Now!"
,
ThreeD_Now_test
))
i_capabilities
|=
CPU_CAPABILITY_3DNOW
;
# endif
if
(
b_amd
&&
(
i_edx
&
0x00400000
)
)
...
...
@@ -300,10 +340,8 @@ out:
i_capabilities
|=
CPU_CAPABILITY_ALTIVEC
;
# elif defined( CAN_COMPILE_ALTIVEC )
check_capability
(
"Altivec"
,
CPU_CAPABILITY_ALTIVEC
,
"mtspr 256, %0
\n\t
"
"vand %%v0, %%v0, %%v0"
,
"r"
(
-
1
));
if
(
vlc_CPU_check
(
"Altivec"
,
Altivec_test
))
i_capabilities
|=
CPU_CAPABILITY_ALTIVEC
;
# endif
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment