34 static void gmc1_altivec(uint8_t *dst , uint8_t *
src ,
 
   35                          int stride, 
int h, 
int x16, 
int y16, 
int rounder)
 
   40         (16 - x16) * (16 - y16), 
 
   46     register const vector 
unsigned char vczero =
 
   47         (
const vector 
unsigned char) vec_splat_u8(0);
 
   48     register const vector 
unsigned short vcsr8 =
 
   49         (
const vector 
unsigned short) vec_splat_u16(8);
 
   50     register vector 
unsigned char dstv, dstv2, srcvB, srcvC, srcvD;
 
   51     register vector 
unsigned short tempB, tempC, tempD;
 
   52     unsigned long dst_odd        = (
unsigned long) dst & 0x0000000F;
 
   53     unsigned long src_really_odd = (
unsigned long) 
src & 0x0000000F;
 
   54     register vector 
unsigned short tempA =
 
   55         vec_ld(0, (
const unsigned short *) ABCD);
 
   56     register vector 
unsigned short Av = vec_splat(tempA, 0);
 
   57     register vector 
unsigned short Bv = vec_splat(tempA, 1);
 
   58     register vector 
unsigned short Cv = vec_splat(tempA, 2);
 
   59     register vector 
unsigned short Dv = vec_splat(tempA, 3);
 
   60     register vector 
unsigned short rounderV =
 
   61         vec_splat((
vec_u16) vec_lde(0, &rounder_a), 0);
 
   66     register vector 
unsigned char src_0 = vec_ld(0, 
src);
 
   67     register vector 
unsigned char src_1 = vec_ld(16, 
src);
 
   68     register vector 
unsigned char srcvA = vec_perm(src_0, src_1,
 
   71     if (src_really_odd != 0x0000000F)
 
   74         srcvB = vec_perm(src_0, src_1, vec_lvsl(1, 
src));
 
   77     srcvA = vec_mergeh(vczero, srcvA);
 
   78     srcvB = vec_mergeh(vczero, srcvB);
 
   80     for (
i = 0; 
i < 
h; 
i++) {
 
   81         dst_odd        =   (
unsigned long) dst            & 0x0000000F;
 
   82         src_really_odd = (((
unsigned long) 
src) + 
stride) & 0x0000000F;
 
   84         dstv = vec_ld(0, dst);
 
   91         srcvC = vec_perm(src_0, src_1, vec_lvsl(
stride + 0, 
src));
 
   93         if (src_really_odd != 0x0000000F)
 
   96             srcvD = vec_perm(src_0, src_1, vec_lvsl(
stride + 1, 
src));
 
  100         srcvC = vec_mergeh(vczero, srcvC);
 
  101         srcvD = vec_mergeh(vczero, srcvD);
 
  106         tempA = vec_mladd((vector 
unsigned short) srcvA, Av, rounderV);
 
  107         tempB = vec_mladd((vector 
unsigned short) srcvB, Bv, tempA);
 
  108         tempC = vec_mladd((vector 
unsigned short) srcvC, Cv, tempB);
 
  109         tempD = vec_mladd((vector 
unsigned short) srcvD, Dv, tempC);
 
  114         tempD = vec_sr(tempD, vcsr8);
 
  116         dstv2 = vec_pack(tempD, (vector 
unsigned short) vczero);
 
  119             dstv2 = vec_perm(dstv, dstv2, vcprm(0, 1, 
s0, 
s1));
 
  121             dstv2 = vec_perm(dstv, dstv2, vcprm(
s0, 
s1, 2, 3));
 
  123         vec_st(dstv2, 0, dst);
 
  137     c->gmc1 = gmc1_altivec;