00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "config.h"
00027
00028 #include <inttypes.h>
00029
00030 #include "dsputil.h"
00031
00032 #include "vis.h"
00033
00034 extern void ff_simple_idct_put_vis(uint8_t *dest, int line_size, DCTELEM *data);
00035 extern void ff_simple_idct_add_vis(uint8_t *dest, int line_size, DCTELEM *data);
00036 extern void ff_simple_idct_vis(DCTELEM *data);
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 #define ATTR_ALIGN(alignd) __attribute__ ((aligned(alignd)))
00059
00060 #define DUP4(x) {x, x, x, x}
00061 #define DUP8(x) {x, x, x, x, x, x, x, x}
00062 static const int16_t constants1[] ATTR_ALIGN(8) = DUP4 (1);
00063 static const int16_t constants2[] ATTR_ALIGN(8) = DUP4 (2);
00064 static const int16_t constants3[] ATTR_ALIGN(8) = DUP4 (3);
00065 static const int16_t constants6[] ATTR_ALIGN(8) = DUP4 (6);
00066 static const int8_t constants_fe[] ATTR_ALIGN(8) = DUP8 (0xfe);
00067 static const int8_t constants_7f[] ATTR_ALIGN(8) = DUP8 (0x7f);
00068 static const int8_t constants128[] ATTR_ALIGN(8) = DUP8 (128);
00069 static const int16_t constants256_512[] ATTR_ALIGN(8) =
00070 {256, 512, 256, 512};
00071 static const int16_t constants256_1024[] ATTR_ALIGN(8) =
00072 {256, 1024, 256, 1024};
00073
00074 #define REF_0 0
00075 #define REF_0_1 1
00076 #define REF_2 2
00077 #define REF_2_1 3
00078 #define REF_4 4
00079 #define REF_4_1 5
00080 #define REF_6 6
00081 #define REF_6_1 7
00082 #define REF_S0 8
00083 #define REF_S0_1 9
00084 #define REF_S2 10
00085 #define REF_S2_1 11
00086 #define REF_S4 12
00087 #define REF_S4_1 13
00088 #define REF_S6 14
00089 #define REF_S6_1 15
00090 #define DST_0 16
00091 #define DST_1 17
00092 #define DST_2 18
00093 #define DST_3 19
00094 #define CONST_1 20
00095 #define CONST_2 20
00096 #define CONST_3 20
00097 #define CONST_6 20
00098 #define MASK_fe 20
00099 #define CONST_128 22
00100 #define CONST_256 22
00101 #define CONST_512 22
00102 #define CONST_1024 22
00103 #define TMP0 24
00104 #define TMP1 25
00105 #define TMP2 26
00106 #define TMP3 27
00107 #define TMP4 28
00108 #define TMP5 29
00109 #define ZERO 30
00110 #define MASK_7f 30
00111
00112 #define TMP6 32
00113 #define TMP8 34
00114 #define TMP10 36
00115 #define TMP12 38
00116 #define TMP14 40
00117 #define TMP16 42
00118 #define TMP18 44
00119 #define TMP20 46
00120 #define TMP22 48
00121 #define TMP24 50
00122 #define TMP26 52
00123 #define TMP28 54
00124 #define TMP30 56
00125 #define TMP32 58
00126
00127 static void MC_put_o_16_vis (uint8_t * dest, const uint8_t * _ref,
00128 const int stride, int height)
00129 {
00130 uint8_t *ref = (uint8_t *) _ref;
00131
00132 ref = vis_alignaddr(ref);
00133 do {
00134 vis_ld64(ref[0], TMP0);
00135
00136 vis_ld64_2(ref, 8, TMP2);
00137
00138 vis_ld64_2(ref, 16, TMP4);
00139 ref += stride;
00140
00141 vis_faligndata(TMP0, TMP2, REF_0);
00142 vis_st64(REF_0, dest[0]);
00143
00144 vis_faligndata(TMP2, TMP4, REF_2);
00145 vis_st64_2(REF_2, dest, 8);
00146 dest += stride;
00147 } while (--height);
00148 }
00149
00150 static void MC_put_o_8_vis (uint8_t * dest, const uint8_t * _ref,
00151 const int stride, int height)
00152 {
00153 uint8_t *ref = (uint8_t *) _ref;
00154
00155 ref = vis_alignaddr(ref);
00156 do {
00157 vis_ld64(ref[0], TMP0);
00158
00159 vis_ld64(ref[8], TMP2);
00160 ref += stride;
00161
00162
00163
00164 vis_faligndata(TMP0, TMP2, REF_0);
00165 vis_st64(REF_0, dest[0]);
00166 dest += stride;
00167 } while (--height);
00168 }
00169
00170
00171 static void MC_avg_o_16_vis (uint8_t * dest, const uint8_t * _ref,
00172 const int stride, int height)
00173 {
00174 uint8_t *ref = (uint8_t *) _ref;
00175 int stride_8 = stride + 8;
00176
00177 ref = vis_alignaddr(ref);
00178
00179 vis_ld64(ref[0], TMP0);
00180
00181 vis_ld64(ref[8], TMP2);
00182
00183 vis_ld64(ref[16], TMP4);
00184
00185 vis_ld64(dest[0], DST_0);
00186
00187 vis_ld64(dest[8], DST_2);
00188
00189 vis_ld64(constants_fe[0], MASK_fe);
00190 vis_faligndata(TMP0, TMP2, REF_0);
00191
00192 vis_ld64(constants_7f[0], MASK_7f);
00193 vis_faligndata(TMP2, TMP4, REF_2);
00194
00195 vis_ld64(constants128[0], CONST_128);
00196
00197 ref += stride;
00198 height = (height >> 1) - 1;
00199
00200 do {
00201 vis_ld64(ref[0], TMP0);
00202 vis_xor(DST_0, REF_0, TMP6);
00203
00204 vis_ld64_2(ref, 8, TMP2);
00205 vis_and(TMP6, MASK_fe, TMP6);
00206
00207 vis_ld64_2(ref, 16, TMP4);
00208 ref += stride;
00209 vis_mul8x16(CONST_128, TMP6, TMP6);
00210 vis_xor(DST_2, REF_2, TMP8);
00211
00212 vis_and(TMP8, MASK_fe, TMP8);
00213
00214 vis_or(DST_0, REF_0, TMP10);
00215 vis_ld64_2(dest, stride, DST_0);
00216 vis_mul8x16(CONST_128, TMP8, TMP8);
00217
00218 vis_or(DST_2, REF_2, TMP12);
00219 vis_ld64_2(dest, stride_8, DST_2);
00220
00221 vis_ld64(ref[0], TMP14);
00222 vis_and(TMP6, MASK_7f, TMP6);
00223
00224 vis_and(TMP8, MASK_7f, TMP8);
00225
00226 vis_psub16(TMP10, TMP6, TMP6);
00227 vis_st64(TMP6, dest[0]);
00228
00229 vis_psub16(TMP12, TMP8, TMP8);
00230 vis_st64_2(TMP8, dest, 8);
00231
00232 dest += stride;
00233 vis_ld64_2(ref, 8, TMP16);
00234 vis_faligndata(TMP0, TMP2, REF_0);
00235
00236 vis_ld64_2(ref, 16, TMP18);
00237 vis_faligndata(TMP2, TMP4, REF_2);
00238 ref += stride;
00239
00240 vis_xor(DST_0, REF_0, TMP20);
00241
00242 vis_and(TMP20, MASK_fe, TMP20);
00243
00244 vis_xor(DST_2, REF_2, TMP22);
00245 vis_mul8x16(CONST_128, TMP20, TMP20);
00246
00247 vis_and(TMP22, MASK_fe, TMP22);
00248
00249 vis_or(DST_0, REF_0, TMP24);
00250 vis_mul8x16(CONST_128, TMP22, TMP22);
00251
00252 vis_or(DST_2, REF_2, TMP26);
00253
00254 vis_ld64_2(dest, stride, DST_0);
00255 vis_faligndata(TMP14, TMP16, REF_0);
00256
00257 vis_ld64_2(dest, stride_8, DST_2);
00258 vis_faligndata(TMP16, TMP18, REF_2);
00259
00260 vis_and(TMP20, MASK_7f, TMP20);
00261
00262 vis_and(TMP22, MASK_7f, TMP22);
00263
00264 vis_psub16(TMP24, TMP20, TMP20);
00265 vis_st64(TMP20, dest[0]);
00266
00267 vis_psub16(TMP26, TMP22, TMP22);
00268 vis_st64_2(TMP22, dest, 8);
00269 dest += stride;
00270 } while (--height);
00271
00272 vis_ld64(ref[0], TMP0);
00273 vis_xor(DST_0, REF_0, TMP6);
00274
00275 vis_ld64_2(ref, 8, TMP2);
00276 vis_and(TMP6, MASK_fe, TMP6);
00277
00278 vis_ld64_2(ref, 16, TMP4);
00279 vis_mul8x16(CONST_128, TMP6, TMP6);
00280 vis_xor(DST_2, REF_2, TMP8);
00281
00282 vis_and(TMP8, MASK_fe, TMP8);
00283
00284 vis_or(DST_0, REF_0, TMP10);
00285 vis_ld64_2(dest, stride, DST_0);
00286 vis_mul8x16(CONST_128, TMP8, TMP8);
00287
00288 vis_or(DST_2, REF_2, TMP12);
00289 vis_ld64_2(dest, stride_8, DST_2);
00290
00291 vis_ld64(ref[0], TMP14);
00292 vis_and(TMP6, MASK_7f, TMP6);
00293
00294 vis_and(TMP8, MASK_7f, TMP8);
00295
00296 vis_psub16(TMP10, TMP6, TMP6);
00297 vis_st64(TMP6, dest[0]);
00298
00299 vis_psub16(TMP12, TMP8, TMP8);
00300 vis_st64_2(TMP8, dest, 8);
00301
00302 dest += stride;
00303 vis_faligndata(TMP0, TMP2, REF_0);
00304
00305 vis_faligndata(TMP2, TMP4, REF_2);
00306
00307 vis_xor(DST_0, REF_0, TMP20);
00308
00309 vis_and(TMP20, MASK_fe, TMP20);
00310
00311 vis_xor(DST_2, REF_2, TMP22);
00312 vis_mul8x16(CONST_128, TMP20, TMP20);
00313
00314 vis_and(TMP22, MASK_fe, TMP22);
00315
00316 vis_or(DST_0, REF_0, TMP24);
00317 vis_mul8x16(CONST_128, TMP22, TMP22);
00318
00319 vis_or(DST_2, REF_2, TMP26);
00320
00321 vis_and(TMP20, MASK_7f, TMP20);
00322
00323 vis_and(TMP22, MASK_7f, TMP22);
00324
00325 vis_psub16(TMP24, TMP20, TMP20);
00326 vis_st64(TMP20, dest[0]);
00327
00328 vis_psub16(TMP26, TMP22, TMP22);
00329 vis_st64_2(TMP22, dest, 8);
00330 }
00331
00332 static void MC_avg_o_8_vis (uint8_t * dest, const uint8_t * _ref,
00333 const int stride, int height)
00334 {
00335 uint8_t *ref = (uint8_t *) _ref;
00336
00337 ref = vis_alignaddr(ref);
00338
00339 vis_ld64(ref[0], TMP0);
00340
00341 vis_ld64(ref[8], TMP2);
00342
00343 vis_ld64(dest[0], DST_0);
00344
00345 vis_ld64(constants_fe[0], MASK_fe);
00346
00347 vis_ld64(constants_7f[0], MASK_7f);
00348 vis_faligndata(TMP0, TMP2, REF_0);
00349
00350 vis_ld64(constants128[0], CONST_128);
00351
00352 ref += stride;
00353 height = (height >> 1) - 1;
00354
00355 do {
00356 vis_ld64(ref[0], TMP0);
00357 vis_xor(DST_0, REF_0, TMP4);
00358
00359 vis_ld64(ref[8], TMP2);
00360 vis_and(TMP4, MASK_fe, TMP4);
00361
00362 vis_or(DST_0, REF_0, TMP6);
00363 vis_ld64_2(dest, stride, DST_0);
00364 ref += stride;
00365 vis_mul8x16(CONST_128, TMP4, TMP4);
00366
00367 vis_ld64(ref[0], TMP12);
00368 vis_faligndata(TMP0, TMP2, REF_0);
00369
00370 vis_ld64(ref[8], TMP2);
00371 vis_xor(DST_0, REF_0, TMP0);
00372 ref += stride;
00373
00374 vis_and(TMP0, MASK_fe, TMP0);
00375
00376 vis_and(TMP4, MASK_7f, TMP4);
00377
00378 vis_psub16(TMP6, TMP4, TMP4);
00379 vis_st64(TMP4, dest[0]);
00380 dest += stride;
00381 vis_mul8x16(CONST_128, TMP0, TMP0);
00382
00383 vis_or(DST_0, REF_0, TMP6);
00384 vis_ld64_2(dest, stride, DST_0);
00385
00386 vis_faligndata(TMP12, TMP2, REF_0);
00387
00388 vis_and(TMP0, MASK_7f, TMP0);
00389
00390 vis_psub16(TMP6, TMP0, TMP4);
00391 vis_st64(TMP4, dest[0]);
00392 dest += stride;
00393 } while (--height);
00394
00395 vis_ld64(ref[0], TMP0);
00396 vis_xor(DST_0, REF_0, TMP4);
00397
00398 vis_ld64(ref[8], TMP2);
00399 vis_and(TMP4, MASK_fe, TMP4);
00400
00401 vis_or(DST_0, REF_0, TMP6);
00402 vis_ld64_2(dest, stride, DST_0);
00403 vis_mul8x16(CONST_128, TMP4, TMP4);
00404
00405 vis_faligndata(TMP0, TMP2, REF_0);
00406
00407 vis_xor(DST_0, REF_0, TMP0);
00408
00409 vis_and(TMP0, MASK_fe, TMP0);
00410
00411 vis_and(TMP4, MASK_7f, TMP4);
00412
00413 vis_psub16(TMP6, TMP4, TMP4);
00414 vis_st64(TMP4, dest[0]);
00415 dest += stride;
00416 vis_mul8x16(CONST_128, TMP0, TMP0);
00417
00418 vis_or(DST_0, REF_0, TMP6);
00419
00420 vis_and(TMP0, MASK_7f, TMP0);
00421
00422 vis_psub16(TMP6, TMP0, TMP4);
00423 vis_st64(TMP4, dest[0]);
00424 }
00425
00426 static void MC_put_x_16_vis (uint8_t * dest, const uint8_t * _ref,
00427 const int stride, int height)
00428 {
00429 uint8_t *ref = (uint8_t *) _ref;
00430 unsigned long off = (unsigned long) ref & 0x7;
00431 unsigned long off_plus_1 = off + 1;
00432
00433 ref = vis_alignaddr(ref);
00434
00435 vis_ld64(ref[0], TMP0);
00436
00437 vis_ld64_2(ref, 8, TMP2);
00438
00439 vis_ld64_2(ref, 16, TMP4);
00440
00441 vis_ld64(constants_fe[0], MASK_fe);
00442
00443 vis_ld64(constants_7f[0], MASK_7f);
00444 vis_faligndata(TMP0, TMP2, REF_0);
00445
00446 vis_ld64(constants128[0], CONST_128);
00447 vis_faligndata(TMP2, TMP4, REF_4);
00448
00449 if (off != 0x7) {
00450 vis_alignaddr_g0((void *)off_plus_1);
00451 vis_faligndata(TMP0, TMP2, REF_2);
00452 vis_faligndata(TMP2, TMP4, REF_6);
00453 } else {
00454 vis_src1(TMP2, REF_2);
00455 vis_src1(TMP4, REF_6);
00456 }
00457
00458 ref += stride;
00459 height = (height >> 1) - 1;
00460
00461 do {
00462 vis_ld64(ref[0], TMP0);
00463 vis_xor(REF_0, REF_2, TMP6);
00464
00465 vis_ld64_2(ref, 8, TMP2);
00466 vis_xor(REF_4, REF_6, TMP8);
00467
00468 vis_ld64_2(ref, 16, TMP4);
00469 vis_and(TMP6, MASK_fe, TMP6);
00470 ref += stride;
00471
00472 vis_ld64(ref[0], TMP14);
00473 vis_mul8x16(CONST_128, TMP6, TMP6);
00474 vis_and(TMP8, MASK_fe, TMP8);
00475
00476 vis_ld64_2(ref, 8, TMP16);
00477 vis_mul8x16(CONST_128, TMP8, TMP8);
00478 vis_or(REF_0, REF_2, TMP10);
00479
00480 vis_ld64_2(ref, 16, TMP18);
00481 ref += stride;
00482 vis_or(REF_4, REF_6, TMP12);
00483
00484 vis_alignaddr_g0((void *)off);
00485
00486 vis_faligndata(TMP0, TMP2, REF_0);
00487
00488 vis_faligndata(TMP2, TMP4, REF_4);
00489
00490 if (off != 0x7) {
00491 vis_alignaddr_g0((void *)off_plus_1);
00492 vis_faligndata(TMP0, TMP2, REF_2);
00493 vis_faligndata(TMP2, TMP4, REF_6);
00494 } else {
00495 vis_src1(TMP2, REF_2);
00496 vis_src1(TMP4, REF_6);
00497 }
00498
00499 vis_and(TMP6, MASK_7f, TMP6);
00500
00501 vis_and(TMP8, MASK_7f, TMP8);
00502
00503 vis_psub16(TMP10, TMP6, TMP6);
00504 vis_st64(TMP6, dest[0]);
00505
00506 vis_psub16(TMP12, TMP8, TMP8);
00507 vis_st64_2(TMP8, dest, 8);
00508 dest += stride;
00509
00510 vis_xor(REF_0, REF_2, TMP6);
00511
00512 vis_xor(REF_4, REF_6, TMP8);
00513
00514 vis_and(TMP6, MASK_fe, TMP6);
00515
00516 vis_mul8x16(CONST_128, TMP6, TMP6);
00517 vis_and(TMP8, MASK_fe, TMP8);
00518
00519 vis_mul8x16(CONST_128, TMP8, TMP8);
00520 vis_or(REF_0, REF_2, TMP10);
00521
00522 vis_or(REF_4, REF_6, TMP12);
00523
00524 vis_alignaddr_g0((void *)off);
00525
00526 vis_faligndata(TMP14, TMP16, REF_0);
00527
00528 vis_faligndata(TMP16, TMP18, REF_4);
00529
00530 if (off != 0x7) {
00531 vis_alignaddr_g0((void *)off_plus_1);
00532 vis_faligndata(TMP14, TMP16, REF_2);
00533 vis_faligndata(TMP16, TMP18, REF_6);
00534 } else {
00535 vis_src1(TMP16, REF_2);
00536 vis_src1(TMP18, REF_6);
00537 }
00538
00539 vis_and(TMP6, MASK_7f, TMP6);
00540
00541 vis_and(TMP8, MASK_7f, TMP8);
00542
00543 vis_psub16(TMP10, TMP6, TMP6);
00544 vis_st64(TMP6, dest[0]);
00545
00546 vis_psub16(TMP12, TMP8, TMP8);
00547 vis_st64_2(TMP8, dest, 8);
00548 dest += stride;
00549 } while (--height);
00550
00551 vis_ld64(ref[0], TMP0);
00552 vis_xor(REF_0, REF_2, TMP6);
00553
00554 vis_ld64_2(ref, 8, TMP2);
00555 vis_xor(REF_4, REF_6, TMP8);
00556
00557 vis_ld64_2(ref, 16, TMP4);
00558 vis_and(TMP6, MASK_fe, TMP6);
00559
00560 vis_mul8x16(CONST_128, TMP6, TMP6);
00561 vis_and(TMP8, MASK_fe, TMP8);
00562
00563 vis_mul8x16(CONST_128, TMP8, TMP8);
00564 vis_or(REF_0, REF_2, TMP10);
00565
00566 vis_or(REF_4, REF_6, TMP12);
00567
00568 vis_alignaddr_g0((void *)off);
00569
00570 vis_faligndata(TMP0, TMP2, REF_0);
00571
00572 vis_faligndata(TMP2, TMP4, REF_4);
00573
00574 if (off != 0x7) {
00575 vis_alignaddr_g0((void *)off_plus_1);
00576 vis_faligndata(TMP0, TMP2, REF_2);
00577 vis_faligndata(TMP2, TMP4, REF_6);
00578 } else {
00579 vis_src1(TMP2, REF_2);
00580 vis_src1(TMP4, REF_6);
00581 }
00582
00583 vis_and(TMP6, MASK_7f, TMP6);
00584
00585 vis_and(TMP8, MASK_7f, TMP8);
00586
00587 vis_psub16(TMP10, TMP6, TMP6);
00588 vis_st64(TMP6, dest[0]);
00589
00590 vis_psub16(TMP12, TMP8, TMP8);
00591 vis_st64_2(TMP8, dest, 8);
00592 dest += stride;
00593
00594 vis_xor(REF_0, REF_2, TMP6);
00595
00596 vis_xor(REF_4, REF_6, TMP8);
00597
00598 vis_and(TMP6, MASK_fe, TMP6);
00599
00600 vis_mul8x16(CONST_128, TMP6, TMP6);
00601 vis_and(TMP8, MASK_fe, TMP8);
00602
00603 vis_mul8x16(CONST_128, TMP8, TMP8);
00604 vis_or(REF_0, REF_2, TMP10);
00605
00606 vis_or(REF_4, REF_6, TMP12);
00607
00608 vis_and(TMP6, MASK_7f, TMP6);
00609
00610 vis_and(TMP8, MASK_7f, TMP8);
00611
00612 vis_psub16(TMP10, TMP6, TMP6);
00613 vis_st64(TMP6, dest[0]);
00614
00615 vis_psub16(TMP12, TMP8, TMP8);
00616 vis_st64_2(TMP8, dest, 8);
00617 }
00618
00619 static void MC_put_x_8_vis (uint8_t * dest, const uint8_t * _ref,
00620 const int stride, int height)
00621 {
00622 uint8_t *ref = (uint8_t *) _ref;
00623 unsigned long off = (unsigned long) ref & 0x7;
00624 unsigned long off_plus_1 = off + 1;
00625
00626 ref = vis_alignaddr(ref);
00627
00628 vis_ld64(ref[0], TMP0);
00629
00630 vis_ld64(ref[8], TMP2);
00631
00632 vis_ld64(constants_fe[0], MASK_fe);
00633
00634 vis_ld64(constants_7f[0], MASK_7f);
00635
00636 vis_ld64(constants128[0], CONST_128);
00637 vis_faligndata(TMP0, TMP2, REF_0);
00638
00639 if (off != 0x7) {
00640 vis_alignaddr_g0((void *)off_plus_1);
00641 vis_faligndata(TMP0, TMP2, REF_2);
00642 } else {
00643 vis_src1(TMP2, REF_2);
00644 }
00645
00646 ref += stride;
00647 height = (height >> 1) - 1;
00648
00649 do {
00650 vis_ld64(ref[0], TMP0);
00651 vis_xor(REF_0, REF_2, TMP4);
00652
00653 vis_ld64_2(ref, 8, TMP2);
00654 vis_and(TMP4, MASK_fe, TMP4);
00655 ref += stride;
00656
00657 vis_ld64(ref[0], TMP8);
00658 vis_or(REF_0, REF_2, TMP6);
00659 vis_mul8x16(CONST_128, TMP4, TMP4);
00660
00661 vis_alignaddr_g0((void *)off);
00662
00663 vis_ld64_2(ref, 8, TMP10);
00664 ref += stride;
00665 vis_faligndata(TMP0, TMP2, REF_0);
00666
00667 if (off != 0x7) {
00668 vis_alignaddr_g0((void *)off_plus_1);
00669 vis_faligndata(TMP0, TMP2, REF_2);
00670 } else {
00671 vis_src1(TMP2, REF_2);
00672 }
00673
00674 vis_and(TMP4, MASK_7f, TMP4);
00675
00676 vis_psub16(TMP6, TMP4, DST_0);
00677 vis_st64(DST_0, dest[0]);
00678 dest += stride;
00679
00680 vis_xor(REF_0, REF_2, TMP12);
00681
00682 vis_and(TMP12, MASK_fe, TMP12);
00683
00684 vis_or(REF_0, REF_2, TMP14);
00685 vis_mul8x16(CONST_128, TMP12, TMP12);
00686
00687 vis_alignaddr_g0((void *)off);
00688 vis_faligndata(TMP8, TMP10, REF_0);
00689 if (off != 0x7) {
00690 vis_alignaddr_g0((void *)off_plus_1);
00691 vis_faligndata(TMP8, TMP10, REF_2);
00692 } else {
00693 vis_src1(TMP10, REF_2);
00694 }
00695
00696 vis_and(TMP12, MASK_7f, TMP12);
00697
00698 vis_psub16(TMP14, TMP12, DST_0);
00699 vis_st64(DST_0, dest[0]);
00700 dest += stride;
00701 } while (--height);
00702
00703 vis_ld64(ref[0], TMP0);
00704 vis_xor(REF_0, REF_2, TMP4);
00705
00706 vis_ld64_2(ref, 8, TMP2);
00707 vis_and(TMP4, MASK_fe, TMP4);
00708
00709 vis_or(REF_0, REF_2, TMP6);
00710 vis_mul8x16(CONST_128, TMP4, TMP4);
00711
00712 vis_alignaddr_g0((void *)off);
00713
00714 vis_faligndata(TMP0, TMP2, REF_0);
00715
00716 if (off != 0x7) {
00717 vis_alignaddr_g0((void *)off_plus_1);
00718 vis_faligndata(TMP0, TMP2, REF_2);
00719 } else {
00720 vis_src1(TMP2, REF_2);
00721 }
00722
00723 vis_and(TMP4, MASK_7f, TMP4);
00724
00725 vis_psub16(TMP6, TMP4, DST_0);
00726 vis_st64(DST_0, dest[0]);
00727 dest += stride;
00728
00729 vis_xor(REF_0, REF_2, TMP12);
00730
00731 vis_and(TMP12, MASK_fe, TMP12);
00732
00733 vis_or(REF_0, REF_2, TMP14);
00734 vis_mul8x16(CONST_128, TMP12, TMP12);
00735
00736 vis_and(TMP12, MASK_7f, TMP12);
00737
00738 vis_psub16(TMP14, TMP12, DST_0);
00739 vis_st64(DST_0, dest[0]);
00740 dest += stride;
00741 }
00742
00743 static void MC_avg_x_16_vis (uint8_t * dest, const uint8_t * _ref,
00744 const int stride, int height)
00745 {
00746 uint8_t *ref = (uint8_t *) _ref;
00747 unsigned long off = (unsigned long) ref & 0x7;
00748 unsigned long off_plus_1 = off + 1;
00749
00750 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
00751
00752 vis_ld64(constants3[0], CONST_3);
00753 vis_fzero(ZERO);
00754 vis_ld64(constants256_512[0], CONST_256);
00755
00756 ref = vis_alignaddr(ref);
00757 do {
00758 vis_ld64(ref[0], TMP0);
00759
00760 vis_ld64(ref[8], TMP2);
00761
00762 vis_alignaddr_g0((void *)off);
00763
00764 vis_ld64(ref[16], TMP4);
00765
00766 vis_ld64(dest[0], DST_0);
00767 vis_faligndata(TMP0, TMP2, REF_0);
00768
00769 vis_ld64(dest[8], DST_2);
00770 vis_faligndata(TMP2, TMP4, REF_4);
00771
00772 if (off != 0x7) {
00773 vis_alignaddr_g0((void *)off_plus_1);
00774 vis_faligndata(TMP0, TMP2, REF_2);
00775 vis_faligndata(TMP2, TMP4, REF_6);
00776 } else {
00777 vis_src1(TMP2, REF_2);
00778 vis_src1(TMP4, REF_6);
00779 }
00780
00781 vis_mul8x16au(REF_0, CONST_256, TMP0);
00782
00783 vis_pmerge(ZERO, REF_2, TMP4);
00784 vis_mul8x16au(REF_0_1, CONST_256, TMP2);
00785
00786 vis_pmerge(ZERO, REF_2_1, TMP6);
00787
00788 vis_padd16(TMP0, TMP4, TMP0);
00789
00790 vis_mul8x16al(DST_0, CONST_512, TMP4);
00791 vis_padd16(TMP2, TMP6, TMP2);
00792
00793 vis_mul8x16al(DST_1, CONST_512, TMP6);
00794
00795 vis_mul8x16au(REF_6, CONST_256, TMP12);
00796
00797 vis_padd16(TMP0, TMP4, TMP0);
00798 vis_mul8x16au(REF_6_1, CONST_256, TMP14);
00799
00800 vis_padd16(TMP2, TMP6, TMP2);
00801 vis_mul8x16au(REF_4, CONST_256, TMP16);
00802
00803 vis_padd16(TMP0, CONST_3, TMP8);
00804 vis_mul8x16au(REF_4_1, CONST_256, TMP18);
00805
00806 vis_padd16(TMP2, CONST_3, TMP10);
00807 vis_pack16(TMP8, DST_0);
00808
00809 vis_pack16(TMP10, DST_1);
00810 vis_padd16(TMP16, TMP12, TMP0);
00811
00812 vis_st64(DST_0, dest[0]);
00813 vis_mul8x16al(DST_2, CONST_512, TMP4);
00814 vis_padd16(TMP18, TMP14, TMP2);
00815
00816 vis_mul8x16al(DST_3, CONST_512, TMP6);
00817 vis_padd16(TMP0, CONST_3, TMP0);
00818
00819 vis_padd16(TMP2, CONST_3, TMP2);
00820
00821 vis_padd16(TMP0, TMP4, TMP0);
00822
00823 vis_padd16(TMP2, TMP6, TMP2);
00824 vis_pack16(TMP0, DST_2);
00825
00826 vis_pack16(TMP2, DST_3);
00827 vis_st64(DST_2, dest[8]);
00828
00829 ref += stride;
00830 dest += stride;
00831 } while (--height);
00832 }
00833
00834 static void MC_avg_x_8_vis (uint8_t * dest, const uint8_t * _ref,
00835 const int stride, int height)
00836 {
00837 uint8_t *ref = (uint8_t *) _ref;
00838 unsigned long off = (unsigned long) ref & 0x7;
00839 unsigned long off_plus_1 = off + 1;
00840 int stride_times_2 = stride << 1;
00841
00842 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
00843
00844 vis_ld64(constants3[0], CONST_3);
00845 vis_fzero(ZERO);
00846 vis_ld64(constants256_512[0], CONST_256);
00847
00848 ref = vis_alignaddr(ref);
00849 height >>= 2;
00850 do {
00851 vis_ld64(ref[0], TMP0);
00852
00853 vis_ld64_2(ref, 8, TMP2);
00854 ref += stride;
00855
00856 vis_alignaddr_g0((void *)off);
00857
00858 vis_ld64(ref[0], TMP4);
00859 vis_faligndata(TMP0, TMP2, REF_0);
00860
00861 vis_ld64_2(ref, 8, TMP6);
00862 ref += stride;
00863
00864 vis_ld64(ref[0], TMP8);
00865
00866 vis_ld64_2(ref, 8, TMP10);
00867 ref += stride;
00868 vis_faligndata(TMP4, TMP6, REF_4);
00869
00870 vis_ld64(ref[0], TMP12);
00871
00872 vis_ld64_2(ref, 8, TMP14);
00873 ref += stride;
00874 vis_faligndata(TMP8, TMP10, REF_S0);
00875
00876 vis_faligndata(TMP12, TMP14, REF_S4);
00877
00878 if (off != 0x7) {
00879 vis_alignaddr_g0((void *)off_plus_1);
00880
00881 vis_ld64(dest[0], DST_0);
00882 vis_faligndata(TMP0, TMP2, REF_2);
00883
00884 vis_ld64_2(dest, stride, DST_2);
00885 vis_faligndata(TMP4, TMP6, REF_6);
00886
00887 vis_faligndata(TMP8, TMP10, REF_S2);
00888
00889 vis_faligndata(TMP12, TMP14, REF_S6);
00890 } else {
00891 vis_ld64(dest[0], DST_0);
00892 vis_src1(TMP2, REF_2);
00893
00894 vis_ld64_2(dest, stride, DST_2);
00895 vis_src1(TMP6, REF_6);
00896
00897 vis_src1(TMP10, REF_S2);
00898
00899 vis_src1(TMP14, REF_S6);
00900 }
00901
00902 vis_pmerge(ZERO, REF_0, TMP0);
00903 vis_mul8x16au(REF_0_1, CONST_256, TMP2);
00904
00905 vis_pmerge(ZERO, REF_2, TMP4);
00906 vis_mul8x16au(REF_2_1, CONST_256, TMP6);
00907
00908 vis_padd16(TMP0, CONST_3, TMP0);
00909 vis_mul8x16al(DST_0, CONST_512, TMP16);
00910
00911 vis_padd16(TMP2, CONST_3, TMP2);
00912 vis_mul8x16al(DST_1, CONST_512, TMP18);
00913
00914 vis_padd16(TMP0, TMP4, TMP0);
00915 vis_mul8x16au(REF_4, CONST_256, TMP8);
00916
00917 vis_padd16(TMP2, TMP6, TMP2);
00918 vis_mul8x16au(REF_4_1, CONST_256, TMP10);
00919
00920 vis_padd16(TMP0, TMP16, TMP0);
00921 vis_mul8x16au(REF_6, CONST_256, TMP12);
00922
00923 vis_padd16(TMP2, TMP18, TMP2);
00924 vis_mul8x16au(REF_6_1, CONST_256, TMP14);
00925
00926 vis_padd16(TMP8, CONST_3, TMP8);
00927 vis_mul8x16al(DST_2, CONST_512, TMP16);
00928
00929 vis_padd16(TMP8, TMP12, TMP8);
00930 vis_mul8x16al(DST_3, CONST_512, TMP18);
00931
00932 vis_padd16(TMP10, TMP14, TMP10);
00933 vis_pack16(TMP0, DST_0);
00934
00935 vis_pack16(TMP2, DST_1);
00936 vis_st64(DST_0, dest[0]);
00937 dest += stride;
00938 vis_padd16(TMP10, CONST_3, TMP10);
00939
00940 vis_ld64_2(dest, stride, DST_0);
00941 vis_padd16(TMP8, TMP16, TMP8);
00942
00943 vis_ld64_2(dest, stride_times_2, TMP4);
00944 vis_padd16(TMP10, TMP18, TMP10);
00945 vis_pack16(TMP8, DST_2);
00946
00947 vis_pack16(TMP10, DST_3);
00948 vis_st64(DST_2, dest[0]);
00949 dest += stride;
00950
00951 vis_mul8x16au(REF_S0_1, CONST_256, TMP2);
00952 vis_pmerge(ZERO, REF_S0, TMP0);
00953
00954 vis_pmerge(ZERO, REF_S2, TMP24);
00955 vis_mul8x16au(REF_S2_1, CONST_256, TMP6);
00956
00957 vis_padd16(TMP0, CONST_3, TMP0);
00958 vis_mul8x16au(REF_S4, CONST_256, TMP8);
00959
00960 vis_padd16(TMP2, CONST_3, TMP2);
00961 vis_mul8x16au(REF_S4_1, CONST_256, TMP10);
00962
00963 vis_padd16(TMP0, TMP24, TMP0);
00964 vis_mul8x16au(REF_S6, CONST_256, TMP12);
00965
00966 vis_padd16(TMP2, TMP6, TMP2);
00967 vis_mul8x16au(REF_S6_1, CONST_256, TMP14);
00968
00969 vis_padd16(TMP8, CONST_3, TMP8);
00970 vis_mul8x16al(DST_0, CONST_512, TMP16);
00971
00972 vis_padd16(TMP10, CONST_3, TMP10);
00973 vis_mul8x16al(DST_1, CONST_512, TMP18);
00974
00975 vis_padd16(TMP8, TMP12, TMP8);
00976 vis_mul8x16al(TMP4, CONST_512, TMP20);
00977
00978 vis_mul8x16al(TMP5, CONST_512, TMP22);
00979 vis_padd16(TMP0, TMP16, TMP0);
00980
00981 vis_padd16(TMP2, TMP18, TMP2);
00982 vis_pack16(TMP0, DST_0);
00983
00984 vis_padd16(TMP10, TMP14, TMP10);
00985 vis_pack16(TMP2, DST_1);
00986 vis_st64(DST_0, dest[0]);
00987 dest += stride;
00988
00989 vis_padd16(TMP8, TMP20, TMP8);
00990
00991 vis_padd16(TMP10, TMP22, TMP10);
00992 vis_pack16(TMP8, DST_2);
00993
00994 vis_pack16(TMP10, DST_3);
00995 vis_st64(DST_2, dest[0]);
00996 dest += stride;
00997 } while (--height);
00998 }
00999
01000 static void MC_put_y_16_vis (uint8_t * dest, const uint8_t * _ref,
01001 const int stride, int height)
01002 {
01003 uint8_t *ref = (uint8_t *) _ref;
01004
01005 ref = vis_alignaddr(ref);
01006 vis_ld64(ref[0], TMP0);
01007
01008 vis_ld64_2(ref, 8, TMP2);
01009
01010 vis_ld64_2(ref, 16, TMP4);
01011 ref += stride;
01012
01013 vis_ld64(ref[0], TMP6);
01014 vis_faligndata(TMP0, TMP2, REF_0);
01015
01016 vis_ld64_2(ref, 8, TMP8);
01017 vis_faligndata(TMP2, TMP4, REF_4);
01018
01019 vis_ld64_2(ref, 16, TMP10);
01020 ref += stride;
01021
01022 vis_ld64(constants_fe[0], MASK_fe);
01023 vis_faligndata(TMP6, TMP8, REF_2);
01024
01025 vis_ld64(constants_7f[0], MASK_7f);
01026 vis_faligndata(TMP8, TMP10, REF_6);
01027
01028 vis_ld64(constants128[0], CONST_128);
01029 height = (height >> 1) - 1;
01030 do {
01031 vis_ld64(ref[0], TMP0);
01032 vis_xor(REF_0, REF_2, TMP12);
01033
01034 vis_ld64_2(ref, 8, TMP2);
01035 vis_xor(REF_4, REF_6, TMP16);
01036
01037 vis_ld64_2(ref, 16, TMP4);
01038 ref += stride;
01039 vis_or(REF_0, REF_2, TMP14);
01040
01041 vis_ld64(ref[0], TMP6);
01042 vis_or(REF_4, REF_6, TMP18);
01043
01044 vis_ld64_2(ref, 8, TMP8);
01045 vis_faligndata(TMP0, TMP2, REF_0);
01046
01047 vis_ld64_2(ref, 16, TMP10);
01048 ref += stride;
01049 vis_faligndata(TMP2, TMP4, REF_4);
01050
01051 vis_and(TMP12, MASK_fe, TMP12);
01052
01053 vis_and(TMP16, MASK_fe, TMP16);
01054 vis_mul8x16(CONST_128, TMP12, TMP12);
01055
01056 vis_mul8x16(CONST_128, TMP16, TMP16);
01057 vis_xor(REF_0, REF_2, TMP0);
01058
01059 vis_xor(REF_4, REF_6, TMP2);
01060
01061 vis_or(REF_0, REF_2, TMP20);
01062
01063 vis_and(TMP12, MASK_7f, TMP12);
01064
01065 vis_and(TMP16, MASK_7f, TMP16);
01066
01067 vis_psub16(TMP14, TMP12, TMP12);
01068 vis_st64(TMP12, dest[0]);
01069
01070 vis_psub16(TMP18, TMP16, TMP16);
01071 vis_st64_2(TMP16, dest, 8);
01072 dest += stride;
01073
01074 vis_or(REF_4, REF_6, TMP18);
01075
01076 vis_and(TMP0, MASK_fe, TMP0);
01077
01078 vis_and(TMP2, MASK_fe, TMP2);
01079 vis_mul8x16(CONST_128, TMP0, TMP0);
01080
01081 vis_faligndata(TMP6, TMP8, REF_2);
01082 vis_mul8x16(CONST_128, TMP2, TMP2);
01083
01084 vis_faligndata(TMP8, TMP10, REF_6);
01085
01086 vis_and(TMP0, MASK_7f, TMP0);
01087
01088 vis_and(TMP2, MASK_7f, TMP2);
01089
01090 vis_psub16(TMP20, TMP0, TMP0);
01091 vis_st64(TMP0, dest[0]);
01092
01093 vis_psub16(TMP18, TMP2, TMP2);
01094 vis_st64_2(TMP2, dest, 8);
01095 dest += stride;
01096 } while (--height);
01097
01098 vis_ld64(ref[0], TMP0);
01099 vis_xor(REF_0, REF_2, TMP12);
01100
01101 vis_ld64_2(ref, 8, TMP2);
01102 vis_xor(REF_4, REF_6, TMP16);
01103
01104 vis_ld64_2(ref, 16, TMP4);
01105 vis_or(REF_0, REF_2, TMP14);
01106
01107 vis_or(REF_4, REF_6, TMP18);
01108
01109 vis_faligndata(TMP0, TMP2, REF_0);
01110
01111 vis_faligndata(TMP2, TMP4, REF_4);
01112
01113 vis_and(TMP12, MASK_fe, TMP12);
01114
01115 vis_and(TMP16, MASK_fe, TMP16);
01116 vis_mul8x16(CONST_128, TMP12, TMP12);
01117
01118 vis_mul8x16(CONST_128, TMP16, TMP16);
01119 vis_xor(REF_0, REF_2, TMP0);
01120
01121 vis_xor(REF_4, REF_6, TMP2);
01122
01123 vis_or(REF_0, REF_2, TMP20);
01124
01125 vis_and(TMP12, MASK_7f, TMP12);
01126
01127 vis_and(TMP16, MASK_7f, TMP16);
01128
01129 vis_psub16(TMP14, TMP12, TMP12);
01130 vis_st64(TMP12, dest[0]);
01131
01132 vis_psub16(TMP18, TMP16, TMP16);
01133 vis_st64_2(TMP16, dest, 8);
01134 dest += stride;
01135
01136 vis_or(REF_4, REF_6, TMP18);
01137
01138 vis_and(TMP0, MASK_fe, TMP0);
01139
01140 vis_and(TMP2, MASK_fe, TMP2);
01141 vis_mul8x16(CONST_128, TMP0, TMP0);
01142
01143 vis_mul8x16(CONST_128, TMP2, TMP2);
01144
01145 vis_and(TMP0, MASK_7f, TMP0);
01146
01147 vis_and(TMP2, MASK_7f, TMP2);
01148
01149 vis_psub16(TMP20, TMP0, TMP0);
01150 vis_st64(TMP0, dest[0]);
01151
01152 vis_psub16(TMP18, TMP2, TMP2);
01153 vis_st64_2(TMP2, dest, 8);
01154 }
01155
01156 static void MC_put_y_8_vis (uint8_t * dest, const uint8_t * _ref,
01157 const int stride, int height)
01158 {
01159 uint8_t *ref = (uint8_t *) _ref;
01160
01161 ref = vis_alignaddr(ref);
01162 vis_ld64(ref[0], TMP0);
01163
01164 vis_ld64_2(ref, 8, TMP2);
01165 ref += stride;
01166
01167 vis_ld64(ref[0], TMP4);
01168
01169 vis_ld64_2(ref, 8, TMP6);
01170 ref += stride;
01171
01172 vis_ld64(constants_fe[0], MASK_fe);
01173 vis_faligndata(TMP0, TMP2, REF_0);
01174
01175 vis_ld64(constants_7f[0], MASK_7f);
01176 vis_faligndata(TMP4, TMP6, REF_2);
01177
01178 vis_ld64(constants128[0], CONST_128);
01179 height = (height >> 1) - 1;
01180 do {
01181 vis_ld64(ref[0], TMP0);
01182 vis_xor(REF_0, REF_2, TMP4);
01183
01184 vis_ld64_2(ref, 8, TMP2);
01185 ref += stride;
01186 vis_and(TMP4, MASK_fe, TMP4);
01187
01188 vis_or(REF_0, REF_2, TMP6);
01189 vis_mul8x16(CONST_128, TMP4, TMP4);
01190
01191 vis_faligndata(TMP0, TMP2, REF_0);
01192 vis_ld64(ref[0], TMP0);
01193
01194 vis_ld64_2(ref, 8, TMP2);
01195 ref += stride;
01196 vis_xor(REF_0, REF_2, TMP12);
01197
01198 vis_and(TMP4, MASK_7f, TMP4);
01199
01200 vis_and(TMP12, MASK_fe, TMP12);
01201
01202 vis_mul8x16(CONST_128, TMP12, TMP12);
01203 vis_or(REF_0, REF_2, TMP14);
01204
01205 vis_psub16(TMP6, TMP4, DST_0);
01206 vis_st64(DST_0, dest[0]);
01207 dest += stride;
01208
01209 vis_faligndata(TMP0, TMP2, REF_2);
01210
01211 vis_and(TMP12, MASK_7f, TMP12);
01212
01213 vis_psub16(TMP14, TMP12, DST_0);
01214 vis_st64(DST_0, dest[0]);
01215 dest += stride;
01216 } while (--height);
01217
01218 vis_ld64(ref[0], TMP0);
01219 vis_xor(REF_0, REF_2, TMP4);
01220
01221 vis_ld64_2(ref, 8, TMP2);
01222 vis_and(TMP4, MASK_fe, TMP4);
01223
01224 vis_or(REF_0, REF_2, TMP6);
01225 vis_mul8x16(CONST_128, TMP4, TMP4);
01226
01227 vis_faligndata(TMP0, TMP2, REF_0);
01228
01229 vis_xor(REF_0, REF_2, TMP12);
01230
01231 vis_and(TMP4, MASK_7f, TMP4);
01232
01233 vis_and(TMP12, MASK_fe, TMP12);
01234
01235 vis_mul8x16(CONST_128, TMP12, TMP12);
01236 vis_or(REF_0, REF_2, TMP14);
01237
01238 vis_psub16(TMP6, TMP4, DST_0);
01239 vis_st64(DST_0, dest[0]);
01240 dest += stride;
01241
01242 vis_and(TMP12, MASK_7f, TMP12);
01243
01244 vis_psub16(TMP14, TMP12, DST_0);
01245 vis_st64(DST_0, dest[0]);
01246 }
01247
01248 static void MC_avg_y_16_vis (uint8_t * dest, const uint8_t * _ref,
01249 const int stride, int height)
01250 {
01251 uint8_t *ref = (uint8_t *) _ref;
01252 int stride_8 = stride + 8;
01253 int stride_16 = stride + 16;
01254
01255 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
01256
01257 ref = vis_alignaddr(ref);
01258
01259 vis_ld64(ref[ 0], TMP0);
01260 vis_fzero(ZERO);
01261
01262 vis_ld64(ref[ 8], TMP2);
01263
01264 vis_ld64(ref[16], TMP4);
01265
01266 vis_ld64(constants3[0], CONST_3);
01267 vis_faligndata(TMP0, TMP2, REF_2);
01268
01269 vis_ld64(constants256_512[0], CONST_256);
01270 vis_faligndata(TMP2, TMP4, REF_6);
01271 height >>= 1;
01272
01273 do {
01274 vis_ld64_2(ref, stride, TMP0);
01275 vis_pmerge(ZERO, REF_2, TMP12);
01276 vis_mul8x16au(REF_2_1, CONST_256, TMP14);
01277
01278 vis_ld64_2(ref, stride_8, TMP2);
01279 vis_pmerge(ZERO, REF_6, TMP16);
01280 vis_mul8x16au(REF_6_1, CONST_256, TMP18);
01281
01282 vis_ld64_2(ref, stride_16, TMP4);
01283 ref += stride;
01284
01285 vis_ld64(dest[0], DST_0);
01286 vis_faligndata(TMP0, TMP2, REF_0);
01287
01288 vis_ld64_2(dest, 8, DST_2);
01289 vis_faligndata(TMP2, TMP4, REF_4);
01290
01291 vis_ld64_2(ref, stride, TMP6);
01292 vis_pmerge(ZERO, REF_0, TMP0);
01293 vis_mul8x16au(REF_0_1, CONST_256, TMP2);
01294
01295 vis_ld64_2(ref, stride_8, TMP8);
01296 vis_pmerge(ZERO, REF_4, TMP4);
01297
01298 vis_ld64_2(ref, stride_16, TMP10);
01299 ref += stride;
01300
01301 vis_ld64_2(dest, stride, REF_S0);
01302 vis_faligndata(TMP6, TMP8, REF_2);
01303 vis_mul8x16au(REF_4_1, CONST_256, TMP6);
01304
01305 vis_ld64_2(dest, stride_8, REF_S2);
01306 vis_faligndata(TMP8, TMP10, REF_6);
01307 vis_mul8x16al(DST_0, CONST_512, TMP20);
01308
01309 vis_padd16(TMP0, CONST_3, TMP0);
01310 vis_mul8x16al(DST_1, CONST_512, TMP22);
01311
01312 vis_padd16(TMP2, CONST_3, TMP2);
01313 vis_mul8x16al(DST_2, CONST_512, TMP24);
01314
01315 vis_padd16(TMP4, CONST_3, TMP4);
01316 vis_mul8x16al(DST_3, CONST_512, TMP26);
01317
01318 vis_padd16(TMP6, CONST_3, TMP6);
01319
01320 vis_padd16(TMP12, TMP20, TMP12);
01321 vis_mul8x16al(REF_S0, CONST_512, TMP20);
01322
01323 vis_padd16(TMP14, TMP22, TMP14);
01324 vis_mul8x16al(REF_S0_1, CONST_512, TMP22);
01325
01326 vis_padd16(TMP16, TMP24, TMP16);
01327 vis_mul8x16al(REF_S2, CONST_512, TMP24);
01328
01329 vis_padd16(TMP18, TMP26, TMP18);
01330 vis_mul8x16al(REF_S2_1, CONST_512, TMP26);
01331
01332 vis_padd16(TMP12, TMP0, TMP12);
01333 vis_mul8x16au(REF_2, CONST_256, TMP28);
01334
01335 vis_padd16(TMP14, TMP2, TMP14);
01336 vis_mul8x16au(REF_2_1, CONST_256, TMP30);
01337
01338 vis_padd16(TMP16, TMP4, TMP16);
01339 vis_mul8x16au(REF_6, CONST_256, REF_S4);
01340
01341 vis_padd16(TMP18, TMP6, TMP18);
01342 vis_mul8x16au(REF_6_1, CONST_256, REF_S6);
01343
01344 vis_pack16(TMP12, DST_0);
01345 vis_padd16(TMP28, TMP0, TMP12);
01346
01347 vis_pack16(TMP14, DST_1);
01348 vis_st64(DST_0, dest[0]);
01349 vis_padd16(TMP30, TMP2, TMP14);
01350
01351 vis_pack16(TMP16, DST_2);
01352 vis_padd16(REF_S4, TMP4, TMP16);
01353
01354 vis_pack16(TMP18, DST_3);
01355 vis_st64_2(DST_2, dest, 8);
01356 dest += stride;
01357 vis_padd16(REF_S6, TMP6, TMP18);
01358
01359 vis_padd16(TMP12, TMP20, TMP12);
01360
01361 vis_padd16(TMP14, TMP22, TMP14);
01362 vis_pack16(TMP12, DST_0);
01363
01364 vis_padd16(TMP16, TMP24, TMP16);
01365 vis_pack16(TMP14, DST_1);
01366 vis_st64(DST_0, dest[0]);
01367
01368 vis_padd16(TMP18, TMP26, TMP18);
01369 vis_pack16(TMP16, DST_2);
01370
01371 vis_pack16(TMP18, DST_3);
01372 vis_st64_2(DST_2, dest, 8);
01373 dest += stride;
01374 } while (--height);
01375 }
01376
01377 static void MC_avg_y_8_vis (uint8_t * dest, const uint8_t * _ref,
01378 const int stride, int height)
01379 {
01380 uint8_t *ref = (uint8_t *) _ref;
01381 int stride_8 = stride + 8;
01382
01383 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
01384
01385 ref = vis_alignaddr(ref);
01386
01387 vis_ld64(ref[ 0], TMP0);
01388 vis_fzero(ZERO);
01389
01390 vis_ld64(ref[ 8], TMP2);
01391
01392 vis_ld64(constants3[0], CONST_3);
01393 vis_faligndata(TMP0, TMP2, REF_2);
01394
01395 vis_ld64(constants256_512[0], CONST_256);
01396
01397 height >>= 1;
01398 do {
01399 vis_ld64_2(ref, stride, TMP0);
01400 vis_pmerge(ZERO, REF_2, TMP8);
01401 vis_mul8x16au(REF_2_1, CONST_256, TMP10);
01402
01403 vis_ld64_2(ref, stride_8, TMP2);
01404 ref += stride;
01405
01406 vis_ld64(dest[0], DST_0);
01407
01408 vis_ld64_2(dest, stride, DST_2);
01409 vis_faligndata(TMP0, TMP2, REF_0);
01410
01411 vis_ld64_2(ref, stride, TMP4);
01412 vis_mul8x16al(DST_0, CONST_512, TMP16);
01413 vis_pmerge(ZERO, REF_0, TMP12);
01414
01415 vis_ld64_2(ref, stride_8, TMP6);
01416 ref += stride;
01417 vis_mul8x16al(DST_1, CONST_512, TMP18);
01418 vis_pmerge(ZERO, REF_0_1, TMP14);
01419
01420 vis_padd16(TMP12, CONST_3, TMP12);
01421 vis_mul8x16al(DST_2, CONST_512, TMP24);
01422
01423 vis_padd16(TMP14, CONST_3, TMP14);
01424 vis_mul8x16al(DST_3, CONST_512, TMP26);
01425
01426 vis_faligndata(TMP4, TMP6, REF_2);
01427
01428 vis_padd16(TMP8, TMP12, TMP8);
01429
01430 vis_padd16(TMP10, TMP14, TMP10);
01431 vis_mul8x16au(REF_2, CONST_256, TMP20);
01432
01433 vis_padd16(TMP8, TMP16, TMP0);
01434 vis_mul8x16au(REF_2_1, CONST_256, TMP22);
01435
01436 vis_padd16(TMP10, TMP18, TMP2);
01437 vis_pack16(TMP0, DST_0);
01438
01439 vis_pack16(TMP2, DST_1);
01440 vis_st64(DST_0, dest[0]);
01441 dest += stride;
01442 vis_padd16(TMP12, TMP20, TMP12);
01443
01444 vis_padd16(TMP14, TMP22, TMP14);
01445
01446 vis_padd16(TMP12, TMP24, TMP0);
01447
01448 vis_padd16(TMP14, TMP26, TMP2);
01449 vis_pack16(TMP0, DST_2);
01450
01451 vis_pack16(TMP2, DST_3);
01452 vis_st64(DST_2, dest[0]);
01453 dest += stride;
01454 } while (--height);
01455 }
01456
01457 static void MC_put_xy_16_vis (uint8_t * dest, const uint8_t * _ref,
01458 const int stride, int height)
01459 {
01460 uint8_t *ref = (uint8_t *) _ref;
01461 unsigned long off = (unsigned long) ref & 0x7;
01462 unsigned long off_plus_1 = off + 1;
01463 int stride_8 = stride + 8;
01464 int stride_16 = stride + 16;
01465
01466 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
01467
01468 ref = vis_alignaddr(ref);
01469
01470 vis_ld64(ref[ 0], TMP0);
01471 vis_fzero(ZERO);
01472
01473 vis_ld64(ref[ 8], TMP2);
01474
01475 vis_ld64(ref[16], TMP4);
01476
01477 vis_ld64(constants2[0], CONST_2);
01478 vis_faligndata(TMP0, TMP2, REF_S0);
01479
01480 vis_ld64(constants256_512[0], CONST_256);
01481 vis_faligndata(TMP2, TMP4, REF_S4);
01482
01483 if (off != 0x7) {
01484 vis_alignaddr_g0((void *)off_plus_1);
01485 vis_faligndata(TMP0, TMP2, REF_S2);
01486 vis_faligndata(TMP2, TMP4, REF_S6);
01487 } else {
01488 vis_src1(TMP2, REF_S2);
01489 vis_src1(TMP4, REF_S6);
01490 }
01491
01492 height >>= 1;
01493 do {
01494 vis_ld64_2(ref, stride, TMP0);
01495 vis_mul8x16au(REF_S0, CONST_256, TMP12);
01496 vis_pmerge(ZERO, REF_S0_1, TMP14);
01497
01498 vis_alignaddr_g0((void *)off);
01499
01500 vis_ld64_2(ref, stride_8, TMP2);
01501 vis_mul8x16au(REF_S2, CONST_256, TMP16);
01502 vis_pmerge(ZERO, REF_S2_1, TMP18);
01503
01504 vis_ld64_2(ref, stride_16, TMP4);
01505 ref += stride;
01506 vis_mul8x16au(REF_S4, CONST_256, TMP20);
01507 vis_pmerge(ZERO, REF_S4_1, TMP22);
01508
01509 vis_ld64_2(ref, stride, TMP6);
01510 vis_mul8x16au(REF_S6, CONST_256, TMP24);
01511 vis_pmerge(ZERO, REF_S6_1, TMP26);
01512
01513 vis_ld64_2(ref, stride_8, TMP8);
01514 vis_faligndata(TMP0, TMP2, REF_0);
01515
01516 vis_ld64_2(ref, stride_16, TMP10);
01517 ref += stride;
01518 vis_faligndata(TMP2, TMP4, REF_4);
01519
01520 vis_faligndata(TMP6, TMP8, REF_S0);
01521
01522 vis_faligndata(TMP8, TMP10, REF_S4);
01523
01524 if (off != 0x7) {
01525 vis_alignaddr_g0((void *)off_plus_1);
01526 vis_faligndata(TMP0, TMP2, REF_2);
01527 vis_faligndata(TMP2, TMP4, REF_6);
01528 vis_faligndata(TMP6, TMP8, REF_S2);
01529 vis_faligndata(TMP8, TMP10, REF_S6);
01530 } else {
01531 vis_src1(TMP2, REF_2);
01532 vis_src1(TMP4, REF_6);
01533 vis_src1(TMP8, REF_S2);
01534 vis_src1(TMP10, REF_S6);
01535 }
01536
01537 vis_mul8x16au(REF_0, CONST_256, TMP0);
01538 vis_pmerge(ZERO, REF_0_1, TMP2);
01539
01540 vis_mul8x16au(REF_2, CONST_256, TMP4);
01541 vis_pmerge(ZERO, REF_2_1, TMP6);
01542
01543 vis_padd16(TMP0, CONST_2, TMP8);
01544 vis_mul8x16au(REF_4, CONST_256, TMP0);
01545
01546 vis_padd16(TMP2, CONST_2, TMP10);
01547 vis_mul8x16au(REF_4_1, CONST_256, TMP2);
01548
01549 vis_padd16(TMP8, TMP4, TMP8);
01550 vis_mul8x16au(REF_6, CONST_256, TMP4);
01551
01552 vis_padd16(TMP10, TMP6, TMP10);
01553 vis_mul8x16au(REF_6_1, CONST_256, TMP6);
01554
01555 vis_padd16(TMP12, TMP8, TMP12);
01556
01557 vis_padd16(TMP14, TMP10, TMP14);
01558
01559 vis_padd16(TMP12, TMP16, TMP12);
01560
01561 vis_padd16(TMP14, TMP18, TMP14);
01562 vis_pack16(TMP12, DST_0);
01563
01564 vis_pack16(TMP14, DST_1);
01565 vis_st64(DST_0, dest[0]);
01566 vis_padd16(TMP0, CONST_2, TMP12);
01567
01568 vis_mul8x16au(REF_S0, CONST_256, TMP0);
01569 vis_padd16(TMP2, CONST_2, TMP14);
01570
01571 vis_mul8x16au(REF_S0_1, CONST_256, TMP2);
01572 vis_padd16(TMP12, TMP4, TMP12);
01573
01574 vis_mul8x16au(REF_S2, CONST_256, TMP4);
01575 vis_padd16(TMP14, TMP6, TMP14);
01576
01577 vis_mul8x16au(REF_S2_1, CONST_256, TMP6);
01578 vis_padd16(TMP20, TMP12, TMP20);
01579
01580 vis_padd16(TMP22, TMP14, TMP22);
01581
01582 vis_padd16(TMP20, TMP24, TMP20);
01583
01584 vis_padd16(TMP22, TMP26, TMP22);
01585 vis_pack16(TMP20, DST_2);
01586
01587 vis_pack16(TMP22, DST_3);
01588 vis_st64_2(DST_2, dest, 8);
01589 dest += stride;
01590 vis_padd16(TMP0, TMP4, TMP24);
01591
01592 vis_mul8x16au(REF_S4, CONST_256, TMP0);
01593 vis_padd16(TMP2, TMP6, TMP26);
01594
01595 vis_mul8x16au(REF_S4_1, CONST_256, TMP2);
01596 vis_padd16(TMP24, TMP8, TMP24);
01597
01598 vis_padd16(TMP26, TMP10, TMP26);
01599 vis_pack16(TMP24, DST_0);
01600
01601 vis_pack16(TMP26, DST_1);
01602 vis_st64(DST_0, dest[0]);
01603 vis_pmerge(ZERO, REF_S6, TMP4);
01604
01605 vis_pmerge(ZERO, REF_S6_1, TMP6);
01606
01607 vis_padd16(TMP0, TMP4, TMP0);
01608
01609 vis_padd16(TMP2, TMP6, TMP2);
01610
01611 vis_padd16(TMP0, TMP12, TMP0);
01612
01613 vis_padd16(TMP2, TMP14, TMP2);
01614 vis_pack16(TMP0, DST_2);
01615
01616 vis_pack16(TMP2, DST_3);
01617 vis_st64_2(DST_2, dest, 8);
01618 dest += stride;
01619 } while (--height);
01620 }
01621
01622 static void MC_put_xy_8_vis (uint8_t * dest, const uint8_t * _ref,
01623 const int stride, int height)
01624 {
01625 uint8_t *ref = (uint8_t *) _ref;
01626 unsigned long off = (unsigned long) ref & 0x7;
01627 unsigned long off_plus_1 = off + 1;
01628 int stride_8 = stride + 8;
01629
01630 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
01631
01632 ref = vis_alignaddr(ref);
01633
01634 vis_ld64(ref[ 0], TMP0);
01635 vis_fzero(ZERO);
01636
01637 vis_ld64(ref[ 8], TMP2);
01638
01639 vis_ld64(constants2[0], CONST_2);
01640
01641 vis_ld64(constants256_512[0], CONST_256);
01642 vis_faligndata(TMP0, TMP2, REF_S0);
01643
01644 if (off != 0x7) {
01645 vis_alignaddr_g0((void *)off_plus_1);
01646 vis_faligndata(TMP0, TMP2, REF_S2);
01647 } else {
01648 vis_src1(TMP2, REF_S2);
01649 }
01650
01651 height >>= 1;
01652 do {
01653 vis_ld64_2(ref, stride, TMP0);
01654 vis_mul8x16au(REF_S0, CONST_256, TMP8);
01655 vis_pmerge(ZERO, REF_S2, TMP12);
01656
01657 vis_alignaddr_g0((void *)off);
01658
01659 vis_ld64_2(ref, stride_8, TMP2);
01660 ref += stride;
01661 vis_mul8x16au(REF_S0_1, CONST_256, TMP10);
01662 vis_pmerge(ZERO, REF_S2_1, TMP14);
01663
01664 vis_ld64_2(ref, stride, TMP4);
01665
01666 vis_ld64_2(ref, stride_8, TMP6);
01667 ref += stride;
01668 vis_faligndata(TMP0, TMP2, REF_S4);
01669
01670 vis_pmerge(ZERO, REF_S4, TMP18);
01671
01672 vis_pmerge(ZERO, REF_S4_1, TMP20);
01673
01674 vis_faligndata(TMP4, TMP6, REF_S0);
01675
01676 if (off != 0x7) {
01677 vis_alignaddr_g0((void *)off_plus_1);
01678 vis_faligndata(TMP0, TMP2, REF_S6);
01679 vis_faligndata(TMP4, TMP6, REF_S2);
01680 } else {
01681 vis_src1(TMP2, REF_S6);
01682 vis_src1(TMP6, REF_S2);
01683 }
01684
01685 vis_padd16(TMP18, CONST_2, TMP18);
01686 vis_mul8x16au(REF_S6, CONST_256, TMP22);
01687
01688 vis_padd16(TMP20, CONST_2, TMP20);
01689 vis_mul8x16au(REF_S6_1, CONST_256, TMP24);
01690
01691 vis_mul8x16au(REF_S0, CONST_256, TMP26);
01692 vis_pmerge(ZERO, REF_S0_1, TMP28);
01693
01694 vis_mul8x16au(REF_S2, CONST_256, TMP30);
01695 vis_padd16(TMP18, TMP22, TMP18);
01696
01697 vis_mul8x16au(REF_S2_1, CONST_256, TMP32);
01698 vis_padd16(TMP20, TMP24, TMP20);
01699
01700 vis_padd16(TMP8, TMP18, TMP8);
01701
01702 vis_padd16(TMP10, TMP20, TMP10);
01703
01704 vis_padd16(TMP8, TMP12, TMP8);
01705
01706 vis_padd16(TMP10, TMP14, TMP10);
01707 vis_pack16(TMP8, DST_0);
01708
01709 vis_pack16(TMP10, DST_1);
01710 vis_st64(DST_0, dest[0]);
01711 dest += stride;
01712 vis_padd16(TMP18, TMP26, TMP18);
01713
01714 vis_padd16(TMP20, TMP28, TMP20);
01715
01716 vis_padd16(TMP18, TMP30, TMP18);
01717
01718 vis_padd16(TMP20, TMP32, TMP20);
01719 vis_pack16(TMP18, DST_2);
01720
01721 vis_pack16(TMP20, DST_3);
01722 vis_st64(DST_2, dest[0]);
01723 dest += stride;
01724 } while (--height);
01725 }
01726
01727 static void MC_avg_xy_16_vis (uint8_t * dest, const uint8_t * _ref,
01728 const int stride, int height)
01729 {
01730 uint8_t *ref = (uint8_t *) _ref;
01731 unsigned long off = (unsigned long) ref & 0x7;
01732 unsigned long off_plus_1 = off + 1;
01733 int stride_8 = stride + 8;
01734 int stride_16 = stride + 16;
01735
01736 vis_set_gsr(4 << VIS_GSR_SCALEFACT_SHIFT);
01737
01738 ref = vis_alignaddr(ref);
01739
01740 vis_ld64(ref[ 0], TMP0);
01741 vis_fzero(ZERO);
01742
01743 vis_ld64(ref[ 8], TMP2);
01744
01745 vis_ld64(ref[16], TMP4);
01746
01747 vis_ld64(constants6[0], CONST_6);
01748 vis_faligndata(TMP0, TMP2, REF_S0);
01749
01750 vis_ld64(constants256_1024[0], CONST_256);
01751 vis_faligndata(TMP2, TMP4, REF_S4);
01752
01753 if (off != 0x7) {
01754 vis_alignaddr_g0((void *)off_plus_1);
01755 vis_faligndata(TMP0, TMP2, REF_S2);
01756 vis_faligndata(TMP2, TMP4, REF_S6);
01757 } else {
01758 vis_src1(TMP2, REF_S2);
01759 vis_src1(TMP4, REF_S6);
01760 }
01761
01762 height >>= 1;
01763 do {
01764 vis_ld64_2(ref, stride, TMP0);
01765 vis_mul8x16au(REF_S0, CONST_256, TMP12);
01766 vis_pmerge(ZERO, REF_S0_1, TMP14);
01767
01768 vis_alignaddr_g0((void *)off);
01769
01770 vis_ld64_2(ref, stride_8, TMP2);
01771 vis_mul8x16au(REF_S2, CONST_256, TMP16);
01772 vis_pmerge(ZERO, REF_S2_1, TMP18);
01773
01774 vis_ld64_2(ref, stride_16, TMP4);
01775 ref += stride;
01776 vis_mul8x16au(REF_S4, CONST_256, TMP20);
01777 vis_pmerge(ZERO, REF_S4_1, TMP22);
01778
01779 vis_ld64_2(ref, stride, TMP6);
01780 vis_mul8x16au(REF_S6, CONST_256, TMP24);
01781 vis_pmerge(ZERO, REF_S6_1, TMP26);
01782
01783 vis_ld64_2(ref, stride_8, TMP8);
01784 vis_faligndata(TMP0, TMP2, REF_0);
01785
01786 vis_ld64_2(ref, stride_16, TMP10);
01787 ref += stride;
01788 vis_faligndata(TMP2, TMP4, REF_4);
01789
01790 vis_ld64(dest[0], DST_0);
01791 vis_faligndata(TMP6, TMP8, REF_S0);
01792
01793 vis_ld64_2(dest, 8, DST_2);
01794 vis_faligndata(TMP8, TMP10, REF_S4);
01795
01796 if (off != 0x7) {
01797 vis_alignaddr_g0((void *)off_plus_1);
01798 vis_faligndata(TMP0, TMP2, REF_2);
01799 vis_faligndata(TMP2, TMP4, REF_6);
01800 vis_faligndata(TMP6, TMP8, REF_S2);
01801 vis_faligndata(TMP8, TMP10, REF_S6);
01802 } else {
01803 vis_src1(TMP2, REF_2);
01804 vis_src1(TMP4, REF_6);
01805 vis_src1(TMP8, REF_S2);
01806 vis_src1(TMP10, REF_S6);
01807 }
01808
01809 vis_mul8x16al(DST_0, CONST_1024, TMP30);
01810 vis_pmerge(ZERO, REF_0, TMP0);
01811
01812 vis_mul8x16al(DST_1, CONST_1024, TMP32);
01813 vis_pmerge(ZERO, REF_0_1, TMP2);
01814
01815 vis_mul8x16au(REF_2, CONST_256, TMP4);
01816 vis_pmerge(ZERO, REF_2_1, TMP6);
01817
01818 vis_mul8x16al(DST_2, CONST_1024, REF_0);
01819 vis_padd16(TMP0, CONST_6, TMP0);
01820
01821 vis_mul8x16al(DST_3, CONST_1024, REF_2);
01822 vis_padd16(TMP2, CONST_6, TMP2);
01823
01824 vis_padd16(TMP0, TMP4, TMP0);
01825 vis_mul8x16au(REF_4, CONST_256, TMP4);
01826
01827 vis_padd16(TMP2, TMP6, TMP2);
01828 vis_mul8x16au(REF_4_1, CONST_256, TMP6);
01829
01830 vis_padd16(TMP12, TMP0, TMP12);
01831 vis_mul8x16au(REF_6, CONST_256, TMP8);
01832
01833 vis_padd16(TMP14, TMP2, TMP14);
01834 vis_mul8x16au(REF_6_1, CONST_256, TMP10);
01835
01836 vis_padd16(TMP12, TMP16, TMP12);
01837 vis_mul8x16au(REF_S0, CONST_256, REF_4);
01838
01839 vis_padd16(TMP14, TMP18, TMP14);
01840 vis_mul8x16au(REF_S0_1, CONST_256, REF_6);
01841
01842 vis_padd16(TMP12, TMP30, TMP12);
01843
01844 vis_padd16(TMP14, TMP32, TMP14);
01845 vis_pack16(TMP12, DST_0);
01846
01847 vis_pack16(TMP14, DST_1);
01848 vis_st64(DST_0, dest[0]);
01849 vis_padd16(TMP4, CONST_6, TMP4);
01850
01851 vis_ld64_2(dest, stride, DST_0);
01852 vis_padd16(TMP6, CONST_6, TMP6);
01853 vis_mul8x16au(REF_S2, CONST_256, TMP12);
01854
01855 vis_padd16(TMP4, TMP8, TMP4);
01856 vis_mul8x16au(REF_S2_1, CONST_256, TMP14);
01857
01858 vis_padd16(TMP6, TMP10, TMP6);
01859
01860 vis_padd16(TMP20, TMP4, TMP20);
01861
01862 vis_padd16(TMP22, TMP6, TMP22);
01863
01864 vis_padd16(TMP20, TMP24, TMP20);
01865
01866 vis_padd16(TMP22, TMP26, TMP22);
01867
01868 vis_padd16(TMP20, REF_0, TMP20);
01869 vis_mul8x16au(REF_S4, CONST_256, REF_0);
01870
01871 vis_padd16(TMP22, REF_2, TMP22);
01872 vis_pack16(TMP20, DST_2);
01873
01874 vis_pack16(TMP22, DST_3);
01875 vis_st64_2(DST_2, dest, 8);
01876 dest += stride;
01877
01878 vis_ld64_2(dest, 8, DST_2);
01879 vis_mul8x16al(DST_0, CONST_1024, TMP30);
01880 vis_pmerge(ZERO, REF_S4_1, REF_2);
01881
01882 vis_mul8x16al(DST_1, CONST_1024, TMP32);
01883 vis_padd16(REF_4, TMP0, TMP8);
01884
01885 vis_mul8x16au(REF_S6, CONST_256, REF_4);
01886 vis_padd16(REF_6, TMP2, TMP10);
01887
01888 vis_mul8x16au(REF_S6_1, CONST_256, REF_6);
01889 vis_padd16(TMP8, TMP12, TMP8);
01890
01891 vis_padd16(TMP10, TMP14, TMP10);
01892
01893 vis_padd16(TMP8, TMP30, TMP8);
01894
01895 vis_padd16(TMP10, TMP32, TMP10);
01896 vis_pack16(TMP8, DST_0);
01897
01898 vis_pack16(TMP10, DST_1);
01899 vis_st64(DST_0, dest[0]);
01900
01901 vis_padd16(REF_0, TMP4, REF_0);
01902
01903 vis_mul8x16al(DST_2, CONST_1024, TMP30);
01904 vis_padd16(REF_2, TMP6, REF_2);
01905
01906 vis_mul8x16al(DST_3, CONST_1024, TMP32);
01907 vis_padd16(REF_0, REF_4, REF_0);
01908
01909 vis_padd16(REF_2, REF_6, REF_2);
01910
01911 vis_padd16(REF_0, TMP30, REF_0);
01912
01913
01914
01915 vis_padd16(REF_2, TMP32, REF_2);
01916 vis_pack16(REF_0, DST_2);
01917
01918 vis_pack16(REF_2, DST_3);
01919 vis_st64_2(DST_2, dest, 8);
01920 dest += stride;
01921 } while (--height);
01922 }
01923
01924 static void MC_avg_xy_8_vis (uint8_t * dest, const uint8_t * _ref,
01925 const int stride, int height)
01926 {
01927 uint8_t *ref = (uint8_t *) _ref;
01928 unsigned long off = (unsigned long) ref & 0x7;
01929 unsigned long off_plus_1 = off + 1;
01930 int stride_8 = stride + 8;
01931
01932 vis_set_gsr(4 << VIS_GSR_SCALEFACT_SHIFT);
01933
01934 ref = vis_alignaddr(ref);
01935
01936 vis_ld64(ref[0], TMP0);
01937 vis_fzero(ZERO);
01938
01939 vis_ld64_2(ref, 8, TMP2);
01940
01941 vis_ld64(constants6[0], CONST_6);
01942
01943 vis_ld64(constants256_1024[0], CONST_256);
01944 vis_faligndata(TMP0, TMP2, REF_S0);
01945
01946 if (off != 0x7) {
01947 vis_alignaddr_g0((void *)off_plus_1);
01948 vis_faligndata(TMP0, TMP2, REF_S2);
01949 } else {
01950 vis_src1(TMP2, REF_S2);
01951 }
01952
01953 height >>= 1;
01954 do {
01955 vis_ld64_2(ref, stride, TMP0);
01956 vis_mul8x16au(REF_S0, CONST_256, TMP8);
01957 vis_pmerge(ZERO, REF_S0_1, TMP10);
01958
01959 vis_ld64_2(ref, stride_8, TMP2);
01960 ref += stride;
01961 vis_mul8x16au(REF_S2, CONST_256, TMP12);
01962 vis_pmerge(ZERO, REF_S2_1, TMP14);
01963
01964 vis_alignaddr_g0((void *)off);
01965
01966 vis_ld64_2(ref, stride, TMP4);
01967 vis_faligndata(TMP0, TMP2, REF_S4);
01968
01969 vis_ld64_2(ref, stride_8, TMP6);
01970 ref += stride;
01971
01972 vis_ld64(dest[0], DST_0);
01973 vis_faligndata(TMP4, TMP6, REF_S0);
01974
01975 vis_ld64_2(dest, stride, DST_2);
01976
01977 if (off != 0x7) {
01978 vis_alignaddr_g0((void *)off_plus_1);
01979 vis_faligndata(TMP0, TMP2, REF_S6);
01980 vis_faligndata(TMP4, TMP6, REF_S2);
01981 } else {
01982 vis_src1(TMP2, REF_S6);
01983 vis_src1(TMP6, REF_S2);
01984 }
01985
01986 vis_mul8x16al(DST_0, CONST_1024, TMP30);
01987 vis_pmerge(ZERO, REF_S4, TMP22);
01988
01989 vis_mul8x16al(DST_1, CONST_1024, TMP32);
01990 vis_pmerge(ZERO, REF_S4_1, TMP24);
01991
01992 vis_mul8x16au(REF_S6, CONST_256, TMP26);
01993 vis_pmerge(ZERO, REF_S6_1, TMP28);
01994
01995 vis_mul8x16au(REF_S0, CONST_256, REF_S4);
01996 vis_padd16(TMP22, CONST_6, TMP22);
01997
01998 vis_mul8x16au(REF_S0_1, CONST_256, REF_S6);
01999 vis_padd16(TMP24, CONST_6, TMP24);
02000
02001 vis_mul8x16al(DST_2, CONST_1024, REF_0);
02002 vis_padd16(TMP22, TMP26, TMP22);
02003
02004 vis_mul8x16al(DST_3, CONST_1024, REF_2);
02005 vis_padd16(TMP24, TMP28, TMP24);
02006
02007 vis_mul8x16au(REF_S2, CONST_256, TMP26);
02008 vis_padd16(TMP8, TMP22, TMP8);
02009
02010 vis_mul8x16au(REF_S2_1, CONST_256, TMP28);
02011 vis_padd16(TMP10, TMP24, TMP10);
02012
02013 vis_padd16(TMP8, TMP12, TMP8);
02014
02015 vis_padd16(TMP10, TMP14, TMP10);
02016
02017 vis_padd16(TMP8, TMP30, TMP8);
02018
02019 vis_padd16(TMP10, TMP32, TMP10);
02020 vis_pack16(TMP8, DST_0);
02021
02022 vis_pack16(TMP10, DST_1);
02023 vis_st64(DST_0, dest[0]);
02024 dest += stride;
02025
02026 vis_padd16(REF_S4, TMP22, TMP12);
02027
02028 vis_padd16(REF_S6, TMP24, TMP14);
02029
02030 vis_padd16(TMP12, TMP26, TMP12);
02031
02032 vis_padd16(TMP14, TMP28, TMP14);
02033
02034 vis_padd16(TMP12, REF_0, TMP12);
02035
02036 vis_padd16(TMP14, REF_2, TMP14);
02037 vis_pack16(TMP12, DST_2);
02038
02039 vis_pack16(TMP14, DST_3);
02040 vis_st64(DST_2, dest[0]);
02041 dest += stride;
02042 } while (--height);
02043 }
02044
02045
02046
02047
02048
02049
02050
02051
02052
02053
02054
02055
02056
02057
02058
02059
02060
02061
02062
02063
02064
02065
02066
02067
02068 static void MC_put_no_round_o_16_vis (uint8_t * dest, const uint8_t * _ref,
02069 const int stride, int height)
02070 {
02071 uint8_t *ref = (uint8_t *) _ref;
02072
02073 ref = vis_alignaddr(ref);
02074 do {
02075 vis_ld64(ref[0], TMP0);
02076
02077 vis_ld64_2(ref, 8, TMP2);
02078
02079 vis_ld64_2(ref, 16, TMP4);
02080 ref += stride;
02081
02082 vis_faligndata(TMP0, TMP2, REF_0);
02083 vis_st64(REF_0, dest[0]);
02084
02085 vis_faligndata(TMP2, TMP4, REF_2);
02086 vis_st64_2(REF_2, dest, 8);
02087 dest += stride;
02088 } while (--height);
02089 }
02090
02091 static void MC_put_no_round_o_8_vis (uint8_t * dest, const uint8_t * _ref,
02092 const int stride, int height)
02093 {
02094 uint8_t *ref = (uint8_t *) _ref;
02095
02096 ref = vis_alignaddr(ref);
02097 do {
02098 vis_ld64(ref[0], TMP0);
02099
02100 vis_ld64(ref[8], TMP2);
02101 ref += stride;
02102
02103
02104
02105 vis_faligndata(TMP0, TMP2, REF_0);
02106 vis_st64(REF_0, dest[0]);
02107 dest += stride;
02108 } while (--height);
02109 }
02110
02111
02112 static void MC_avg_no_round_o_16_vis (uint8_t * dest, const uint8_t * _ref,
02113 const int stride, int height)
02114 {
02115 uint8_t *ref = (uint8_t *) _ref;
02116 int stride_8 = stride + 8;
02117
02118 ref = vis_alignaddr(ref);
02119
02120 vis_ld64(ref[0], TMP0);
02121
02122 vis_ld64(ref[8], TMP2);
02123
02124 vis_ld64(ref[16], TMP4);
02125
02126 vis_ld64(dest[0], DST_0);
02127
02128 vis_ld64(dest[8], DST_2);
02129
02130 vis_ld64(constants_fe[0], MASK_fe);
02131 vis_faligndata(TMP0, TMP2, REF_0);
02132
02133 vis_ld64(constants_7f[0], MASK_7f);
02134 vis_faligndata(TMP2, TMP4, REF_2);
02135
02136 vis_ld64(constants128[0], CONST_128);
02137
02138 ref += stride;
02139 height = (height >> 1) - 1;
02140
02141 do {
02142 vis_ld64(ref[0], TMP0);
02143 vis_xor(DST_0, REF_0, TMP6);
02144
02145 vis_ld64_2(ref, 8, TMP2);
02146 vis_and(TMP6, MASK_fe, TMP6);
02147
02148 vis_ld64_2(ref, 16, TMP4);
02149 ref += stride;
02150 vis_mul8x16(CONST_128, TMP6, TMP6);
02151 vis_xor(DST_2, REF_2, TMP8);
02152
02153 vis_and(TMP8, MASK_fe, TMP8);
02154
02155 vis_and(DST_0, REF_0, TMP10);
02156 vis_ld64_2(dest, stride, DST_0);
02157 vis_mul8x16(CONST_128, TMP8, TMP8);
02158
02159 vis_and(DST_2, REF_2, TMP12);
02160 vis_ld64_2(dest, stride_8, DST_2);
02161
02162 vis_ld64(ref[0], TMP14);
02163 vis_and(TMP6, MASK_7f, TMP6);
02164
02165 vis_and(TMP8, MASK_7f, TMP8);
02166
02167 vis_padd16(TMP10, TMP6, TMP6);
02168 vis_st64(TMP6, dest[0]);
02169
02170 vis_padd16(TMP12, TMP8, TMP8);
02171 vis_st64_2(TMP8, dest, 8);
02172
02173 dest += stride;
02174 vis_ld64_2(ref, 8, TMP16);
02175 vis_faligndata(TMP0, TMP2, REF_0);
02176
02177 vis_ld64_2(ref, 16, TMP18);
02178 vis_faligndata(TMP2, TMP4, REF_2);
02179 ref += stride;
02180
02181 vis_xor(DST_0, REF_0, TMP20);
02182
02183 vis_and(TMP20, MASK_fe, TMP20);
02184
02185 vis_xor(DST_2, REF_2, TMP22);
02186 vis_mul8x16(CONST_128, TMP20, TMP20);
02187
02188 vis_and(TMP22, MASK_fe, TMP22);
02189
02190 vis_and(DST_0, REF_0, TMP24);
02191 vis_mul8x16(CONST_128, TMP22, TMP22);
02192
02193 vis_and(DST_2, REF_2, TMP26);
02194
02195 vis_ld64_2(dest, stride, DST_0);
02196 vis_faligndata(TMP14, TMP16, REF_0);
02197
02198 vis_ld64_2(dest, stride_8, DST_2);
02199 vis_faligndata(TMP16, TMP18, REF_2);
02200
02201 vis_and(TMP20, MASK_7f, TMP20);
02202
02203 vis_and(TMP22, MASK_7f, TMP22);
02204
02205 vis_padd16(TMP24, TMP20, TMP20);
02206 vis_st64(TMP20, dest[0]);
02207
02208 vis_padd16(TMP26, TMP22, TMP22);
02209 vis_st64_2(TMP22, dest, 8);
02210 dest += stride;
02211 } while (--height);
02212
02213 vis_ld64(ref[0], TMP0);
02214 vis_xor(DST_0, REF_0, TMP6);
02215
02216 vis_ld64_2(ref, 8, TMP2);
02217 vis_and(TMP6, MASK_fe, TMP6);
02218
02219 vis_ld64_2(ref, 16, TMP4);
02220 vis_mul8x16(CONST_128, TMP6, TMP6);
02221 vis_xor(DST_2, REF_2, TMP8);
02222
02223 vis_and(TMP8, MASK_fe, TMP8);
02224
02225 vis_and(DST_0, REF_0, TMP10);
02226 vis_ld64_2(dest, stride, DST_0);
02227 vis_mul8x16(CONST_128, TMP8, TMP8);
02228
02229 vis_and(DST_2, REF_2, TMP12);
02230 vis_ld64_2(dest, stride_8, DST_2);
02231
02232 vis_ld64(ref[0], TMP14);
02233 vis_and(TMP6, MASK_7f, TMP6);
02234
02235 vis_and(TMP8, MASK_7f, TMP8);
02236
02237 vis_padd16(TMP10, TMP6, TMP6);
02238 vis_st64(TMP6, dest[0]);
02239
02240 vis_padd16(TMP12, TMP8, TMP8);
02241 vis_st64_2(TMP8, dest, 8);
02242
02243 dest += stride;
02244 vis_faligndata(TMP0, TMP2, REF_0);
02245
02246 vis_faligndata(TMP2, TMP4, REF_2);
02247
02248 vis_xor(DST_0, REF_0, TMP20);
02249
02250 vis_and(TMP20, MASK_fe, TMP20);
02251
02252 vis_xor(DST_2, REF_2, TMP22);
02253 vis_mul8x16(CONST_128, TMP20, TMP20);
02254
02255 vis_and(TMP22, MASK_fe, TMP22);
02256
02257 vis_and(DST_0, REF_0, TMP24);
02258 vis_mul8x16(CONST_128, TMP22, TMP22);
02259
02260 vis_and(DST_2, REF_2, TMP26);
02261
02262 vis_and(TMP20, MASK_7f, TMP20);
02263
02264 vis_and(TMP22, MASK_7f, TMP22);
02265
02266 vis_padd16(TMP24, TMP20, TMP20);
02267 vis_st64(TMP20, dest[0]);
02268
02269 vis_padd16(TMP26, TMP22, TMP22);
02270 vis_st64_2(TMP22, dest, 8);
02271 }
02272
02273 static void MC_avg_no_round_o_8_vis (uint8_t * dest, const uint8_t * _ref,
02274 const int stride, int height)
02275 {
02276 uint8_t *ref = (uint8_t *) _ref;
02277
02278 ref = vis_alignaddr(ref);
02279
02280 vis_ld64(ref[0], TMP0);
02281
02282 vis_ld64(ref[8], TMP2);
02283
02284 vis_ld64(dest[0], DST_0);
02285
02286 vis_ld64(constants_fe[0], MASK_fe);
02287
02288 vis_ld64(constants_7f[0], MASK_7f);
02289 vis_faligndata(TMP0, TMP2, REF_0);
02290
02291 vis_ld64(constants128[0], CONST_128);
02292
02293 ref += stride;
02294 height = (height >> 1) - 1;
02295
02296 do {
02297 vis_ld64(ref[0], TMP0);
02298 vis_xor(DST_0, REF_0, TMP4);
02299
02300 vis_ld64(ref[8], TMP2);
02301 vis_and(TMP4, MASK_fe, TMP4);
02302
02303 vis_and(DST_0, REF_0, TMP6);
02304 vis_ld64_2(dest, stride, DST_0);
02305 ref += stride;
02306 vis_mul8x16(CONST_128, TMP4, TMP4);
02307
02308 vis_ld64(ref[0], TMP12);
02309 vis_faligndata(TMP0, TMP2, REF_0);
02310
02311 vis_ld64(ref[8], TMP2);
02312 vis_xor(DST_0, REF_0, TMP0);
02313 ref += stride;
02314
02315 vis_and(TMP0, MASK_fe, TMP0);
02316
02317 vis_and(TMP4, MASK_7f, TMP4);
02318
02319 vis_padd16(TMP6, TMP4, TMP4);
02320 vis_st64(TMP4, dest[0]);
02321 dest += stride;
02322 vis_mul8x16(CONST_128, TMP0, TMP0);
02323
02324 vis_and(DST_0, REF_0, TMP6);
02325 vis_ld64_2(dest, stride, DST_0);
02326
02327 vis_faligndata(TMP12, TMP2, REF_0);
02328
02329 vis_and(TMP0, MASK_7f, TMP0);
02330
02331 vis_padd16(TMP6, TMP0, TMP4);
02332 vis_st64(TMP4, dest[0]);
02333 dest += stride;
02334 } while (--height);
02335
02336 vis_ld64(ref[0], TMP0);
02337 vis_xor(DST_0, REF_0, TMP4);
02338
02339 vis_ld64(ref[8], TMP2);
02340 vis_and(TMP4, MASK_fe, TMP4);
02341
02342 vis_and(DST_0, REF_0, TMP6);
02343 vis_ld64_2(dest, stride, DST_0);
02344 vis_mul8x16(CONST_128, TMP4, TMP4);
02345
02346 vis_faligndata(TMP0, TMP2, REF_0);
02347
02348 vis_xor(DST_0, REF_0, TMP0);
02349
02350 vis_and(TMP0, MASK_fe, TMP0);
02351
02352 vis_and(TMP4, MASK_7f, TMP4);
02353
02354 vis_padd16(TMP6, TMP4, TMP4);
02355 vis_st64(TMP4, dest[0]);
02356 dest += stride;
02357 vis_mul8x16(CONST_128, TMP0, TMP0);
02358
02359 vis_and(DST_0, REF_0, TMP6);
02360
02361 vis_and(TMP0, MASK_7f, TMP0);
02362
02363 vis_padd16(TMP6, TMP0, TMP4);
02364 vis_st64(TMP4, dest[0]);
02365 }
02366
02367 static void MC_put_no_round_x_16_vis (uint8_t * dest, const uint8_t * _ref,
02368 const int stride, int height)
02369 {
02370 uint8_t *ref = (uint8_t *) _ref;
02371 unsigned long off = (unsigned long) ref & 0x7;
02372 unsigned long off_plus_1 = off + 1;
02373
02374 ref = vis_alignaddr(ref);
02375
02376 vis_ld64(ref[0], TMP0);
02377
02378 vis_ld64_2(ref, 8, TMP2);
02379
02380 vis_ld64_2(ref, 16, TMP4);
02381
02382 vis_ld64(constants_fe[0], MASK_fe);
02383
02384 vis_ld64(constants_7f[0], MASK_7f);
02385 vis_faligndata(TMP0, TMP2, REF_0);
02386
02387 vis_ld64(constants128[0], CONST_128);
02388 vis_faligndata(TMP2, TMP4, REF_4);
02389
02390 if (off != 0x7) {
02391 vis_alignaddr_g0((void *)off_plus_1);
02392 vis_faligndata(TMP0, TMP2, REF_2);
02393 vis_faligndata(TMP2, TMP4, REF_6);
02394 } else {
02395 vis_src1(TMP2, REF_2);
02396 vis_src1(TMP4, REF_6);
02397 }
02398
02399 ref += stride;
02400 height = (height >> 1) - 1;
02401
02402 do {
02403 vis_ld64(ref[0], TMP0);
02404 vis_xor(REF_0, REF_2, TMP6);
02405
02406 vis_ld64_2(ref, 8, TMP2);
02407 vis_xor(REF_4, REF_6, TMP8);
02408
02409 vis_ld64_2(ref, 16, TMP4);
02410 vis_and(TMP6, MASK_fe, TMP6);
02411 ref += stride;
02412
02413 vis_ld64(ref[0], TMP14);
02414 vis_mul8x16(CONST_128, TMP6, TMP6);
02415 vis_and(TMP8, MASK_fe, TMP8);
02416
02417 vis_ld64_2(ref, 8, TMP16);
02418 vis_mul8x16(CONST_128, TMP8, TMP8);
02419 vis_and(REF_0, REF_2, TMP10);
02420
02421 vis_ld64_2(ref, 16, TMP18);
02422 ref += stride;
02423 vis_and(REF_4, REF_6, TMP12);
02424
02425 vis_alignaddr_g0((void *)off);
02426
02427 vis_faligndata(TMP0, TMP2, REF_0);
02428
02429 vis_faligndata(TMP2, TMP4, REF_4);
02430
02431 if (off != 0x7) {
02432 vis_alignaddr_g0((void *)off_plus_1);
02433 vis_faligndata(TMP0, TMP2, REF_2);
02434 vis_faligndata(TMP2, TMP4, REF_6);
02435 } else {
02436 vis_src1(TMP2, REF_2);
02437 vis_src1(TMP4, REF_6);
02438 }
02439
02440 vis_and(TMP6, MASK_7f, TMP6);
02441
02442 vis_and(TMP8, MASK_7f, TMP8);
02443
02444 vis_padd16(TMP10, TMP6, TMP6);
02445 vis_st64(TMP6, dest[0]);
02446
02447 vis_padd16(TMP12, TMP8, TMP8);
02448 vis_st64_2(TMP8, dest, 8);
02449 dest += stride;
02450
02451 vis_xor(REF_0, REF_2, TMP6);
02452
02453 vis_xor(REF_4, REF_6, TMP8);
02454
02455 vis_and(TMP6, MASK_fe, TMP6);
02456
02457 vis_mul8x16(CONST_128, TMP6, TMP6);
02458 vis_and(TMP8, MASK_fe, TMP8);
02459
02460 vis_mul8x16(CONST_128, TMP8, TMP8);
02461 vis_and(REF_0, REF_2, TMP10);
02462
02463 vis_and(REF_4, REF_6, TMP12);
02464
02465 vis_alignaddr_g0((void *)off);
02466
02467 vis_faligndata(TMP14, TMP16, REF_0);
02468
02469 vis_faligndata(TMP16, TMP18, REF_4);
02470
02471 if (off != 0x7) {
02472 vis_alignaddr_g0((void *)off_plus_1);
02473 vis_faligndata(TMP14, TMP16, REF_2);
02474 vis_faligndata(TMP16, TMP18, REF_6);
02475 } else {
02476 vis_src1(TMP16, REF_2);
02477 vis_src1(TMP18, REF_6);
02478 }
02479
02480 vis_and(TMP6, MASK_7f, TMP6);
02481
02482 vis_and(TMP8, MASK_7f, TMP8);
02483
02484 vis_padd16(TMP10, TMP6, TMP6);
02485 vis_st64(TMP6, dest[0]);
02486
02487 vis_padd16(TMP12, TMP8, TMP8);
02488 vis_st64_2(TMP8, dest, 8);
02489 dest += stride;
02490 } while (--height);
02491
02492 vis_ld64(ref[0], TMP0);
02493 vis_xor(REF_0, REF_2, TMP6);
02494
02495 vis_ld64_2(ref, 8, TMP2);
02496 vis_xor(REF_4, REF_6, TMP8);
02497
02498 vis_ld64_2(ref, 16, TMP4);
02499 vis_and(TMP6, MASK_fe, TMP6);
02500
02501 vis_mul8x16(CONST_128, TMP6, TMP6);
02502 vis_and(TMP8, MASK_fe, TMP8);
02503
02504 vis_mul8x16(CONST_128, TMP8, TMP8);
02505 vis_and(REF_0, REF_2, TMP10);
02506
02507 vis_and(REF_4, REF_6, TMP12);
02508
02509 vis_alignaddr_g0((void *)off);
02510
02511 vis_faligndata(TMP0, TMP2, REF_0);
02512
02513 vis_faligndata(TMP2, TMP4, REF_4);
02514
02515 if (off != 0x7) {
02516 vis_alignaddr_g0((void *)off_plus_1);
02517 vis_faligndata(TMP0, TMP2, REF_2);
02518 vis_faligndata(TMP2, TMP4, REF_6);
02519 } else {
02520 vis_src1(TMP2, REF_2);
02521 vis_src1(TMP4, REF_6);
02522 }
02523
02524 vis_and(TMP6, MASK_7f, TMP6);
02525
02526 vis_and(TMP8, MASK_7f, TMP8);
02527
02528 vis_padd16(TMP10, TMP6, TMP6);
02529 vis_st64(TMP6, dest[0]);
02530
02531 vis_padd16(TMP12, TMP8, TMP8);
02532 vis_st64_2(TMP8, dest, 8);
02533 dest += stride;
02534
02535 vis_xor(REF_0, REF_2, TMP6);
02536
02537 vis_xor(REF_4, REF_6, TMP8);
02538
02539 vis_and(TMP6, MASK_fe, TMP6);
02540
02541 vis_mul8x16(CONST_128, TMP6, TMP6);
02542 vis_and(TMP8, MASK_fe, TMP8);
02543
02544 vis_mul8x16(CONST_128, TMP8, TMP8);
02545 vis_and(REF_0, REF_2, TMP10);
02546
02547 vis_and(REF_4, REF_6, TMP12);
02548
02549 vis_and(TMP6, MASK_7f, TMP6);
02550
02551 vis_and(TMP8, MASK_7f, TMP8);
02552
02553 vis_padd16(TMP10, TMP6, TMP6);
02554 vis_st64(TMP6, dest[0]);
02555
02556 vis_padd16(TMP12, TMP8, TMP8);
02557 vis_st64_2(TMP8, dest, 8);
02558 }
02559
02560 static void MC_put_no_round_x_8_vis (uint8_t * dest, const uint8_t * _ref,
02561 const int stride, int height)
02562 {
02563 uint8_t *ref = (uint8_t *) _ref;
02564 unsigned long off = (unsigned long) ref & 0x7;
02565 unsigned long off_plus_1 = off + 1;
02566
02567 ref = vis_alignaddr(ref);
02568
02569 vis_ld64(ref[0], TMP0);
02570
02571 vis_ld64(ref[8], TMP2);
02572
02573 vis_ld64(constants_fe[0], MASK_fe);
02574
02575 vis_ld64(constants_7f[0], MASK_7f);
02576
02577 vis_ld64(constants128[0], CONST_128);
02578 vis_faligndata(TMP0, TMP2, REF_0);
02579
02580 if (off != 0x7) {
02581 vis_alignaddr_g0((void *)off_plus_1);
02582 vis_faligndata(TMP0, TMP2, REF_2);
02583 } else {
02584 vis_src1(TMP2, REF_2);
02585 }
02586
02587 ref += stride;
02588 height = (height >> 1) - 1;
02589
02590 do {
02591 vis_ld64(ref[0], TMP0);
02592 vis_xor(REF_0, REF_2, TMP4);
02593
02594 vis_ld64_2(ref, 8, TMP2);
02595 vis_and(TMP4, MASK_fe, TMP4);
02596 ref += stride;
02597
02598 vis_ld64(ref[0], TMP8);
02599 vis_and(REF_0, REF_2, TMP6);
02600 vis_mul8x16(CONST_128, TMP4, TMP4);
02601
02602 vis_alignaddr_g0((void *)off);
02603
02604 vis_ld64_2(ref, 8, TMP10);
02605 ref += stride;
02606 vis_faligndata(TMP0, TMP2, REF_0);
02607
02608 if (off != 0x7) {
02609 vis_alignaddr_g0((void *)off_plus_1);
02610 vis_faligndata(TMP0, TMP2, REF_2);
02611 } else {
02612 vis_src1(TMP2, REF_2);
02613 }
02614
02615 vis_and(TMP4, MASK_7f, TMP4);
02616
02617 vis_padd16(TMP6, TMP4, DST_0);
02618 vis_st64(DST_0, dest[0]);
02619 dest += stride;
02620
02621 vis_xor(REF_0, REF_2, TMP12);
02622
02623 vis_and(TMP12, MASK_fe, TMP12);
02624
02625 vis_and(REF_0, REF_2, TMP14);
02626 vis_mul8x16(CONST_128, TMP12, TMP12);
02627
02628 vis_alignaddr_g0((void *)off);
02629 vis_faligndata(TMP8, TMP10, REF_0);
02630 if (off != 0x7) {
02631 vis_alignaddr_g0((void *)off_plus_1);
02632 vis_faligndata(TMP8, TMP10, REF_2);
02633 } else {
02634 vis_src1(TMP10, REF_2);
02635 }
02636
02637 vis_and(TMP12, MASK_7f, TMP12);
02638
02639 vis_padd16(TMP14, TMP12, DST_0);
02640 vis_st64(DST_0, dest[0]);
02641 dest += stride;
02642 } while (--height);
02643
02644 vis_ld64(ref[0], TMP0);
02645 vis_xor(REF_0, REF_2, TMP4);
02646
02647 vis_ld64_2(ref, 8, TMP2);
02648 vis_and(TMP4, MASK_fe, TMP4);
02649
02650 vis_and(REF_0, REF_2, TMP6);
02651 vis_mul8x16(CONST_128, TMP4, TMP4);
02652
02653 vis_alignaddr_g0((void *)off);
02654
02655 vis_faligndata(TMP0, TMP2, REF_0);
02656
02657 if (off != 0x7) {
02658 vis_alignaddr_g0((void *)off_plus_1);
02659 vis_faligndata(TMP0, TMP2, REF_2);
02660 } else {
02661 vis_src1(TMP2, REF_2);
02662 }
02663
02664 vis_and(TMP4, MASK_7f, TMP4);
02665
02666 vis_padd16(TMP6, TMP4, DST_0);
02667 vis_st64(DST_0, dest[0]);
02668 dest += stride;
02669
02670 vis_xor(REF_0, REF_2, TMP12);
02671
02672 vis_and(TMP12, MASK_fe, TMP12);
02673
02674 vis_and(REF_0, REF_2, TMP14);
02675 vis_mul8x16(CONST_128, TMP12, TMP12);
02676
02677 vis_and(TMP12, MASK_7f, TMP12);
02678
02679 vis_padd16(TMP14, TMP12, DST_0);
02680 vis_st64(DST_0, dest[0]);
02681 dest += stride;
02682 }
02683
02684 static void MC_avg_no_round_x_16_vis (uint8_t * dest, const uint8_t * _ref,
02685 const int stride, int height)
02686 {
02687 uint8_t *ref = (uint8_t *) _ref;
02688 unsigned long off = (unsigned long) ref & 0x7;
02689 unsigned long off_plus_1 = off + 1;
02690
02691 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
02692
02693 vis_ld64(constants3[0], CONST_3);
02694 vis_fzero(ZERO);
02695 vis_ld64(constants256_512[0], CONST_256);
02696
02697 ref = vis_alignaddr(ref);
02698 do {
02699 vis_ld64(ref[0], TMP0);
02700
02701 vis_ld64(ref[8], TMP2);
02702
02703 vis_alignaddr_g0((void *)off);
02704
02705 vis_ld64(ref[16], TMP4);
02706
02707 vis_ld64(dest[0], DST_0);
02708 vis_faligndata(TMP0, TMP2, REF_0);
02709
02710 vis_ld64(dest[8], DST_2);
02711 vis_faligndata(TMP2, TMP4, REF_4);
02712
02713 if (off != 0x7) {
02714 vis_alignaddr_g0((void *)off_plus_1);
02715 vis_faligndata(TMP0, TMP2, REF_2);
02716 vis_faligndata(TMP2, TMP4, REF_6);
02717 } else {
02718 vis_src1(TMP2, REF_2);
02719 vis_src1(TMP4, REF_6);
02720 }
02721
02722 vis_mul8x16au(REF_0, CONST_256, TMP0);
02723
02724 vis_pmerge(ZERO, REF_2, TMP4);
02725 vis_mul8x16au(REF_0_1, CONST_256, TMP2);
02726
02727 vis_pmerge(ZERO, REF_2_1, TMP6);
02728
02729 vis_padd16(TMP0, TMP4, TMP0);
02730
02731 vis_mul8x16al(DST_0, CONST_512, TMP4);
02732 vis_padd16(TMP2, TMP6, TMP2);
02733
02734 vis_mul8x16al(DST_1, CONST_512, TMP6);
02735
02736 vis_mul8x16au(REF_6, CONST_256, TMP12);
02737
02738 vis_padd16(TMP0, TMP4, TMP0);
02739 vis_mul8x16au(REF_6_1, CONST_256, TMP14);
02740
02741 vis_padd16(TMP2, TMP6, TMP2);
02742 vis_mul8x16au(REF_4, CONST_256, TMP16);
02743
02744 vis_padd16(TMP0, CONST_3, TMP8);
02745 vis_mul8x16au(REF_4_1, CONST_256, TMP18);
02746
02747 vis_padd16(TMP2, CONST_3, TMP10);
02748 vis_pack16(TMP8, DST_0);
02749
02750 vis_pack16(TMP10, DST_1);
02751 vis_padd16(TMP16, TMP12, TMP0);
02752
02753 vis_st64(DST_0, dest[0]);
02754 vis_mul8x16al(DST_2, CONST_512, TMP4);
02755 vis_padd16(TMP18, TMP14, TMP2);
02756
02757 vis_mul8x16al(DST_3, CONST_512, TMP6);
02758 vis_padd16(TMP0, CONST_3, TMP0);
02759
02760 vis_padd16(TMP2, CONST_3, TMP2);
02761
02762 vis_padd16(TMP0, TMP4, TMP0);
02763
02764 vis_padd16(TMP2, TMP6, TMP2);
02765 vis_pack16(TMP0, DST_2);
02766
02767 vis_pack16(TMP2, DST_3);
02768 vis_st64(DST_2, dest[8]);
02769
02770 ref += stride;
02771 dest += stride;
02772 } while (--height);
02773 }
02774
02775 static void MC_avg_no_round_x_8_vis (uint8_t * dest, const uint8_t * _ref,
02776 const int stride, int height)
02777 {
02778 uint8_t *ref = (uint8_t *) _ref;
02779 unsigned long off = (unsigned long) ref & 0x7;
02780 unsigned long off_plus_1 = off + 1;
02781 int stride_times_2 = stride << 1;
02782
02783 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
02784
02785 vis_ld64(constants3[0], CONST_3);
02786 vis_fzero(ZERO);
02787 vis_ld64(constants256_512[0], CONST_256);
02788
02789 ref = vis_alignaddr(ref);
02790 height >>= 2;
02791 do {
02792 vis_ld64(ref[0], TMP0);
02793
02794 vis_ld64_2(ref, 8, TMP2);
02795 ref += stride;
02796
02797 vis_alignaddr_g0((void *)off);
02798
02799 vis_ld64(ref[0], TMP4);
02800 vis_faligndata(TMP0, TMP2, REF_0);
02801
02802 vis_ld64_2(ref, 8, TMP6);
02803 ref += stride;
02804
02805 vis_ld64(ref[0], TMP8);
02806
02807 vis_ld64_2(ref, 8, TMP10);
02808 ref += stride;
02809 vis_faligndata(TMP4, TMP6, REF_4);
02810
02811 vis_ld64(ref[0], TMP12);
02812
02813 vis_ld64_2(ref, 8, TMP14);
02814 ref += stride;
02815 vis_faligndata(TMP8, TMP10, REF_S0);
02816
02817 vis_faligndata(TMP12, TMP14, REF_S4);
02818
02819 if (off != 0x7) {
02820 vis_alignaddr_g0((void *)off_plus_1);
02821
02822 vis_ld64(dest[0], DST_0);
02823 vis_faligndata(TMP0, TMP2, REF_2);
02824
02825 vis_ld64_2(dest, stride, DST_2);
02826 vis_faligndata(TMP4, TMP6, REF_6);
02827
02828 vis_faligndata(TMP8, TMP10, REF_S2);
02829
02830 vis_faligndata(TMP12, TMP14, REF_S6);
02831 } else {
02832 vis_ld64(dest[0], DST_0);
02833 vis_src1(TMP2, REF_2);
02834
02835 vis_ld64_2(dest, stride, DST_2);
02836 vis_src1(TMP6, REF_6);
02837
02838 vis_src1(TMP10, REF_S2);
02839
02840 vis_src1(TMP14, REF_S6);
02841 }
02842
02843 vis_pmerge(ZERO, REF_0, TMP0);
02844 vis_mul8x16au(REF_0_1, CONST_256, TMP2);
02845
02846 vis_pmerge(ZERO, REF_2, TMP4);
02847 vis_mul8x16au(REF_2_1, CONST_256, TMP6);
02848
02849 vis_padd16(TMP0, CONST_3, TMP0);
02850 vis_mul8x16al(DST_0, CONST_512, TMP16);
02851
02852 vis_padd16(TMP2, CONST_3, TMP2);
02853 vis_mul8x16al(DST_1, CONST_512, TMP18);
02854
02855 vis_padd16(TMP0, TMP4, TMP0);
02856 vis_mul8x16au(REF_4, CONST_256, TMP8);
02857
02858 vis_padd16(TMP2, TMP6, TMP2);
02859 vis_mul8x16au(REF_4_1, CONST_256, TMP10);
02860
02861 vis_padd16(TMP0, TMP16, TMP0);
02862 vis_mul8x16au(REF_6, CONST_256, TMP12);
02863
02864 vis_padd16(TMP2, TMP18, TMP2);
02865 vis_mul8x16au(REF_6_1, CONST_256, TMP14);
02866
02867 vis_padd16(TMP8, CONST_3, TMP8);
02868 vis_mul8x16al(DST_2, CONST_512, TMP16);
02869
02870 vis_padd16(TMP8, TMP12, TMP8);
02871 vis_mul8x16al(DST_3, CONST_512, TMP18);
02872
02873 vis_padd16(TMP10, TMP14, TMP10);
02874 vis_pack16(TMP0, DST_0);
02875
02876 vis_pack16(TMP2, DST_1);
02877 vis_st64(DST_0, dest[0]);
02878 dest += stride;
02879 vis_padd16(TMP10, CONST_3, TMP10);
02880
02881 vis_ld64_2(dest, stride, DST_0);
02882 vis_padd16(TMP8, TMP16, TMP8);
02883
02884 vis_ld64_2(dest, stride_times_2, TMP4);
02885 vis_padd16(TMP10, TMP18, TMP10);
02886 vis_pack16(TMP8, DST_2);
02887
02888 vis_pack16(TMP10, DST_3);
02889 vis_st64(DST_2, dest[0]);
02890 dest += stride;
02891
02892 vis_mul8x16au(REF_S0_1, CONST_256, TMP2);
02893 vis_pmerge(ZERO, REF_S0, TMP0);
02894
02895 vis_pmerge(ZERO, REF_S2, TMP24);
02896 vis_mul8x16au(REF_S2_1, CONST_256, TMP6);
02897
02898 vis_padd16(TMP0, CONST_3, TMP0);
02899 vis_mul8x16au(REF_S4, CONST_256, TMP8);
02900
02901 vis_padd16(TMP2, CONST_3, TMP2);
02902 vis_mul8x16au(REF_S4_1, CONST_256, TMP10);
02903
02904 vis_padd16(TMP0, TMP24, TMP0);
02905 vis_mul8x16au(REF_S6, CONST_256, TMP12);
02906
02907 vis_padd16(TMP2, TMP6, TMP2);
02908 vis_mul8x16au(REF_S6_1, CONST_256, TMP14);
02909
02910 vis_padd16(TMP8, CONST_3, TMP8);
02911 vis_mul8x16al(DST_0, CONST_512, TMP16);
02912
02913 vis_padd16(TMP10, CONST_3, TMP10);
02914 vis_mul8x16al(DST_1, CONST_512, TMP18);
02915
02916 vis_padd16(TMP8, TMP12, TMP8);
02917 vis_mul8x16al(TMP4, CONST_512, TMP20);
02918
02919 vis_mul8x16al(TMP5, CONST_512, TMP22);
02920 vis_padd16(TMP0, TMP16, TMP0);
02921
02922 vis_padd16(TMP2, TMP18, TMP2);
02923 vis_pack16(TMP0, DST_0);
02924
02925 vis_padd16(TMP10, TMP14, TMP10);
02926 vis_pack16(TMP2, DST_1);
02927 vis_st64(DST_0, dest[0]);
02928 dest += stride;
02929
02930 vis_padd16(TMP8, TMP20, TMP8);
02931
02932 vis_padd16(TMP10, TMP22, TMP10);
02933 vis_pack16(TMP8, DST_2);
02934
02935 vis_pack16(TMP10, DST_3);
02936 vis_st64(DST_2, dest[0]);
02937 dest += stride;
02938 } while (--height);
02939 }
02940
02941 static void MC_put_no_round_y_16_vis (uint8_t * dest, const uint8_t * _ref,
02942 const int stride, int height)
02943 {
02944 uint8_t *ref = (uint8_t *) _ref;
02945
02946 ref = vis_alignaddr(ref);
02947 vis_ld64(ref[0], TMP0);
02948
02949 vis_ld64_2(ref, 8, TMP2);
02950
02951 vis_ld64_2(ref, 16, TMP4);
02952 ref += stride;
02953
02954 vis_ld64(ref[0], TMP6);
02955 vis_faligndata(TMP0, TMP2, REF_0);
02956
02957 vis_ld64_2(ref, 8, TMP8);
02958 vis_faligndata(TMP2, TMP4, REF_4);
02959
02960 vis_ld64_2(ref, 16, TMP10);
02961 ref += stride;
02962
02963 vis_ld64(constants_fe[0], MASK_fe);
02964 vis_faligndata(TMP6, TMP8, REF_2);
02965
02966 vis_ld64(constants_7f[0], MASK_7f);
02967 vis_faligndata(TMP8, TMP10, REF_6);
02968
02969 vis_ld64(constants128[0], CONST_128);
02970 height = (height >> 1) - 1;
02971 do {
02972 vis_ld64(ref[0], TMP0);
02973 vis_xor(REF_0, REF_2, TMP12);
02974
02975 vis_ld64_2(ref, 8, TMP2);
02976 vis_xor(REF_4, REF_6, TMP16);
02977
02978 vis_ld64_2(ref, 16, TMP4);
02979 ref += stride;
02980 vis_and(REF_0, REF_2, TMP14);
02981
02982 vis_ld64(ref[0], TMP6);
02983 vis_and(REF_4, REF_6, TMP18);
02984
02985 vis_ld64_2(ref, 8, TMP8);
02986 vis_faligndata(TMP0, TMP2, REF_0);
02987
02988 vis_ld64_2(ref, 16, TMP10);
02989 ref += stride;
02990 vis_faligndata(TMP2, TMP4, REF_4);
02991
02992 vis_and(TMP12, MASK_fe, TMP12);
02993
02994 vis_and(TMP16, MASK_fe, TMP16);
02995 vis_mul8x16(CONST_128, TMP12, TMP12);
02996
02997 vis_mul8x16(CONST_128, TMP16, TMP16);
02998 vis_xor(REF_0, REF_2, TMP0);
02999
03000 vis_xor(REF_4, REF_6, TMP2);
03001
03002 vis_and(REF_0, REF_2, TMP20);
03003
03004 vis_and(TMP12, MASK_7f, TMP12);
03005
03006 vis_and(TMP16, MASK_7f, TMP16);
03007
03008 vis_padd16(TMP14, TMP12, TMP12);
03009 vis_st64(TMP12, dest[0]);
03010
03011 vis_padd16(TMP18, TMP16, TMP16);
03012 vis_st64_2(TMP16, dest, 8);
03013 dest += stride;
03014
03015 vis_and(REF_4, REF_6, TMP18);
03016
03017 vis_and(TMP0, MASK_fe, TMP0);
03018
03019 vis_and(TMP2, MASK_fe, TMP2);
03020 vis_mul8x16(CONST_128, TMP0, TMP0);
03021
03022 vis_faligndata(TMP6, TMP8, REF_2);
03023 vis_mul8x16(CONST_128, TMP2, TMP2);
03024
03025 vis_faligndata(TMP8, TMP10, REF_6);
03026
03027 vis_and(TMP0, MASK_7f, TMP0);
03028
03029 vis_and(TMP2, MASK_7f, TMP2);
03030
03031 vis_padd16(TMP20, TMP0, TMP0);
03032 vis_st64(TMP0, dest[0]);
03033
03034 vis_padd16(TMP18, TMP2, TMP2);
03035 vis_st64_2(TMP2, dest, 8);
03036 dest += stride;
03037 } while (--height);
03038
03039 vis_ld64(ref[0], TMP0);
03040 vis_xor(REF_0, REF_2, TMP12);
03041
03042 vis_ld64_2(ref, 8, TMP2);
03043 vis_xor(REF_4, REF_6, TMP16);
03044
03045 vis_ld64_2(ref, 16, TMP4);
03046 vis_and(REF_0, REF_2, TMP14);
03047
03048 vis_and(REF_4, REF_6, TMP18);
03049
03050 vis_faligndata(TMP0, TMP2, REF_0);
03051
03052 vis_faligndata(TMP2, TMP4, REF_4);
03053
03054 vis_and(TMP12, MASK_fe, TMP12);
03055
03056 vis_and(TMP16, MASK_fe, TMP16);
03057 vis_mul8x16(CONST_128, TMP12, TMP12);
03058
03059 vis_mul8x16(CONST_128, TMP16, TMP16);
03060 vis_xor(REF_0, REF_2, TMP0);
03061
03062 vis_xor(REF_4, REF_6, TMP2);
03063
03064 vis_and(REF_0, REF_2, TMP20);
03065
03066 vis_and(TMP12, MASK_7f, TMP12);
03067
03068 vis_and(TMP16, MASK_7f, TMP16);
03069
03070 vis_padd16(TMP14, TMP12, TMP12);
03071 vis_st64(TMP12, dest[0]);
03072
03073 vis_padd16(TMP18, TMP16, TMP16);
03074 vis_st64_2(TMP16, dest, 8);
03075 dest += stride;
03076
03077 vis_and(REF_4, REF_6, TMP18);
03078
03079 vis_and(TMP0, MASK_fe, TMP0);
03080
03081 vis_and(TMP2, MASK_fe, TMP2);
03082 vis_mul8x16(CONST_128, TMP0, TMP0);
03083
03084 vis_mul8x16(CONST_128, TMP2, TMP2);
03085
03086 vis_and(TMP0, MASK_7f, TMP0);
03087
03088 vis_and(TMP2, MASK_7f, TMP2);
03089
03090 vis_padd16(TMP20, TMP0, TMP0);
03091 vis_st64(TMP0, dest[0]);
03092
03093 vis_padd16(TMP18, TMP2, TMP2);
03094 vis_st64_2(TMP2, dest, 8);
03095 }
03096
03097 static void MC_put_no_round_y_8_vis (uint8_t * dest, const uint8_t * _ref,
03098 const int stride, int height)
03099 {
03100 uint8_t *ref = (uint8_t *) _ref;
03101
03102 ref = vis_alignaddr(ref);
03103 vis_ld64(ref[0], TMP0);
03104
03105 vis_ld64_2(ref, 8, TMP2);
03106 ref += stride;
03107
03108 vis_ld64(ref[0], TMP4);
03109
03110 vis_ld64_2(ref, 8, TMP6);
03111 ref += stride;
03112
03113 vis_ld64(constants_fe[0], MASK_fe);
03114 vis_faligndata(TMP0, TMP2, REF_0);
03115
03116 vis_ld64(constants_7f[0], MASK_7f);
03117 vis_faligndata(TMP4, TMP6, REF_2);
03118
03119 vis_ld64(constants128[0], CONST_128);
03120 height = (height >> 1) - 1;
03121 do {
03122 vis_ld64(ref[0], TMP0);
03123 vis_xor(REF_0, REF_2, TMP4);
03124
03125 vis_ld64_2(ref, 8, TMP2);
03126 ref += stride;
03127 vis_and(TMP4, MASK_fe, TMP4);
03128
03129 vis_and(REF_0, REF_2, TMP6);
03130 vis_mul8x16(CONST_128, TMP4, TMP4);
03131
03132 vis_faligndata(TMP0, TMP2, REF_0);
03133 vis_ld64(ref[0], TMP0);
03134
03135 vis_ld64_2(ref, 8, TMP2);
03136 ref += stride;
03137 vis_xor(REF_0, REF_2, TMP12);
03138
03139 vis_and(TMP4, MASK_7f, TMP4);
03140
03141 vis_and(TMP12, MASK_fe, TMP12);
03142
03143 vis_mul8x16(CONST_128, TMP12, TMP12);
03144 vis_and(REF_0, REF_2, TMP14);
03145
03146 vis_padd16(TMP6, TMP4, DST_0);
03147 vis_st64(DST_0, dest[0]);
03148 dest += stride;
03149
03150 vis_faligndata(TMP0, TMP2, REF_2);
03151
03152 vis_and(TMP12, MASK_7f, TMP12);
03153
03154 vis_padd16(TMP14, TMP12, DST_0);
03155 vis_st64(DST_0, dest[0]);
03156 dest += stride;
03157 } while (--height);
03158
03159 vis_ld64(ref[0], TMP0);
03160 vis_xor(REF_0, REF_2, TMP4);
03161
03162 vis_ld64_2(ref, 8, TMP2);
03163 vis_and(TMP4, MASK_fe, TMP4);
03164
03165 vis_and(REF_0, REF_2, TMP6);
03166 vis_mul8x16(CONST_128, TMP4, TMP4);
03167
03168 vis_faligndata(TMP0, TMP2, REF_0);
03169
03170 vis_xor(REF_0, REF_2, TMP12);
03171
03172 vis_and(TMP4, MASK_7f, TMP4);
03173
03174 vis_and(TMP12, MASK_fe, TMP12);
03175
03176 vis_mul8x16(CONST_128, TMP12, TMP12);
03177 vis_and(REF_0, REF_2, TMP14);
03178
03179 vis_padd16(TMP6, TMP4, DST_0);
03180 vis_st64(DST_0, dest[0]);
03181 dest += stride;
03182
03183 vis_and(TMP12, MASK_7f, TMP12);
03184
03185 vis_padd16(TMP14, TMP12, DST_0);
03186 vis_st64(DST_0, dest[0]);
03187 }
03188
03189 static void MC_avg_no_round_y_16_vis (uint8_t * dest, const uint8_t * _ref,
03190 const int stride, int height)
03191 {
03192 uint8_t *ref = (uint8_t *) _ref;
03193 int stride_8 = stride + 8;
03194 int stride_16 = stride + 16;
03195
03196 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
03197
03198 ref = vis_alignaddr(ref);
03199
03200 vis_ld64(ref[ 0], TMP0);
03201 vis_fzero(ZERO);
03202
03203 vis_ld64(ref[ 8], TMP2);
03204
03205 vis_ld64(ref[16], TMP4);
03206
03207 vis_ld64(constants3[0], CONST_3);
03208 vis_faligndata(TMP0, TMP2, REF_2);
03209
03210 vis_ld64(constants256_512[0], CONST_256);
03211 vis_faligndata(TMP2, TMP4, REF_6);
03212 height >>= 1;
03213
03214 do {
03215 vis_ld64_2(ref, stride, TMP0);
03216 vis_pmerge(ZERO, REF_2, TMP12);
03217 vis_mul8x16au(REF_2_1, CONST_256, TMP14);
03218
03219 vis_ld64_2(ref, stride_8, TMP2);
03220 vis_pmerge(ZERO, REF_6, TMP16);
03221 vis_mul8x16au(REF_6_1, CONST_256, TMP18);
03222
03223 vis_ld64_2(ref, stride_16, TMP4);
03224 ref += stride;
03225
03226 vis_ld64(dest[0], DST_0);
03227 vis_faligndata(TMP0, TMP2, REF_0);
03228
03229 vis_ld64_2(dest, 8, DST_2);
03230 vis_faligndata(TMP2, TMP4, REF_4);
03231
03232 vis_ld64_2(ref, stride, TMP6);
03233 vis_pmerge(ZERO, REF_0, TMP0);
03234 vis_mul8x16au(REF_0_1, CONST_256, TMP2);
03235
03236 vis_ld64_2(ref, stride_8, TMP8);
03237 vis_pmerge(ZERO, REF_4, TMP4);
03238
03239 vis_ld64_2(ref, stride_16, TMP10);
03240 ref += stride;
03241
03242 vis_ld64_2(dest, stride, REF_S0);
03243 vis_faligndata(TMP6, TMP8, REF_2);
03244 vis_mul8x16au(REF_4_1, CONST_256, TMP6);
03245
03246 vis_ld64_2(dest, stride_8, REF_S2);
03247 vis_faligndata(TMP8, TMP10, REF_6);
03248 vis_mul8x16al(DST_0, CONST_512, TMP20);
03249
03250 vis_padd16(TMP0, CONST_3, TMP0);
03251 vis_mul8x16al(DST_1, CONST_512, TMP22);
03252
03253 vis_padd16(TMP2, CONST_3, TMP2);
03254 vis_mul8x16al(DST_2, CONST_512, TMP24);
03255
03256 vis_padd16(TMP4, CONST_3, TMP4);
03257 vis_mul8x16al(DST_3, CONST_512, TMP26);
03258
03259 vis_padd16(TMP6, CONST_3, TMP6);
03260
03261 vis_padd16(TMP12, TMP20, TMP12);
03262 vis_mul8x16al(REF_S0, CONST_512, TMP20);
03263
03264 vis_padd16(TMP14, TMP22, TMP14);
03265 vis_mul8x16al(REF_S0_1, CONST_512, TMP22);
03266
03267 vis_padd16(TMP16, TMP24, TMP16);
03268 vis_mul8x16al(REF_S2, CONST_512, TMP24);
03269
03270 vis_padd16(TMP18, TMP26, TMP18);
03271 vis_mul8x16al(REF_S2_1, CONST_512, TMP26);
03272
03273 vis_padd16(TMP12, TMP0, TMP12);
03274 vis_mul8x16au(REF_2, CONST_256, TMP28);
03275
03276 vis_padd16(TMP14, TMP2, TMP14);
03277 vis_mul8x16au(REF_2_1, CONST_256, TMP30);
03278
03279 vis_padd16(TMP16, TMP4, TMP16);
03280 vis_mul8x16au(REF_6, CONST_256, REF_S4);
03281
03282 vis_padd16(TMP18, TMP6, TMP18);
03283 vis_mul8x16au(REF_6_1, CONST_256, REF_S6);
03284
03285 vis_pack16(TMP12, DST_0);
03286 vis_padd16(TMP28, TMP0, TMP12);
03287
03288 vis_pack16(TMP14, DST_1);
03289 vis_st64(DST_0, dest[0]);
03290 vis_padd16(TMP30, TMP2, TMP14);
03291
03292 vis_pack16(TMP16, DST_2);
03293 vis_padd16(REF_S4, TMP4, TMP16);
03294
03295 vis_pack16(TMP18, DST_3);
03296 vis_st64_2(DST_2, dest, 8);
03297 dest += stride;
03298 vis_padd16(REF_S6, TMP6, TMP18);
03299
03300 vis_padd16(TMP12, TMP20, TMP12);
03301
03302 vis_padd16(TMP14, TMP22, TMP14);
03303 vis_pack16(TMP12, DST_0);
03304
03305 vis_padd16(TMP16, TMP24, TMP16);
03306 vis_pack16(TMP14, DST_1);
03307 vis_st64(DST_0, dest[0]);
03308
03309 vis_padd16(TMP18, TMP26, TMP18);
03310 vis_pack16(TMP16, DST_2);
03311
03312 vis_pack16(TMP18, DST_3);
03313 vis_st64_2(DST_2, dest, 8);
03314 dest += stride;
03315 } while (--height);
03316 }
03317
03318 static void MC_avg_no_round_y_8_vis (uint8_t * dest, const uint8_t * _ref,
03319 const int stride, int height)
03320 {
03321 uint8_t *ref = (uint8_t *) _ref;
03322 int stride_8 = stride + 8;
03323
03324 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
03325
03326 ref = vis_alignaddr(ref);
03327
03328 vis_ld64(ref[ 0], TMP0);
03329 vis_fzero(ZERO);
03330
03331 vis_ld64(ref[ 8], TMP2);
03332
03333 vis_ld64(constants3[0], CONST_3);
03334 vis_faligndata(TMP0, TMP2, REF_2);
03335
03336 vis_ld64(constants256_512[0], CONST_256);
03337
03338 height >>= 1;
03339 do {
03340 vis_ld64_2(ref, stride, TMP0);
03341 vis_pmerge(ZERO, REF_2, TMP8);
03342 vis_mul8x16au(REF_2_1, CONST_256, TMP10);
03343
03344 vis_ld64_2(ref, stride_8, TMP2);
03345 ref += stride;
03346
03347 vis_ld64(dest[0], DST_0);
03348
03349 vis_ld64_2(dest, stride, DST_2);
03350 vis_faligndata(TMP0, TMP2, REF_0);
03351
03352 vis_ld64_2(ref, stride, TMP4);
03353 vis_mul8x16al(DST_0, CONST_512, TMP16);
03354 vis_pmerge(ZERO, REF_0, TMP12);
03355
03356 vis_ld64_2(ref, stride_8, TMP6);
03357 ref += stride;
03358 vis_mul8x16al(DST_1, CONST_512, TMP18);
03359 vis_pmerge(ZERO, REF_0_1, TMP14);
03360
03361 vis_padd16(TMP12, CONST_3, TMP12);
03362 vis_mul8x16al(DST_2, CONST_512, TMP24);
03363
03364 vis_padd16(TMP14, CONST_3, TMP14);
03365 vis_mul8x16al(DST_3, CONST_512, TMP26);
03366
03367 vis_faligndata(TMP4, TMP6, REF_2);
03368
03369 vis_padd16(TMP8, TMP12, TMP8);
03370
03371 vis_padd16(TMP10, TMP14, TMP10);
03372 vis_mul8x16au(REF_2, CONST_256, TMP20);
03373
03374 vis_padd16(TMP8, TMP16, TMP0);
03375 vis_mul8x16au(REF_2_1, CONST_256, TMP22);
03376
03377 vis_padd16(TMP10, TMP18, TMP2);
03378 vis_pack16(TMP0, DST_0);
03379
03380 vis_pack16(TMP2, DST_1);
03381 vis_st64(DST_0, dest[0]);
03382 dest += stride;
03383 vis_padd16(TMP12, TMP20, TMP12);
03384
03385 vis_padd16(TMP14, TMP22, TMP14);
03386
03387 vis_padd16(TMP12, TMP24, TMP0);
03388
03389 vis_padd16(TMP14, TMP26, TMP2);
03390 vis_pack16(TMP0, DST_2);
03391
03392 vis_pack16(TMP2, DST_3);
03393 vis_st64(DST_2, dest[0]);
03394 dest += stride;
03395 } while (--height);
03396 }
03397
03398 static void MC_put_no_round_xy_16_vis (uint8_t * dest, const uint8_t * _ref,
03399 const int stride, int height)
03400 {
03401 uint8_t *ref = (uint8_t *) _ref;
03402 unsigned long off = (unsigned long) ref & 0x7;
03403 unsigned long off_plus_1 = off + 1;
03404 int stride_8 = stride + 8;
03405 int stride_16 = stride + 16;
03406
03407 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
03408
03409 ref = vis_alignaddr(ref);
03410
03411 vis_ld64(ref[ 0], TMP0);
03412 vis_fzero(ZERO);
03413
03414 vis_ld64(ref[ 8], TMP2);
03415
03416 vis_ld64(ref[16], TMP4);
03417
03418 vis_ld64(constants1[0], CONST_1);
03419 vis_faligndata(TMP0, TMP2, REF_S0);
03420
03421 vis_ld64(constants256_512[0], CONST_256);
03422 vis_faligndata(TMP2, TMP4, REF_S4);
03423
03424 if (off != 0x7) {
03425 vis_alignaddr_g0((void *)off_plus_1);
03426 vis_faligndata(TMP0, TMP2, REF_S2);
03427 vis_faligndata(TMP2, TMP4, REF_S6);
03428 } else {
03429 vis_src1(TMP2, REF_S2);
03430 vis_src1(TMP4, REF_S6);
03431 }
03432
03433 height >>= 1;
03434 do {
03435 vis_ld64_2(ref, stride, TMP0);
03436 vis_mul8x16au(REF_S0, CONST_256, TMP12);
03437 vis_pmerge(ZERO, REF_S0_1, TMP14);
03438
03439 vis_alignaddr_g0((void *)off);
03440
03441 vis_ld64_2(ref, stride_8, TMP2);
03442 vis_mul8x16au(REF_S2, CONST_256, TMP16);
03443 vis_pmerge(ZERO, REF_S2_1, TMP18);
03444
03445 vis_ld64_2(ref, stride_16, TMP4);
03446 ref += stride;
03447 vis_mul8x16au(REF_S4, CONST_256, TMP20);
03448 vis_pmerge(ZERO, REF_S4_1, TMP22);
03449
03450 vis_ld64_2(ref, stride, TMP6);
03451 vis_mul8x16au(REF_S6, CONST_256, TMP24);
03452 vis_pmerge(ZERO, REF_S6_1, TMP26);
03453
03454 vis_ld64_2(ref, stride_8, TMP8);
03455 vis_faligndata(TMP0, TMP2, REF_0);
03456
03457 vis_ld64_2(ref, stride_16, TMP10);
03458 ref += stride;
03459 vis_faligndata(TMP2, TMP4, REF_4);
03460
03461 vis_faligndata(TMP6, TMP8, REF_S0);
03462
03463 vis_faligndata(TMP8, TMP10, REF_S4);
03464
03465 if (off != 0x7) {
03466 vis_alignaddr_g0((void *)off_plus_1);
03467 vis_faligndata(TMP0, TMP2, REF_2);
03468 vis_faligndata(TMP2, TMP4, REF_6);
03469 vis_faligndata(TMP6, TMP8, REF_S2);
03470 vis_faligndata(TMP8, TMP10, REF_S6);
03471 } else {
03472 vis_src1(TMP2, REF_2);
03473 vis_src1(TMP4, REF_6);
03474 vis_src1(TMP8, REF_S2);
03475 vis_src1(TMP10, REF_S6);
03476 }
03477
03478 vis_mul8x16au(REF_0, CONST_256, TMP0);
03479 vis_pmerge(ZERO, REF_0_1, TMP2);
03480
03481 vis_mul8x16au(REF_2, CONST_256, TMP4);
03482 vis_pmerge(ZERO, REF_2_1, TMP6);
03483
03484 vis_padd16(TMP0, CONST_2, TMP8);
03485 vis_mul8x16au(REF_4, CONST_256, TMP0);
03486
03487 vis_padd16(TMP2, CONST_1, TMP10);
03488 vis_mul8x16au(REF_4_1, CONST_256, TMP2);
03489
03490 vis_padd16(TMP8, TMP4, TMP8);
03491 vis_mul8x16au(REF_6, CONST_256, TMP4);
03492
03493 vis_padd16(TMP10, TMP6, TMP10);
03494 vis_mul8x16au(REF_6_1, CONST_256, TMP6);
03495
03496 vis_padd16(TMP12, TMP8, TMP12);
03497
03498 vis_padd16(TMP14, TMP10, TMP14);
03499
03500 vis_padd16(TMP12, TMP16, TMP12);
03501
03502 vis_padd16(TMP14, TMP18, TMP14);
03503 vis_pack16(TMP12, DST_0);
03504
03505 vis_pack16(TMP14, DST_1);
03506 vis_st64(DST_0, dest[0]);
03507 vis_padd16(TMP0, CONST_1, TMP12);
03508
03509 vis_mul8x16au(REF_S0, CONST_256, TMP0);
03510 vis_padd16(TMP2, CONST_1, TMP14);
03511
03512 vis_mul8x16au(REF_S0_1, CONST_256, TMP2);
03513 vis_padd16(TMP12, TMP4, TMP12);
03514
03515 vis_mul8x16au(REF_S2, CONST_256, TMP4);
03516 vis_padd16(TMP14, TMP6, TMP14);
03517
03518 vis_mul8x16au(REF_S2_1, CONST_256, TMP6);
03519 vis_padd16(TMP20, TMP12, TMP20);
03520
03521 vis_padd16(TMP22, TMP14, TMP22);
03522
03523 vis_padd16(TMP20, TMP24, TMP20);
03524
03525 vis_padd16(TMP22, TMP26, TMP22);
03526 vis_pack16(TMP20, DST_2);
03527
03528 vis_pack16(TMP22, DST_3);
03529 vis_st64_2(DST_2, dest, 8);
03530 dest += stride;
03531 vis_padd16(TMP0, TMP4, TMP24);
03532
03533 vis_mul8x16au(REF_S4, CONST_256, TMP0);
03534 vis_padd16(TMP2, TMP6, TMP26);
03535
03536 vis_mul8x16au(REF_S4_1, CONST_256, TMP2);
03537 vis_padd16(TMP24, TMP8, TMP24);
03538
03539 vis_padd16(TMP26, TMP10, TMP26);
03540 vis_pack16(TMP24, DST_0);
03541
03542 vis_pack16(TMP26, DST_1);
03543 vis_st64(DST_0, dest[0]);
03544 vis_pmerge(ZERO, REF_S6, TMP4);
03545
03546 vis_pmerge(ZERO, REF_S6_1, TMP6);
03547
03548 vis_padd16(TMP0, TMP4, TMP0);
03549
03550 vis_padd16(TMP2, TMP6, TMP2);
03551
03552 vis_padd16(TMP0, TMP12, TMP0);
03553
03554 vis_padd16(TMP2, TMP14, TMP2);
03555 vis_pack16(TMP0, DST_2);
03556
03557 vis_pack16(TMP2, DST_3);
03558 vis_st64_2(DST_2, dest, 8);
03559 dest += stride;
03560 } while (--height);
03561 }
03562
03563 static void MC_put_no_round_xy_8_vis (uint8_t * dest, const uint8_t * _ref,
03564 const int stride, int height)
03565 {
03566 uint8_t *ref = (uint8_t *) _ref;
03567 unsigned long off = (unsigned long) ref & 0x7;
03568 unsigned long off_plus_1 = off + 1;
03569 int stride_8 = stride + 8;
03570
03571 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
03572
03573 ref = vis_alignaddr(ref);
03574
03575 vis_ld64(ref[ 0], TMP0);
03576 vis_fzero(ZERO);
03577
03578 vis_ld64(ref[ 8], TMP2);
03579
03580 vis_ld64(constants1[0], CONST_1);
03581
03582 vis_ld64(constants256_512[0], CONST_256);
03583 vis_faligndata(TMP0, TMP2, REF_S0);
03584
03585 if (off != 0x7) {
03586 vis_alignaddr_g0((void *)off_plus_1);
03587 vis_faligndata(TMP0, TMP2, REF_S2);
03588 } else {
03589 vis_src1(TMP2, REF_S2);
03590 }
03591
03592 height >>= 1;
03593 do {
03594 vis_ld64_2(ref, stride, TMP0);
03595 vis_mul8x16au(REF_S0, CONST_256, TMP8);
03596 vis_pmerge(ZERO, REF_S2, TMP12);
03597
03598 vis_alignaddr_g0((void *)off);
03599
03600 vis_ld64_2(ref, stride_8, TMP2);
03601 ref += stride;
03602 vis_mul8x16au(REF_S0_1, CONST_256, TMP10);
03603 vis_pmerge(ZERO, REF_S2_1, TMP14);
03604
03605 vis_ld64_2(ref, stride, TMP4);
03606
03607 vis_ld64_2(ref, stride_8, TMP6);
03608 ref += stride;
03609 vis_faligndata(TMP0, TMP2, REF_S4);
03610
03611 vis_pmerge(ZERO, REF_S4, TMP18);
03612
03613 vis_pmerge(ZERO, REF_S4_1, TMP20);
03614
03615 vis_faligndata(TMP4, TMP6, REF_S0);
03616
03617 if (off != 0x7) {
03618 vis_alignaddr_g0((void *)off_plus_1);
03619 vis_faligndata(TMP0, TMP2, REF_S6);
03620 vis_faligndata(TMP4, TMP6, REF_S2);
03621 } else {
03622 vis_src1(TMP2, REF_S6);
03623 vis_src1(TMP6, REF_S2);
03624 }
03625
03626 vis_padd16(TMP18, CONST_1, TMP18);
03627 vis_mul8x16au(REF_S6, CONST_256, TMP22);
03628
03629 vis_padd16(TMP20, CONST_1, TMP20);
03630 vis_mul8x16au(REF_S6_1, CONST_256, TMP24);
03631
03632 vis_mul8x16au(REF_S0, CONST_256, TMP26);
03633 vis_pmerge(ZERO, REF_S0_1, TMP28);
03634
03635 vis_mul8x16au(REF_S2, CONST_256, TMP30);
03636 vis_padd16(TMP18, TMP22, TMP18);
03637
03638 vis_mul8x16au(REF_S2_1, CONST_256, TMP32);
03639 vis_padd16(TMP20, TMP24, TMP20);
03640
03641 vis_padd16(TMP8, TMP18, TMP8);
03642
03643 vis_padd16(TMP10, TMP20, TMP10);
03644
03645 vis_padd16(TMP8, TMP12, TMP8);
03646
03647 vis_padd16(TMP10, TMP14, TMP10);
03648 vis_pack16(TMP8, DST_0);
03649
03650 vis_pack16(TMP10, DST_1);
03651 vis_st64(DST_0, dest[0]);
03652 dest += stride;
03653 vis_padd16(TMP18, TMP26, TMP18);
03654
03655 vis_padd16(TMP20, TMP28, TMP20);
03656
03657 vis_padd16(TMP18, TMP30, TMP18);
03658
03659 vis_padd16(TMP20, TMP32, TMP20);
03660 vis_pack16(TMP18, DST_2);
03661
03662 vis_pack16(TMP20, DST_3);
03663 vis_st64(DST_2, dest[0]);
03664 dest += stride;
03665 } while (--height);
03666 }
03667
03668 static void MC_avg_no_round_xy_16_vis (uint8_t * dest, const uint8_t * _ref,
03669 const int stride, int height)
03670 {
03671 uint8_t *ref = (uint8_t *) _ref;
03672 unsigned long off = (unsigned long) ref & 0x7;
03673 unsigned long off_plus_1 = off + 1;
03674 int stride_8 = stride + 8;
03675 int stride_16 = stride + 16;
03676
03677 vis_set_gsr(4 << VIS_GSR_SCALEFACT_SHIFT);
03678
03679 ref = vis_alignaddr(ref);
03680
03681 vis_ld64(ref[ 0], TMP0);
03682 vis_fzero(ZERO);
03683
03684 vis_ld64(ref[ 8], TMP2);
03685
03686 vis_ld64(ref[16], TMP4);
03687
03688 vis_ld64(constants6[0], CONST_6);
03689 vis_faligndata(TMP0, TMP2, REF_S0);
03690
03691 vis_ld64(constants256_1024[0], CONST_256);
03692 vis_faligndata(TMP2, TMP4, REF_S4);
03693
03694 if (off != 0x7) {
03695 vis_alignaddr_g0((void *)off_plus_1);
03696 vis_faligndata(TMP0, TMP2, REF_S2);
03697 vis_faligndata(TMP2, TMP4, REF_S6);
03698 } else {
03699 vis_src1(TMP2, REF_S2);
03700 vis_src1(TMP4, REF_S6);
03701 }
03702
03703 height >>= 1;
03704 do {
03705 vis_ld64_2(ref, stride, TMP0);
03706 vis_mul8x16au(REF_S0, CONST_256, TMP12);
03707 vis_pmerge(ZERO, REF_S0_1, TMP14);
03708
03709 vis_alignaddr_g0((void *)off);
03710
03711 vis_ld64_2(ref, stride_8, TMP2);
03712 vis_mul8x16au(REF_S2, CONST_256, TMP16);
03713 vis_pmerge(ZERO, REF_S2_1, TMP18);
03714
03715 vis_ld64_2(ref, stride_16, TMP4);
03716 ref += stride;
03717 vis_mul8x16au(REF_S4, CONST_256, TMP20);
03718 vis_pmerge(ZERO, REF_S4_1, TMP22);
03719
03720 vis_ld64_2(ref, stride, TMP6);
03721 vis_mul8x16au(REF_S6, CONST_256, TMP24);
03722 vis_pmerge(ZERO, REF_S6_1, TMP26);
03723
03724 vis_ld64_2(ref, stride_8, TMP8);
03725 vis_faligndata(TMP0, TMP2, REF_0);
03726
03727 vis_ld64_2(ref, stride_16, TMP10);
03728 ref += stride;
03729 vis_faligndata(TMP2, TMP4, REF_4);
03730
03731 vis_ld64(dest[0], DST_0);
03732 vis_faligndata(TMP6, TMP8, REF_S0);
03733
03734 vis_ld64_2(dest, 8, DST_2);
03735 vis_faligndata(TMP8, TMP10, REF_S4);
03736
03737 if (off != 0x7) {
03738 vis_alignaddr_g0((void *)off_plus_1);
03739 vis_faligndata(TMP0, TMP2, REF_2);
03740 vis_faligndata(TMP2, TMP4, REF_6);
03741 vis_faligndata(TMP6, TMP8, REF_S2);
03742 vis_faligndata(TMP8, TMP10, REF_S6);
03743 } else {
03744 vis_src1(TMP2, REF_2);
03745 vis_src1(TMP4, REF_6);
03746 vis_src1(TMP8, REF_S2);
03747 vis_src1(TMP10, REF_S6);
03748 }
03749
03750 vis_mul8x16al(DST_0, CONST_1024, TMP30);
03751 vis_pmerge(ZERO, REF_0, TMP0);
03752
03753 vis_mul8x16al(DST_1, CONST_1024, TMP32);
03754 vis_pmerge(ZERO, REF_0_1, TMP2);
03755
03756 vis_mul8x16au(REF_2, CONST_256, TMP4);
03757 vis_pmerge(ZERO, REF_2_1, TMP6);
03758
03759 vis_mul8x16al(DST_2, CONST_1024, REF_0);
03760 vis_padd16(TMP0, CONST_6, TMP0);
03761
03762 vis_mul8x16al(DST_3, CONST_1024, REF_2);
03763 vis_padd16(TMP2, CONST_6, TMP2);
03764
03765 vis_padd16(TMP0, TMP4, TMP0);
03766 vis_mul8x16au(REF_4, CONST_256, TMP4);
03767
03768 vis_padd16(TMP2, TMP6, TMP2);
03769 vis_mul8x16au(REF_4_1, CONST_256, TMP6);
03770
03771 vis_padd16(TMP12, TMP0, TMP12);
03772 vis_mul8x16au(REF_6, CONST_256, TMP8);
03773
03774 vis_padd16(TMP14, TMP2, TMP14);
03775 vis_mul8x16au(REF_6_1, CONST_256, TMP10);
03776
03777 vis_padd16(TMP12, TMP16, TMP12);
03778 vis_mul8x16au(REF_S0, CONST_256, REF_4);
03779
03780 vis_padd16(TMP14, TMP18, TMP14);
03781 vis_mul8x16au(REF_S0_1, CONST_256, REF_6);
03782
03783 vis_padd16(TMP12, TMP30, TMP12);
03784
03785 vis_padd16(TMP14, TMP32, TMP14);
03786 vis_pack16(TMP12, DST_0);
03787
03788 vis_pack16(TMP14, DST_1);
03789 vis_st64(DST_0, dest[0]);
03790 vis_padd16(TMP4, CONST_6, TMP4);
03791
03792 vis_ld64_2(dest, stride, DST_0);
03793 vis_padd16(TMP6, CONST_6, TMP6);
03794 vis_mul8x16au(REF_S2, CONST_256, TMP12);
03795
03796 vis_padd16(TMP4, TMP8, TMP4);
03797 vis_mul8x16au(REF_S2_1, CONST_256, TMP14);
03798
03799 vis_padd16(TMP6, TMP10, TMP6);
03800
03801 vis_padd16(TMP20, TMP4, TMP20);
03802
03803 vis_padd16(TMP22, TMP6, TMP22);
03804
03805 vis_padd16(TMP20, TMP24, TMP20);
03806
03807 vis_padd16(TMP22, TMP26, TMP22);
03808
03809 vis_padd16(TMP20, REF_0, TMP20);
03810 vis_mul8x16au(REF_S4, CONST_256, REF_0);
03811
03812 vis_padd16(TMP22, REF_2, TMP22);
03813 vis_pack16(TMP20, DST_2);
03814
03815 vis_pack16(TMP22, DST_3);
03816 vis_st64_2(DST_2, dest, 8);
03817 dest += stride;
03818
03819 vis_ld64_2(dest, 8, DST_2);
03820 vis_mul8x16al(DST_0, CONST_1024, TMP30);
03821 vis_pmerge(ZERO, REF_S4_1, REF_2);
03822
03823 vis_mul8x16al(DST_1, CONST_1024, TMP32);
03824 vis_padd16(REF_4, TMP0, TMP8);
03825
03826 vis_mul8x16au(REF_S6, CONST_256, REF_4);
03827 vis_padd16(REF_6, TMP2, TMP10);
03828
03829 vis_mul8x16au(REF_S6_1, CONST_256, REF_6);
03830 vis_padd16(TMP8, TMP12, TMP8);
03831
03832 vis_padd16(TMP10, TMP14, TMP10);
03833
03834 vis_padd16(TMP8, TMP30, TMP8);
03835
03836 vis_padd16(TMP10, TMP32, TMP10);
03837 vis_pack16(TMP8, DST_0);
03838
03839 vis_pack16(TMP10, DST_1);
03840 vis_st64(DST_0, dest[0]);
03841
03842 vis_padd16(REF_0, TMP4, REF_0);
03843
03844 vis_mul8x16al(DST_2, CONST_1024, TMP30);
03845 vis_padd16(REF_2, TMP6, REF_2);
03846
03847 vis_mul8x16al(DST_3, CONST_1024, TMP32);
03848 vis_padd16(REF_0, REF_4, REF_0);
03849
03850 vis_padd16(REF_2, REF_6, REF_2);
03851
03852 vis_padd16(REF_0, TMP30, REF_0);
03853
03854
03855
03856 vis_padd16(REF_2, TMP32, REF_2);
03857 vis_pack16(REF_0, DST_2);
03858
03859 vis_pack16(REF_2, DST_3);
03860 vis_st64_2(DST_2, dest, 8);
03861 dest += stride;
03862 } while (--height);
03863 }
03864
03865 static void MC_avg_no_round_xy_8_vis (uint8_t * dest, const uint8_t * _ref,
03866 const int stride, int height)
03867 {
03868 uint8_t *ref = (uint8_t *) _ref;
03869 unsigned long off = (unsigned long) ref & 0x7;
03870 unsigned long off_plus_1 = off + 1;
03871 int stride_8 = stride + 8;
03872
03873 vis_set_gsr(4 << VIS_GSR_SCALEFACT_SHIFT);
03874
03875 ref = vis_alignaddr(ref);
03876
03877 vis_ld64(ref[0], TMP0);
03878 vis_fzero(ZERO);
03879
03880 vis_ld64_2(ref, 8, TMP2);
03881
03882 vis_ld64(constants6[0], CONST_6);
03883
03884 vis_ld64(constants256_1024[0], CONST_256);
03885 vis_faligndata(TMP0, TMP2, REF_S0);
03886
03887 if (off != 0x7) {
03888 vis_alignaddr_g0((void *)off_plus_1);
03889 vis_faligndata(TMP0, TMP2, REF_S2);
03890 } else {
03891 vis_src1(TMP2, REF_S2);
03892 }
03893
03894 height >>= 1;
03895 do {
03896 vis_ld64_2(ref, stride, TMP0);
03897 vis_mul8x16au(REF_S0, CONST_256, TMP8);
03898 vis_pmerge(ZERO, REF_S0_1, TMP10);
03899
03900 vis_ld64_2(ref, stride_8, TMP2);
03901 ref += stride;
03902 vis_mul8x16au(REF_S2, CONST_256, TMP12);
03903 vis_pmerge(ZERO, REF_S2_1, TMP14);
03904
03905 vis_alignaddr_g0((void *)off);
03906
03907 vis_ld64_2(ref, stride, TMP4);
03908 vis_faligndata(TMP0, TMP2, REF_S4);
03909
03910 vis_ld64_2(ref, stride_8, TMP6);
03911 ref += stride;
03912
03913 vis_ld64(dest[0], DST_0);
03914 vis_faligndata(TMP4, TMP6, REF_S0);
03915
03916 vis_ld64_2(dest, stride, DST_2);
03917
03918 if (off != 0x7) {
03919 vis_alignaddr_g0((void *)off_plus_1);
03920 vis_faligndata(TMP0, TMP2, REF_S6);
03921 vis_faligndata(TMP4, TMP6, REF_S2);
03922 } else {
03923 vis_src1(TMP2, REF_S6);
03924 vis_src1(TMP6, REF_S2);
03925 }
03926
03927 vis_mul8x16al(DST_0, CONST_1024, TMP30);
03928 vis_pmerge(ZERO, REF_S4, TMP22);
03929
03930 vis_mul8x16al(DST_1, CONST_1024, TMP32);
03931 vis_pmerge(ZERO, REF_S4_1, TMP24);
03932
03933 vis_mul8x16au(REF_S6, CONST_256, TMP26);
03934 vis_pmerge(ZERO, REF_S6_1, TMP28);
03935
03936 vis_mul8x16au(REF_S0, CONST_256, REF_S4);
03937 vis_padd16(TMP22, CONST_6, TMP22);
03938
03939 vis_mul8x16au(REF_S0_1, CONST_256, REF_S6);
03940 vis_padd16(TMP24, CONST_6, TMP24);
03941
03942 vis_mul8x16al(DST_2, CONST_1024, REF_0);
03943 vis_padd16(TMP22, TMP26, TMP22);
03944
03945 vis_mul8x16al(DST_3, CONST_1024, REF_2);
03946 vis_padd16(TMP24, TMP28, TMP24);
03947
03948 vis_mul8x16au(REF_S2, CONST_256, TMP26);
03949 vis_padd16(TMP8, TMP22, TMP8);
03950
03951 vis_mul8x16au(REF_S2_1, CONST_256, TMP28);
03952 vis_padd16(TMP10, TMP24, TMP10);
03953
03954 vis_padd16(TMP8, TMP12, TMP8);
03955
03956 vis_padd16(TMP10, TMP14, TMP10);
03957
03958 vis_padd16(TMP8, TMP30, TMP8);
03959
03960 vis_padd16(TMP10, TMP32, TMP10);
03961 vis_pack16(TMP8, DST_0);
03962
03963 vis_pack16(TMP10, DST_1);
03964 vis_st64(DST_0, dest[0]);
03965 dest += stride;
03966
03967 vis_padd16(REF_S4, TMP22, TMP12);
03968
03969 vis_padd16(REF_S6, TMP24, TMP14);
03970
03971 vis_padd16(TMP12, TMP26, TMP12);
03972
03973 vis_padd16(TMP14, TMP28, TMP14);
03974
03975 vis_padd16(TMP12, REF_0, TMP12);
03976
03977 vis_padd16(TMP14, REF_2, TMP14);
03978 vis_pack16(TMP12, DST_2);
03979
03980 vis_pack16(TMP14, DST_3);
03981 vis_st64(DST_2, dest[0]);
03982 dest += stride;
03983 } while (--height);
03984 }
03985
03986
03987
03988 #define ACCEL_SPARC_VIS 1
03989 #define ACCEL_SPARC_VIS2 2
03990
03991 static int vis_level ()
03992 {
03993 int accel = 0;
03994 accel |= ACCEL_SPARC_VIS;
03995 accel |= ACCEL_SPARC_VIS2;
03996 return accel;
03997 }
03998
03999
04000 void dsputil_init_vis(DSPContext* c, AVCodecContext *avctx)
04001 {
04002
04003 int accel = vis_level ();
04004
04005 if (accel & ACCEL_SPARC_VIS) {
04006 if(avctx->idct_algo==FF_IDCT_SIMPLEVIS){
04007 c->idct_put = ff_simple_idct_put_vis;
04008 c->idct_add = ff_simple_idct_add_vis;
04009 c->idct = ff_simple_idct_vis;
04010 c->idct_permutation_type = FF_TRANSPOSE_IDCT_PERM;
04011 }
04012
04013 c->put_pixels_tab[0][0] = MC_put_o_16_vis;
04014 c->put_pixels_tab[0][1] = MC_put_x_16_vis;
04015 c->put_pixels_tab[0][2] = MC_put_y_16_vis;
04016 c->put_pixels_tab[0][3] = MC_put_xy_16_vis;
04017
04018 c->put_pixels_tab[1][0] = MC_put_o_8_vis;
04019 c->put_pixels_tab[1][1] = MC_put_x_8_vis;
04020 c->put_pixels_tab[1][2] = MC_put_y_8_vis;
04021 c->put_pixels_tab[1][3] = MC_put_xy_8_vis;
04022
04023 c->avg_pixels_tab[0][0] = MC_avg_o_16_vis;
04024 c->avg_pixels_tab[0][1] = MC_avg_x_16_vis;
04025 c->avg_pixels_tab[0][2] = MC_avg_y_16_vis;
04026 c->avg_pixels_tab[0][3] = MC_avg_xy_16_vis;
04027
04028 c->avg_pixels_tab[1][0] = MC_avg_o_8_vis;
04029 c->avg_pixels_tab[1][1] = MC_avg_x_8_vis;
04030 c->avg_pixels_tab[1][2] = MC_avg_y_8_vis;
04031 c->avg_pixels_tab[1][3] = MC_avg_xy_8_vis;
04032
04033 c->put_no_rnd_pixels_tab[0][0] = MC_put_no_round_o_16_vis;
04034 c->put_no_rnd_pixels_tab[0][1] = MC_put_no_round_x_16_vis;
04035 c->put_no_rnd_pixels_tab[0][2] = MC_put_no_round_y_16_vis;
04036 c->put_no_rnd_pixels_tab[0][3] = MC_put_no_round_xy_16_vis;
04037
04038 c->put_no_rnd_pixels_tab[1][0] = MC_put_no_round_o_8_vis;
04039 c->put_no_rnd_pixels_tab[1][1] = MC_put_no_round_x_8_vis;
04040 c->put_no_rnd_pixels_tab[1][2] = MC_put_no_round_y_8_vis;
04041 c->put_no_rnd_pixels_tab[1][3] = MC_put_no_round_xy_8_vis;
04042
04043 c->avg_no_rnd_pixels_tab[0][0] = MC_avg_no_round_o_16_vis;
04044 c->avg_no_rnd_pixels_tab[0][1] = MC_avg_no_round_x_16_vis;
04045 c->avg_no_rnd_pixels_tab[0][2] = MC_avg_no_round_y_16_vis;
04046 c->avg_no_rnd_pixels_tab[0][3] = MC_avg_no_round_xy_16_vis;
04047
04048 c->avg_no_rnd_pixels_tab[1][0] = MC_avg_no_round_o_8_vis;
04049 c->avg_no_rnd_pixels_tab[1][1] = MC_avg_no_round_x_8_vis;
04050 c->avg_no_rnd_pixels_tab[1][2] = MC_avg_no_round_y_8_vis;
04051 c->avg_no_rnd_pixels_tab[1][3] = MC_avg_no_round_xy_8_vis;
04052 }
04053 }