summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/i386/sse4_2-popcnt.h
blob: ce06ba1b8d02efcaa8daaeb97d6703a3feda52e5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "sse4_2-check.h"

#include <nmmintrin.h>

#define NUM 1024

static int
compute_popcnt (TYPE v)
{
  int ret;
  int i;

 ret = 0;
 for (i = 0; i < sizeof(v) * 8; i++)
   if ((v & ((TYPE)1 << (TYPE) i)))
     ret++;

 return ret;
}

static void
sse4_2_test (void)
{
  int i;
  TYPE vals[NUM];
  TYPE res;

 for (i = 0; i < NUM; i++)
   {
     vals[i] = rand ();
     if (sizeof (TYPE) > 4)
       vals[i] |= (TYPE)rand() << (TYPE)(sizeof (TYPE) * 4);
   }

 for (i=0; i < NUM; i++)
   { 
     res = POPCNT (vals[i]);
     if (res != compute_popcnt (vals[i]))
       abort ();
   }
}