1 /* { dg-do compile { target { powerpc*-*-* } } } */
2 /* { dg-skip-if "" { powerpc*-*-darwin* } } */
3 /* { dg-require-effective-target powerpc_p8vector_ok } */
4 /* { dg-options "-mdejagnu-cpu=power8 -O2 -ftree-vectorize -fvect-cost-model=dynamic -fno-unroll-loops -fno-unroll-all-loops" } */
5 
6 #include <altivec.h>
7 
8 #ifndef SIZE
9 #define SIZE 1024
10 #endif
11 
12 #ifndef ALIGN
13 #define ALIGN 32
14 #endif
15 
16 #ifndef ATTR_ALIGN
17 #define ATTR_ALIGN __attribute__((__aligned__(ALIGN)))
18 #endif
19 
20 #define DOIT(TYPE, PREFIX)						\
21 TYPE PREFIX ## _eqv_builtin (TYPE a, TYPE b)				\
22 {									\
23   return vec_eqv (a, b);						\
24 }									\
25 									\
26 TYPE PREFIX ## _eqv_arith (TYPE a, TYPE b)				\
27 {									\
28   return ~(a ^ b);							\
29 }									\
30 									\
31 TYPE PREFIX ## _nand_builtin (TYPE a, TYPE b)				\
32 {									\
33   return vec_nand (a, b);						\
34 }									\
35 									\
36 TYPE PREFIX ## _nand_arith1 (TYPE a, TYPE b)				\
37 {									\
38   return ~(a & b);							\
39 }									\
40 									\
41 TYPE PREFIX ## _nand_arith2 (TYPE a, TYPE b)				\
42 {									\
43   return (~a) | (~b);							\
44 }									\
45 									\
46 TYPE PREFIX ## _orc_builtin (TYPE a, TYPE b)				\
47 {									\
48   return vec_orc (a, b);						\
49 }									\
50 									\
51 TYPE PREFIX ## _orc_arith1 (TYPE a, TYPE b)				\
52 {									\
53   return (~ a) | b;							\
54 }									\
55 									\
56 TYPE PREFIX ## _orc_arith2 (TYPE a, TYPE b)				\
57 {									\
58   return a | (~ b);							\
59 }
60 
61 #define DOIT_FLOAT(TYPE, PREFIX)					\
62 TYPE PREFIX ## _eqv_builtin (TYPE a, TYPE b)				\
63 {									\
64   return vec_eqv (a, b);						\
65 }									\
66 									\
67 TYPE PREFIX ## _nand_builtin (TYPE a, TYPE b)				\
68 {									\
69   return vec_nand (a, b);						\
70 }									\
71 									\
72 TYPE PREFIX ## _orc_builtin (TYPE a, TYPE b)				\
73 {									\
74   return vec_orc (a, b);						\
75 }
76 
77 typedef vector signed char		sign_char_vec;
78 typedef vector short			sign_short_vec;
79 typedef vector int			sign_int_vec;
80 typedef vector long long		sign_llong_vec;
81 
82 typedef vector unsigned char		uns_char_vec;
83 typedef vector unsigned short		uns_short_vec;
84 typedef vector unsigned int		uns_int_vec;
85 typedef vector unsigned long long	uns_llong_vec;
86 
87 typedef vector float			float_vec;
88 typedef vector double			double_vec;
89 
90 DOIT(sign_char_vec,	sign_char)
91 DOIT(sign_short_vec,	sign_short)
92 DOIT(sign_int_vec,	sign_int)
93 DOIT(sign_llong_vec,	sign_llong)
94 
95 DOIT(uns_char_vec,	uns_char)
96 DOIT(uns_short_vec,	uns_short)
97 DOIT(uns_int_vec,	uns_int)
98 DOIT(uns_llong_vec,	uns_llong)
99 
100 DOIT_FLOAT(float_vec,	float)
101 DOIT_FLOAT(double_vec,	double)
102 
103 /* { dg-final { scan-assembler-times "xxleqv"  18 } } */
104 /* { dg-final { scan-assembler-times "xxlnand" 26 } } */
105 /* { dg-final { scan-assembler-times "xxlorc"  26 } } */
106