------- Comment #10 from bonzini at gcc dot gnu dot org  2005-10-11 11:38 
-------
This is as small as I could make it.  Any other attempt to hoist something
causes it not to fail anymore (at -maltivec -O2).  Interesting, given that GCSE
*does* the hoisting...

It's a reload problem.



typedef __attribute__((vector_size (16))) unsigned char vec;
void H_Pass_16_Altivec_C(vec vec_src, vec firs, vec sums1, vec sums2,
                         vec *FIR_Tab_16, unsigned char *Src)
{
  vec tmp, spltb3, spltb4, spltb5, spltb6, mrghb3, mrglb3, mrghb4, mrglb4,
    mrghb5, mrglb5, mrghb6, mrglb6, firs0, firs1, firs2, firs3, upkhb0, upklb0,
    upkhb1, upklb1, upkhb2, upklb2, upkhb3, upklb3, upkhb4, spltb7, mrghb7,
    mrglb7, firs4, spltb8, mrghb8, mrglb8, upklb4;

  spltb3 = __builtin_altivec_vspltb (vec_src, 3);
  spltb4 = __builtin_altivec_vspltb (vec_src, 4);
  spltb5 = __builtin_altivec_vspltb (vec_src, 5);
  spltb6 = __builtin_altivec_vspltb (vec_src, 6);
  mrghb3 = __builtin_altivec_vmrghb (spltb3, spltb3);
  mrglb3 = __builtin_altivec_vmrglb (spltb3, spltb3);
  mrghb4 = __builtin_altivec_vmrghb (spltb4, spltb4);
  mrglb4 = __builtin_altivec_vmrglb (spltb4, spltb4);
  mrghb5 = __builtin_altivec_vmrghb (spltb5, spltb5);
  mrglb5 = __builtin_altivec_vmrglb (spltb5, spltb5);
  mrghb6 = __builtin_altivec_vmrghb (spltb6, spltb6);
  mrglb6 = __builtin_altivec_vmrglb (spltb6, spltb6);
  firs0 = FIR_Tab_16[0];
  firs1 = FIR_Tab_16[1];
  firs2 = FIR_Tab_16[2];
  firs3 = FIR_Tab_16[3];
  upkhb0 = __builtin_altivec_vupkhsb (firs0);
  upklb0 = __builtin_altivec_vupklsb (firs0);
  upkhb1 = __builtin_altivec_vupkhsb (firs1);
  upklb1 = __builtin_altivec_vupklsb (firs1);
  upkhb2 = __builtin_altivec_vupkhsb (firs2);
  upklb2 = __builtin_altivec_vupklsb (firs2);
  upkhb3 = __builtin_altivec_vupkhsb (firs3);
  upklb3 = __builtin_altivec_vupklsb (firs3);
  upkhb4 = __builtin_altivec_vupkhsb (firs);
  *(char *) &tmp = (char) *(Src + 16);
L0:
  sums1 = __builtin_altivec_vmladduhm (mrghb3, upkhb4, sums1);
  sums2 = __builtin_altivec_vmladduhm (mrglb3, upkhb4, sums2);
  sums1 = __builtin_altivec_vmladduhm (mrghb4, upkhb0, sums1);
  sums2 = __builtin_altivec_vmladduhm (mrglb4, upklb0, sums2);
  sums1 = __builtin_altivec_vmladduhm (mrghb5, upkhb1, sums1);
  sums2 = __builtin_altivec_vmladduhm (mrglb5, upklb1, sums2);
  sums1 = __builtin_altivec_vmladduhm (mrghb6, upkhb2, sums1);
  sums2 = __builtin_altivec_vmladduhm (mrglb6, upklb2, sums2);
  spltb7 = __builtin_altivec_vspltb (vec_src, 7);
  mrghb7 = __builtin_altivec_vmrghb (spltb7, spltb7);
  sums1 = __builtin_altivec_vmladduhm (mrghb7, upkhb3, sums1);
  mrglb7 = __builtin_altivec_vmrglb (spltb7, spltb7);
  sums2 = __builtin_altivec_vmladduhm (mrglb7, upklb3, sums2);
  firs4 = FIR_Tab_16[4];
  spltb8 = __builtin_altivec_vspltb (vec_src, 8);
  mrghb8 = __builtin_altivec_vmrghb (spltb8, spltb8);
  upkhb4 = __builtin_altivec_vupkhsb (firs4);
  sums1 = __builtin_altivec_vmladduhm (mrghb8, upkhb4, sums1);
  mrglb8 = __builtin_altivec_vmrglb ((vec)tmp, spltb8);
  upklb4 = __builtin_altivec_vupklsb (firs4);
  sums2 = __builtin_altivec_vmladduhm (mrglb8, upklb4, sums2);
  tmp = __builtin_altivec_vspltish (5);
  sums1 = __builtin_altivec_vsrah (sums1, tmp);
  __builtin_altivec_vpkshus (sums1, sums2);
  goto L0;
}


-- 

bonzini at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
 GCC target triplet|powerpc-*-linux-gnu         |powerpc-*-*


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24230

Reply via email to