changeset 6062:9d1590a4df90 libavcodec

Partially address issue299, no performance change apparently
author lu_zero
date Sat, 22 Dec 2007 15:17:46 +0000
parents 95ac40977cf7
children 47ed1b9610b1
files ppc/h264_template_altivec.c
diffstat 1 files changed, 42 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/ppc/h264_template_altivec.c	Sat Dec 22 03:39:53 2007 +0000
+++ b/ppc/h264_template_altivec.c	Sat Dec 22 15:17:46 2007 +0000
@@ -51,6 +51,27 @@
         dst += stride;\
         src += stride;
 
+#define CHROMA_MC8_ALTIVEC_CORE_SIMPLE \
+        vsrc2ssH = (vec_s16_t)vec_mergeh(zero_u8v,(vec_u8_t)vsrc2uc);\
+\
+        psum = vec_mladd(vA, vsrc0ssH, v32ss);\
+        psum = vec_mladd(vB, vsrc1ssH, psum);\
+        psum = vec_mladd(vC, vsrc2ssH, psum);\
+        psum = vec_sr(psum, v6us);\
+\
+        vdst = vec_ld(0, dst);\
+        ppsum = (vec_u8_t)vec_pack(psum, psum);\
+        vfdst = vec_perm(vdst, ppsum, fperm);\
+\
+        OP_U8_ALTIVEC(fsum, vfdst, vdst);\
+\
+        vec_st(fsum, 0, dst);\
+\
+        vsrc0ssH = vsrc1ssH;\
+        vsrc1ssH = vsrc2ssH;\
+\
+        dst += stride;\
+        src += stride;
 
 void PREFIX_h264_chroma_mc8_altivec(uint8_t * dst, uint8_t * src, int stride, int h, int x, int y) {
   POWERPC_PERF_DECLARE(PREFIX_h264_chroma_mc8_num, 1);
@@ -109,6 +130,7 @@
     vsrc0ssH = (vec_s16_t)vec_mergeh(zero_u8v,(vec_u8_t)vsrc0uc);
     vsrc1ssH = (vec_s16_t)vec_mergeh(zero_u8v,(vec_u8_t)vsrc1uc);
 
+    if (ABCD[3]) {
     if (!loadSecond) {// -> !reallyBadAlign
         for (i = 0 ; i < h ; i++) {
             vsrcCuc = vec_ld(stride + 0, src);
@@ -131,6 +153,26 @@
             CHROMA_MC8_ALTIVEC_CORE
         }
     }
+    } else {
+    if (!loadSecond) {// -> !reallyBadAlign
+        for (i = 0 ; i < h ; i++) {
+            vsrcCuc = vec_ld(stride + 0, src);
+            vsrc2uc = vec_perm(vsrcCuc, vsrcCuc, vsrcperm0);
+
+            CHROMA_MC8_ALTIVEC_CORE_SIMPLE
+        }
+    } else {
+        vec_u8_t vsrcDuc;
+        for (i = 0 ; i < h ; i++) {
+            vsrcCuc = vec_ld(stride + 0, src);
+            vsrcDuc = vec_ld(stride + 16, src);
+            vsrc2uc = vec_perm(vsrcCuc, vsrcDuc, vsrcperm0);
+
+            CHROMA_MC8_ALTIVEC_CORE_SIMPLE
+        }
+    }
+
+    }
     POWERPC_PERF_STOP_COUNT(PREFIX_h264_chroma_mc8_num, 1);
 }