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