swar-add-4x8b.c 1.75 KB
/* Assembler needs option --has-swar */
//A: '--has-swar'

#include <stdint.h>

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

#define ALEN  40

uint8_t input_a[ALEN] = { 111,  91,  82, 178,  12, 161, 183,  93,
                          214, 179, 173, 247, 121, 253, 143, 139,
                           45,  28, 246, 117, 103, 205, 231, 240,
                           68, 221, 150,   5,  81,  47,  78,  74,
                          167, 203, 230, 184, 190,  65, 113, 199};
uint8_t input_b[ALEN] = { 191, 122, 238,  38,   8, 130, 249,  86,
                           62, 179,  56, 250, 193,  51, 174, 221,
                          228,  84,  25,  18, 180, 252, 125,  67,
                          119, 154, 169, 109, 148,  73,  46, 103,
                           29,  44, 247, 200,  95,  23, 192, 236};
uint8_t output_zU8[ALEN];
uint8_t output_zS4x8b[ALEN];

void do_as_uint8(void)
{
  uint8_t *pa = input_a;
  uint8_t *pb = input_b;
  uint8_t *pz = output_zU8;

  for(int i=0;i<ALEN;++i) {
    pz[i] = pa[i] + pb[i];
  }
}

void do_as_s4x8b(void)
{
  s4x8b *pa = (s4x8b *)input_a;
  s4x8b *pb = (s4x8b *)input_b;
  s4x8b *pz = (s4x8b *)output_zS4x8b;
  for(int i=0;i<ALEN/4;++i) {
    pz[i] = pa[i] + pb[i];
  }
}

int main(void)
{
  int fail = 0;
  /* clear results */
  for(int i=0;i<ALEN;++i) {
    output_zU8[i] = 0;
    output_zS4x8b[i] = 0;
  }

  /* compute as separated U8 */
  do_as_uint8();

  /* compute as swar s4x8b */
  do_as_s4x8b();

  /* display variables */
//  printf("Data before (a,b, z1, z2):\n");
//  for(int i=0;i<ALEN;++i) {
//    printf(" #%d: %u , %u , %u , %u\n", i, input_a[i], input_b[i], output_zU8[i], output_zS4x8b[i]);
//  }

  for(int i=0;i<ALEN;++i) {
    if (output_zU8[i]!=output_zS4x8b[i]) {
      fail++;
    }
  }

  return fail;
}