aboutsummaryrefslogtreecommitdiff
path: root/mt/vvadd3.c
blob: d18d2de01b7a64f17502d217f2515bfe61c76db1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "stdlib.h"
#include "dataset.h"

void __attribute__((noinline)) vvadd(int coreid, int ncores, size_t n, const data_t* x, const data_t* y, data_t* z)
{
  data_t* to = &z[coreid * (n / ncores)];
  const data_t* from1 = &x[coreid * (n / ncores)];
  const data_t* from2 = &y[coreid * (n / ncores)];
  size_t count = n / ncores;
  size_t c = (count + 7) / 8;
  switch(count % 8) {
    case 0: do {  *to++ = *from1++ + *from2++;
    case 7:       *to++ = *from1++ + *from2++;
    case 6:       *to++ = *from1++ + *from2++;
    case 5:       *to++ = *from1++ + *from2++;
    case 4:       *to++ = *from1++ + *from2++;
    case 3:       *to++ = *from1++ + *from2++;
    case 2:       *to++ = *from1++ + *from2++;
    case 1:       *to++ = *from1++ + *from2++;
  } while(--c > 0);
  }
}