]> git.sesse.net Git - vlc/blob - plugins/motion/motionaltivec.c
* ALL: got rid of *_Probe functions because most of them were duplicates
[vlc] / plugins / motion / motionaltivec.c
1 /*****************************************************************************
2  * motionaltivec.c : Altivec motion compensation module for vlc
3  *****************************************************************************
4  * Copyright (C) 2001 VideoLAN
5  * $Id: motionaltivec.c,v 1.10 2002/02/15 13:32:53 sam Exp $
6  *
7  * Authors: Michel Lespinasse <walken@zoy.org>
8  *          Paul Mackerras <paulus@linuxcare.com.au>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
23  *****************************************************************************/
24
25 #ifndef __BUILD_ALTIVEC_ASM__
26
27 /*****************************************************************************
28  * Preamble
29  *****************************************************************************/
30 #include <stdlib.h>                                      /* malloc(), free() */
31 #include <string.h>
32 #include <inttypes.h>
33
34 #include <videolan/vlc.h>
35
36 /*****************************************************************************
37  * Local and extern prototypes.
38  *****************************************************************************/
39 static void motion_getfunctions( function_list_t * p_function_list );
40
41 /*****************************************************************************
42  * Build configuration tree.
43  *****************************************************************************/
44 MODULE_CONFIG_START
45 MODULE_CONFIG_STOP
46
47 MODULE_INIT_START
48     SET_DESCRIPTION( "Altivec motion compensation module" )
49     ADD_CAPABILITY( MOTION, 150 )
50     ADD_REQUIREMENT( ALTIVEC )
51     ADD_SHORTCUT( "altivec" )
52     ADD_SHORTCUT( "motionaltivec" )
53 MODULE_INIT_STOP
54
55 MODULE_ACTIVATE_START
56     motion_getfunctions( &p_module->p_functions->motion );
57 MODULE_ACTIVATE_STOP
58
59 MODULE_DEACTIVATE_START
60 MODULE_DEACTIVATE_STOP
61
62 /*****************************************************************************
63  * Motion compensation in Altivec
64  *****************************************************************************/
65
66 #ifndef CAN_COMPILE_C_ALTIVEC
67
68 /*
69  * The asm code is generated with:
70  *
71  * gcc-2.95 -fvec -D__BUILD_ALTIVEC_ASM__ -O9 -fomit-frame-pointer -mregnames -S
72  *      motion_comp_altivec.c
73  *
74  * sed 's/.L/._L/g' motion_comp_altivec.s |
75  * awk '{args=""; len=split ($2, arg, ",");
76  *      for (i=1; i<=len; i++) { a=arg[i]; if (i<len) a=a",";
77  *                               args = args sprintf ("%-6s", a) }
78  *      printf ("\t\"\t%-16s%-24s\\n\"\n", $1, args) }' |
79  * unexpand -a
80  */
81
82 static void MC_put_o_16_altivec (uint8_t * dest, uint8_t * ref,
83                                  int stride, int height)
84 {
85     asm ("                                              \n"
86         "       srawi           %r6,  %r6,  1           \n"
87         "       li              %r9,  15                \n"
88         "       addi            %r6,  %r6,  -1          \n"
89         "       lvsl            %v12, 0,    %r4         \n"
90         "       mtctr           %r6                     \n"
91         "       lvx             %v1,  0,    %r4         \n"
92         "       lvx             %v0,  %r9,  %r4         \n"
93         "       add             %r0,  %r5,  %r5         \n"
94         "       vperm           %v13, %v1,  %v0,  %v12  \n"
95         "       add             %r4,  %r4,  %r5         \n"
96         "._L6:                                          \n"
97         "       li              %r9,  15                \n"
98         "       lvx             %v1,  0,    %r4         \n"
99         "       lvx             %v0,  %r9,  %r4         \n"
100         "       stvx            %v13, 0,    %r3         \n"
101         "       vperm           %v13, %v1,  %v0,  %v12  \n"
102         "       add             %r4,  %r4,  %r5         \n"
103         "       lvx             %v1,  0,    %r4         \n"
104         "       lvx             %v0,  %r9,  %r4         \n"
105         "       stvx            %v13, %r5,  %r3         \n"
106         "       vperm           %v13, %v1,  %v0,  %v12  \n"
107         "       add             %r4,  %r4,  %r5         \n"
108         "       add             %r3,  %r3,  %r0         \n"
109         "       bdnz            ._L6                    \n"
110         "       lvx             %v0,  %r9,  %r4         \n"
111         "       lvx             %v1,  0,    %r4         \n"
112         "       stvx            %v13, 0,    %r3         \n"
113         "       vperm           %v13, %v1,  %v0,  %v12  \n"
114         "       stvx            %v13, %r5,  %r3         \n"
115          );
116 }
117
118 static void MC_put_o_8_altivec (uint8_t * dest, uint8_t * ref,
119                                 int stride, int height)
120 {
121     asm ("                                              \n"
122         "       lvsl            %v12, 0,    %r4         \n"
123         "       lvsl            %v1,  %r5,  %r4         \n"
124         "       vmrghb          %v12, %v12, %v12        \n"
125         "       srawi           %r6,  %r6,  1           \n"
126         "       li              %r9,  7                 \n"
127         "       vmrghb          %v1,  %v1,  %v1         \n"
128         "       addi            %r6,  %r6,  -1          \n"
129         "       vpkuhum         %v10, %v12, %v12        \n"
130         "       lvx             %v13, 0,    %r4         \n"
131         "       mtctr           %r6                     \n"
132         "       vpkuhum         %v11, %v1,  %v1         \n"
133         "       lvx             %v0,  %r9,  %r4         \n"
134         "       add             %r4,  %r4,  %r5         \n"
135         "       vperm           %v12, %v13, %v0,  %v10  \n"
136         "._L11:                                         \n"
137         "       li              %r9,  7                 \n"
138         "       lvx             %v0,  %r9,  %r4         \n"
139         "       lvx             %v13, 0,    %r4         \n"
140         "       stvewx          %v12, 0,    %r3         \n"
141         "       li              %r9,  4                 \n"
142         "       vperm           %v1,  %v13, %v0,  %v11  \n"
143         "       stvewx          %v12, %r9,  %r3         \n"
144         "       add             %r4,  %r4,  %r5         \n"
145         "       li              %r9,  7                 \n"
146         "       lvx             %v0,  %r9,  %r4         \n"
147         "       lvx             %v13, 0,    %r4         \n"
148         "       add             %r3,  %r3,  %r5         \n"
149         "       stvewx          %v1,  0,    %r3         \n"
150         "       vperm           %v12, %v13, %v0,  %v10  \n"
151         "       li              %r9,  4                 \n"
152         "       stvewx          %v1,  %r9,  %r3         \n"
153         "       add             %r4,  %r4,  %r5         \n"
154         "       add             %r3,  %r3,  %r5         \n"
155         "       bdnz            ._L11                   \n"
156         "       li              %r9,  7                 \n"
157         "       lvx             %v0,  %r9,  %r4         \n"
158         "       lvx             %v13, 0,    %r4         \n"
159         "       stvewx          %v12, 0,    %r3         \n"
160         "       li              %r9,  4                 \n"
161         "       vperm           %v1,  %v13, %v0,  %v11  \n"
162         "       stvewx          %v12, %r9,  %r3         \n"
163         "       add             %r3,  %r3,  %r5         \n"
164         "       stvewx          %v1,  0,    %r3         \n"
165         "       stvewx          %v1,  %r9,  %r3         \n"
166          );
167 }
168
169 static void MC_put_x_16_altivec (uint8_t * dest, uint8_t * ref,
170                                  int stride, int height)
171 {
172     asm ("                                              \n"
173         "       lvsl            %v11, 0,    %r4         \n"
174         "       vspltisb        %v0,  1                 \n"
175         "       li              %r9,  16                \n"
176         "       lvx             %v12, 0,    %r4         \n"
177         "       vaddubm         %v10, %v11, %v0         \n"
178         "       lvx             %v13, %r9,  %r4         \n"
179         "       srawi           %r6,  %r6,  1           \n"
180         "       addi            %r6,  %r6,  -1          \n"
181         "       vperm           %v1,  %v12, %v13, %v10  \n"
182         "       vperm           %v0,  %v12, %v13, %v11  \n"
183         "       mtctr           %r6                     \n"
184         "       add             %r0,  %r5,  %r5         \n"
185         "       add             %r4,  %r4,  %r5         \n"
186         "       vavgub          %v0,  %v0,  %v1         \n"
187         "._L16:                                         \n"
188         "       li              %r9,  16                \n"
189         "       lvx             %v12, 0,    %r4         \n"
190         "       lvx             %v13, %r9,  %r4         \n"
191         "       stvx            %v0,  0,    %r3         \n"
192         "       vperm           %v1,  %v12, %v13, %v10  \n"
193         "       add             %r4,  %r4,  %r5         \n"
194         "       vperm           %v0,  %v12, %v13, %v11  \n"
195         "       lvx             %v12, 0,    %r4         \n"
196         "       lvx             %v13, %r9,  %r4         \n"
197         "       vavgub          %v0,  %v0,  %v1         \n"
198         "       stvx            %v0,  %r5,  %r3         \n"
199         "       vperm           %v1,  %v12, %v13, %v10  \n"
200         "       add             %r4,  %r4,  %r5         \n"
201         "       vperm           %v0,  %v12, %v13, %v11  \n"
202         "       add             %r3,  %r3,  %r0         \n"
203         "       vavgub          %v0,  %v0,  %v1         \n"
204         "       bdnz            ._L16                   \n"
205         "       lvx             %v13, %r9,  %r4         \n"
206         "       lvx             %v12, 0,    %r4         \n"
207         "       stvx            %v0,  0,    %r3         \n"
208         "       vperm           %v1,  %v12, %v13, %v10  \n"
209         "       vperm           %v0,  %v12, %v13, %v11  \n"
210         "       vavgub          %v0,  %v0,  %v1         \n"
211         "       stvx            %v0,  %r5,  %r3         \n"
212          );
213 }
214
215 static void MC_put_x_8_altivec (uint8_t * dest, uint8_t * ref,
216                                 int stride, int height)
217 {
218     asm ("                                              \n"
219         "       lvsl            %v0,  0,    %r4         \n"
220         "       vspltisb        %v13, 1                 \n"
221         "       lvsl            %v10, %r5,  %r4         \n"
222         "       vmrghb          %v0,  %v0,  %v0         \n"
223         "       li              %r9,  8                 \n"
224         "       lvx             %v11, 0,    %r4         \n"
225         "       vmrghb          %v10, %v10, %v10        \n"
226         "       vpkuhum         %v8,  %v0,  %v0         \n"
227         "       lvx             %v12, %r9,  %r4         \n"
228         "       srawi           %r6,  %r6,  1           \n"
229         "       vpkuhum         %v9,  %v10, %v10        \n"
230         "       vaddubm         %v7,  %v8,  %v13        \n"
231         "       addi            %r6,  %r6,  -1          \n"
232         "       vperm           %v1,  %v11, %v12, %v8   \n"
233         "       mtctr           %r6                     \n"
234         "       vaddubm         %v13, %v9,  %v13        \n"
235         "       add             %r4,  %r4,  %r5         \n"
236         "       vperm           %v0,  %v11, %v12, %v7   \n"
237         "       vavgub          %v0,  %v1,  %v0         \n"
238         "._L21:                                         \n"
239         "       li              %r9,  8                 \n"
240         "       lvx             %v12, %r9,  %r4         \n"
241         "       lvx             %v11, 0,    %r4         \n"
242         "       stvewx          %v0,  0,    %r3         \n"
243         "       li              %r9,  4                 \n"
244         "       vperm           %v1,  %v11, %v12, %v13  \n"
245         "       stvewx          %v0,  %r9,  %r3         \n"
246         "       vperm           %v0,  %v11, %v12, %v9   \n"
247         "       add             %r4,  %r4,  %r5         \n"
248         "       li              %r9,  8                 \n"
249         "       lvx             %v12, %r9,  %r4         \n"
250         "       vavgub          %v10, %v0,  %v1         \n"
251         "       lvx             %v11, 0,    %r4         \n"
252         "       add             %r3,  %r3,  %r5         \n"
253         "       stvewx          %v10, 0,    %r3         \n"
254         "       vperm           %v1,  %v11, %v12, %v7   \n"
255         "       vperm           %v0,  %v11, %v12, %v8   \n"
256         "       li              %r9,  4                 \n"
257         "       stvewx          %v10, %r9,  %r3         \n"
258         "       add             %r4,  %r4,  %r5         \n"
259         "       vavgub          %v0,  %v0,  %v1         \n"
260         "       add             %r3,  %r3,  %r5         \n"
261         "       bdnz            ._L21                   \n"
262         "       li              %r9,  8                 \n"
263         "       lvx             %v12, %r9,  %r4         \n"
264         "       lvx             %v11, 0,    %r4         \n"
265         "       stvewx          %v0,  0,    %r3         \n"
266         "       li              %r9,  4                 \n"
267         "       vperm           %v1,  %v11, %v12, %v13  \n"
268         "       stvewx          %v0,  %r9,  %r3         \n"
269         "       vperm           %v0,  %v11, %v12, %v9   \n"
270         "       add             %r3,  %r3,  %r5         \n"
271         "       vavgub          %v10, %v0,  %v1         \n"
272         "       stvewx          %v10, 0,    %r3         \n"
273         "       stvewx          %v10, %r9,  %r3         \n"
274          );
275 }
276
277 static void MC_put_y_16_altivec (uint8_t * dest, uint8_t * ref,
278                                  int stride, int height)
279 {
280     asm ("                                              \n"
281         "       li              %r9,  15                \n"
282         "       lvsl            %v10, 0,    %r4         \n"
283         "       lvx             %v13, 0,    %r4         \n"
284         "       lvx             %v1,  %r9,  %r4         \n"
285         "       add             %r4,  %r4,  %r5         \n"
286         "       vperm           %v12, %v13, %v1,  %v10  \n"
287         "       srawi           %r6,  %r6,  1           \n"
288         "       lvx             %v13, 0,    %r4         \n"
289         "       lvx             %v1,  %r9,  %r4         \n"
290         "       addi            %r6,  %r6,  -1          \n"
291         "       vperm           %v11, %v13, %v1,  %v10  \n"
292         "       mtctr           %r6                     \n"
293         "       add             %r0,  %r5,  %r5         \n"
294         "       add             %r4,  %r4,  %r5         \n"
295         "       vavgub          %v0,  %v12, %v11        \n"
296         "._L26:                                         \n"
297         "       li              %r9,  15                \n"
298         "       lvx             %v13, 0,    %r4         \n"
299         "       lvx             %v1,  %r9,  %r4         \n"
300         "       stvx            %v0,  0,    %r3         \n"
301         "       vperm           %v12, %v13, %v1,  %v10  \n"
302         "       add             %r4,  %r4,  %r5         \n"
303         "       lvx             %v13, 0,    %r4         \n"
304         "       lvx             %v1,  %r9,  %r4         \n"
305         "       vavgub          %v0,  %v12, %v11        \n"
306         "       stvx            %v0,  %r5,  %r3         \n"
307         "       vperm           %v11, %v13, %v1,  %v10  \n"
308         "       add             %r4,  %r4,  %r5         \n"
309         "       add             %r3,  %r3,  %r0         \n"
310         "       vavgub          %v0,  %v12, %v11        \n"
311         "       bdnz            ._L26                   \n"
312         "       lvx             %v1,  %r9,  %r4         \n"
313         "       lvx             %v13, 0,    %r4         \n"
314         "       stvx            %v0,  0,    %r3         \n"
315         "       vperm           %v12, %v13, %v1,  %v10  \n"
316         "       vavgub          %v0,  %v12, %v11        \n"
317         "       stvx            %v0,  %r5,  %r3         \n"
318          );
319 }
320
321 static void MC_put_y_8_altivec (uint8_t * dest, uint8_t * ref,
322                                 int stride, int height)
323 {
324     asm ("                                              \n"
325         "       lvsl            %v13, 0,    %r4         \n"
326         "       lvsl            %v11, %r5,  %r4         \n"
327         "       vmrghb          %v13, %v13, %v13        \n"
328         "       li              %r9,  7                 \n"
329         "       lvx             %v12, 0,    %r4         \n"
330         "       vmrghb          %v11, %v11, %v11        \n"
331         "       lvx             %v1,  %r9,  %r4         \n"
332         "       vpkuhum         %v9,  %v13, %v13        \n"
333         "       add             %r4,  %r4,  %r5         \n"
334         "       vpkuhum         %v10, %v11, %v11        \n"
335         "       vperm           %v13, %v12, %v1,  %v9   \n"
336         "       srawi           %r6,  %r6,  1           \n"
337         "       lvx             %v12, 0,    %r4         \n"
338         "       lvx             %v1,  %r9,  %r4         \n"
339         "       addi            %r6,  %r6,  -1          \n"
340         "       vperm           %v11, %v12, %v1,  %v10  \n"
341         "       mtctr           %r6                     \n"
342         "       add             %r4,  %r4,  %r5         \n"
343         "       vavgub          %v0,  %v13, %v11        \n"
344         "._L31:                                         \n"
345         "       li              %r9,  7                 \n"
346         "       lvx             %v1,  %r9,  %r4         \n"
347         "       lvx             %v12, 0,    %r4         \n"
348         "       stvewx          %v0,  0,    %r3         \n"
349         "       li              %r9,  4                 \n"
350         "       vperm           %v13, %v12, %v1,  %v9   \n"
351         "       stvewx          %v0,  %r9,  %r3         \n"
352         "       add             %r4,  %r4,  %r5         \n"
353         "       vavgub          %v0,  %v13, %v11        \n"
354         "       li              %r9,  7                 \n"
355         "       lvx             %v1,  %r9,  %r4         \n"
356         "       lvx             %v12, 0,    %r4         \n"
357         "       add             %r3,  %r3,  %r5         \n"
358         "       stvewx          %v0,  0,    %r3         \n"
359         "       vperm           %v11, %v12, %v1,  %v10  \n"
360         "       li              %r9,  4                 \n"
361         "       stvewx          %v0,  %r9,  %r3         \n"
362         "       vavgub          %v0,  %v13, %v11        \n"
363         "       add             %r4,  %r4,  %r5         \n"
364         "       add             %r3,  %r3,  %r5         \n"
365         "       bdnz            ._L31                   \n"
366         "       li              %r9,  7                 \n"
367         "       lvx             %v1,  %r9,  %r4         \n"
368         "       lvx             %v12, 0,    %r4         \n"
369         "       stvewx          %v0,  0,    %r3         \n"
370         "       li              %r9,  4                 \n"
371         "       vperm           %v13, %v12, %v1,  %v9   \n"
372         "       stvewx          %v0,  %r9,  %r3         \n"
373         "       add             %r3,  %r3,  %r5         \n"
374         "       vavgub          %v0,  %v13, %v11        \n"
375         "       stvewx          %v0,  0,    %r3         \n"
376         "       stvewx          %v0,  %r9,  %r3         \n"
377          );
378 }
379
380 static void MC_put_xy_16_altivec (uint8_t * dest, uint8_t * ref,
381                                   int stride, int height)
382 {
383     asm ("                                              \n"
384         "       lvsl            %v5,  0,    %r4         \n"
385         "       vspltisb        %v3,  1                 \n"
386         "       li              %r9,  16                \n"
387         "       lvx             %v1,  0,    %r4         \n"
388         "       vaddubm         %v4,  %v5,  %v3         \n"
389         "       lvx             %v0,  %r9,  %r4         \n"
390         "       add             %r4,  %r4,  %r5         \n"
391         "       vperm           %v10, %v1,  %v0,  %v4   \n"
392         "       srawi           %r6,  %r6,  1           \n"
393         "       vperm           %v11, %v1,  %v0,  %v5   \n"
394         "       addi            %r6,  %r6,  -1          \n"
395         "       lvx             %v1,  0,    %r4         \n"
396         "       mtctr           %r6                     \n"
397         "       lvx             %v0,  %r9,  %r4         \n"
398         "       vavgub          %v9,  %v11, %v10        \n"
399         "       vxor            %v8,  %v11, %v10        \n"
400         "       add             %r0,  %r5,  %r5         \n"
401         "       vperm           %v10, %v1,  %v0,  %v4   \n"
402         "       add             %r4,  %r4,  %r5         \n"
403         "       vperm           %v11, %v1,  %v0,  %v5   \n"
404         "       vxor            %v6,  %v11, %v10        \n"
405         "       vavgub          %v7,  %v11, %v10        \n"
406         "       vor             %v0,  %v8,  %v6         \n"
407         "       vxor            %v13, %v9,  %v7         \n"
408         "       vand            %v0,  %v3,  %v0         \n"
409         "       vavgub          %v1,  %v9,  %v7         \n"
410         "       vand            %v0,  %v0,  %v13        \n"
411         "       vsububm         %v13, %v1,  %v0         \n"
412         "._L36:                                         \n"
413         "       li              %r9,  16                \n"
414         "       lvx             %v1,  0,    %r4         \n"
415         "       lvx             %v0,  %r9,  %r4         \n"
416         "       stvx            %v13, 0,    %r3         \n"
417         "       vperm           %v10, %v1,  %v0,  %v4   \n"
418         "       add             %r4,  %r4,  %r5         \n"
419         "       vperm           %v11, %v1,  %v0,  %v5   \n"
420         "       lvx             %v1,  0,    %r4         \n"
421         "       lvx             %v0,  %r9,  %r4         \n"
422         "       vavgub          %v9,  %v11, %v10        \n"
423         "       vxor            %v8,  %v11, %v10        \n"
424         "       add             %r4,  %r4,  %r5         \n"
425         "       vperm           %v10, %v1,  %v0,  %v4   \n"
426         "       vavgub          %v12, %v9,  %v7         \n"
427         "       vperm           %v11, %v1,  %v0,  %v5   \n"
428         "       vor             %v13, %v8,  %v6         \n"
429         "       vxor            %v0,  %v9,  %v7         \n"
430         "       vxor            %v6,  %v11, %v10        \n"
431         "       vand            %v13, %v3,  %v13        \n"
432         "       vavgub          %v7,  %v11, %v10        \n"
433         "       vor             %v1,  %v8,  %v6         \n"
434         "       vand            %v13, %v13, %v0         \n"
435         "       vxor            %v0,  %v9,  %v7         \n"
436         "       vand            %v1,  %v3,  %v1         \n"
437         "       vsububm         %v13, %v12, %v13        \n"
438         "       vand            %v1,  %v1,  %v0         \n"
439         "       stvx            %v13, %r5,  %r3         \n"
440         "       vavgub          %v0,  %v9,  %v7         \n"
441         "       add             %r3,  %r3,  %r0         \n"
442         "       vsububm         %v13, %v0,  %v1         \n"
443         "       bdnz            ._L36                   \n"
444         "       lvx             %v0,  %r9,  %r4         \n"
445         "       lvx             %v1,  0,    %r4         \n"
446         "       stvx            %v13, 0,    %r3         \n"
447         "       vperm           %v10, %v1,  %v0,  %v4   \n"
448         "       vperm           %v11, %v1,  %v0,  %v5   \n"
449         "       vxor            %v8,  %v11, %v10        \n"
450         "       vavgub          %v9,  %v11, %v10        \n"
451         "       vor             %v0,  %v8,  %v6         \n"
452         "       vxor            %v13, %v9,  %v7         \n"
453         "       vand            %v0,  %v3,  %v0         \n"
454         "       vavgub          %v1,  %v9,  %v7         \n"
455         "       vand            %v0,  %v0,  %v13        \n"
456         "       vsububm         %v13, %v1,  %v0         \n"
457         "       stvx            %v13, %r5,  %r3         \n"
458          );
459 }
460
461 static void MC_put_xy_8_altivec (uint8_t * dest, uint8_t * ref,
462                                  int stride, int height)
463 {
464     asm ("                                              \n"
465         "       lvsl            %v4,  0,    %r4         \n"
466         "       vspltisb        %v3,  1                 \n"
467         "       lvsl            %v5,  %r5,  %r4         \n"
468         "       vmrghb          %v4,  %v4,  %v4         \n"
469         "       li              %r9,  16                \n"
470         "       vmrghb          %v5,  %v5,  %v5         \n"
471         "       lvx             %v1,  0,    %r4         \n"
472         "       vpkuhum         %v4,  %v4,  %v4         \n"
473         "       lvx             %v0,  %r9,  %r4         \n"
474         "       vpkuhum         %v5,  %v5,  %v5         \n"
475         "       add             %r4,  %r4,  %r5         \n"
476         "       vaddubm         %v2,  %v4,  %v3         \n"
477         "       vperm           %v11, %v1,  %v0,  %v4   \n"
478         "       srawi           %r6,  %r6,  1           \n"
479         "       vaddubm         %v19, %v5,  %v3         \n"
480         "       addi            %r6,  %r6,  -1          \n"
481         "       vperm           %v10, %v1,  %v0,  %v2   \n"
482         "       mtctr           %r6                     \n"
483         "       lvx             %v1,  0,    %r4         \n"
484         "       lvx             %v0,  %r9,  %r4         \n"
485         "       vavgub          %v9,  %v11, %v10        \n"
486         "       vxor            %v8,  %v11, %v10        \n"
487         "       add             %r4,  %r4,  %r5         \n"
488         "       vperm           %v10, %v1,  %v0,  %v19  \n"
489         "       vperm           %v11, %v1,  %v0,  %v5   \n"
490         "       vxor            %v6,  %v11, %v10        \n"
491         "       vavgub          %v7,  %v11, %v10        \n"
492         "       vor             %v0,  %v8,  %v6         \n"
493         "       vxor            %v13, %v9,  %v7         \n"
494         "       vand            %v0,  %v3,  %v0         \n"
495         "       vavgub          %v1,  %v9,  %v7         \n"
496         "       vand            %v0,  %v0,  %v13        \n"
497         "       vsububm         %v13, %v1,  %v0         \n"
498         "._L41:                                         \n"
499         "       li              %r9,  16                \n"
500         "       lvx             %v0,  %r9,  %r4         \n"
501         "       lvx             %v1,  0,    %r4         \n"
502         "       stvewx          %v13, 0,    %r3         \n"
503         "       li              %r9,  4                 \n"
504         "       vperm           %v10, %v1,  %v0,  %v2   \n"
505         "       stvewx          %v13, %r9,  %r3         \n"
506         "       vperm           %v11, %v1,  %v0,  %v4   \n"
507         "       add             %r4,  %r4,  %r5         \n"
508         "       li              %r9,  16                \n"
509         "       vavgub          %v9,  %v11, %v10        \n"
510         "       lvx             %v0,  %r9,  %r4         \n"
511         "       vxor            %v8,  %v11, %v10        \n"
512         "       lvx             %v1,  0,    %r4         \n"
513         "       vavgub          %v12, %v9,  %v7         \n"
514         "       vor             %v13, %v8,  %v6         \n"
515         "       add             %r3,  %r3,  %r5         \n"
516         "       vperm           %v10, %v1,  %v0,  %v19  \n"
517         "       li              %r9,  4                 \n"
518         "       vperm           %v11, %v1,  %v0,  %v5   \n"
519         "       vand            %v13, %v3,  %v13        \n"
520         "       add             %r4,  %r4,  %r5         \n"
521         "       vxor            %v0,  %v9,  %v7         \n"
522         "       vxor            %v6,  %v11, %v10        \n"
523         "       vavgub          %v7,  %v11, %v10        \n"
524         "       vor             %v1,  %v8,  %v6         \n"
525         "       vand            %v13, %v13, %v0         \n"
526         "       vxor            %v0,  %v9,  %v7         \n"
527         "       vand            %v1,  %v3,  %v1         \n"
528         "       vsububm         %v13, %v12, %v13        \n"
529         "       vand            %v1,  %v1,  %v0         \n"
530         "       stvewx          %v13, 0,    %r3         \n"
531         "       vavgub          %v0,  %v9,  %v7         \n"
532         "       stvewx          %v13, %r9,  %r3         \n"
533         "       add             %r3,  %r3,  %r5         \n"
534         "       vsububm         %v13, %v0,  %v1         \n"
535         "       bdnz            ._L41                   \n"
536         "       li              %r9,  16                \n"
537         "       lvx             %v0,  %r9,  %r4         \n"
538         "       lvx             %v1,  0,    %r4         \n"
539         "       stvewx          %v13, 0,    %r3         \n"
540         "       vperm           %v10, %v1,  %v0,  %v2   \n"
541         "       li              %r9,  4                 \n"
542         "       vperm           %v11, %v1,  %v0,  %v4   \n"
543         "       stvewx          %v13, %r9,  %r3         \n"
544         "       add             %r3,  %r3,  %r5         \n"
545         "       vxor            %v8,  %v11, %v10        \n"
546         "       vavgub          %v9,  %v11, %v10        \n"
547         "       vor             %v0,  %v8,  %v6         \n"
548         "       vxor            %v13, %v9,  %v7         \n"
549         "       vand            %v0,  %v3,  %v0         \n"
550         "       vavgub          %v1,  %v9,  %v7         \n"
551         "       vand            %v0,  %v0,  %v13        \n"
552         "       vsububm         %v13, %v1,  %v0         \n"
553         "       stvewx          %v13, 0,    %r3         \n"
554         "       stvewx          %v13, %r9,  %r3         \n"
555          );
556 }
557
558 static void MC_avg_o_16_altivec (uint8_t * dest, uint8_t * ref,
559                                  int stride, int height)
560 {
561     asm ("                                              \n"
562         "       li              %r9,  15                \n"
563         "       lvx             %v0,  %r9,  %r4         \n"
564         "       lvsl            %v11, 0,    %r4         \n"
565         "       lvx             %v1,  0,    %r4         \n"
566         "       srawi           %r6,  %r6,  1           \n"
567         "       addi            %r6,  %r6,  -1          \n"
568         "       vperm           %v0,  %v1,  %v0,  %v11  \n"
569         "       lvx             %v13, 0,    %r3         \n"
570         "       mtctr           %r6                     \n"
571         "       add             %r9,  %r5,  %r5         \n"
572         "       vavgub          %v12, %v13, %v0         \n"
573         "       add             %r4,  %r4,  %r5         \n"
574         "._L46:                                         \n"
575         "       li              %r11, 15                \n"
576         "       lvx             %v1,  0,    %r4         \n"
577         "       lvx             %v0,  %r11, %r4         \n"
578         "       lvx             %v13, %r5,  %r3         \n"
579         "       vperm           %v0,  %v1,  %v0,  %v11  \n"
580         "       stvx            %v12, 0,    %r3         \n"
581         "       add             %r4,  %r4,  %r5         \n"
582         "       vavgub          %v12, %v13, %v0         \n"
583         "       lvx             %v1,  0,    %r4         \n"
584         "       lvx             %v0,  %r11, %r4         \n"
585         "       lvx             %v13, %r9,  %r3         \n"
586         "       vperm           %v0,  %v1,  %v0,  %v11  \n"
587         "       stvx            %v12, %r5,  %r3         \n"
588         "       add             %r4,  %r4,  %r5         \n"
589         "       vavgub          %v12, %v13, %v0         \n"
590         "       add             %r3,  %r3,  %r9         \n"
591         "       bdnz            ._L46                   \n"
592         "       lvx             %v0,  %r11, %r4         \n"
593         "       lvx             %v1,  0,    %r4         \n"
594         "       lvx             %v13, %r5,  %r3         \n"
595         "       vperm           %v0,  %v1,  %v0,  %v11  \n"
596         "       stvx            %v12, 0,    %r3         \n"
597         "       vavgub          %v12, %v13, %v0         \n"
598         "       stvx            %v12, %r5,  %r3         \n"
599          );
600 }
601
602 static void MC_avg_o_8_altivec (uint8_t * dest, uint8_t * ref,
603                                 int stride, int height)
604 {
605     asm ("                                              \n"
606         "       lvsl            %v12, 0,    %r4         \n"
607         "       li              %r9,  7                 \n"
608         "       vmrghb          %v12, %v12, %v12        \n"
609         "       lvsl            %v1,  %r5,  %r4         \n"
610         "       lvx             %v13, 0,    %r4         \n"
611         "       vpkuhum         %v9,  %v12, %v12        \n"
612         "       lvx             %v0,  %r9,  %r4         \n"
613         "       srawi           %r6,  %r6,  1           \n"
614         "       vmrghb          %v1,  %v1,  %v1         \n"
615         "       addi            %r6,  %r6,  -1          \n"
616         "       vperm           %v0,  %v13, %v0,  %v9   \n"
617         "       lvx             %v11, 0,    %r3         \n"
618         "       mtctr           %r6                     \n"
619         "       vpkuhum         %v10, %v1,  %v1         \n"
620         "       add             %r4,  %r4,  %r5         \n"
621         "       vavgub          %v12, %v11, %v0         \n"
622         "._L51:                                         \n"
623         "       li              %r9,  7                 \n"
624         "       lvx             %v0,  %r9,  %r4         \n"
625         "       lvx             %v13, 0,    %r4         \n"
626         "       lvx             %v11, %r5,  %r3         \n"
627         "       stvewx          %v12, 0,    %r3         \n"
628         "       vperm           %v0,  %v13, %v0,  %v10  \n"
629         "       li              %r9,  4                 \n"
630         "       stvewx          %v12, %r9,  %r3         \n"
631         "       vavgub          %v1,  %v11, %v0         \n"
632         "       add             %r4,  %r4,  %r5         \n"
633         "       li              %r9,  7                 \n"
634         "       lvx             %v0,  %r9,  %r4         \n"
635         "       add             %r3,  %r3,  %r5         \n"
636         "       lvx             %v13, 0,    %r4         \n"
637         "       lvx             %v11, %r5,  %r3         \n"
638         "       stvewx          %v1,  0,    %r3         \n"
639         "       vperm           %v0,  %v13, %v0,  %v9   \n"
640         "       li              %r9,  4                 \n"
641         "       stvewx          %v1,  %r9,  %r3         \n"
642         "       vavgub          %v12, %v11, %v0         \n"
643         "       add             %r4,  %r4,  %r5         \n"
644         "       add             %r3,  %r3,  %r5         \n"
645         "       bdnz            ._L51                   \n"
646         "       li              %r9,  7                 \n"
647         "       lvx             %v0,  %r9,  %r4         \n"
648         "       lvx             %v13, 0,    %r4         \n"
649         "       lvx             %v11, %r5,  %r3         \n"
650         "       stvewx          %v12, 0,    %r3         \n"
651         "       vperm           %v0,  %v13, %v0,  %v10  \n"
652         "       li              %r9,  4                 \n"
653         "       stvewx          %v12, %r9,  %r3         \n"
654         "       vavgub          %v1,  %v11, %v0         \n"
655         "       add             %r3,  %r3,  %r5         \n"
656         "       stvewx          %v1,  0,    %r3         \n"
657         "       stvewx          %v1,  %r9,  %r3         \n"
658          );
659 }
660
661 static void MC_avg_x_16_altivec (uint8_t * dest, uint8_t * ref,
662                                  int stride, int height)
663 {
664     asm ("                                              \n"
665         "       lvsl            %v8,  0,    %r4         \n"
666         "       vspltisb        %v0,  1                 \n"
667         "       li              %r9,  16                \n"
668         "       lvx             %v12, %r9,  %r4         \n"
669         "       vaddubm         %v7,  %v8,  %v0         \n"
670         "       lvx             %v11, 0,    %r4         \n"
671         "       srawi           %r6,  %r6,  1           \n"
672         "       vperm           %v1,  %v11, %v12, %v7   \n"
673         "       addi            %r6,  %r6,  -1          \n"
674         "       vperm           %v0,  %v11, %v12, %v8   \n"
675         "       lvx             %v9,  0,    %r3         \n"
676         "       mtctr           %r6                     \n"
677         "       add             %r9,  %r5,  %r5         \n"
678         "       vavgub          %v0,  %v0,  %v1         \n"
679         "       add             %r4,  %r4,  %r5         \n"
680         "       vavgub          %v10, %v9,  %v0         \n"
681         "._L56:                                         \n"
682         "       li              %r11, 16                \n"
683         "       lvx             %v11, 0,    %r4         \n"
684         "       lvx             %v12, %r11, %r4         \n"
685         "       lvx             %v9,  %r5,  %r3         \n"
686         "       stvx            %v10, 0,    %r3         \n"
687         "       vperm           %v0,  %v11, %v12, %v7   \n"
688         "       add             %r4,  %r4,  %r5         \n"
689         "       vperm           %v1,  %v11, %v12, %v8   \n"
690         "       lvx             %v11, 0,    %r4         \n"
691         "       lvx             %v12, %r11, %r4         \n"
692         "       vavgub          %v1,  %v1,  %v0         \n"
693         "       add             %r4,  %r4,  %r5         \n"
694         "       vperm           %v13, %v11, %v12, %v7   \n"
695         "       vavgub          %v10, %v9,  %v1         \n"
696         "       vperm           %v0,  %v11, %v12, %v8   \n"
697         "       lvx             %v9,  %r9,  %r3         \n"
698         "       stvx            %v10, %r5,  %r3         \n"
699         "       vavgub          %v0,  %v0,  %v13        \n"
700         "       add             %r3,  %r3,  %r9         \n"
701         "       vavgub          %v10, %v9,  %v0         \n"
702         "       bdnz            ._L56                   \n"
703         "       lvx             %v12, %r11, %r4         \n"
704         "       lvx             %v11, 0,    %r4         \n"
705         "       lvx             %v9,  %r5,  %r3         \n"
706         "       vperm           %v1,  %v11, %v12, %v7   \n"
707         "       stvx            %v10, 0,    %r3         \n"
708         "       vperm           %v0,  %v11, %v12, %v8   \n"
709         "       vavgub          %v0,  %v0,  %v1         \n"
710         "       vavgub          %v10, %v9,  %v0         \n"
711         "       stvx            %v10, %r5,  %r3         \n"
712          );
713 }
714
715 static void MC_avg_x_8_altivec (uint8_t * dest, uint8_t * ref,
716                                 int stride, int height)
717 {
718     asm ("                                              \n"
719         "       lvsl            %v10, 0,    %r4         \n"
720         "       vspltisb        %v13, 1                 \n"
721         "       li              %r9,  8                 \n"
722         "       vmrghb          %v10, %v10, %v10        \n"
723         "       lvx             %v11, 0,    %r4         \n"
724         "       lvx             %v12, %r9,  %r4         \n"
725         "       vpkuhum         %v7,  %v10, %v10        \n"
726         "       srawi           %r6,  %r6,  1           \n"
727         "       lvsl            %v10, %r5,  %r4         \n"
728         "       vaddubm         %v6,  %v7,  %v13        \n"
729         "       vperm           %v0,  %v11, %v12, %v7   \n"
730         "       addi            %r6,  %r6,  -1          \n"
731         "       vmrghb          %v10, %v10, %v10        \n"
732         "       lvx             %v9,  0,    %r3         \n"
733         "       mtctr           %r6                     \n"
734         "       vperm           %v1,  %v11, %v12, %v6   \n"
735         "       add             %r4,  %r4,  %r5         \n"
736         "       vpkuhum         %v8,  %v10, %v10        \n"
737         "       vavgub          %v0,  %v0,  %v1         \n"
738         "       vaddubm         %v13, %v8,  %v13        \n"
739         "       vavgub          %v10, %v9,  %v0         \n"
740         "._L61:                                         \n"
741         "       li              %r9,  8                 \n"
742         "       lvx             %v12, %r9,  %r4         \n"
743         "       lvx             %v11, 0,    %r4         \n"
744         "       lvx             %v9,  %r5,  %r3         \n"
745         "       stvewx          %v10, 0,    %r3         \n"
746         "       vperm           %v1,  %v11, %v12, %v13  \n"
747         "       vperm           %v0,  %v11, %v12, %v8   \n"
748         "       li              %r9,  4                 \n"
749         "       stvewx          %v10, %r9,  %r3         \n"
750         "       add             %r4,  %r4,  %r5         \n"
751         "       vavgub          %v0,  %v0,  %v1         \n"
752         "       li              %r9,  8                 \n"
753         "       lvx             %v12, %r9,  %r4         \n"
754         "       vavgub          %v10, %v9,  %v0         \n"
755         "       lvx             %v11, 0,    %r4         \n"
756         "       add             %r3,  %r3,  %r5         \n"
757         "       vperm           %v1,  %v11, %v12, %v6   \n"
758         "       lvx             %v9,  %r5,  %r3         \n"
759         "       vperm           %v0,  %v11, %v12, %v7   \n"
760         "       stvewx          %v10, 0,    %r3         \n"
761         "       li              %r9,  4                 \n"
762         "       vavgub          %v0,  %v0,  %v1         \n"
763         "       stvewx          %v10, %r9,  %r3         \n"
764         "       add             %r4,  %r4,  %r5         \n"
765         "       add             %r3,  %r3,  %r5         \n"
766         "       vavgub          %v10, %v9,  %v0         \n"
767         "       bdnz            ._L61                   \n"
768         "       li              %r9,  8                 \n"
769         "       lvx             %v12, %r9,  %r4         \n"
770         "       lvx             %v11, 0,    %r4         \n"
771         "       lvx             %v9,  %r5,  %r3         \n"
772         "       vperm           %v1,  %v11, %v12, %v13  \n"
773         "       stvewx          %v10, 0,    %r3         \n"
774         "       vperm           %v0,  %v11, %v12, %v8   \n"
775         "       li              %r9,  4                 \n"
776         "       stvewx          %v10, %r9,  %r3         \n"
777         "       vavgub          %v0,  %v0,  %v1         \n"
778         "       add             %r3,  %r3,  %r5         \n"
779         "       vavgub          %v10, %v9,  %v0         \n"
780         "       stvewx          %v10, 0,    %r3         \n"
781         "       stvewx          %v10, %r9,  %r3         \n"
782          );
783 }
784
785 static void MC_avg_y_16_altivec (uint8_t * dest, uint8_t * ref,
786                                  int stride, int height)
787 {
788     asm ("                                              \n"
789         "       li              %r9,  15                \n"
790         "       lvx             %v1,  %r9,  %r4         \n"
791         "       lvsl            %v9,  0,    %r4         \n"
792         "       lvx             %v13, 0,    %r4         \n"
793         "       add             %r4,  %r4,  %r5         \n"
794         "       vperm           %v11, %v13, %v1,  %v9   \n"
795         "       li              %r11, 15                \n"
796         "       lvx             %v13, 0,    %r4         \n"
797         "       lvx             %v1,  %r11, %r4         \n"
798         "       srawi           %r6,  %r6,  1           \n"
799         "       vperm           %v10, %v13, %v1,  %v9   \n"
800         "       addi            %r6,  %r6,  -1          \n"
801         "       lvx             %v12, 0,    %r3         \n"
802         "       mtctr           %r6                     \n"
803         "       vavgub          %v0,  %v11, %v10        \n"
804         "       add             %r9,  %r5,  %r5         \n"
805         "       add             %r4,  %r4,  %r5         \n"
806         "       vavgub          %v0,  %v12, %v0         \n"
807         "._L66:                                         \n"
808         "       li              %r11, 15                \n"
809         "       lvx             %v13, 0,    %r4         \n"
810         "       lvx             %v1,  %r11, %r4         \n"
811         "       lvx             %v12, %r5,  %r3         \n"
812         "       vperm           %v11, %v13, %v1,  %v9   \n"
813         "       stvx            %v0,  0,    %r3         \n"
814         "       add             %r4,  %r4,  %r5         \n"
815         "       vavgub          %v0,  %v11, %v10        \n"
816         "       lvx             %v13, 0,    %r4         \n"
817         "       lvx             %v1,  %r11, %r4         \n"
818         "       vavgub          %v0,  %v12, %v0         \n"
819         "       add             %r4,  %r4,  %r5         \n"
820         "       lvx             %v12, %r9,  %r3         \n"
821         "       vperm           %v10, %v13, %v1,  %v9   \n"
822         "       stvx            %v0,  %r5,  %r3         \n"
823         "       vavgub          %v0,  %v11, %v10        \n"
824         "       add             %r3,  %r3,  %r9         \n"
825         "       vavgub          %v0,  %v12, %v0         \n"
826         "       bdnz            ._L66                   \n"
827         "       lvx             %v1,  %r11, %r4         \n"
828         "       lvx             %v13, 0,    %r4         \n"
829         "       lvx             %v12, %r5,  %r3         \n"
830         "       vperm           %v11, %v13, %v1,  %v9   \n"
831         "       stvx            %v0,  0,    %r3         \n"
832         "       vavgub          %v0,  %v11, %v10        \n"
833         "       vavgub          %v0,  %v12, %v0         \n"
834         "       stvx            %v0,  %r5,  %r3         \n"
835          );
836 }
837
838 static void MC_avg_y_8_altivec (uint8_t * dest, uint8_t * ref,
839                                 int stride, int height)
840 {
841     asm ("                                              \n"
842         "       lvsl            %v12, 0,    %r4         \n"
843         "       lvsl            %v9,  %r5,  %r4         \n"
844         "       vmrghb          %v12, %v12, %v12        \n"
845         "       li              %r9,  7                 \n"
846         "       lvx             %v11, 0,    %r4         \n"
847         "       vmrghb          %v9,  %v9,  %v9         \n"
848         "       lvx             %v13, %r9,  %r4         \n"
849         "       vpkuhum         %v7,  %v12, %v12        \n"
850         "       add             %r4,  %r4,  %r5         \n"
851         "       vpkuhum         %v8,  %v9,  %v9         \n"
852         "       vperm           %v12, %v11, %v13, %v7   \n"
853         "       srawi           %r6,  %r6,  1           \n"
854         "       lvx             %v11, 0,    %r4         \n"
855         "       lvx             %v13, %r9,  %r4         \n"
856         "       addi            %r6,  %r6,  -1          \n"
857         "       vperm           %v9,  %v11, %v13, %v8   \n"
858         "       lvx             %v10, 0,    %r3         \n"
859         "       mtctr           %r6                     \n"
860         "       add             %r4,  %r4,  %r5         \n"
861         "       vavgub          %v0,  %v12, %v9         \n"
862         "       vavgub          %v1,  %v10, %v0         \n"
863         "._L71:                                         \n"
864         "       li              %r9,  7                 \n"
865         "       lvx             %v13, %r9,  %r4         \n"
866         "       lvx             %v11, 0,    %r4         \n"
867         "       lvx             %v10, %r5,  %r3         \n"
868         "       stvewx          %v1,  0,    %r3         \n"
869         "       vperm           %v12, %v11, %v13, %v7   \n"
870         "       li              %r9,  4                 \n"
871         "       stvewx          %v1,  %r9,  %r3         \n"
872         "       vavgub          %v0,  %v12, %v9         \n"
873         "       add             %r4,  %r4,  %r5         \n"
874         "       li              %r9,  7                 \n"
875         "       vavgub          %v1,  %v10, %v0         \n"
876         "       lvx             %v13, %r9,  %r4         \n"
877         "       lvx             %v11, 0,    %r4         \n"
878         "       add             %r3,  %r3,  %r5         \n"
879         "       vperm           %v9,  %v11, %v13, %v8   \n"
880         "       lvx             %v10, %r5,  %r3         \n"
881         "       stvewx          %v1,  0,    %r3         \n"
882         "       vavgub          %v0,  %v12, %v9         \n"
883         "       li              %r9,  4                 \n"
884         "       stvewx          %v1,  %r9,  %r3         \n"
885         "       add             %r4,  %r4,  %r5         \n"
886         "       vavgub          %v1,  %v10, %v0         \n"
887         "       add             %r3,  %r3,  %r5         \n"
888         "       bdnz            ._L71                   \n"
889         "       li              %r9,  7                 \n"
890         "       lvx             %v13, %r9,  %r4         \n"
891         "       lvx             %v11, 0,    %r4         \n"
892         "       lvx             %v10, %r5,  %r3         \n"
893         "       vperm           %v12, %v11, %v13, %v7   \n"
894         "       stvewx          %v1,  0,    %r3         \n"
895         "       li              %r9,  4                 \n"
896         "       vavgub          %v0,  %v12, %v9         \n"
897         "       stvewx          %v1,  %r9,  %r3         \n"
898         "       add             %r3,  %r3,  %r5         \n"
899         "       vavgub          %v1,  %v10, %v0         \n"
900         "       stvewx          %v1,  0,    %r3         \n"
901         "       stvewx          %v1,  %r9,  %r3         \n"
902          );
903 }
904
905 static void MC_avg_xy_16_altivec (uint8_t * dest, uint8_t * ref,
906                                   int stride, int height)
907 {
908     asm ("                                              \n"
909         "       lvsl            %v4,  0,    %r4         \n"
910         "       vspltisb        %v2,  1                 \n"
911         "       li              %r9,  16                \n"
912         "       lvx             %v1,  %r9,  %r4         \n"
913         "       vaddubm         %v3,  %v4,  %v2         \n"
914         "       lvx             %v13, 0,    %r4         \n"
915         "       add             %r4,  %r4,  %r5         \n"
916         "       vperm           %v10, %v13, %v1,  %v3   \n"
917         "       li              %r11, 16                \n"
918         "       vperm           %v11, %v13, %v1,  %v4   \n"
919         "       srawi           %r6,  %r6,  1           \n"
920         "       lvx             %v13, 0,    %r4         \n"
921         "       lvx             %v1,  %r11, %r4         \n"
922         "       vavgub          %v9,  %v11, %v10        \n"
923         "       vxor            %v8,  %v11, %v10        \n"
924         "       addi            %r6,  %r6,  -1          \n"
925         "       vperm           %v10, %v13, %v1,  %v3   \n"
926         "       lvx             %v6,  0,    %r3         \n"
927         "       mtctr           %r6                     \n"
928         "       vperm           %v11, %v13, %v1,  %v4   \n"
929         "       add             %r9,  %r5,  %r5         \n"
930         "       add             %r4,  %r4,  %r5         \n"
931         "       vxor            %v5,  %v11, %v10        \n"
932         "       vavgub          %v7,  %v11, %v10        \n"
933         "       vor             %v1,  %v8,  %v5         \n"
934         "       vxor            %v13, %v9,  %v7         \n"
935         "       vand            %v1,  %v2,  %v1         \n"
936         "       vavgub          %v0,  %v9,  %v7         \n"
937         "       vand            %v1,  %v1,  %v13        \n"
938         "       vsububm         %v0,  %v0,  %v1         \n"
939         "       vavgub          %v12, %v6,  %v0         \n"
940         "._L76:                                         \n"
941         "       li              %r11, 16                \n"
942         "       lvx             %v13, 0,    %r4         \n"
943         "       lvx             %v1,  %r11, %r4         \n"
944         "       lvx             %v6,  %r5,  %r3         \n"
945         "       stvx            %v12, 0,    %r3         \n"
946         "       vperm           %v10, %v13, %v1,  %v3   \n"
947         "       vperm           %v11, %v13, %v1,  %v4   \n"
948         "       add             %r4,  %r4,  %r5         \n"
949         "       lvx             %v13, 0,    %r4         \n"
950         "       lvx             %v1,  %r11, %r4         \n"
951         "       vavgub          %v9,  %v11, %v10        \n"
952         "       vxor            %v8,  %v11, %v10        \n"
953         "       add             %r4,  %r4,  %r5         \n"
954         "       vperm           %v10, %v13, %v1,  %v3   \n"
955         "       vavgub          %v12, %v9,  %v7         \n"
956         "       vperm           %v11, %v13, %v1,  %v4   \n"
957         "       vor             %v0,  %v8,  %v5         \n"
958         "       vxor            %v13, %v9,  %v7         \n"
959         "       vxor            %v5,  %v11, %v10        \n"
960         "       vand            %v0,  %v2,  %v0         \n"
961         "       vavgub          %v7,  %v11, %v10        \n"
962         "       vor             %v1,  %v8,  %v5         \n"
963         "       vand            %v0,  %v0,  %v13        \n"
964         "       vand            %v1,  %v2,  %v1         \n"
965         "       vxor            %v13, %v9,  %v7         \n"
966         "       vsububm         %v12, %v12, %v0         \n"
967         "       vand            %v1,  %v1,  %v13        \n"
968         "       vavgub          %v0,  %v9,  %v7         \n"
969         "       vavgub          %v12, %v6,  %v12        \n"
970         "       lvx             %v6,  %r9,  %r3         \n"
971         "       vsububm         %v0,  %v0,  %v1         \n"
972         "       stvx            %v12, %r5,  %r3         \n"
973         "       vavgub          %v12, %v6,  %v0         \n"
974         "       add             %r3,  %r3,  %r9         \n"
975         "       bdnz            ._L76                   \n"
976         "       lvx             %v1,  %r11, %r4         \n"
977         "       lvx             %v13, 0,    %r4         \n"
978         "       lvx             %v6,  %r5,  %r3         \n"
979         "       vperm           %v10, %v13, %v1,  %v3   \n"
980         "       stvx            %v12, 0,    %r3         \n"
981         "       vperm           %v11, %v13, %v1,  %v4   \n"
982         "       vxor            %v8,  %v11, %v10        \n"
983         "       vavgub          %v9,  %v11, %v10        \n"
984         "       vor             %v0,  %v8,  %v5         \n"
985         "       vxor            %v13, %v9,  %v7         \n"
986         "       vand            %v0,  %v2,  %v0         \n"
987         "       vavgub          %v1,  %v9,  %v7         \n"
988         "       vand            %v0,  %v0,  %v13        \n"
989         "       vsububm         %v1,  %v1,  %v0         \n"
990         "       vavgub          %v12, %v6,  %v1         \n"
991         "       stvx            %v12, %r5,  %r3         \n"
992          );
993 }
994
995 static void MC_avg_xy_8_altivec (uint8_t * dest, uint8_t * ref,
996                                  int stride, int height)
997 {
998     asm ("                                              \n"
999         "       lvsl            %v2,  0,    %r4         \n"
1000         "       vspltisb        %v19, 1                 \n"
1001         "       lvsl            %v3,  %r5,  %r4         \n"
1002         "       vmrghb          %v2,  %v2,  %v2         \n"
1003         "       li              %r9,  16                \n"
1004         "       vmrghb          %v3,  %v3,  %v3         \n"
1005         "       lvx             %v9,  0,    %r4         \n"
1006         "       vpkuhum         %v2,  %v2,  %v2         \n"
1007         "       lvx             %v1,  %r9,  %r4         \n"
1008         "       vpkuhum         %v3,  %v3,  %v3         \n"
1009         "       add             %r4,  %r4,  %r5         \n"
1010         "       vaddubm         %v18, %v2,  %v19        \n"
1011         "       vperm           %v11, %v9,  %v1,  %v2   \n"
1012         "       srawi           %r6,  %r6,  1           \n"
1013         "       vaddubm         %v17, %v3,  %v19        \n"
1014         "       addi            %r6,  %r6,  -1          \n"
1015         "       vperm           %v10, %v9,  %v1,  %v18  \n"
1016         "       lvx             %v4,  0,    %r3         \n"
1017         "       mtctr           %r6                     \n"
1018         "       lvx             %v1,  %r9,  %r4         \n"
1019         "       lvx             %v9,  0,    %r4         \n"
1020         "       vavgub          %v8,  %v11, %v10        \n"
1021         "       vxor            %v7,  %v11, %v10        \n"
1022         "       add             %r4,  %r4,  %r5         \n"
1023         "       vperm           %v10, %v9,  %v1,  %v17  \n"
1024         "       vperm           %v11, %v9,  %v1,  %v3   \n"
1025         "       vxor            %v5,  %v11, %v10        \n"
1026         "       vavgub          %v6,  %v11, %v10        \n"
1027         "       vor             %v1,  %v7,  %v5         \n"
1028         "       vxor            %v13, %v8,  %v6         \n"
1029         "       vand            %v1,  %v19, %v1         \n"
1030         "       vavgub          %v0,  %v8,  %v6         \n"
1031         "       vand            %v1,  %v1,  %v13        \n"
1032         "       vsububm         %v0,  %v0,  %v1         \n"
1033         "       vavgub          %v13, %v4,  %v0         \n"
1034         "._L81:                                         \n"
1035         "       li              %r9,  16                \n"
1036         "       lvx             %v1,  %r9,  %r4         \n"
1037         "       lvx             %v9,  0,    %r4         \n"
1038         "       lvx             %v4,  %r5,  %r3         \n"
1039         "       stvewx          %v13, 0,    %r3         \n"
1040         "       vperm           %v10, %v9,  %v1,  %v18  \n"
1041         "       vperm           %v11, %v9,  %v1,  %v2   \n"
1042         "       li              %r9,  4                 \n"
1043         "       stvewx          %v13, %r9,  %r3         \n"
1044         "       vxor            %v7,  %v11, %v10        \n"
1045         "       add             %r4,  %r4,  %r5         \n"
1046         "       li              %r9,  16                \n"
1047         "       vavgub          %v8,  %v11, %v10        \n"
1048         "       lvx             %v1,  %r9,  %r4         \n"
1049         "       vor             %v0,  %v7,  %v5         \n"
1050         "       lvx             %v9,  0,    %r4         \n"
1051         "       vxor            %v12, %v8,  %v6         \n"
1052         "       vand            %v0,  %v19, %v0         \n"
1053         "       add             %r3,  %r3,  %r5         \n"
1054         "       vperm           %v10, %v9,  %v1,  %v17  \n"
1055         "       vavgub          %v13, %v8,  %v6         \n"
1056         "       li              %r9,  4                 \n"
1057         "       vperm           %v11, %v9,  %v1,  %v3   \n"
1058         "       vand            %v0,  %v0,  %v12        \n"
1059         "       add             %r4,  %r4,  %r5         \n"
1060         "       vxor            %v5,  %v11, %v10        \n"
1061         "       vavgub          %v6,  %v11, %v10        \n"
1062         "       vor             %v1,  %v7,  %v5         \n"
1063         "       vsububm         %v13, %v13, %v0         \n"
1064         "       vxor            %v0,  %v8,  %v6         \n"
1065         "       vand            %v1,  %v19, %v1         \n"
1066         "       vavgub          %v13, %v4,  %v13        \n"
1067         "       vand            %v1,  %v1,  %v0         \n"
1068         "       lvx             %v4,  %r5,  %r3         \n"
1069         "       vavgub          %v0,  %v8,  %v6         \n"
1070         "       stvewx          %v13, 0,    %r3         \n"
1071         "       stvewx          %v13, %r9,  %r3         \n"
1072         "       vsububm         %v0,  %v0,  %v1         \n"
1073         "       add             %r3,  %r3,  %r5         \n"
1074         "       vavgub          %v13, %v4,  %v0         \n"
1075         "       bdnz            ._L81                   \n"
1076         "       li              %r9,  16                \n"
1077         "       lvx             %v1,  %r9,  %r4         \n"
1078         "       lvx             %v9,  0,    %r4         \n"
1079         "       lvx             %v4,  %r5,  %r3         \n"
1080         "       vperm           %v10, %v9,  %v1,  %v18  \n"
1081         "       stvewx          %v13, 0,    %r3         \n"
1082         "       vperm           %v11, %v9,  %v1,  %v2   \n"
1083         "       li              %r9,  4                 \n"
1084         "       stvewx          %v13, %r9,  %r3         \n"
1085         "       vxor            %v7,  %v11, %v10        \n"
1086         "       add             %r3,  %r3,  %r5         \n"
1087         "       vavgub          %v8,  %v11, %v10        \n"
1088         "       vor             %v0,  %v7,  %v5         \n"
1089         "       vxor            %v13, %v8,  %v6         \n"
1090         "       vand            %v0,  %v19, %v0         \n"
1091         "       vavgub          %v1,  %v8,  %v6         \n"
1092         "       vand            %v0,  %v0,  %v13        \n"
1093         "       vsububm         %v1,  %v1,  %v0         \n"
1094         "       vavgub          %v13, %v4,  %v1         \n"
1095         "       stvewx          %v13, 0,    %r3         \n"
1096         "       stvewx          %v13, %r9,  %r3         \n"
1097          );
1098 }
1099
1100 #endif  /* !CAN_COMPILE_C_ALTIVEC */
1101 #endif  /* __BUILD_ALTIVEC_ASM__ */
1102
1103 #if defined(CAN_COMPILE_C_ALTIVEC) || defined(__BUILD_ALTIVEC_ASM__)
1104
1105 #define vector_s16_t vector signed short
1106 #define vector_u16_t vector unsigned short
1107 #define vector_s8_t vector signed char
1108 #define vector_u8_t vector unsigned char
1109 #define vector_s32_t vector signed int
1110 #define vector_u32_t vector unsigned int
1111
1112 void MC_put_o_16_altivec (unsigned char * dest, unsigned char * ref,
1113                           int stride, int height)
1114 {
1115     vector_u8_t perm, ref0, ref1, tmp;
1116
1117     perm = vec_lvsl (0, ref);
1118
1119     height = (height >> 1) - 1;
1120
1121     ref0 = vec_ld (0, ref);
1122     ref1 = vec_ld (15, ref);
1123     ref += stride;
1124     tmp = vec_perm (ref0, ref1, perm);
1125
1126     do {
1127         ref0 = vec_ld (0, ref);
1128         ref1 = vec_ld (15, ref);
1129         ref += stride;
1130         vec_st (tmp, 0, dest);
1131         tmp = vec_perm (ref0, ref1, perm);
1132
1133         ref0 = vec_ld (0, ref);
1134         ref1 = vec_ld (15, ref);
1135         ref += stride;
1136         vec_st (tmp, stride, dest);
1137         dest += 2*stride;
1138         tmp = vec_perm (ref0, ref1, perm);
1139     } while (--height);
1140
1141     ref0 = vec_ld (0, ref);
1142     ref1 = vec_ld (15, ref);
1143     vec_st (tmp, 0, dest);
1144     tmp = vec_perm (ref0, ref1, perm);
1145     vec_st (tmp, stride, dest);
1146 }
1147
1148 void MC_put_o_8_altivec (unsigned char * dest, unsigned char * ref,
1149                          int stride, int height)
1150 {
1151     vector_u8_t perm0, perm1, tmp0, tmp1, ref0, ref1;
1152
1153     tmp0 = vec_lvsl (0, ref);
1154     tmp0 = vec_mergeh (tmp0, tmp0);
1155     perm0 = vec_pack ((vector_u16_t)tmp0, (vector_u16_t)tmp0);
1156     tmp1 = vec_lvsl (stride, ref);
1157     tmp1 = vec_mergeh (tmp1, tmp1);
1158     perm1 = vec_pack ((vector_u16_t)tmp1, (vector_u16_t)tmp1);
1159
1160     height = (height >> 1) - 1;
1161
1162     ref0 = vec_ld (0, ref);
1163     ref1 = vec_ld (7, ref);
1164     ref += stride;
1165     tmp0 = vec_perm (ref0, ref1, perm0);
1166
1167     do {
1168         ref0 = vec_ld (0, ref);
1169         ref1 = vec_ld (7, ref);
1170         ref += stride;
1171         vec_ste ((vector_u32_t)tmp0, 0, (unsigned int *)dest);
1172         vec_ste ((vector_u32_t)tmp0, 4, (unsigned int *)dest);
1173         dest += stride;
1174         tmp1 = vec_perm (ref0, ref1, perm1);
1175
1176         ref0 = vec_ld (0, ref);
1177         ref1 = vec_ld (7, ref);
1178         ref += stride;
1179         vec_ste ((vector_u32_t)tmp1, 0, (unsigned int *)dest);
1180         vec_ste ((vector_u32_t)tmp1, 4, (unsigned int *)dest);
1181         dest += stride;
1182         tmp0 = vec_perm (ref0, ref1, perm0);
1183     } while (--height);
1184
1185     ref0 = vec_ld (0, ref);
1186     ref1 = vec_ld (7, ref);
1187     vec_ste ((vector_u32_t)tmp0, 0, (unsigned int *)dest);
1188     vec_ste ((vector_u32_t)tmp0, 4, (unsigned int *)dest);
1189     dest += stride;
1190     tmp1 = vec_perm (ref0, ref1, perm1);
1191     vec_ste ((vector_u32_t)tmp1, 0, (unsigned int *)dest);
1192     vec_ste ((vector_u32_t)tmp1, 4, (unsigned int *)dest);
1193 }
1194
1195 void MC_put_x_16_altivec (unsigned char * dest, unsigned char * ref,
1196                           int stride, int height)
1197 {
1198     vector_u8_t permA, permB, ref0, ref1, tmp;
1199
1200     permA = vec_lvsl (0, ref);
1201     permB = vec_add (permA, vec_splat_u8 (1));
1202
1203     height = (height >> 1) - 1;
1204
1205     ref0 = vec_ld (0, ref);
1206     ref1 = vec_ld (16, ref);
1207     ref += stride;
1208     tmp = vec_avg (vec_perm (ref0, ref1, permA),
1209                    vec_perm (ref0, ref1, permB));
1210
1211     do {
1212         ref0 = vec_ld (0, ref);
1213         ref1 = vec_ld (16, ref);
1214         ref += stride;
1215         vec_st (tmp, 0, dest);
1216         tmp = vec_avg (vec_perm (ref0, ref1, permA),
1217                        vec_perm (ref0, ref1, permB));
1218
1219         ref0 = vec_ld (0, ref);
1220         ref1 = vec_ld (16, ref);
1221         ref += stride;
1222         vec_st (tmp, stride, dest);
1223         dest += 2*stride;
1224         tmp = vec_avg (vec_perm (ref0, ref1, permA),
1225                        vec_perm (ref0, ref1, permB));
1226     } while (--height);
1227
1228     ref0 = vec_ld (0, ref);
1229     ref1 = vec_ld (16, ref);
1230     vec_st (tmp, 0, dest);
1231     tmp = vec_avg (vec_perm (ref0, ref1, permA),
1232                    vec_perm (ref0, ref1, permB));
1233     vec_st (tmp, stride, dest);
1234 }
1235
1236 void MC_put_x_8_altivec (unsigned char * dest, unsigned char * ref,
1237                          int stride, int height)
1238 {
1239     vector_u8_t perm0A, perm0B, perm1A, perm1B, ones, tmp0, tmp1, ref0, ref1;
1240
1241     ones = vec_splat_u8 (1);
1242     tmp0 = vec_lvsl (0, ref);
1243     tmp0 = vec_mergeh (tmp0, tmp0);
1244     perm0A = vec_pack ((vector_u16_t)tmp0, (vector_u16_t)tmp0);
1245     perm0B = vec_add (perm0A, ones);
1246     tmp1 = vec_lvsl (stride, ref);
1247     tmp1 = vec_mergeh (tmp1, tmp1);
1248     perm1A = vec_pack ((vector_u16_t)tmp1, (vector_u16_t)tmp1);
1249     perm1B = vec_add (perm1A, ones);
1250
1251     height = (height >> 1) - 1;
1252
1253     ref0 = vec_ld (0, ref);
1254     ref1 = vec_ld (8, ref);
1255     ref += stride;
1256     tmp0 = vec_avg (vec_perm (ref0, ref1, perm0A),
1257                     vec_perm (ref0, ref1, perm0B));
1258
1259     do {
1260         ref0 = vec_ld (0, ref);
1261         ref1 = vec_ld (8, ref);
1262         ref += stride;
1263         vec_ste ((vector_u32_t)tmp0, 0, (unsigned int *)dest);
1264         vec_ste ((vector_u32_t)tmp0, 4, (unsigned int *)dest);
1265         dest += stride;
1266         tmp1 = vec_avg (vec_perm (ref0, ref1, perm1A),
1267                         vec_perm (ref0, ref1, perm1B));
1268
1269         ref0 = vec_ld (0, ref);
1270         ref1 = vec_ld (8, ref);
1271         ref += stride;
1272         vec_ste ((vector_u32_t)tmp1, 0, (unsigned int *)dest);
1273         vec_ste ((vector_u32_t)tmp1, 4, (unsigned int *)dest);
1274         dest += stride;
1275         tmp0 = vec_avg (vec_perm (ref0, ref1, perm0A),
1276                         vec_perm (ref0, ref1, perm0B));
1277     } while (--height);
1278
1279     ref0 = vec_ld (0, ref);
1280     ref1 = vec_ld (8, ref);
1281     vec_ste ((vector_u32_t)tmp0, 0, (unsigned int *)dest);
1282     vec_ste ((vector_u32_t)tmp0, 4, (unsigned int *)dest);
1283     dest += stride;
1284     tmp1 = vec_avg (vec_perm (ref0, ref1, perm1A),
1285                     vec_perm (ref0, ref1, perm1B));
1286     vec_ste ((vector_u32_t)tmp1, 0, (unsigned int *)dest);
1287     vec_ste ((vector_u32_t)tmp1, 4, (unsigned int *)dest);
1288 }
1289
1290 void MC_put_y_16_altivec (unsigned char * dest, unsigned char * ref,
1291                           int stride, int height)
1292 {
1293     vector_u8_t perm, ref0, ref1, tmp0, tmp1, tmp;
1294
1295     perm = vec_lvsl (0, ref);
1296
1297     height = (height >> 1) - 1;
1298
1299     ref0 = vec_ld (0, ref);
1300     ref1 = vec_ld (15, ref);
1301     ref += stride;
1302     tmp0 = vec_perm (ref0, ref1, perm);
1303     ref0 = vec_ld (0, ref);
1304     ref1 = vec_ld (15, ref);
1305     ref += stride;
1306     tmp1 = vec_perm (ref0, ref1, perm);
1307     tmp = vec_avg (tmp0, tmp1);
1308
1309     do {
1310         ref0 = vec_ld (0, ref);
1311         ref1 = vec_ld (15, ref);
1312         ref += stride;
1313         vec_st (tmp, 0, dest);
1314         tmp0 = vec_perm (ref0, ref1, perm);
1315         tmp = vec_avg (tmp0, tmp1);
1316
1317         ref0 = vec_ld (0, ref);
1318         ref1 = vec_ld (15, ref);
1319         ref += stride;
1320         vec_st (tmp, stride, dest);
1321         dest += 2*stride;
1322         tmp1 = vec_perm (ref0, ref1, perm);
1323         tmp = vec_avg (tmp0, tmp1);
1324     } while (--height);
1325
1326     ref0 = vec_ld (0, ref);
1327     ref1 = vec_ld (15, ref);
1328     vec_st (tmp, 0, dest);
1329     tmp0 = vec_perm (ref0, ref1, perm);
1330     tmp = vec_avg (tmp0, tmp1);
1331     vec_st (tmp, stride, dest);
1332 }
1333
1334 void MC_put_y_8_altivec (unsigned char * dest, unsigned char * ref,
1335                          int stride, int height)
1336 {
1337     vector_u8_t perm0, perm1, tmp0, tmp1, tmp, ref0, ref1;
1338
1339     tmp0 = vec_lvsl (0, ref);
1340     tmp0 = vec_mergeh (tmp0, tmp0);
1341     perm0 = vec_pack ((vector_u16_t)tmp0, (vector_u16_t)tmp0);
1342     tmp1 = vec_lvsl (stride, ref);
1343     tmp1 = vec_mergeh (tmp1, tmp1);
1344     perm1 = vec_pack ((vector_u16_t)tmp1, (vector_u16_t)tmp1);
1345
1346     height = (height >> 1) - 1;
1347
1348     ref0 = vec_ld (0, ref);
1349     ref1 = vec_ld (7, ref);
1350     ref += stride;
1351     tmp0 = vec_perm (ref0, ref1, perm0);
1352     ref0 = vec_ld (0, ref);
1353     ref1 = vec_ld (7, ref);
1354     ref += stride;
1355     tmp1 = vec_perm (ref0, ref1, perm1);
1356     tmp = vec_avg (tmp0, tmp1);
1357
1358     do {
1359         ref0 = vec_ld (0, ref);
1360         ref1 = vec_ld (7, ref);
1361         ref += stride;
1362         vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
1363         vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
1364         dest += stride;
1365         tmp0 = vec_perm (ref0, ref1, perm0);
1366         tmp = vec_avg (tmp0, tmp1);
1367
1368         ref0 = vec_ld (0, ref);
1369         ref1 = vec_ld (7, ref);
1370         ref += stride;
1371         vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
1372         vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
1373         dest += stride;
1374         tmp1 = vec_perm (ref0, ref1, perm1);
1375         tmp = vec_avg (tmp0, tmp1);
1376     } while (--height);
1377
1378     ref0 = vec_ld (0, ref);
1379     ref1 = vec_ld (7, ref);
1380     vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
1381     vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
1382     dest += stride;
1383     tmp0 = vec_perm (ref0, ref1, perm0);
1384     tmp = vec_avg (tmp0, tmp1);
1385     vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
1386     vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
1387 }
1388
1389 void MC_put_xy_16_altivec (unsigned char * dest, unsigned char * ref,
1390                            int stride, int height)
1391 {
1392     vector_u8_t permA, permB, ref0, ref1, A, B, avg0, avg1, xor0, xor1, tmp;
1393     vector_u8_t ones;
1394
1395     ones = vec_splat_u8 (1);
1396     permA = vec_lvsl (0, ref);
1397     permB = vec_add (permA, ones);
1398
1399     height = (height >> 1) - 1;
1400
1401     ref0 = vec_ld (0, ref);
1402     ref1 = vec_ld (16, ref);
1403     ref += stride;
1404     A = vec_perm (ref0, ref1, permA);
1405     B = vec_perm (ref0, ref1, permB);
1406     avg0 = vec_avg (A, B);
1407     xor0 = vec_xor (A, B);
1408
1409     ref0 = vec_ld (0, ref);
1410     ref1 = vec_ld (16, ref);
1411     ref += stride;
1412     A = vec_perm (ref0, ref1, permA);
1413     B = vec_perm (ref0, ref1, permB);
1414     avg1 = vec_avg (A, B);
1415     xor1 = vec_xor (A, B);
1416     tmp = vec_sub (vec_avg (avg0, avg1),
1417                    vec_and (vec_and (ones, vec_or (xor0, xor1)),
1418                             vec_xor (avg0, avg1)));
1419
1420
1421     do {
1422         ref0 = vec_ld (0, ref);
1423         ref1 = vec_ld (16, ref);
1424         ref += stride;
1425         vec_st (tmp, 0, dest);
1426         A = vec_perm (ref0, ref1, permA);
1427         B = vec_perm (ref0, ref1, permB);
1428         avg0 = vec_avg (A, B);
1429         xor0 = vec_xor (A, B);
1430         tmp = vec_sub (vec_avg (avg0, avg1),
1431                        vec_and (vec_and (ones, vec_or (xor0, xor1)),
1432                                 vec_xor (avg0, avg1)));
1433
1434         ref0 = vec_ld (0, ref);
1435         ref1 = vec_ld (16, ref);
1436         ref += stride;
1437         vec_st (tmp, stride, dest);
1438         dest += 2*stride;
1439         A = vec_perm (ref0, ref1, permA);
1440         B = vec_perm (ref0, ref1, permB);
1441         avg1 = vec_avg (A, B);
1442         xor1 = vec_xor (A, B);
1443         tmp = vec_sub (vec_avg (avg0, avg1),
1444                        vec_and (vec_and (ones, vec_or (xor0, xor1)),
1445                                 vec_xor (avg0, avg1)));
1446     } while (--height);
1447
1448     ref0 = vec_ld (0, ref);
1449     ref1 = vec_ld (16, ref);
1450     vec_st (tmp, 0, dest);
1451     A = vec_perm (ref0, ref1, permA);
1452     B = vec_perm (ref0, ref1, permB);
1453     avg0 = vec_avg (A, B);
1454     xor0 = vec_xor (A, B);
1455     tmp = vec_sub (vec_avg (avg0, avg1),
1456                    vec_and (vec_and (ones, vec_or (xor0, xor1)),
1457                             vec_xor (avg0, avg1)));
1458     vec_st (tmp, stride, dest);
1459 }
1460
1461 void MC_put_xy_8_altivec (unsigned char * dest, unsigned char * ref,
1462                           int stride, int height)
1463 {
1464     vector_u8_t perm0A, perm0B, perm1A, perm1B, ref0, ref1, A, B;
1465     vector_u8_t avg0, avg1, xor0, xor1, tmp, ones;
1466
1467     ones = vec_splat_u8 (1);
1468     perm0A = vec_lvsl (0, ref);
1469     perm0A = vec_mergeh (perm0A, perm0A);
1470     perm0A = vec_pack ((vector_u16_t)perm0A, (vector_u16_t)perm0A);
1471     perm0B = vec_add (perm0A, ones);
1472     perm1A = vec_lvsl (stride, ref);
1473     perm1A = vec_mergeh (perm1A, perm1A);
1474     perm1A = vec_pack ((vector_u16_t)perm1A, (vector_u16_t)perm1A);
1475     perm1B = vec_add (perm1A, ones);
1476
1477     height = (height >> 1) - 1;
1478
1479     ref0 = vec_ld (0, ref);
1480     ref1 = vec_ld (16, ref);
1481     ref += stride;
1482     A = vec_perm (ref0, ref1, perm0A);
1483     B = vec_perm (ref0, ref1, perm0B);
1484     avg0 = vec_avg (A, B);
1485     xor0 = vec_xor (A, B);
1486
1487     ref0 = vec_ld (0, ref);
1488     ref1 = vec_ld (16, ref);
1489     ref += stride;
1490     A = vec_perm (ref0, ref1, perm1A);
1491     B = vec_perm (ref0, ref1, perm1B);
1492     avg1 = vec_avg (A, B);
1493     xor1 = vec_xor (A, B);
1494     tmp = vec_sub (vec_avg (avg0, avg1),
1495                    vec_and (vec_and (ones, vec_or (xor0, xor1)),
1496                             vec_xor (avg0, avg1)));
1497
1498
1499     do {
1500         ref0 = vec_ld (0, ref);
1501         ref1 = vec_ld (16, ref);
1502         ref += stride;
1503         vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
1504         vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
1505         dest += stride;
1506         A = vec_perm (ref0, ref1, perm0A);
1507         B = vec_perm (ref0, ref1, perm0B);
1508         avg0 = vec_avg (A, B);
1509         xor0 = vec_xor (A, B);
1510         tmp = vec_sub (vec_avg (avg0, avg1),
1511                        vec_and (vec_and (ones, vec_or (xor0, xor1)),
1512                                 vec_xor (avg0, avg1)));
1513
1514         ref0 = vec_ld (0, ref);
1515         ref1 = vec_ld (16, ref);
1516         ref += stride;
1517         vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
1518         vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
1519         dest += stride;
1520         A = vec_perm (ref0, ref1, perm1A);
1521         B = vec_perm (ref0, ref1, perm1B);
1522         avg1 = vec_avg (A, B);
1523         xor1 = vec_xor (A, B);
1524         tmp = vec_sub (vec_avg (avg0, avg1),
1525                        vec_and (vec_and (ones, vec_or (xor0, xor1)),
1526                                 vec_xor (avg0, avg1)));
1527     } while (--height);
1528
1529     ref0 = vec_ld (0, ref);
1530     ref1 = vec_ld (16, ref);
1531     vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
1532     vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
1533     dest += stride;
1534     A = vec_perm (ref0, ref1, perm0A);
1535     B = vec_perm (ref0, ref1, perm0B);
1536     avg0 = vec_avg (A, B);
1537     xor0 = vec_xor (A, B);
1538     tmp = vec_sub (vec_avg (avg0, avg1),
1539                    vec_and (vec_and (ones, vec_or (xor0, xor1)),
1540                             vec_xor (avg0, avg1)));
1541     vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
1542     vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
1543 }
1544
1545 #if 0
1546 void MC_put_xy_8_altivec (unsigned char * dest, unsigned char * ref,
1547                           int stride, int height)
1548 {
1549     vector_u8_t permA, permB, ref0, ref1, A, B, C, D, tmp, zero, ones;
1550     vector_u16_t splat2, temp;
1551
1552     ones = vec_splat_u8 (1);
1553     permA = vec_lvsl (0, ref);
1554     permB = vec_add (permA, ones);
1555
1556     zero = vec_splat_u8 (0);
1557     splat2 = vec_splat_u16 (2);
1558
1559     do {
1560         ref0 = vec_ld (0, ref);
1561         ref1 = vec_ld (16, ref);
1562         ref += stride;
1563         A = vec_perm (ref0, ref1, permA);
1564         B = vec_perm (ref0, ref1, permB);
1565         ref0 = vec_ld (0, ref);
1566         ref1 = vec_ld (16, ref);
1567         C = vec_perm (ref0, ref1, permA);
1568         D = vec_perm (ref0, ref1, permB);
1569
1570         temp = vec_add (vec_add ((vector_u16_t)vec_mergeh (zero, A),
1571                                 (vector_u16_t)vec_mergeh (zero, B)),
1572                        vec_add ((vector_u16_t)vec_mergeh (zero, C),
1573                                 (vector_u16_t)vec_mergeh (zero, D)));
1574         temp = vec_sr (vec_add (temp, splat2), splat2);
1575         tmp = vec_pack (temp, temp);
1576
1577         vec_st (tmp, 0, dest);
1578         dest += stride;
1579         tmp = vec_avg (vec_perm (ref0, ref1, permA),
1580                        vec_perm (ref0, ref1, permB));
1581     } while (--height);
1582 }
1583 #endif
1584
1585 void MC_avg_o_16_altivec (unsigned char * dest, unsigned char * ref,
1586                           int stride, int height)
1587 {
1588     vector_u8_t perm, ref0, ref1, tmp, prev;
1589
1590     perm = vec_lvsl (0, ref);
1591
1592     height = (height >> 1) - 1;
1593
1594     ref0 = vec_ld (0, ref);
1595     ref1 = vec_ld (15, ref);
1596     ref += stride;
1597     prev = vec_ld (0, dest);
1598     tmp = vec_avg (prev, vec_perm (ref0, ref1, perm));
1599
1600     do {
1601         ref0 = vec_ld (0, ref);
1602         ref1 = vec_ld (15, ref);
1603         ref += stride;
1604         prev = vec_ld (stride, dest);
1605         vec_st (tmp, 0, dest);
1606         tmp = vec_avg (prev, vec_perm (ref0, ref1, perm));
1607
1608         ref0 = vec_ld (0, ref);
1609         ref1 = vec_ld (15, ref);
1610         ref += stride;
1611         prev = vec_ld (2*stride, dest);
1612         vec_st (tmp, stride, dest);
1613         dest += 2*stride;
1614         tmp = vec_avg (prev, vec_perm (ref0, ref1, perm));
1615     } while (--height);
1616
1617     ref0 = vec_ld (0, ref);
1618     ref1 = vec_ld (15, ref);
1619     prev = vec_ld (stride, dest);
1620     vec_st (tmp, 0, dest);
1621     tmp = vec_avg (prev, vec_perm (ref0, ref1, perm));
1622     vec_st (tmp, stride, dest);
1623 }
1624
1625 void MC_avg_o_8_altivec (unsigned char * dest, unsigned char * ref,
1626                          int stride, int height)
1627 {
1628     vector_u8_t perm0, perm1, tmp0, tmp1, ref0, ref1, prev;
1629
1630     tmp0 = vec_lvsl (0, ref);
1631     tmp0 = vec_mergeh (tmp0, tmp0);
1632     perm0 = vec_pack ((vector_u16_t)tmp0, (vector_u16_t)tmp0);
1633     tmp1 = vec_lvsl (stride, ref);
1634     tmp1 = vec_mergeh (tmp1, tmp1);
1635     perm1 = vec_pack ((vector_u16_t)tmp1, (vector_u16_t)tmp1);
1636
1637     height = (height >> 1) - 1;
1638
1639     ref0 = vec_ld (0, ref);
1640     ref1 = vec_ld (7, ref);
1641     ref += stride;
1642     prev = vec_ld (0, dest);
1643     tmp0 = vec_avg (prev, vec_perm (ref0, ref1, perm0));
1644
1645     do {
1646         ref0 = vec_ld (0, ref);
1647         ref1 = vec_ld (7, ref);
1648         ref += stride;
1649         prev = vec_ld (stride, dest);
1650         vec_ste ((vector_u32_t)tmp0, 0, (unsigned int *)dest);
1651         vec_ste ((vector_u32_t)tmp0, 4, (unsigned int *)dest);
1652         dest += stride;
1653         tmp1 = vec_avg (prev, vec_perm (ref0, ref1, perm1));
1654
1655         ref0 = vec_ld (0, ref);
1656         ref1 = vec_ld (7, ref);
1657         ref += stride;
1658         prev = vec_ld (stride, dest);
1659         vec_ste ((vector_u32_t)tmp1, 0, (unsigned int *)dest);
1660         vec_ste ((vector_u32_t)tmp1, 4, (unsigned int *)dest);
1661         dest += stride;
1662         tmp0 = vec_avg (prev, vec_perm (ref0, ref1, perm0));
1663     } while (--height);
1664
1665     ref0 = vec_ld (0, ref);
1666     ref1 = vec_ld (7, ref);
1667     prev = vec_ld (stride, dest);
1668     vec_ste ((vector_u32_t)tmp0, 0, (unsigned int *)dest);
1669     vec_ste ((vector_u32_t)tmp0, 4, (unsigned int *)dest);
1670     dest += stride;
1671     tmp1 = vec_avg (prev, vec_perm (ref0, ref1, perm1));
1672     vec_ste ((vector_u32_t)tmp1, 0, (unsigned int *)dest);
1673     vec_ste ((vector_u32_t)tmp1, 4, (unsigned int *)dest);
1674 }
1675
1676 void MC_avg_x_16_altivec (unsigned char * dest, unsigned char * ref,
1677                           int stride, int height)
1678 {
1679     vector_u8_t permA, permB, ref0, ref1, tmp, prev;
1680
1681     permA = vec_lvsl (0, ref);
1682     permB = vec_add (permA, vec_splat_u8 (1));
1683
1684     height = (height >> 1) - 1;
1685
1686     ref0 = vec_ld (0, ref);
1687     ref1 = vec_ld (16, ref);
1688     prev = vec_ld (0, dest);
1689     ref += stride;
1690     tmp = vec_avg (prev, vec_avg (vec_perm (ref0, ref1, permA),
1691                                   vec_perm (ref0, ref1, permB)));
1692
1693     do {
1694         ref0 = vec_ld (0, ref);
1695         ref1 = vec_ld (16, ref);
1696         ref += stride;
1697         prev = vec_ld (stride, dest);
1698         vec_st (tmp, 0, dest);
1699         tmp = vec_avg (prev, vec_avg (vec_perm (ref0, ref1, permA),
1700                                       vec_perm (ref0, ref1, permB)));
1701
1702         ref0 = vec_ld (0, ref);
1703         ref1 = vec_ld (16, ref);
1704         ref += stride;
1705         prev = vec_ld (2*stride, dest);
1706         vec_st (tmp, stride, dest);
1707         dest += 2*stride;
1708         tmp = vec_avg (prev, vec_avg (vec_perm (ref0, ref1, permA),
1709                                       vec_perm (ref0, ref1, permB)));
1710     } while (--height);
1711
1712     ref0 = vec_ld (0, ref);
1713     ref1 = vec_ld (16, ref);
1714     prev = vec_ld (stride, dest);
1715     vec_st (tmp, 0, dest);
1716     tmp = vec_avg (prev, vec_avg (vec_perm (ref0, ref1, permA),
1717                                   vec_perm (ref0, ref1, permB)));
1718     vec_st (tmp, stride, dest);
1719 }
1720
1721 void MC_avg_x_8_altivec (unsigned char * dest, unsigned char * ref,
1722                          int stride, int height)
1723 {
1724     vector_u8_t perm0A, perm0B, perm1A, perm1B, ones, tmp0, tmp1, ref0, ref1;
1725     vector_u8_t prev;
1726
1727     ones = vec_splat_u8 (1);
1728     tmp0 = vec_lvsl (0, ref);
1729     tmp0 = vec_mergeh (tmp0, tmp0);
1730     perm0A = vec_pack ((vector_u16_t)tmp0, (vector_u16_t)tmp0);
1731     perm0B = vec_add (perm0A, ones);
1732     tmp1 = vec_lvsl (stride, ref);
1733     tmp1 = vec_mergeh (tmp1, tmp1);
1734     perm1A = vec_pack ((vector_u16_t)tmp1, (vector_u16_t)tmp1);
1735     perm1B = vec_add (perm1A, ones);
1736
1737     height = (height >> 1) - 1;
1738
1739     ref0 = vec_ld (0, ref);
1740     ref1 = vec_ld (8, ref);
1741     prev = vec_ld (0, dest);
1742     ref += stride;
1743     tmp0 = vec_avg (prev, vec_avg (vec_perm (ref0, ref1, perm0A),
1744                                    vec_perm (ref0, ref1, perm0B)));
1745
1746     do {
1747         ref0 = vec_ld (0, ref);
1748         ref1 = vec_ld (8, ref);
1749         ref += stride;
1750         prev = vec_ld (stride, dest);
1751         vec_ste ((vector_u32_t)tmp0, 0, (unsigned int *)dest);
1752         vec_ste ((vector_u32_t)tmp0, 4, (unsigned int *)dest);
1753         dest += stride;
1754         tmp1 = vec_avg (prev, vec_avg (vec_perm (ref0, ref1, perm1A),
1755                                        vec_perm (ref0, ref1, perm1B)));
1756
1757         ref0 = vec_ld (0, ref);
1758         ref1 = vec_ld (8, ref);
1759         ref += stride;
1760         prev = vec_ld (stride, dest);
1761         vec_ste ((vector_u32_t)tmp1, 0, (unsigned int *)dest);
1762         vec_ste ((vector_u32_t)tmp1, 4, (unsigned int *)dest);
1763         dest += stride;
1764         tmp0 = vec_avg (prev, vec_avg (vec_perm (ref0, ref1, perm0A),
1765                                        vec_perm (ref0, ref1, perm0B)));
1766     } while (--height);
1767
1768     ref0 = vec_ld (0, ref);
1769     ref1 = vec_ld (8, ref);
1770     prev = vec_ld (stride, dest);
1771     vec_ste ((vector_u32_t)tmp0, 0, (unsigned int *)dest);
1772     vec_ste ((vector_u32_t)tmp0, 4, (unsigned int *)dest);
1773     dest += stride;
1774     tmp1 = vec_avg (prev, vec_avg (vec_perm (ref0, ref1, perm1A),
1775                                    vec_perm (ref0, ref1, perm1B)));
1776     vec_ste ((vector_u32_t)tmp1, 0, (unsigned int *)dest);
1777     vec_ste ((vector_u32_t)tmp1, 4, (unsigned int *)dest);
1778 }
1779
1780 void MC_avg_y_16_altivec (unsigned char * dest, unsigned char * ref,
1781                           int stride, int height)
1782 {
1783     vector_u8_t perm, ref0, ref1, tmp0, tmp1, tmp, prev;
1784
1785     perm = vec_lvsl (0, ref);
1786
1787     height = (height >> 1) - 1;
1788
1789     ref0 = vec_ld (0, ref);
1790     ref1 = vec_ld (15, ref);
1791     ref += stride;
1792     tmp0 = vec_perm (ref0, ref1, perm);
1793     ref0 = vec_ld (0, ref);
1794     ref1 = vec_ld (15, ref);
1795     ref += stride;
1796     prev = vec_ld (0, dest);
1797     tmp1 = vec_perm (ref0, ref1, perm);
1798     tmp = vec_avg (prev, vec_avg (tmp0, tmp1));
1799
1800     do {
1801         ref0 = vec_ld (0, ref);
1802         ref1 = vec_ld (15, ref);
1803         ref += stride;
1804         prev = vec_ld (stride, dest);
1805         vec_st (tmp, 0, dest);
1806         tmp0 = vec_perm (ref0, ref1, perm);
1807         tmp = vec_avg (prev, vec_avg (tmp0, tmp1));
1808
1809         ref0 = vec_ld (0, ref);
1810         ref1 = vec_ld (15, ref);
1811         ref += stride;
1812         prev = vec_ld (2*stride, dest);
1813         vec_st (tmp, stride, dest);
1814         dest += 2*stride;
1815         tmp1 = vec_perm (ref0, ref1, perm);
1816         tmp = vec_avg (prev, vec_avg (tmp0, tmp1));
1817     } while (--height);
1818
1819     ref0 = vec_ld (0, ref);
1820     ref1 = vec_ld (15, ref);
1821     prev = vec_ld (stride, dest);
1822     vec_st (tmp, 0, dest);
1823     tmp0 = vec_perm (ref0, ref1, perm);
1824     tmp = vec_avg (prev, vec_avg (tmp0, tmp1));
1825     vec_st (tmp, stride, dest);
1826 }
1827
1828 void MC_avg_y_8_altivec (unsigned char * dest, unsigned char * ref,
1829                          int stride, int height)
1830 {
1831     vector_u8_t perm0, perm1, tmp0, tmp1, tmp, ref0, ref1, prev;
1832
1833     tmp0 = vec_lvsl (0, ref);
1834     tmp0 = vec_mergeh (tmp0, tmp0);
1835     perm0 = vec_pack ((vector_u16_t)tmp0, (vector_u16_t)tmp0);
1836     tmp1 = vec_lvsl (stride, ref);
1837     tmp1 = vec_mergeh (tmp1, tmp1);
1838     perm1 = vec_pack ((vector_u16_t)tmp1, (vector_u16_t)tmp1);
1839
1840     height = (height >> 1) - 1;
1841
1842     ref0 = vec_ld (0, ref);
1843     ref1 = vec_ld (7, ref);
1844     ref += stride;
1845     tmp0 = vec_perm (ref0, ref1, perm0);
1846     ref0 = vec_ld (0, ref);
1847     ref1 = vec_ld (7, ref);
1848     ref += stride;
1849     prev = vec_ld (0, dest);
1850     tmp1 = vec_perm (ref0, ref1, perm1);
1851     tmp = vec_avg (prev, vec_avg (tmp0, tmp1));
1852
1853     do {
1854         ref0 = vec_ld (0, ref);
1855         ref1 = vec_ld (7, ref);
1856         ref += stride;
1857         prev = vec_ld (stride, dest);
1858         vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
1859         vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
1860         dest += stride;
1861         tmp0 = vec_perm (ref0, ref1, perm0);
1862         tmp = vec_avg (prev, vec_avg (tmp0, tmp1));
1863
1864         ref0 = vec_ld (0, ref);
1865         ref1 = vec_ld (7, ref);
1866         ref += stride;
1867         prev = vec_ld (stride, dest);
1868         vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
1869         vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
1870         dest += stride;
1871         tmp1 = vec_perm (ref0, ref1, perm1);
1872         tmp = vec_avg (prev, vec_avg (tmp0, tmp1));
1873     } while (--height);
1874
1875     ref0 = vec_ld (0, ref);
1876     ref1 = vec_ld (7, ref);
1877     prev = vec_ld (stride, dest);
1878     vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
1879     vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
1880     dest += stride;
1881     tmp0 = vec_perm (ref0, ref1, perm0);
1882     tmp = vec_avg (prev, vec_avg (tmp0, tmp1));
1883     vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
1884     vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
1885 }
1886
1887 void MC_avg_xy_16_altivec (unsigned char * dest, unsigned char * ref,
1888                            int stride, int height)
1889 {
1890     vector_u8_t permA, permB, ref0, ref1, A, B, avg0, avg1, xor0, xor1, tmp;
1891     vector_u8_t ones, prev;
1892
1893     ones = vec_splat_u8 (1);
1894     permA = vec_lvsl (0, ref);
1895     permB = vec_add (permA, ones);
1896
1897     height = (height >> 1) - 1;
1898
1899     ref0 = vec_ld (0, ref);
1900     ref1 = vec_ld (16, ref);
1901     ref += stride;
1902     A = vec_perm (ref0, ref1, permA);
1903     B = vec_perm (ref0, ref1, permB);
1904     avg0 = vec_avg (A, B);
1905     xor0 = vec_xor (A, B);
1906
1907     ref0 = vec_ld (0, ref);
1908     ref1 = vec_ld (16, ref);
1909     ref += stride;
1910     prev = vec_ld (0, dest);
1911     A = vec_perm (ref0, ref1, permA);
1912     B = vec_perm (ref0, ref1, permB);
1913     avg1 = vec_avg (A, B);
1914     xor1 = vec_xor (A, B);
1915     tmp = vec_avg (prev, vec_sub (vec_avg (avg0, avg1),
1916                                   vec_and (vec_and (ones, vec_or (xor0, xor1)),
1917                                            vec_xor (avg0, avg1))));
1918
1919
1920     do {
1921         ref0 = vec_ld (0, ref);
1922         ref1 = vec_ld (16, ref);
1923         ref += stride;
1924         prev = vec_ld (stride, dest);
1925         vec_st (tmp, 0, dest);
1926         A = vec_perm (ref0, ref1, permA);
1927         B = vec_perm (ref0, ref1, permB);
1928         avg0 = vec_avg (A, B);
1929         xor0 = vec_xor (A, B);
1930         tmp = vec_avg (prev,
1931                        vec_sub (vec_avg (avg0, avg1),
1932                                 vec_and (vec_and (ones, vec_or (xor0, xor1)),
1933                                          vec_xor (avg0, avg1))));
1934
1935         ref0 = vec_ld (0, ref);
1936         ref1 = vec_ld (16, ref);
1937         ref += stride;
1938         prev = vec_ld (2*stride, dest);
1939         vec_st (tmp, stride, dest);
1940         dest += 2*stride;
1941         A = vec_perm (ref0, ref1, permA);
1942         B = vec_perm (ref0, ref1, permB);
1943         avg1 = vec_avg (A, B);
1944         xor1 = vec_xor (A, B);
1945         tmp = vec_avg (prev,
1946                        vec_sub (vec_avg (avg0, avg1),
1947                                 vec_and (vec_and (ones, vec_or (xor0, xor1)),
1948                                          vec_xor (avg0, avg1))));
1949     } while (--height);
1950
1951     ref0 = vec_ld (0, ref);
1952     ref1 = vec_ld (16, ref);
1953     prev = vec_ld (stride, dest);
1954     vec_st (tmp, 0, dest);
1955     A = vec_perm (ref0, ref1, permA);
1956     B = vec_perm (ref0, ref1, permB);
1957     avg0 = vec_avg (A, B);
1958     xor0 = vec_xor (A, B);
1959     tmp = vec_avg (prev, vec_sub (vec_avg (avg0, avg1),
1960                                   vec_and (vec_and (ones, vec_or (xor0, xor1)),
1961                                            vec_xor (avg0, avg1))));
1962     vec_st (tmp, stride, dest);
1963 }
1964
1965 void MC_avg_xy_8_altivec (unsigned char * dest, unsigned char * ref,
1966                           int stride, int height)
1967 {
1968     vector_u8_t perm0A, perm0B, perm1A, perm1B, ref0, ref1, A, B;
1969     vector_u8_t avg0, avg1, xor0, xor1, tmp, ones, prev;
1970
1971     ones = vec_splat_u8 (1);
1972     perm0A = vec_lvsl (0, ref);
1973     perm0A = vec_mergeh (perm0A, perm0A);
1974     perm0A = vec_pack ((vector_u16_t)perm0A, (vector_u16_t)perm0A);
1975     perm0B = vec_add (perm0A, ones);
1976     perm1A = vec_lvsl (stride, ref);
1977     perm1A = vec_mergeh (perm1A, perm1A);
1978     perm1A = vec_pack ((vector_u16_t)perm1A, (vector_u16_t)perm1A);
1979     perm1B = vec_add (perm1A, ones);
1980
1981     height = (height >> 1) - 1;
1982
1983     ref0 = vec_ld (0, ref);
1984     ref1 = vec_ld (16, ref);
1985     ref += stride;
1986     A = vec_perm (ref0, ref1, perm0A);
1987     B = vec_perm (ref0, ref1, perm0B);
1988     avg0 = vec_avg (A, B);
1989     xor0 = vec_xor (A, B);
1990
1991     ref0 = vec_ld (0, ref);
1992     ref1 = vec_ld (16, ref);
1993     ref += stride;
1994     prev = vec_ld (0, dest);
1995     A = vec_perm (ref0, ref1, perm1A);
1996     B = vec_perm (ref0, ref1, perm1B);
1997     avg1 = vec_avg (A, B);
1998     xor1 = vec_xor (A, B);
1999     tmp = vec_avg (prev, vec_sub (vec_avg (avg0, avg1),
2000                                   vec_and (vec_and (ones, vec_or (xor0, xor1)),
2001                                            vec_xor (avg0, avg1))));
2002
2003
2004     do {
2005         ref0 = vec_ld (0, ref);
2006         ref1 = vec_ld (16, ref);
2007         ref += stride;
2008         prev = vec_ld (stride, dest);
2009         vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
2010         vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
2011         dest += stride;
2012         A = vec_perm (ref0, ref1, perm0A);
2013         B = vec_perm (ref0, ref1, perm0B);
2014         avg0 = vec_avg (A, B);
2015         xor0 = vec_xor (A, B);
2016         tmp = vec_avg (prev,
2017                        vec_sub (vec_avg (avg0, avg1),
2018                                 vec_and (vec_and (ones, vec_or (xor0, xor1)),
2019                                          vec_xor (avg0, avg1))));
2020
2021         ref0 = vec_ld (0, ref);
2022         ref1 = vec_ld (16, ref);
2023         ref += stride;
2024         prev = vec_ld (stride, dest);
2025         vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
2026         vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
2027         dest += stride;
2028         A = vec_perm (ref0, ref1, perm1A);
2029         B = vec_perm (ref0, ref1, perm1B);
2030         avg1 = vec_avg (A, B);
2031         xor1 = vec_xor (A, B);
2032         tmp = vec_avg (prev,
2033                        vec_sub (vec_avg (avg0, avg1),
2034                                 vec_and (vec_and (ones, vec_or (xor0, xor1)),
2035                                          vec_xor (avg0, avg1))));
2036     } while (--height);
2037
2038     ref0 = vec_ld (0, ref);
2039     ref1 = vec_ld (16, ref);
2040     prev = vec_ld (stride, dest);
2041     vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
2042     vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
2043     dest += stride;
2044     A = vec_perm (ref0, ref1, perm0A);
2045     B = vec_perm (ref0, ref1, perm0B);
2046     avg0 = vec_avg (A, B);
2047     xor0 = vec_xor (A, B);
2048     tmp = vec_avg (prev, vec_sub (vec_avg (avg0, avg1),
2049                                   vec_and (vec_and (ones, vec_or (xor0, xor1)),
2050                                            vec_xor (avg0, avg1))));
2051     vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
2052     vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
2053 }
2054
2055 #endif        /* CAN_COMPILE_C_ALTIVEC || __BUILD_ALTIVEC_ASM__ */
2056 #ifndef __BUILD_ALTIVEC_ASM__
2057
2058 /*****************************************************************************
2059  * Functions exported as capabilities. They are declared as static so that
2060  * we don't pollute the namespace too much.
2061  *****************************************************************************/
2062 static void motion_getfunctions( function_list_t * p_function_list )
2063 {
2064     static void (* ppppf_motion[2][2][4])( yuv_data_t *, yuv_data_t *,
2065                                            int, int ) =
2066     {
2067         {
2068             /* Copying functions */
2069             {
2070                 /* Width == 16 */
2071                 MC_put_o_16_altivec, MC_put_x_16_altivec, MC_put_y_16_altivec, MC_put_xy_16_altivec
2072             },
2073             {
2074                 /* Width == 8 */
2075                 MC_put_o_8_altivec,  MC_put_x_8_altivec,  MC_put_y_8_altivec, MC_put_xy_8_altivec
2076             }
2077         },
2078         {
2079             /* Averaging functions */
2080             {
2081                 /* Width == 16 */
2082                 MC_avg_o_16_altivec, MC_avg_x_16_altivec, MC_avg_y_16_altivec, MC_avg_xy_16_altivec
2083             },
2084             {
2085                 /* Width == 8 */
2086                 MC_avg_o_8_altivec,  MC_avg_x_8_altivec,  MC_avg_y_8_altivec,  MC_avg_xy_8_altivec
2087             }
2088         }
2089     };
2090
2091 #define list p_function_list->functions.motion
2092     memcpy( list.ppppf_motion, ppppf_motion, sizeof( void * ) * 16 );
2093 #undef list
2094
2095     return;
2096 }
2097
2098 #endif        /* __BUILD_ALTIVEC_ASM__ */