Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
e42a152b
F
Ffmpeg
项目概览
小白菜888
/
Ffmpeg
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
Ffmpeg
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
e42a152b
编写于
12月 13, 2004
作者:
M
Michael Niedermayer
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
x86 cpu capabilities detection rewrite / cleanup
Originally committed as revision 3750 to
svn://svn.ffmpeg.org/ffmpeg/trunk
上级
74679f5c
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
42 addition
and
61 deletion
+42
-61
libavcodec/avcodec.h
libavcodec/avcodec.h
+1
-0
libavcodec/dsputil.h
libavcodec/dsputil.h
+1
-0
libavcodec/i386/cputest.c
libavcodec/i386/cputest.c
+40
-61
未找到文件。
libavcodec/avcodec.h
浏览文件 @
e42a152b
...
...
@@ -1169,6 +1169,7 @@ typedef struct AVCodecContext {
#define FF_MM_MMXEXT 0x0002
/* SSE integer functions or AMD MMX ext */
#define FF_MM_SSE 0x0008
/* SSE functions */
#define FF_MM_SSE2 0x0010
/* PIV SSE2 functions */
#define FF_MM_3DNOWEXT 0x0020
/* AMD 3DNowExt */
#endif
/* HAVE_MMX */
/**
...
...
libavcodec/dsputil.h
浏览文件 @
e42a152b
...
...
@@ -408,6 +408,7 @@ int mm_support(void);
#define MM_MMXEXT 0x0002
/* SSE integer functions or AMD MMX ext */
#define MM_SSE 0x0008
/* SSE functions */
#define MM_SSE2 0x0010
/* PIV SSE2 functions */
#define MM_3DNOWEXT 0x0020
/* AMD 3DNowExt */
extern
int
mm_flags
;
...
...
libavcodec/i386/cputest.c
浏览文件 @
e42a152b
...
...
@@ -27,6 +27,7 @@ int mm_support(void)
{
int
rval
=
0
;
int
eax
,
ebx
,
ecx
,
edx
;
int
max_std_level
,
max_ext_level
,
std_caps
=
0
,
ext_caps
=
0
;
long
a
,
c
;
__asm__
__volatile__
(
...
...
@@ -52,58 +53,44 @@ int mm_support(void)
if
(
a
==
c
)
return
0
;
/* CPUID not supported */
cpuid
(
0
,
eax
,
ebx
,
ecx
,
edx
);
if
(
ebx
==
0x756e6547
&&
edx
==
0x49656e69
&&
ecx
==
0x6c65746e
)
{
/* intel */
inteltest:
cpuid
(
1
,
eax
,
ebx
,
ecx
,
edx
);
if
((
edx
&
0x00800000
)
==
0
)
return
0
;
rval
|=
MM_MMX
;
if
(
edx
&
0x02000000
)
cpuid
(
0
,
max_std_level
,
ebx
,
ecx
,
edx
);
if
(
max_std_level
>=
1
){
cpuid
(
1
,
eax
,
ebx
,
ecx
,
std_caps
);
if
(
std_caps
&
(
1
<<
23
))
rval
|=
MM_MMX
;
if
(
std_caps
&
(
1
<<
25
))
rval
|=
MM_MMXEXT
|
MM_SSE
;
if
(
edx
&
0x04000000
)
if
(
std_caps
&
(
1
<<
26
)
)
rval
|=
MM_SSE2
;
return
rval
;
}
else
if
(
ebx
==
0x68747541
&&
}
cpuid
(
0x80000000
,
max_ext_level
,
ebx
,
ecx
,
edx
);
if
(
max_ext_level
>=
0x80000001
){
cpuid
(
0x80000001
,
eax
,
ebx
,
ecx
,
ext_caps
);
if
(
ext_caps
&
(
1
<<
31
))
rval
|=
MM_3DNOW
;
if
(
ext_caps
&
(
1
<<
30
))
rval
|=
MM_3DNOWEXT
;
if
(
ext_caps
&
(
1
<<
23
))
rval
|=
MM_MMX
;
}
cpuid
(
0
,
eax
,
ebx
,
ecx
,
edx
);
if
(
ebx
==
0x68747541
&&
edx
==
0x69746e65
&&
ecx
==
0x444d4163
)
{
/* AMD */
cpuid
(
0x80000000
,
eax
,
ebx
,
ecx
,
edx
);
if
((
unsigned
)
eax
<
0x80000001
)
goto
inteltest
;
cpuid
(
0x80000001
,
eax
,
ebx
,
ecx
,
edx
);
if
((
edx
&
0x00800000
)
==
0
)
return
0
;
rval
=
MM_MMX
;
if
(
edx
&
0x80000000
)
rval
|=
MM_3DNOW
;
if
(
edx
&
0x00400000
)
if
(
ext_caps
&
(
1
<<
22
))
rval
|=
MM_MMXEXT
;
goto
inteltest
;
}
else
if
(
ebx
==
0x746e6543
&&
edx
==
0x48727561
&&
ecx
==
0x736c7561
)
{
/* "CentaurHauls" */
/* VIA C3 */
cpuid
(
0x80000000
,
eax
,
ebx
,
ecx
,
edx
);
if
((
unsigned
)
eax
<
0x80000001
)
goto
inteltest
;
cpuid
(
0x80000001
,
eax
,
ebx
,
ecx
,
edx
);
rval
=
0
;
if
(
edx
&
(
1
<<
31
)
)
rval
|=
MM_3DNOW
;
if
(
edx
&
(
1
<<
23
)
)
rval
|=
MM_MMX
;
if
(
edx
&
(
1
<<
24
)
)
if
(
ext_caps
&
(
1
<<
24
))
rval
|=
MM_MMXEXT
;
if
(
rval
==
0
)
goto
inteltest
;
return
rval
;
}
else
if
(
ebx
==
0x69727943
&&
edx
==
0x736e4978
&&
ecx
==
0x64616574
)
{
...
...
@@ -116,29 +103,21 @@ int mm_support(void)
According to the table, the only CPU which supports level
2 is also the only one which supports extended CPUID levels.
*/
if
(
eax
!=
2
)
goto
inteltest
;
cpuid
(
0x80000001
,
eax
,
ebx
,
ecx
,
edx
);
if
((
eax
&
0x00800000
)
==
0
)
return
0
;
rval
=
MM_MMX
;
if
(
eax
&
0x01000000
)
if
(
eax
<
2
)
return
rval
;
if
(
ext_caps
&
(
1
<<
24
))
rval
|=
MM_MMXEXT
;
return
rval
;
}
else
if
(
ebx
==
0x756e6547
&&
edx
==
0x54656e69
&&
ecx
==
0x3638784d
)
{
/* Tranmeta Crusoe */
cpuid
(
0x80000000
,
eax
,
ebx
,
ecx
,
edx
);
if
((
unsigned
)
eax
<
0x80000001
)
return
0
;
cpuid
(
0x80000001
,
eax
,
ebx
,
ecx
,
edx
);
if
((
edx
&
0x00800000
)
==
0
)
return
0
;
return
MM_MMX
;
}
else
{
return
0
;
}
#if 0
av_log(NULL, AV_LOG_DEBUG, "%s%s%s%s%s%s\n",
(rval&MM_MMX) ? "MMX ":"",
(rval&MM_MMXEXT) ? "MMX2 ":"",
(rval&MM_SSE) ? "SSE ":"",
(rval&MM_SSE2) ? "SSE2 ":"",
(rval&MM_3DNOW) ? "3DNow ":"",
(rval&MM_3DNOWEXT) ? "3DNowExt ":"");
#endif
return
rval
;
}
#ifdef __TEST__
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录