swar-pragma.c 1.71 KB
////A: --has-swar
//C: -daiteq-swar-enable

#define NUMELMS           20
#define BITSZ             8

typedef unsigned int swpack __attribute__((subword(BITSZ)));
typedef unsigned int swelm __attribute__((subword(BITSZ,1)));

#define PACKING           (32/BITSZ)
#define ARRAY_SIZE ((NUMELMS+PACKING-1)/PACKING)


//const swpack a[ARRAY_SIZE] = {{1,2,3,4,5,6,7,0,1,2}, {1,3,5,7,0,2,4,6,2,3}};
//const swpack b[ARRAY_SIZE] = {{1,1,1,1,1,1,1,1,1,1}, {7,3,5,1,6,4,2,0,5,3}};
const swpack a[ARRAY_SIZE] = {{1,2,3,4},{5,6,7,0},{1,2,1,3},{5,7,0,2},{4,6,2,3}};
const swpack b[ARRAY_SIZE] = {{1,1,1,1},{1,1,1,1},{1,1,7,3},{5,1,6,4},{2,0,5,3}};
swpack z[ARRAY_SIZE];

void do_add(unsigned n, swpack a[], swpack b[], swpack z[])
{
  for(unsigned i=0;i<n;++i) { /* curly braces are necessary for generation of builtin_swarctrl */
    z[i] = a[i] + b[i];
  }
}

void do_add_sat(unsigned n, swpack *a, swpack *b, swpack *z)
{
  #pragma swar saturate
  for(unsigned i=0;i<n;++i) {
    z[i] = a[i] + b[i];
  }
}

void do_add_red(unsigned n, swpack *a, swpack *b, swpack *z)
{
  #pragma swar reduce
  for(unsigned i=0;i<n;++i) {
    z[i] = a[i] + b[i];
  }
}

void do_add_sat_red(unsigned n, swpack *a, swpack *b, swpack *z)
{
  #pragma swar reduce
  #pragma swar saturate
  for(unsigned i=0;i<n;++i) {
    z[i] = a[i] + b[i];
  }
}



int main(void)
{
//  unsigned int a;
  

  do_add(10, a, b, z);
  do_add_sat(10, a, b, z);
  do_add_red(10, a, b, z);
  do_add_sat_red(10, a, b, z);

  //{
    //__builtin_swarctrl(1);

    //#pragma swar saturate
    //__builtin_swarctrl(8);
    //#pragma swar reduce
    //__builtin_swarctrl(4);

    //{
      //#pragma swar normalize
      //__builtin_swarctrl(16);
    //}
  //}

  //__builtin_swarctrl(0);
  

  return 0;
}