Mercurial > libavcodec.hg
annotate i386/cputest.c @ 2504:f12657081093 libavcodec
INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org)
This patch adds the support for INTRA PCM macroblocks in CAVLC and CABAC
mode, the deblocking needed a small modification and so did the
intra4x4_pred_mode prediction.
With this patch, the 5 streams of the conformance suite containing INTRA
PCM macroblocks now decode entirely, 4 are completely corrects, 1 is
incorrect since the first B slice because of deblocking in B slice not
yet implemented.
The code is not optimized for speed, it is not necessary IPCM
macroblocks are rare, but it could be optimized for code size, if
someone want to do this, feel free.
author | michael |
---|---|
date | Mon, 07 Feb 2005 00:10:28 +0000 |
parents | 55a72627a2c5 |
children | ef2149182f1c |
rev | line source |
---|---|
0 | 1 /* Cpu detection code, extracted from mmx.h ((c)1997-99 by H. Dietz |
429 | 2 and R. Fisher). Converted to C and improved by Fabrice Bellard */ |
0 | 3 |
4 #include <stdlib.h> | |
5 #include "../dsputil.h" | |
6 | |
2293
15cfba1b97b5
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64 patch by (Aurelien Jacobs <aurel at gnuage dot org>)
michael
parents:
2129
diff
changeset
|
7 #ifdef ARCH_X86_64 |
15cfba1b97b5
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64 patch by (Aurelien Jacobs <aurel at gnuage dot org>)
michael
parents:
2129
diff
changeset
|
8 # define REG_b "rbx" |
15cfba1b97b5
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64 patch by (Aurelien Jacobs <aurel at gnuage dot org>)
michael
parents:
2129
diff
changeset
|
9 # define REG_S "rsi" |
15cfba1b97b5
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64 patch by (Aurelien Jacobs <aurel at gnuage dot org>)
michael
parents:
2129
diff
changeset
|
10 #else |
15cfba1b97b5
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64 patch by (Aurelien Jacobs <aurel at gnuage dot org>)
michael
parents:
2129
diff
changeset
|
11 # define REG_b "ebx" |
15cfba1b97b5
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64 patch by (Aurelien Jacobs <aurel at gnuage dot org>)
michael
parents:
2129
diff
changeset
|
12 # define REG_S "esi" |
15cfba1b97b5
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64 patch by (Aurelien Jacobs <aurel at gnuage dot org>)
michael
parents:
2129
diff
changeset
|
13 #endif |
15cfba1b97b5
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64 patch by (Aurelien Jacobs <aurel at gnuage dot org>)
michael
parents:
2129
diff
changeset
|
14 |
22
c31fb57d17a6
Suppressing external gas stuff to improve portability to Win32
nickols_k
parents:
16
diff
changeset
|
15 /* ebx saving is necessary for PIC. gcc seems unable to see it alone */ |
c31fb57d17a6
Suppressing external gas stuff to improve portability to Win32
nickols_k
parents:
16
diff
changeset
|
16 #define cpuid(index,eax,ebx,ecx,edx)\ |
43 | 17 __asm __volatile\ |
2293
15cfba1b97b5
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64 patch by (Aurelien Jacobs <aurel at gnuage dot org>)
michael
parents:
2129
diff
changeset
|
18 ("mov %%"REG_b", %%"REG_S"\n\t"\ |
22
c31fb57d17a6
Suppressing external gas stuff to improve portability to Win32
nickols_k
parents:
16
diff
changeset
|
19 "cpuid\n\t"\ |
2293
15cfba1b97b5
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64 patch by (Aurelien Jacobs <aurel at gnuage dot org>)
michael
parents:
2129
diff
changeset
|
20 "xchg %%"REG_b", %%"REG_S\ |
22
c31fb57d17a6
Suppressing external gas stuff to improve portability to Win32
nickols_k
parents:
16
diff
changeset
|
21 : "=a" (eax), "=S" (ebx),\ |
c31fb57d17a6
Suppressing external gas stuff to improve portability to Win32
nickols_k
parents:
16
diff
changeset
|
22 "=c" (ecx), "=d" (edx)\ |
43 | 23 : "0" (index)); |
0 | 24 |
25 /* Function to test if multimedia instructions are supported... */ | |
26 int mm_support(void) | |
27 { | |
2377
9214c91cdfb7
detect sse on athlon-xp patch by (matthieu castet <castet >.< matthieu >at< free >.< fr>)
michael
parents:
2300
diff
changeset
|
28 int rval = 0; |
0 | 29 int eax, ebx, ecx, edx; |
2388 | 30 int max_std_level, max_ext_level, std_caps=0, ext_caps=0; |
2300
40542ea560d5
gcc 3.4.3 preversions do not appreciate invalid instruction and operand combinations anymore patch by (Aurelien Jacobs <aurel at gnuage dot org>)
michael
parents:
2293
diff
changeset
|
31 long a, c; |
0 | 32 |
33 __asm__ __volatile__ ( | |
34 /* See if CPUID instruction is supported ... */ | |
35 /* ... Get copies of EFLAGS into eax and ecx */ | |
36 "pushf\n\t" | |
2293
15cfba1b97b5
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64 patch by (Aurelien Jacobs <aurel at gnuage dot org>)
michael
parents:
2129
diff
changeset
|
37 "pop %0\n\t" |
2300
40542ea560d5
gcc 3.4.3 preversions do not appreciate invalid instruction and operand combinations anymore patch by (Aurelien Jacobs <aurel at gnuage dot org>)
michael
parents:
2293
diff
changeset
|
38 "mov %0, %1\n\t" |
0 | 39 |
40 /* ... Toggle the ID bit in one copy and store */ | |
41 /* to the EFLAGS reg */ | |
2300
40542ea560d5
gcc 3.4.3 preversions do not appreciate invalid instruction and operand combinations anymore patch by (Aurelien Jacobs <aurel at gnuage dot org>)
michael
parents:
2293
diff
changeset
|
42 "xor $0x200000, %0\n\t" |
0 | 43 "push %0\n\t" |
44 "popf\n\t" | |
45 | |
46 /* ... Get the (hopefully modified) EFLAGS */ | |
47 "pushf\n\t" | |
2293
15cfba1b97b5
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64 patch by (Aurelien Jacobs <aurel at gnuage dot org>)
michael
parents:
2129
diff
changeset
|
48 "pop %0\n\t" |
2300
40542ea560d5
gcc 3.4.3 preversions do not appreciate invalid instruction and operand combinations anymore patch by (Aurelien Jacobs <aurel at gnuage dot org>)
michael
parents:
2293
diff
changeset
|
49 : "=a" (a), "=c" (c) |
0 | 50 : |
51 : "cc" | |
52 ); | |
53 | |
2300
40542ea560d5
gcc 3.4.3 preversions do not appreciate invalid instruction and operand combinations anymore patch by (Aurelien Jacobs <aurel at gnuage dot org>)
michael
parents:
2293
diff
changeset
|
54 if (a == c) |
0 | 55 return 0; /* CPUID not supported */ |
2388 | 56 |
57 cpuid(0, max_std_level, ebx, ecx, edx); | |
58 | |
59 if(max_std_level >= 1){ | |
60 cpuid(1, eax, ebx, ecx, std_caps); | |
61 if (std_caps & (1<<23)) | |
62 rval |= MM_MMX; | |
63 if (std_caps & (1<<25)) | |
64 rval |= MM_MMXEXT | MM_SSE; | |
65 if (std_caps & (1<<26)) | |
66 rval |= MM_SSE2; | |
67 } | |
0 | 68 |
2388 | 69 cpuid(0x80000000, max_ext_level, ebx, ecx, edx); |
70 | |
71 if(max_ext_level >= 0x80000001){ | |
72 cpuid(0x80000001, eax, ebx, ecx, ext_caps); | |
73 if (ext_caps & (1<<31)) | |
74 rval |= MM_3DNOW; | |
75 if (ext_caps & (1<<30)) | |
76 rval |= MM_3DNOWEXT; | |
77 if (ext_caps & (1<<23)) | |
78 rval |= MM_MMX; | |
79 } | |
80 | |
81 cpuid(0, eax, ebx, ecx, edx); | |
82 if ( ebx == 0x68747541 && | |
0 | 83 edx == 0x69746e65 && |
84 ecx == 0x444d4163) { | |
85 /* AMD */ | |
2388 | 86 if(ext_caps & (1<<22)) |
0 | 87 rval |= MM_MMXEXT; |
889
6a9c3ecf2dec
via c3 detection patch by (Francisco Javier Cabello Torres <fjcabello at visual-tools dot com>)
michaelni
parents:
429
diff
changeset
|
88 } else if (ebx == 0x746e6543 && |
6a9c3ecf2dec
via c3 detection patch by (Francisco Javier Cabello Torres <fjcabello at visual-tools dot com>)
michaelni
parents:
429
diff
changeset
|
89 edx == 0x48727561 && |
6a9c3ecf2dec
via c3 detection patch by (Francisco Javier Cabello Torres <fjcabello at visual-tools dot com>)
michaelni
parents:
429
diff
changeset
|
90 ecx == 0x736c7561) { /* "CentaurHauls" */ |
6a9c3ecf2dec
via c3 detection patch by (Francisco Javier Cabello Torres <fjcabello at visual-tools dot com>)
michaelni
parents:
429
diff
changeset
|
91 /* VIA C3 */ |
2388 | 92 if(ext_caps & (1<<24)) |
896
d774ded81bf6
via c3 fix patch by (Francisco Javier Cabello Torres <fjcabello at visual-tools dot com>)
michaelni
parents:
889
diff
changeset
|
93 rval |= MM_MMXEXT; |
0 | 94 } else if (ebx == 0x69727943 && |
95 edx == 0x736e4978 && | |
96 ecx == 0x64616574) { | |
97 /* Cyrix Section */ | |
98 /* See if extended CPUID level 80000001 is supported */ | |
99 /* The value of CPUID/80000001 for the 6x86MX is undefined | |
100 according to the Cyrix CPU Detection Guide (Preliminary | |
101 Rev. 1.01 table 1), so we'll check the value of eax for | |
102 CPUID/0 to see if standard CPUID level 2 is supported. | |
103 According to the table, the only CPU which supports level | |
104 2 is also the only one which supports extended CPUID levels. | |
105 */ | |
2388 | 106 if (eax < 2) |
107 return rval; | |
108 if (ext_caps & (1<<24)) | |
0 | 109 rval |= MM_MMXEXT; |
110 } | |
2388 | 111 #if 0 |
112 av_log(NULL, AV_LOG_DEBUG, "%s%s%s%s%s%s\n", | |
113 (rval&MM_MMX) ? "MMX ":"", | |
114 (rval&MM_MMXEXT) ? "MMX2 ":"", | |
115 (rval&MM_SSE) ? "SSE ":"", | |
116 (rval&MM_SSE2) ? "SSE2 ":"", | |
117 (rval&MM_3DNOW) ? "3DNow ":"", | |
118 (rval&MM_3DNOWEXT) ? "3DNowExt ":""); | |
119 #endif | |
120 return rval; | |
0 | 121 } |
43 | 122 |
123 #ifdef __TEST__ | |
124 int main ( void ) | |
125 { | |
126 int mm_flags; | |
127 mm_flags = mm_support(); | |
2129 | 128 printf("mm_support = 0x%08X\n",mm_flags); |
43 | 129 return 0; |
130 } | |
131 #endif |