summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/aarch64/sve_vec_bool_cmp_1.c
blob: d94cbb37b6ae39666e5ffb949751a6d3b072763f (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
/* { dg-do compile } */
/* { dg-options "-O2 -ftree-vectorize -march=armv8-a+sve" } */

#include <stdint.h>
#include <stdbool.h>

#define VEC_BOOL(NAME, OP, VARTYPE, INDUCTYPE)				\
void __attribute__ ((noinline, noclone))				\
vec_bool_##NAME##_##VARTYPE##_##INDUCTYPE (VARTYPE *dst, VARTYPE *src,	\
					   INDUCTYPE start,		\
					   INDUCTYPE n,			\
					   INDUCTYPE mask)		\
{									\
  for (INDUCTYPE i = 0; i < n; i++)					\
    {									\
      bool lhs = i >= start;						\
      bool rhs = (i & mask) != 0x3D;					\
      if (lhs OP rhs)							\
        dst[i] = src[i];						\
    }									\
}

#define TEST_OP(T, NAME, OP)			\
  T (NAME, OP, uint8_t, uint8_t)		\
  T (NAME, OP, uint16_t, uint16_t)		\
  T (NAME, OP, uint32_t, uint32_t)		\
  T (NAME, OP, uint64_t, uint64_t)		\
  T (NAME, OP, float, uint32_t)			\
  T (NAME, OP, double, uint64_t)

#define TEST_ALL(T)				\
  TEST_OP (T, cmpeq, ==)			\
  TEST_OP (T, cmpne, !=)

TEST_ALL (VEC_BOOL)

/* Both cmpne and cmpeq loops will contain an exclusive predicate or.  */
/* { dg-final { scan-assembler-times {\teors?\tp[0-9]*\.b, p[0-7]/z, p[0-9]*\.b, p[0-9]*\.b\n} 12 } } */
/* cmpeq will also contain a masked predicate not operation, which gets
   folded to BIC.  */
/* { dg-final { scan-assembler-times {\tbic\tp[0-9]+\.b, p[0-7]/z, p[0-9]+\.b, p[0-9]+\.b\n} 6 } } */