annotate ppc/util_altivec.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 8499462c732f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5750
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
1 /*
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
2 * This file is part of FFmpeg.
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
3 *
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
4 * FFmpeg is free software; you can redistribute it and/or
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
5 * modify it under the terms of the GNU Lesser General Public
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
6 * License as published by the Free Software Foundation; either
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
7 * version 2.1 of the License, or (at your option) any later version.
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
8 *
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
9 * FFmpeg is distributed in the hope that it will be useful,
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
12 * Lesser General Public License for more details.
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
13 *
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
14 * You should have received a copy of the GNU Lesser General Public
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
15 * License along with FFmpeg; if not, write to the Free Software
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
17 */
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
18
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
19 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 8718
diff changeset
20 * @file
5750
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
21 * Contains misc utility macros and inline functions
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
22 */
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
23
7760
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 7373
diff changeset
24 #ifndef AVCODEC_PPC_UTIL_ALTIVEC_H
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 7373
diff changeset
25 #define AVCODEC_PPC_UTIL_ALTIVEC_H
5750
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
26
6078
3b73d2fbc9e4 Fix make checkheaders.
diego
parents: 5830
diff changeset
27 #include <stdint.h>
3b73d2fbc9e4 Fix make checkheaders.
diego
parents: 5830
diff changeset
28
3b73d2fbc9e4 Fix make checkheaders.
diego
parents: 5830
diff changeset
29 #include "config.h"
3b73d2fbc9e4 Fix make checkheaders.
diego
parents: 5830
diff changeset
30
8590
7a463923ecd1 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 7760
diff changeset
31 #if HAVE_ALTIVEC_H
6078
3b73d2fbc9e4 Fix make checkheaders.
diego
parents: 5830
diff changeset
32 #include <altivec.h>
3b73d2fbc9e4 Fix make checkheaders.
diego
parents: 5830
diff changeset
33 #endif
3b73d2fbc9e4 Fix make checkheaders.
diego
parents: 5830
diff changeset
34
12010
8499462c732f Altivec: Add helper function to load from a constant misalignment
conrad
parents: 11644
diff changeset
35 #include "types_altivec.h"
8499462c732f Altivec: Add helper function to load from a constant misalignment
conrad
parents: 11644
diff changeset
36
5750
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
37 // used to build registers permutation vectors (vcprm)
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
38 // the 's' are for words in the _s_econd vector
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
39 #define WORD_0 0x00,0x01,0x02,0x03
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
40 #define WORD_1 0x04,0x05,0x06,0x07
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
41 #define WORD_2 0x08,0x09,0x0a,0x0b
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
42 #define WORD_3 0x0c,0x0d,0x0e,0x0f
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
43 #define WORD_s0 0x10,0x11,0x12,0x13
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
44 #define WORD_s1 0x14,0x15,0x16,0x17
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
45 #define WORD_s2 0x18,0x19,0x1a,0x1b
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
46 #define WORD_s3 0x1c,0x1d,0x1e,0x1f
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
47
7373
266d4949aa15 Remove AltiVec vector declaration compiler compatibility macros.
diego
parents: 6368
diff changeset
48 #define vcprm(a,b,c,d) (const vector unsigned char){WORD_ ## a, WORD_ ## b, WORD_ ## c, WORD_ ## d}
266d4949aa15 Remove AltiVec vector declaration compiler compatibility macros.
diego
parents: 6368
diff changeset
49 #define vcii(a,b,c,d) (const vector float){FLOAT_ ## a, FLOAT_ ## b, FLOAT_ ## c, FLOAT_ ## d}
5750
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
50
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
51 // vcprmle is used to keep the same index as in the SSE version.
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
52 // it's the same as vcprm, with the index inversed
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
53 // ('le' is Little Endian)
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
54 #define vcprmle(a,b,c,d) vcprm(d,c,b,a)
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
55
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
56 // used to build inverse/identity vectors (vcii)
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
57 // n is _n_egative, p is _p_ositive
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
58 #define FLOAT_n -1.
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
59 #define FLOAT_p 1.
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
60
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
61
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
62 // Transpose 8x8 matrix of 16-bit elements (in-place)
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
63 #define TRANSPOSE8(a,b,c,d,e,f,g,h) \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
64 do { \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
65 vector signed short A1, B1, C1, D1, E1, F1, G1, H1; \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
66 vector signed short A2, B2, C2, D2, E2, F2, G2, H2; \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
67 \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
68 A1 = vec_mergeh (a, e); \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
69 B1 = vec_mergel (a, e); \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
70 C1 = vec_mergeh (b, f); \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
71 D1 = vec_mergel (b, f); \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
72 E1 = vec_mergeh (c, g); \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
73 F1 = vec_mergel (c, g); \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
74 G1 = vec_mergeh (d, h); \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
75 H1 = vec_mergel (d, h); \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
76 \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
77 A2 = vec_mergeh (A1, E1); \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
78 B2 = vec_mergel (A1, E1); \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
79 C2 = vec_mergeh (B1, F1); \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
80 D2 = vec_mergel (B1, F1); \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
81 E2 = vec_mergeh (C1, G1); \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
82 F2 = vec_mergel (C1, G1); \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
83 G2 = vec_mergeh (D1, H1); \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
84 H2 = vec_mergel (D1, H1); \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
85 \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
86 a = vec_mergeh (A2, E2); \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
87 b = vec_mergel (A2, E2); \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
88 c = vec_mergeh (B2, F2); \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
89 d = vec_mergel (B2, F2); \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
90 e = vec_mergeh (C2, G2); \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
91 f = vec_mergel (C2, G2); \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
92 g = vec_mergeh (D2, H2); \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
93 h = vec_mergel (D2, H2); \
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
94 } while (0)
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
95
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
96
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
97 /** \brief loads unaligned vector \a *src with offset \a offset
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
98 and returns it */
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
99 static inline vector unsigned char unaligned_load(int offset, uint8_t *src)
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
100 {
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
101 register vector unsigned char first = vec_ld(offset, src);
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
102 register vector unsigned char second = vec_ld(offset+15, src);
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
103 register vector unsigned char mask = vec_lvsl(offset, src);
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
104 return vec_perm(first, second, mask);
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
105 }
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents:
diff changeset
106
12010
8499462c732f Altivec: Add helper function to load from a constant misalignment
conrad
parents: 11644
diff changeset
107 /**
8499462c732f Altivec: Add helper function to load from a constant misalignment
conrad
parents: 11644
diff changeset
108 * loads vector known misalignment
8499462c732f Altivec: Add helper function to load from a constant misalignment
conrad
parents: 11644
diff changeset
109 * @param perm_vec the align permute vector to combine the two loads from lvsl
8499462c732f Altivec: Add helper function to load from a constant misalignment
conrad
parents: 11644
diff changeset
110 */
8499462c732f Altivec: Add helper function to load from a constant misalignment
conrad
parents: 11644
diff changeset
111 static inline vec_u8 load_with_perm_vec(int offset, uint8_t *src, vec_u8 perm_vec)
8499462c732f Altivec: Add helper function to load from a constant misalignment
conrad
parents: 11644
diff changeset
112 {
8499462c732f Altivec: Add helper function to load from a constant misalignment
conrad
parents: 11644
diff changeset
113 vec_u8 a = vec_ld(offset, src);
8499462c732f Altivec: Add helper function to load from a constant misalignment
conrad
parents: 11644
diff changeset
114 vec_u8 b = vec_ld(offset+15, src);
8499462c732f Altivec: Add helper function to load from a constant misalignment
conrad
parents: 11644
diff changeset
115 return vec_perm(a, b, perm_vec);
8499462c732f Altivec: Add helper function to load from a constant misalignment
conrad
parents: 11644
diff changeset
116 }
8499462c732f Altivec: Add helper function to load from a constant misalignment
conrad
parents: 11644
diff changeset
117
7760
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 7373
diff changeset
118 #endif /* AVCODEC_PPC_UTIL_ALTIVEC_H */