swar-c99-6.10.6-pragma.c 1012 Bytes
////A: --has-swar
//C: -daiteq-swar-enable

//#include <stdio.h>

typedef unsigned int s4x8b __attribute__((subword(8)));

#define LEN 12

unsigned char data_a[LEN] = {1,2,3,4,5,6,7,8,9,10,11,12};
unsigned char data_b[LEN] = {10,20,30,40,50,60,70,80,90,100,110,120};
unsigned char data_z[LEN] = {0,0,0,0,0,0,0,0,0,0,0,0};


void do_4x8b_add(void)
{
  s4x8b *a = (s4x8b *)data_a;
  s4x8b *b = (s4x8b *)data_b;
  s4x8b *z = (s4x8b *)data_z;

  #pragma swar normalize
  z[0] = a[0] + b[0];
  z[2] = a[2] + b[4];
  z[4] = a[4] + b[4];

  {
    #pragma swar saturate
    z[6] = a[6] + b[6];
#pragma swar manual
    z[8] = a[8] + b[8];
    z[10] = a[10] + b[10];
  }
}

int main(void)
{
  volatile unsigned long a;

  //__builtin_swarctrl(0);

  a = __builtin_swaraccum(0);
  a = __builtin_swaraccum(1);
  a = __builtin_swaraccum(2);
  a = __builtin_swaraccum(3);

  do_4x8b_add();

  a = __builtin_swaraccum(0);
  a = __builtin_swaraccum(1);
  a = __builtin_swaraccum(2);
  a = __builtin_swaraccum(3);

  return 0;
}