aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/gcc.target/powerpc/p8vector-builtin-5.c
blob: 36de9eb9bf0c7aec495e3994d2bccab38fbf83fe (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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/* { dg-do compile { target { powerpc*-*-* } } } */
/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
/* { dg-require-effective-target powerpc_p8vector_ok } */
/* { dg-options "-mcpu=power8 -O2 -ftree-vectorize -fvect-cost-model=dynamic -fno-unroll-loops -fno-unroll-all-loops" } */

#include <altivec.h>

#ifndef SIZE
#define SIZE 1024
#endif

#ifndef ALIGN
#define ALIGN 32
#endif

#ifndef ATTR_ALIGN
#define ATTR_ALIGN __attribute__((__aligned__(ALIGN)))
#endif

#define DOIT(TYPE, PREFIX)						\
TYPE PREFIX ## _eqv_builtin (TYPE a, TYPE b)				\
{									\
  return vec_eqv (a, b);						\
}									\
									\
TYPE PREFIX ## _eqv_arith (TYPE a, TYPE b)				\
{									\
  return ~(a ^ b);							\
}									\
									\
TYPE PREFIX ## _nand_builtin (TYPE a, TYPE b)				\
{									\
  return vec_nand (a, b);						\
}									\
									\
TYPE PREFIX ## _nand_arith1 (TYPE a, TYPE b)				\
{									\
  return ~(a & b);							\
}									\
									\
TYPE PREFIX ## _nand_arith2 (TYPE a, TYPE b)				\
{									\
  return (~a) | (~b);							\
}									\
									\
TYPE PREFIX ## _orc_builtin (TYPE a, TYPE b)				\
{									\
  return vec_orc (a, b);						\
}									\
									\
TYPE PREFIX ## _orc_arith1 (TYPE a, TYPE b)				\
{									\
  return (~ a) | b;							\
}									\
									\
TYPE PREFIX ## _orc_arith2 (TYPE a, TYPE b)				\
{									\
  return a | (~ b);							\
}

#define DOIT_FLOAT(TYPE, PREFIX)					\
TYPE PREFIX ## _eqv_builtin (TYPE a, TYPE b)				\
{									\
  return vec_eqv (a, b);						\
}									\
									\
TYPE PREFIX ## _nand_builtin (TYPE a, TYPE b)				\
{									\
  return vec_nand (a, b);						\
}									\
									\
TYPE PREFIX ## _orc_builtin (TYPE a, TYPE b)				\
{									\
  return vec_orc (a, b);						\
}

typedef vector signed char		sign_char_vec;
typedef vector short			sign_short_vec;
typedef vector int			sign_int_vec;
typedef vector long long		sign_llong_vec;

typedef vector unsigned char		uns_char_vec;
typedef vector unsigned short		uns_short_vec;
typedef vector unsigned int		uns_int_vec;
typedef vector unsigned long long	uns_llong_vec;

typedef vector float			float_vec;
typedef vector double			double_vec;

DOIT(sign_char_vec,	sign_char)
DOIT(sign_short_vec,	sign_short)
DOIT(sign_int_vec,	sign_int)
DOIT(sign_llong_vec,	sign_llong)

DOIT(uns_char_vec,	uns_char)
DOIT(uns_short_vec,	uns_short)
DOIT(uns_int_vec,	uns_int)
DOIT(uns_llong_vec,	uns_llong)

DOIT_FLOAT(float_vec,	float)
DOIT_FLOAT(double_vec,	double)

/* { dg-final { scan-assembler-times "xxleqv"  18 } } */
/* { dg-final { scan-assembler-times "xxlnand" 26 } } */
/* { dg-final { scan-assembler-times "xxlorc"  26 } } */