annotate x86/mathops.h @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 21fd8b4dfab9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8430
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
1 /*
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
2 * simple math operations
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
3 * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> et al
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
4 *
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
5 * This file is part of FFmpeg.
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
6 *
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
11 *
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
15 * Lesser General Public License for more details.
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
16 *
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
20 */
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
21
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
22 #ifndef AVCODEC_X86_MATHOPS_H
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
23 #define AVCODEC_X86_MATHOPS_H
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
24
8627
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8430
diff changeset
25 #include "config.h"
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8430
diff changeset
26 #include "libavutil/common.h"
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8430
diff changeset
27
8759
4cea2f47219a re-enable mid_pred asm on x86_64. (broke in r16681)
lorenm
parents: 8627
diff changeset
28 #if ARCH_X86_32
8430
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
29 #define MULL(ra, rb, shift) \
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
30 ({ int rt, dummy; __asm__ (\
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
31 "imull %3 \n\t"\
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
32 "shrdl %4, %%edx, %%eax \n\t"\
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
33 : "=a"(rt), "=d"(dummy)\
11702
21fd8b4dfab9 Adding missing () to mathops.h.
michael
parents: 11200
diff changeset
34 : "a" ((int)(ra)), "rm" ((int)(rb)), "i"(shift));\
8430
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
35 rt; })
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
36
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
37 #define MULH(ra, rb) \
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
38 ({ int rt, dummy;\
11702
21fd8b4dfab9 Adding missing () to mathops.h.
michael
parents: 11200
diff changeset
39 __asm__ ("imull %3\n\t" : "=d"(rt), "=a"(dummy): "a" ((int)(ra)), "rm" ((int)(rb)));\
8430
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
40 rt; })
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
41
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
42 #define MUL64(ra, rb) \
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
43 ({ int64_t rt;\
11702
21fd8b4dfab9 Adding missing () to mathops.h.
michael
parents: 11200
diff changeset
44 __asm__ ("imull %2\n\t" : "=A"(rt) : "a" ((int)(ra)), "g" ((int)(rb)));\
8430
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
45 rt; })
8759
4cea2f47219a re-enable mid_pred asm on x86_64. (broke in r16681)
lorenm
parents: 8627
diff changeset
46 #endif
8430
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
47
8627
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8430
diff changeset
48 #if HAVE_CMOV
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8430
diff changeset
49 /* median of 3 */
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8430
diff changeset
50 #define mid_pred mid_pred
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8430
diff changeset
51 static inline av_const int mid_pred(int a, int b, int c)
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8430
diff changeset
52 {
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8430
diff changeset
53 int i=b;
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8430
diff changeset
54 __asm__ volatile(
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8430
diff changeset
55 "cmp %2, %1 \n\t"
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8430
diff changeset
56 "cmovg %1, %0 \n\t"
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8430
diff changeset
57 "cmovg %2, %1 \n\t"
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8430
diff changeset
58 "cmp %3, %1 \n\t"
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8430
diff changeset
59 "cmovl %3, %1 \n\t"
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8430
diff changeset
60 "cmp %1, %0 \n\t"
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8430
diff changeset
61 "cmovg %1, %0 \n\t"
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8430
diff changeset
62 :"+&r"(i), "+&r"(a)
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8430
diff changeset
63 :"r"(b), "r"(c)
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8430
diff changeset
64 );
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8430
diff changeset
65 return i;
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8430
diff changeset
66 }
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8430
diff changeset
67 #endif
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8430
diff changeset
68
10951
38b3b209b4bc Move COPY3_IF_LT to lavc/mathops.h
mru
parents: 8759
diff changeset
69 #if HAVE_CMOV
38b3b209b4bc Move COPY3_IF_LT to lavc/mathops.h
mru
parents: 8759
diff changeset
70 #define COPY3_IF_LT(x, y, a, b, c, d)\
38b3b209b4bc Move COPY3_IF_LT to lavc/mathops.h
mru
parents: 8759
diff changeset
71 __asm__ volatile(\
38b3b209b4bc Move COPY3_IF_LT to lavc/mathops.h
mru
parents: 8759
diff changeset
72 "cmpl %0, %3 \n\t"\
38b3b209b4bc Move COPY3_IF_LT to lavc/mathops.h
mru
parents: 8759
diff changeset
73 "cmovl %3, %0 \n\t"\
38b3b209b4bc Move COPY3_IF_LT to lavc/mathops.h
mru
parents: 8759
diff changeset
74 "cmovl %4, %1 \n\t"\
38b3b209b4bc Move COPY3_IF_LT to lavc/mathops.h
mru
parents: 8759
diff changeset
75 "cmovl %5, %2 \n\t"\
38b3b209b4bc Move COPY3_IF_LT to lavc/mathops.h
mru
parents: 8759
diff changeset
76 : "+&r" (x), "+&r" (a), "+r" (c)\
38b3b209b4bc Move COPY3_IF_LT to lavc/mathops.h
mru
parents: 8759
diff changeset
77 : "r" (y), "r" (b), "r" (d)\
38b3b209b4bc Move COPY3_IF_LT to lavc/mathops.h
mru
parents: 8759
diff changeset
78 );
38b3b209b4bc Move COPY3_IF_LT to lavc/mathops.h
mru
parents: 8759
diff changeset
79 #endif
38b3b209b4bc Move COPY3_IF_LT to lavc/mathops.h
mru
parents: 8759
diff changeset
80
11200
cd8a77473dd1 Move NEG_[US]SR32 macros to mathops.h
mru
parents: 10951
diff changeset
81 // avoid +32 for shift optimization (gcc should do that ...)
cd8a77473dd1 Move NEG_[US]SR32 macros to mathops.h
mru
parents: 10951
diff changeset
82 #define NEG_SSR32 NEG_SSR32
cd8a77473dd1 Move NEG_[US]SR32 macros to mathops.h
mru
parents: 10951
diff changeset
83 static inline int32_t NEG_SSR32( int32_t a, int8_t s){
cd8a77473dd1 Move NEG_[US]SR32 macros to mathops.h
mru
parents: 10951
diff changeset
84 __asm__ ("sarl %1, %0\n\t"
cd8a77473dd1 Move NEG_[US]SR32 macros to mathops.h
mru
parents: 10951
diff changeset
85 : "+r" (a)
cd8a77473dd1 Move NEG_[US]SR32 macros to mathops.h
mru
parents: 10951
diff changeset
86 : "ic" ((uint8_t)(-s))
cd8a77473dd1 Move NEG_[US]SR32 macros to mathops.h
mru
parents: 10951
diff changeset
87 );
cd8a77473dd1 Move NEG_[US]SR32 macros to mathops.h
mru
parents: 10951
diff changeset
88 return a;
cd8a77473dd1 Move NEG_[US]SR32 macros to mathops.h
mru
parents: 10951
diff changeset
89 }
cd8a77473dd1 Move NEG_[US]SR32 macros to mathops.h
mru
parents: 10951
diff changeset
90
cd8a77473dd1 Move NEG_[US]SR32 macros to mathops.h
mru
parents: 10951
diff changeset
91 #define NEG_USR32 NEG_USR32
cd8a77473dd1 Move NEG_[US]SR32 macros to mathops.h
mru
parents: 10951
diff changeset
92 static inline uint32_t NEG_USR32(uint32_t a, int8_t s){
cd8a77473dd1 Move NEG_[US]SR32 macros to mathops.h
mru
parents: 10951
diff changeset
93 __asm__ ("shrl %1, %0\n\t"
cd8a77473dd1 Move NEG_[US]SR32 macros to mathops.h
mru
parents: 10951
diff changeset
94 : "+r" (a)
cd8a77473dd1 Move NEG_[US]SR32 macros to mathops.h
mru
parents: 10951
diff changeset
95 : "ic" ((uint8_t)(-s))
cd8a77473dd1 Move NEG_[US]SR32 macros to mathops.h
mru
parents: 10951
diff changeset
96 );
cd8a77473dd1 Move NEG_[US]SR32 macros to mathops.h
mru
parents: 10951
diff changeset
97 return a;
cd8a77473dd1 Move NEG_[US]SR32 macros to mathops.h
mru
parents: 10951
diff changeset
98 }
cd8a77473dd1 Move NEG_[US]SR32 macros to mathops.h
mru
parents: 10951
diff changeset
99
8430
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents:
diff changeset
100 #endif /* AVCODEC_X86_MATHOPS_H */