Mercurial > libavcodec.hg
annotate alpha/asm.h @ 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 | 52254c2f9cae |
children | e44ff53b1c85 |
rev | line source |
---|---|
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
1 /* |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
2 * Alpha optimized DSP utils |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
3 * Copyright (c) 2002 Falk Hueffner <falk@debian.org> |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
4 * |
429 | 5 * This library is free software; you can redistribute it and/or |
6 * modify it under the terms of the GNU Lesser General Public | |
7 * License as published by the Free Software Foundation; either | |
8 * version 2 of the License, or (at your option) any later version. | |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
9 * |
429 | 10 * This library is distributed in the hope that it will be useful, |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
429 | 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 * Lesser General Public License for more details. | |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
14 * |
429 | 15 * You should have received a copy of the GNU Lesser General Public |
16 * License along with this library; if not, write to the Free Software | |
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
18 */ |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
19 |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
20 #ifndef LIBAVCODEC_ALPHA_ASM_H |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
21 #define LIBAVCODEC_ALPHA_ASM_H |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
22 |
504 | 23 #include <inttypes.h> |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
24 |
728 | 25 #if defined __GNUC__ |
26 # define GNUC_PREREQ(maj, min) \ | |
27 ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) | |
28 #else | |
29 # define GNUC_PREREQ(maj, min) 0 | |
30 #endif | |
31 | |
32 #if GNUC_PREREQ(2,96) | |
33 # define likely(x) __builtin_expect((x) != 0, 1) | |
34 # define unlikely(x) __builtin_expect((x) != 0, 0) | |
35 #else | |
36 # define likely(x) (x) | |
37 # define unlikely(x) (x) | |
38 #endif | |
39 | |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
40 #define AMASK_BWX (1 << 0) |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
41 #define AMASK_FIX (1 << 1) |
504 | 42 #define AMASK_CIX (1 << 2) |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
43 #define AMASK_MVI (1 << 8) |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
44 |
1378 | 45 static inline uint64_t BYTE_VEC(uint64_t x) |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
46 { |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
47 x |= x << 8; |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
48 x |= x << 16; |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
49 x |= x << 32; |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
50 return x; |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
51 } |
1378 | 52 static inline uint64_t WORD_VEC(uint64_t x) |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
53 { |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
54 x |= x << 16; |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
55 x |= x << 32; |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
56 return x; |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
57 } |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
58 |
504 | 59 #define ldq(p) (*(const uint64_t *) (p)) |
60 #define ldl(p) (*(const int32_t *) (p)) | |
61 #define stl(l, p) do { *(uint32_t *) (p) = (l); } while (0) | |
62 #define stq(l, p) do { *(uint64_t *) (p) = (l); } while (0) | |
728 | 63 #define sextw(x) ((int16_t) (x)) |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
64 |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
65 #ifdef __GNUC__ |
504 | 66 struct unaligned_long { uint64_t l; } __attribute__((packed)); |
67 #define ldq_u(p) (*(const uint64_t *) (((uint64_t) (p)) & ~7ul)) | |
68 #define uldq(a) (((const struct unaligned_long *) (a))->l) | |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
69 |
728 | 70 #if GNUC_PREREQ(3,3) |
1465
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
71 #define prefetch(p) __builtin_prefetch((p), 0, 1) |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
72 #define prefetch_en(p) __builtin_prefetch((p), 0, 0) |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
73 #define prefetch_m(p) __builtin_prefetch((p), 1, 1) |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
74 #define prefetch_men(p) __builtin_prefetch((p), 1, 0) |
504 | 75 #define cmpbge __builtin_alpha_cmpbge |
76 /* Avoid warnings. */ | |
77 #define extql(a, b) __builtin_alpha_extql(a, (uint64_t) (b)) | |
728 | 78 #define extwl(a, b) __builtin_alpha_extwl(a, (uint64_t) (b)) |
504 | 79 #define extqh(a, b) __builtin_alpha_extqh(a, (uint64_t) (b)) |
80 #define zap __builtin_alpha_zap | |
81 #define zapnot __builtin_alpha_zapnot | |
82 #define amask __builtin_alpha_amask | |
83 #define implver __builtin_alpha_implver | |
84 #define rpcc __builtin_alpha_rpcc | |
1465
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
85 #else |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
86 #define prefetch(p) asm volatile("ldl $31,%0" : : "m"(*(const char *) (p)) : "memory") |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
87 #define prefetch_en(p) asm volatile("ldq $31,%0" : : "m"(*(const char *) (p)) : "memory") |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
88 #define prefetch_m(p) asm volatile("lds $f31,%0" : : "m"(*(const char *) (p)) : "memory") |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
89 #define prefetch_men(p) asm volatile("ldt $f31,%0" : : "m"(*(const char *) (p)) : "memory") |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
90 #define cmpbge(a, b) ({ uint64_t __r; asm ("cmpbge %r1,%2,%0" : "=r" (__r) : "rJ" (a), "rI" (b)); __r; }) |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
91 #define extql(a, b) ({ uint64_t __r; asm ("extql %r1,%2,%0" : "=r" (__r) : "rJ" (a), "rI" (b)); __r; }) |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
92 #define extwl(a, b) ({ uint64_t __r; asm ("extwl %r1,%2,%0" : "=r" (__r) : "rJ" (a), "rI" (b)); __r; }) |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
93 #define extqh(a, b) ({ uint64_t __r; asm ("extqh %r1,%2,%0" : "=r" (__r) : "rJ" (a), "rI" (b)); __r; }) |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
94 #define zap(a, b) ({ uint64_t __r; asm ("zap %r1,%2,%0" : "=r" (__r) : "rJ" (a), "rI" (b)); __r; }) |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
95 #define zapnot(a, b) ({ uint64_t __r; asm ("zapnot %r1,%2,%0" : "=r" (__r) : "rJ" (a), "rI" (b)); __r; }) |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
96 #define amask(a) ({ uint64_t __r; asm ("amask %1,%0" : "=r" (__r) : "rI" (a)); __r; }) |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
97 #define implver() ({ uint64_t __r; asm ("implver %0" : "=r" (__r)); __r; }) |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
98 #define rpcc() ({ uint64_t __r; asm volatile ("rpcc %0" : "=r" (__r)); __r; }) |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
99 #endif |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
100 #define wh64(p) asm volatile("wh64 (%0)" : : "r"(p) : "memory") |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
101 |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
102 #if GNUC_PREREQ(3,3) && defined(__alpha_max__) |
504 | 103 #define minub8 __builtin_alpha_minub8 |
104 #define minsb8 __builtin_alpha_minsb8 | |
105 #define minuw4 __builtin_alpha_minuw4 | |
106 #define minsw4 __builtin_alpha_minsw4 | |
107 #define maxub8 __builtin_alpha_maxub8 | |
108 #define maxsb8 __builtin_alpha_maxsb8 | |
109 #define maxuw4 __builtin_alpha_maxuw4 | |
110 #define maxsw4 __builtin_alpha_maxsw4 | |
111 #define perr __builtin_alpha_perr | |
112 #define pklb __builtin_alpha_pklb | |
113 #define pkwb __builtin_alpha_pkwb | |
114 #define unpkbl __builtin_alpha_unpkbl | |
115 #define unpkbw __builtin_alpha_unpkbw | |
116 #else | |
1465
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
117 #define minub8(a, b) ({ uint64_t __r; asm (".arch ev6; minub8 %r1,%2,%0" : "=r" (__r) : "%rJ" (a), "rI" (b)); __r; }) |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
118 #define minsb8(a, b) ({ uint64_t __r; asm (".arch ev6; minsb8 %r1,%2,%0" : "=r" (__r) : "%rJ" (a), "rI" (b)); __r; }) |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
119 #define minuw4(a, b) ({ uint64_t __r; asm (".arch ev6; minuw4 %r1,%2,%0" : "=r" (__r) : "%rJ" (a), "rI" (b)); __r; }) |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
120 #define minsw4(a, b) ({ uint64_t __r; asm (".arch ev6; minsw4 %r1,%2,%0" : "=r" (__r) : "%rJ" (a), "rI" (b)); __r; }) |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
121 #define maxub8(a, b) ({ uint64_t __r; asm (".arch ev6; maxub8 %r1,%2,%0" : "=r" (__r) : "%rJ" (a), "rI" (b)); __r; }) |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
122 #define maxsb8(a, b) ({ uint64_t __r; asm (".arch ev6; maxsb8 %r1,%2,%0" : "=r" (__r) : "%rJ" (a), "rI" (b)); __r; }) |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
123 #define maxuw4(a, b) ({ uint64_t __r; asm (".arch ev6; maxuw4 %r1,%2,%0" : "=r" (__r) : "%rJ" (a), "rI" (b)); __r; }) |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
124 #define maxsw4(a, b) ({ uint64_t __r; asm (".arch ev6; maxsw4 %r1,%2,%0" : "=r" (__r) : "%rJ" (a), "rI" (b)); __r; }) |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
125 #define perr(a, b) ({ uint64_t __r; asm (".arch ev6; perr %r1,%r2,%0" : "=r" (__r) : "%rJ" (a), "rJ" (b)); __r; }) |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
126 #define pklb(a) ({ uint64_t __r; asm (".arch ev6; pklb %r1,%0" : "=r" (__r) : "rJ" (a)); __r; }) |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
127 #define pkwb(a) ({ uint64_t __r; asm (".arch ev6; pkwb %r1,%0" : "=r" (__r) : "rJ" (a)); __r; }) |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
128 #define unpkbl(a) ({ uint64_t __r; asm (".arch ev6; unpkbl %r1,%0" : "=r" (__r) : "rJ" (a)); __r; }) |
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
129 #define unpkbw(a) ({ uint64_t __r; asm (".arch ev6; unpkbw %r1,%0" : "=r" (__r) : "rJ" (a)); __r; }) |
504 | 130 #endif |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
131 |
728 | 132 #elif defined(__DECC) /* Digital/Compaq/hp "ccc" compiler */ |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
133 |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
134 #include <c_asm.h> |
504 | 135 #define ldq_u(a) asm ("ldq_u %v0,0(%a0)", a) |
136 #define uldq(a) (*(const __unaligned uint64_t *) (a)) | |
137 #define cmpbge(a, b) asm ("cmpbge %a0,%a1,%v0", a, b) | |
138 #define extql(a, b) asm ("extql %a0,%a1,%v0", a, b) | |
728 | 139 #define extwl(a, b) asm ("extwl %a0,%a1,%v0", a, b) |
504 | 140 #define extqh(a, b) asm ("extqh %a0,%a1,%v0", a, b) |
141 #define zap(a, b) asm ("zap %a0,%a1,%v0", a, b) | |
142 #define zapnot(a, b) asm ("zapnot %a0,%a1,%v0", a, b) | |
143 #define amask(a) asm ("amask %a0,%v0", a) | |
144 #define implver() asm ("implver %v0") | |
145 #define rpcc() asm ("rpcc %v0") | |
146 #define minub8(a, b) asm ("minub8 %a0,%a1,%v0", a, b) | |
147 #define minsb8(a, b) asm ("minsb8 %a0,%a1,%v0", a, b) | |
148 #define minuw4(a, b) asm ("minuw4 %a0,%a1,%v0", a, b) | |
149 #define minsw4(a, b) asm ("minsw4 %a0,%a1,%v0", a, b) | |
150 #define maxub8(a, b) asm ("maxub8 %a0,%a1,%v0", a, b) | |
151 #define maxsb8(a, b) asm ("maxsb8 %a0,%a1,%v0", a, b) | |
152 #define maxuw4(a, b) asm ("maxuw4 %a0,%a1,%v0", a, b) | |
153 #define maxsw4(a, b) asm ("maxsw4 %a0,%a1,%v0", a, b) | |
154 #define perr(a, b) asm ("perr %a0,%a1,%v0", a, b) | |
155 #define pklb(a) asm ("pklb %a0,%v0", a) | |
156 #define pkwb(a) asm ("pkwb %a0,%v0", a) | |
157 #define unpkbl(a) asm ("unpkbl %a0,%v0", a) | |
158 #define unpkbw(a) asm ("unpkbw %a0,%v0", a) | |
1465
52254c2f9cae
Use asms instead of builtins when compiling for generic Alpha. Less
mellum
parents:
1378
diff
changeset
|
159 #define wh64(a) asm ("wh64 %a0", a) |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
160 |
504 | 161 #else |
162 #error "Unknown compiler!" | |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
163 #endif |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
164 |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
165 #endif /* LIBAVCODEC_ALPHA_ASM_H */ |