1 /* This test code is included into vsx-vector-6.p7.c, vsx-vector-6.p8.c
2    and vsx-vector-6.p9.c.  The .c files have the tests for the number
3    of instructions generated for each cpu type.  */
4 
5 #include <altivec.h>
6 
7 typedef struct {
8   vector double d;
9   vector float f;
10   vector long sl;
11   vector int si;
12   vector short ss;
13   vector char sc;
14   vector unsigned int ui;
15   vector unsigned short int us;
16   vector unsigned char uc;
17   vector bool long long bll;
18   vector bool long bl;
19   vector bool int bi;
20   vector bool short bs;
21   vector bool char bc;
22 } opnd_t;
23 
24 void
func_1op(opnd_t * dst,opnd_t * src)25 func_1op (opnd_t *dst, opnd_t *src)
26 {
27   dst[0].d = vec_abs (src[0].d);
28   dst[1].d = vec_ceil (src[1].d);
29   dst[2].d = vec_floor (src[2].d);
30   dst[3].d = vec_nearbyint (src[3].d);
31   dst[4].d = vec_rint (src[4].d);
32   dst[5].d = vec_sqrt (src[5].d);
33   dst[6].d = vec_trunc (src[6].d);
34   dst[7].f = vec_trunc (src[7].f);
35 }
36 
37 void
func_2op(opnd_t * dst,opnd_t * src0,opnd_t * src1)38 func_2op (opnd_t *dst, opnd_t *src0, opnd_t *src1)
39 {
40   dst[0].d = vec_add (src0[0].d, src1[0].d);
41   dst[1].d = vec_div (src0[1].d, src1[1].d);
42   dst[2].d = vec_max (src0[2].d, src1[2].d);
43   dst[3].uc = vec_max (src0[3].uc, src1[3].uc);
44   dst[4].d = vec_min (src0[4].d, src1[4].d);
45   dst[5].d = vec_mul (src0[5].d, src1[5].d);
46   dst[6].d = vec_sub (src0[6].d, src1[6].d);
47 }
48 
49 void
func_2lop(opnd_t * dst,opnd_t * src0,opnd_t * src1)50 func_2lop (opnd_t *dst, opnd_t *src0, opnd_t *src1)
51 {
52   dst[0].d = vec_and (src0[0].d, src1[0].d);
53   dst[1].d = vec_and (src0[1].d, src1[1].bl);
54   dst[2].d = vec_and (src0[2].bl, src1[2].d);
55 
56   dst[3].d = vec_andc (src0[3].d, src1[3].d);
57   dst[4].d = vec_andc (src0[4].d, src1[4].bl);
58   dst[5].d = vec_andc (src0[5].bl, src1[5].d);
59   dst[6].d = vec_andc (src0[6].bll, src1[6].d);
60   dst[7].d = vec_andc (src0[7].d, src1[7].bll);
61   dst[8].bi = vec_andc (src0[8].bi, src1[8].bi);
62   dst[9].bs = vec_andc (src0[9].bs, src1[9].bs);
63   dst[10].bc = vec_andc (src0[10].bc, src1[10].bc);
64   dst[11].f = vec_andc (src0[11].f, src1[11].f);
65   dst[12].f = vec_andc (src0[12].bi, src1[12].f);
66   dst[13].f = vec_andc (src0[13].f, src1[13].bi);
67   dst[14].d = vec_andc (src0[14].bll, src1[14].d);
68   dst[15].d = vec_andc (src0[15].d, src1[15].bll);
69 
70   dst[16].d = vec_nor (src0[16].d, src1[16].d);
71   dst[17].f = vec_nor (src0[17].f, src1[17].f);
72   dst[18].bi = vec_nor (src0[18].bi, src1[18].bi);
73   dst[19].bs = vec_nor (src0[19].bs, src1[19].bs);
74   dst[20].bc = vec_nor (src0[20].bc, src1[20].bc);
75 
76   dst[21].d = vec_or (src0[21].d, src1[21].d);
77   dst[22].d = vec_or (src0[22].d, src1[22].bl);
78   dst[23].d = vec_or (src0[23].bl, src1[23].d);
79   dst[24].d = vec_or (src0[24].bll, src1[24].d);
80   dst[25].d = vec_or (src0[25].d, src1[25].bll);
81   dst[26].f = vec_or (src0[26].f, src1[26].f);
82   dst[27].bi = vec_or (src0[27].bi, src1[27].bi);
83   dst[28].bs = vec_or (src0[28].bs, src1[28].bs);
84   dst[29].bc = vec_or (src0[29].bc, src1[29].bc);
85 
86   dst[30].d = vec_xor (src0[30].d, src1[30].d);
87   dst[31].d = vec_xor (src0[31].d, src1[31].bl);
88   dst[32].d = vec_xor (src0[32].bl, src1[32].d);
89 }
90 
91 void
func_cmp(opnd_t * dst,opnd_t * src0,opnd_t * src1)92 func_cmp (opnd_t *dst, opnd_t *src0, opnd_t *src1)
93 {
94   dst[0].bl = vec_cmpeq (src0[0].d, src1[0].d);
95   dst[1].bl = vec_cmpgt (src0[1].d, src1[1].d);
96   dst[2].bl = vec_cmpge (src0[2].d, src1[2].d);
97   dst[3].bl = vec_cmplt (src0[3].d, src1[3].d);
98   dst[4].bl = vec_cmple (src0[4].d, src1[4].d);
99 }
100 
101 void
func_all_cmp(int * dst,opnd_t * src0,opnd_t * src1)102 func_all_cmp (int *dst, opnd_t *src0, opnd_t *src1)
103 {
104   dst[0] = vec_all_eq (src0[0].d, src1[0].d);
105   dst[1] = vec_all_ge (src0[1].d, src1[1].d);
106   dst[2] = vec_all_gt (src0[2].d, src1[2].d);
107   dst[3] = vec_all_le (src0[3].d, src1[3].d);
108   dst[4] = vec_all_lt (src0[4].d, src1[4].d);
109   dst[5] = vec_all_nan (src0[5].d);
110   dst[6] = vec_all_ne (src0[6].d, src1[6].d);
111   dst[7] = vec_all_nge (src0[7].d, src1[7].d);
112   dst[8] = vec_all_ngt (src0[8].d, src1[8].d);
113   dst[9] = vec_all_nle (src0[9].d, src1[9].d);
114   dst[10] = vec_all_nlt (src0[10].d, src1[10].d);
115   dst[11] = vec_all_numeric (src0[11].d);
116   dst[12] = vec_any_eq (src0[12].d, src1[12].d);
117   dst[13] = vec_any_ge (src0[13].d, src1[13].d);
118   dst[14] = vec_any_gt (src0[14].d, src1[14].d);
119   dst[15] = vec_any_le (src0[15].d, src1[15].d);
120   dst[16] = vec_any_lt (src0[16].d, src1[16].d);
121   dst[17] = vec_any_nan (src0[17].d);
122   dst[18] = vec_any_ne (src0[18].d, src1[18].d);
123   dst[19] = vec_any_nge (src0[19].d, src1[19].d);
124   dst[20] = vec_any_ngt (src0[20].d, src1[20].d);
125   dst[21] = vec_any_nle (src0[21].d, src1[21].d);
126   dst[22] = vec_any_nlt (src0[22].d, src1[22].d);
127   dst[23] = vec_any_numeric (src0[23].d);
128 }
129 
130 void
func_3op(opnd_t * dst,opnd_t * src0,opnd_t * src1,opnd_t * src2)131 func_3op (opnd_t *dst, opnd_t *src0, opnd_t *src1, opnd_t *src2)
132 {
133   dst[0].d = vec_madd (src0[0].d, src1[0].d, src2[0].d);
134   dst[1].d = vec_msub (src0[1].d, src1[1].d, src2[1].d);
135   dst[2].d = vec_nmadd (src0[2].d, src1[2].d, src2[2].d);
136   dst[3].d = vec_nmsub (src0[3].d, src1[3].d, src2[3].d);
137 
138   dst[4].f = vec_madd (src0[4].f, src1[4].f, src2[4].f);
139   dst[5].f = vec_msub (src0[5].f, src1[5].f, src2[5].f);
140   dst[6].f = vec_nmsub (src0[6].f, src1[6].f, src2[6].f);
141   dst[7].f = vec_nmadd (src0[7].f, src1[7].f, src2[7].f);
142 
143 #if defined (__BIG_ENDIAN__) || defined (_ARCH_PWR9)
144   dst[8].d = vec_perm (src0[8].d, src1[8].d, src2[8].uc);
145 #else
146   dst[8].d = vec_perm (src0[8].d, src1[8].d, ~src2[8].uc);
147 #endif
148 
149   dst[9].d = vec_sel (src0[9].d, src1[9].d, src2[9].d);
150   dst[10].d = vec_sel (src0[10].d, src1[10].d, src2[10].bl);
151 
152   dst[11].si = vec_msums(src0[11].ss, src1[11].ss, src2[11].si);
153   dst[12].ui = vec_msums(src0[12].us, src1[12].us, src2[12].ui);
154 }
155