Example #1
0
void foo (vector unsigned char *vucr,
	  vector bool char *vbcr,
	  vector unsigned short *vusr,
	  vector bool short *vbsr,
	  vector unsigned int *vuir,
	  vector bool int *vbir,
	  vector unsigned long long *vulr,
	  vector bool long long *vblr,
	  vector signed __int128 *vsxr,
	  vector unsigned __int128 *vuxr,
	  vector double *vdr)
{
  *vsxr++ = vec_addc (vsxa, vsxb);
  *vuxr++ = vec_addc (vuxa, vuxb);
  *vsxr++ = vec_adde (vsxa, vsxb, vsxc);
  *vuxr++ = vec_adde (vuxa, vuxb, vuxc);
  *vsxr++ = vec_addec (vsxa, vsxb, vsxc);
  *vuxr++ = vec_addec (vuxa, vuxb, vuxc);
  *vucr++ = vec_bperm (vuca, vucb);
  *vulr++ = vec_bperm (vuxa, vucb);
  *vbcr++ = vec_eqv (vbca, vbcb);
  *vbir++ = vec_eqv (vbia, vbib);
  *vblr++ = vec_eqv (vbla, vblb);
  *vbsr++ = vec_eqv (vbsa, vbsb);
  *vucr++ = vec_gb (vuca);
  *vbcr++ = vec_nand (vbca, vbcb);
  *vbir++ = vec_nand (vbia, vbib);
  *vblr++ = vec_nand (vbla, vblb);
  *vbsr++ = vec_nand (vbsa, vbsb);
  *vbcr++ = vec_orc (vbca, vbcb);
  *vbir++ = vec_orc (vbia, vbib);
  *vblr++ = vec_orc (vbla, vblb);
  *vbsr++ = vec_orc (vbsa, vbsb);
  *vblr++ = vec_perm (vbla, vblb, vucc);
  *vusr++ = vec_pmsum_be (vuca, vucb);
  *vuir++ = vec_pmsum_be (vusa, vusb);
  *vulr++ = vec_pmsum_be (vuia, vuib);
  *vuxr++ = vec_pmsum_be (vula, vulb);
  *vuir++ = vec_shasigma_be (vuia, 0, 1);
  *vulr++ = vec_shasigma_be (vula, 0, 1);
}
Example #2
0
File: 3a-01.c Project: 0day-ci/gcc
static vector unsigned int
f(vector unsigned int a, vector unsigned int b) 
{
  return vec_addc(a,b);
}
unsigned long long sumsq_av(signed short *in,int cnt){
  long long sum;
  vector signed short x;
  vector unsigned int sums,carries,s1,s2;
  int pad;
  union { vector unsigned char cv; vector unsigned int iv; unsigned int w[4]; unsigned char c[16];} s;

  carries = sums = (vector unsigned int)(0);
  if((pad = (int)in & 15)!=0){
    /* Load unaligned leading word */
    x = vec_perm(vec_ld(0,in),(vector signed short)(0),vec_lvsl(0,in));
    if(cnt < 8){ /* Shift right to chop stuff beyond end of short block */
      s.c[15] = (8-cnt)<<4;
      x = vec_sro(x,s.cv);
    }
    sums = (vector unsigned int)vec_msum(x,x,(vector signed int)(0));
    in += 8-pad/2;
    cnt -= 8-pad/2;
  }
  /* Everything is now aligned, rip through most of the block */
  while(cnt >= 8){
    x = vec_ld(0,in);
    /* A single vec_msum cannot overflow, but we have to sum it with
     * the earlier terms separately to handle the carries
     * The cast to unsigned is OK because squares are always positive
     */
    s1 = (vector unsigned int)vec_msum(x,x,(vector signed int)(0));
    carries = vec_add(carries,vec_addc(sums,s1));
    sums = vec_add(sums,s1);
    in += 8;
    cnt -= 8;
  }
  /* Handle trailing fragment, if any */
  if(cnt > 0){
    x = vec_ld(0,in);
    s.c[15] = (8-cnt)<<4;
    x = vec_sro(x,s.cv);
    s1 = (vector unsigned int)vec_msum(x,x,(vector signed int)(0));
    carries = vec_add(carries,vec_addc(sums,s1));
    sums = vec_add(sums,s1);
  }
  /* Combine 4 sub-sums and carries */
  s.c[15] = 64; /* Shift right two 32-bit words */
  s1 = vec_sro(sums,s.cv);
  s2 = vec_sro(carries,s.cv);
  carries = vec_add(carries,vec_addc(sums,s1));
  sums = vec_add(sums,s1);
  carries = vec_add(carries,s2);

  s.c[15] = 32; /* Shift right one 32-bit word */
  s1 = vec_sro(sums,s.cv);
  s2 = vec_sro(carries,s.cv);
  carries = vec_add(carries,vec_addc(sums,s1));
  sums = vec_add(sums,s1);
  carries = vec_add(carries,s2);

  /* Extract sum and carries from right-hand words and combine into result */
  s.iv = sums;
  sum = s.w[3];

  s.iv = carries;
  sum += (long long)s.w[3] << 32;

  return sum;
}
Example #4
0
File: 3b-10.c Project: 0day-ci/gcc
x f (x a)
{
  return vec_addc(a,a); 
}