1 /* { dg-do run { target { power10_hw } } } */
2 /* { dg-do link { target { ! power10_hw } } } */
3 /* { dg-options "-mdejagnu-cpu=power10 -O2 -save-temps" } */
4 /* { dg-require-effective-target power10_ok } */
5 /* { dg-require-effective-target int128 } */
6
7 /* Check that the expected 128-bit instructions are generated if the processor
8 supports the 128-bit integer instructions. */
9 /* { dg-final { scan-assembler-times {\mmtvsrbm\M} 1 } } */
10 /* { dg-final { scan-assembler-times {\mmtvsrhm\M} 1 } } */
11 /* { dg-final { scan-assembler-times {\mmtvsrwm\M} 1 } } */
12 /* { dg-final { scan-assembler-times {\mmtvsrdm\M} 1 } } */
13 /* { dg-final { scan-assembler-times {\mmtvsrqm\M} 1 } } */
14 /* { dg-final { scan-assembler-times {\mmtvsrbmi\M} 2 } } */
15
16 #define DEBUG 0
17
18 #if DEBUG
19 #include <stdio.h>
20 #include <stdlib.h>
21 #endif
22 #include <altivec.h>
23
24 void abort (void);
25
26 int main ()
27 {
28 int i, num_elements;
29 unsigned long long arg1;
30
31 vector unsigned char vbc_result_bi, vbc_expected_result_bi;
32 vector unsigned short vbc_result_hi, vbc_expected_result_hi;
33 vector unsigned int vbc_result_wi, vbc_expected_result_wi;
34 vector unsigned long long vbc_result_di, vbc_expected_result_di;
35 vector __uint128_t vbc_result_qi, vbc_expected_result_qi;
36
37 unsigned int result_wi, expected_result_wi;
38 unsigned long long result, expected_result;
39 const unsigned char mp=1;
40 vector unsigned char vbc_bi_src;
41 vector unsigned short vbc_hi_src;
42 vector unsigned int vbc_wi_src;
43 vector unsigned long long vbc_di_src;
44 vector __uint128_t vbc_qi_src;
45
46 /* mtvsrbmi */
47 num_elements = 16;
48
49 for (i = 0; i<num_elements; i++)
50 vbc_expected_result_bi[i] = 0x0;
51
52 vbc_expected_result_bi[0] = 0xFF;
53 vbc_expected_result_bi[2] = 0xFF;
54
55 vbc_result_bi = vec_genbm(5);
56
57 for (i = 0; i<num_elements; i++) {
58 if (vbc_result_bi[i] != vbc_expected_result_bi[i]) {
59 #if DEBUG
60 printf("ERROR: vec_genbm(const 5) ");
61 printf("element %d equals 0x%x does not match expected_result = 0x%x",
62 i, vbc_result_bi[i], vbc_expected_result_bi[i]);
63 printf("\n\n");
64 #else
65 abort();
66 #endif
67 }
68 }
69
70 /* mtvsrbm */
71 num_elements = 16;
72 /* -O2 should generate mtvsrbmi as argument will fit in 6-bit field. */
73 arg1 = 3;
74
75 for (i = 0; i<num_elements; i++)
76 vbc_expected_result_bi[i] = 0x0;
77
78 vbc_expected_result_bi[1] = 0xFF;
79 vbc_expected_result_bi[0] = 0xFF;
80
81 vbc_result_bi = vec_genbm(arg1);
82
83 for (i = 0; i<num_elements; i++) {
84 if (vbc_result_bi[i] != vbc_expected_result_bi[i]) {
85 #if DEBUG
86 printf("ERROR: vec_genbm(%d) ", arg1);
87 printf("element %d equals 0x%x does not match expected_result = 0x%x",
88 i, vbc_result_bi[i], vbc_expected_result_bi[i]);
89 printf("\n\n");
90 #else
91 abort();
92 #endif
93 }
94 }
95
96 num_elements = 16;
97 /* Should generate mtvsrbm as argument will not fit in 6-bit field. */
98 arg1 = 0xEA; // 234 decimal
99
100 for (i = 0; i<num_elements; i++)
101 vbc_expected_result_bi[i] = 0x0;
102
103 vbc_expected_result_bi[7] = 0xFF;
104 vbc_expected_result_bi[6] = 0xFF;
105 vbc_expected_result_bi[5] = 0xFF;
106 vbc_expected_result_bi[3] = 0xFF;
107 vbc_expected_result_bi[1] = 0xFF;
108
109 vbc_result_bi = vec_genbm(arg1);
110
111 for (i = 0; i<num_elements; i++) {
112 if (vbc_result_bi[i] != vbc_expected_result_bi[i]) {
113 #if DEBUG
114 printf("ERROR: vec_genbm(%d) ", arg1);
115 printf("element %d equals 0x%x does not match expected_result = 0x%x",
116 i, vbc_result_bi[i], vbc_expected_result_bi[i]);
117 printf("\n\n");
118 #else
119 abort();
120 #endif
121 }
122 }
123
124 /* mtvsrhm */
125 num_elements = 8;
126 arg1 = 5;
127
128 for (i = 0; i<num_elements; i++)
129 vbc_expected_result_hi[i] = 0x0;
130
131 vbc_expected_result_hi[2] = 0xFFFF;
132 vbc_expected_result_hi[0] = 0xFFFF;
133
134 vbc_result_hi = vec_genhm(arg1);
135
136 for (i = 0; i<num_elements; i++) {
137 if (vbc_result_hi[i] != vbc_expected_result_hi[i]) {
138 #if DEBUG
139 printf("ERROR: vec_genhm(%d) ", arg1);
140 printf("element %d equals 0x%x does not match expected_result = 0x%x",
141 i, vbc_result_hi[i], vbc_expected_result_hi[i]);
142 printf("\n\n");
143 #else
144 abort();
145 #endif
146 }
147 }
148
149 /* mtvsrwm */
150 num_elements = 4;
151 arg1 = 7;
152
153 for (i = 0; i<num_elements; i++)
154 vbc_expected_result_wi[i] = 0x0;
155
156 vbc_expected_result_wi[2] = 0xFFFFFFFF;
157 vbc_expected_result_wi[1] = 0xFFFFFFFF;
158 vbc_expected_result_wi[0] = 0xFFFFFFFF;
159
160 vbc_result_wi = vec_genwm(arg1);
161
162 for (i = 0; i<num_elements; i++) {
163 if (vbc_result_wi[i] != vbc_expected_result_wi[i]) {
164 #if DEBUG
165 printf("ERROR: vec_genwm(%d) ", arg1);
166 printf("element %d equals 0x%x does not match expected_result = 0x%x",
167 i, vbc_result_wi[i], vbc_expected_result_wi[i]);
168 printf("\n\n");
169 #else
170 abort();
171 #endif
172 }
173 }
174
175 /* mtvsrdm */
176 num_elements = 2;
177 arg1 = 1;
178
179 for (i = 0; i<num_elements; i++)
180 vbc_expected_result_di[i] = 0x0;
181
182 vbc_expected_result_di[1] = 0x0;
183 vbc_expected_result_di[0] = 0xFFFFFFFFFFFFFFFF;
184
185 vbc_result_di = vec_gendm(arg1);
186
187 for (i = 0; i<num_elements; i++) {
188 if (vbc_result_di[i] != vbc_expected_result_di[i]) {
189 #if DEBUG
190 printf("ERROR: vec_gendm(%d) ", arg1);
191 printf("element %d equals 0x%llx does not match expected_result = ",
192 i, vbc_result_di[i]);
193 printf("0x%llx\n\n", vbc_expected_result_di[i]);
194 #else
195 abort();
196 #endif
197 }
198 }
199
200 /* mtvsrqm */
201 num_elements = 1;
202 arg1 = 1;
203
204 for (i = 0; i<num_elements; i++)
205 vbc_expected_result_qi[i] = 0x0;
206
207 vbc_expected_result_qi[0] = 0xFFFFFFFFFFFFFFFFULL;
208 vbc_expected_result_qi[0] = (vbc_expected_result_qi[0] << 64)
209 | 0xFFFFFFFFFFFFFFFFULL;
210
211 vbc_result_qi = vec_genqm(arg1);
212
213 for (i = 0; i<num_elements; i++) {
214 if (vbc_result_qi[i] != vbc_expected_result_qi[i]) {
215 #if DEBUG
216 printf("ERROR: vec_genqm(%d) ", arg1);
217 printf("element %d equals 0x%llx does not match expected_result = ",
218 i, vbc_result_qi[i]);
219 printf("0x%llx\n\n", vbc_expected_result_qi[i]);
220 #else
221 abort();
222 #endif
223 }
224 }
225
226 return 0;
227 }