aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/s390/vxe/popcount-1.c
blob: 9ea835a1cf0703ff29281f49419b39cc72f2430e (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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/* { dg-do run } */
/* { dg-options "-O3 -mzarch -march=arch12 --save-temps" } */
/* { dg-require-effective-target s390_vxe } */

/* Vectorization currently only works for v4si.  v8hi at least uses 2x
   vpopctf but no vpopcth.  */

typedef unsigned char     uv16qi __attribute__((vector_size(16)));
typedef unsigned short     uv8hi __attribute__((vector_size(16)));
typedef unsigned int       uv4si __attribute__((vector_size(16)));
typedef unsigned long long uv2di __attribute__((vector_size(16)));

uv16qi __attribute__((noinline))
vpopctb (uv16qi a)
{
  uv16qi r;
  int i;

  for (i = 0; i < 16; i++)
    r[i] = __builtin_popcount (a[i]);

  return r;
}
/* { dg-final { scan-assembler "vpopctb\t%v24,%v24" { xfail *-*-* } } } */

uv8hi __attribute__((noinline))
vpopcth (uv8hi a)
{
  uv8hi r;
  int i;

  for (i = 0; i < 8; i++)
    r[i] = __builtin_popcount (a[i]);

  return r;
}
/* { dg-final { scan-assembler "vpopcth\t%v24,%v24" { xfail *-*-* } } } */

uv4si __attribute__((noinline))
vpopctf (uv4si a)
{
  uv4si r;
  int i;

  for (i = 0; i < 4; i++)
    r[i] = __builtin_popcount (a[i]);

  return r;
}
/* { dg-final { scan-assembler "vpopctf\t%v24,%v24" } } */

uv2di __attribute__((noinline))
vpopctg (uv2di a)
{
  uv2di r;
  int i;

  for (i = 0; i < 2; i++)
    r[i] = __builtin_popcount (a[i]);

  return r;
}
/* { dg-final { scan-assembler "vpopctg\t%v24,%v24" { xfail *-*-* } } } */

int
main ()
{
  uv16qi a = (uv16qi){ 42, 1, ~0, 2, 42, 1, ~0, 2, 42, 1, ~0, 2, 42, 1, ~0, 2 };
  if (__builtin_s390_vec_any_ne (vpopctb (a),
				 (uv16qi){ 3, 1, 8, 1, 3, 1, 8, 1,
					   3, 1, 8, 1, 3, 1, 8, 1 }))
    __builtin_abort ();

  if (__builtin_s390_vec_any_ne (vpopcth ((uv8hi){ 42, 1, ~0, 2, 42, 1, ~0, 2 }),
				 (uv8hi){ 3, 1, 16, 1, 3, 1, 16, 1 }))
    __builtin_abort ();

  if (__builtin_s390_vec_any_ne (vpopctf ((uv4si){ 42, 1, ~0, 2 }),
				 (uv4si){ 3, 1, 32, 1 }))
    __builtin_abort ();

  if (__builtin_s390_vec_any_ne (vpopctg ((uv2di){ 42, 1 }),
					  (uv2di){ 3, 1 }))
      __builtin_abort ();


  return 0;
}