[RS6000] Tests that use int128_t and -m32
[official-gcc.git] / gcc / testsuite / gcc.target / powerpc / vsx_mask-move-runnable.c
blobc2eb53d3bb2331ae522e1fa455c348e083d143b8
1 /* { dg-do run { target { power10_hw } } } */
2 /* { dg-do link { target { ! power10_hw } } } */
3 /* { dg-options "-mcpu=power10 -O2" } */
4 /* { dg-require-effective-target { int128 && power10_ok } } */
6 /* Check that the expected 128-bit instructions are generated if the processor
7 supports the 128-bit integer instructions. */
8 /* { dg-final { scan-assembler-times {\mmtvsrbm\M} 1 } } */
9 /* { dg-final { scan-assembler-times {\mmtvsrhm\M} 1 } } */
10 /* { dg-final { scan-assembler-times {\mmtvsrwm\M} 1 } } */
11 /* { dg-final { scan-assembler-times {\mmtvsrdm\M} 1 } } */
12 /* { dg-final { scan-assembler-times {\mmtvsrqm\M} 1 } } */
13 /* { dg-final { scan-assembler-times {\mmtvsrbmi\M} 2 } } */
15 #define DEBUG 0
17 #if DEBUG
18 #include <stdio.h>
19 #include <stdlib.h>
20 #endif
21 #include <altivec.h>
23 void abort (void);
25 int main ()
27 int i, num_elements;
28 unsigned long long arg1;
30 vector unsigned char vbc_result_bi, vbc_expected_result_bi;
31 vector unsigned short vbc_result_hi, vbc_expected_result_hi;
32 vector unsigned int vbc_result_wi, vbc_expected_result_wi;
33 vector unsigned long long vbc_result_di, vbc_expected_result_di;
34 vector __uint128_t vbc_result_qi, vbc_expected_result_qi;
36 unsigned int result_wi, expected_result_wi;
37 unsigned long long result, expected_result;
38 const unsigned char mp=1;
39 vector unsigned char vbc_bi_src;
40 vector unsigned short vbc_hi_src;
41 vector unsigned int vbc_wi_src;
42 vector unsigned long long vbc_di_src;
43 vector __uint128_t vbc_qi_src;
45 /* mtvsrbmi */
46 num_elements = 16;
48 for (i = 0; i<num_elements; i++)
49 vbc_expected_result_bi[i] = 0x0;
51 vbc_expected_result_bi[0] = 0xFF;
52 vbc_expected_result_bi[2] = 0xFF;
54 vbc_result_bi = vec_genbm(5);
56 for (i = 0; i<num_elements; i++) {
57 if (vbc_result_bi[i] != vbc_expected_result_bi[i]) {
58 #if DEBUG
59 printf("ERROR: vec_genbm(const 5) ");
60 printf("element %d equals 0x%x does not match expected_result = 0x%x",
61 i, vbc_result_bi[i], vbc_expected_result_bi[i]);
62 printf("\n\n");
63 #else
64 abort();
65 #endif
69 /* mtvsrbm */
70 num_elements = 16;
71 /* -O2 should generate mtvsrbmi as argument will fit in 6-bit field. */
72 arg1 = 3;
74 for (i = 0; i<num_elements; i++)
75 vbc_expected_result_bi[i] = 0x0;
77 vbc_expected_result_bi[1] = 0xFF;
78 vbc_expected_result_bi[0] = 0xFF;
80 vbc_result_bi = vec_genbm(arg1);
82 for (i = 0; i<num_elements; i++) {
83 if (vbc_result_bi[i] != vbc_expected_result_bi[i]) {
84 #if DEBUG
85 printf("ERROR: vec_genbm(%d) ", arg1);
86 printf("element %d equals 0x%x does not match expected_result = 0x%x",
87 i, vbc_result_bi[i], vbc_expected_result_bi[i]);
88 printf("\n\n");
89 #else
90 abort();
91 #endif
95 num_elements = 16;
96 /* Should generate mtvsrbm as argument will not fit in 6-bit field. */
97 arg1 = 0xEA; // 234 decimal
99 for (i = 0; i<num_elements; i++)
100 vbc_expected_result_bi[i] = 0x0;
102 vbc_expected_result_bi[7] = 0xFF;
103 vbc_expected_result_bi[6] = 0xFF;
104 vbc_expected_result_bi[5] = 0xFF;
105 vbc_expected_result_bi[3] = 0xFF;
106 vbc_expected_result_bi[1] = 0xFF;
108 vbc_result_bi = vec_genbm(arg1);
110 for (i = 0; i<num_elements; i++) {
111 if (vbc_result_bi[i] != vbc_expected_result_bi[i]) {
112 #if DEBUG
113 printf("ERROR: vec_genbm(%d) ", arg1);
114 printf("element %d equals 0x%x does not match expected_result = 0x%x",
115 i, vbc_result_bi[i], vbc_expected_result_bi[i]);
116 printf("\n\n");
117 #else
118 abort();
119 #endif
123 /* mtvsrhm */
124 num_elements = 8;
125 arg1 = 5;
127 for (i = 0; i<num_elements; i++)
128 vbc_expected_result_hi[i] = 0x0;
130 vbc_expected_result_hi[2] = 0xFFFF;
131 vbc_expected_result_hi[0] = 0xFFFF;
133 vbc_result_hi = vec_genhm(arg1);
135 for (i = 0; i<num_elements; i++) {
136 if (vbc_result_hi[i] != vbc_expected_result_hi[i]) {
137 #if DEBUG
138 printf("ERROR: vec_genhm(%d) ", arg1);
139 printf("element %d equals 0x%x does not match expected_result = 0x%x",
140 i, vbc_result_hi[i], vbc_expected_result_hi[i]);
141 printf("\n\n");
142 #else
143 abort();
144 #endif
148 /* mtvsrwm */
149 num_elements = 4;
150 arg1 = 7;
152 for (i = 0; i<num_elements; i++)
153 vbc_expected_result_wi[i] = 0x0;
155 vbc_expected_result_wi[2] = 0xFFFFFFFF;
156 vbc_expected_result_wi[1] = 0xFFFFFFFF;
157 vbc_expected_result_wi[0] = 0xFFFFFFFF;
159 vbc_result_wi = vec_genwm(arg1);
161 for (i = 0; i<num_elements; i++) {
162 if (vbc_result_wi[i] != vbc_expected_result_wi[i]) {
163 #if DEBUG
164 printf("ERROR: vec_genwm(%d) ", arg1);
165 printf("element %d equals 0x%x does not match expected_result = 0x%x",
166 i, vbc_result_wi[i], vbc_expected_result_wi[i]);
167 printf("\n\n");
168 #else
169 abort();
170 #endif
174 /* mtvsrdm */
175 num_elements = 2;
176 arg1 = 1;
178 for (i = 0; i<num_elements; i++)
179 vbc_expected_result_di[i] = 0x0;
181 vbc_expected_result_di[1] = 0x0;
182 vbc_expected_result_di[0] = 0xFFFFFFFFFFFFFFFF;
184 vbc_result_di = vec_gendm(arg1);
186 for (i = 0; i<num_elements; i++) {
187 if (vbc_result_di[i] != vbc_expected_result_di[i]) {
188 #if DEBUG
189 printf("ERROR: vec_gendm(%d) ", arg1);
190 printf("element %d equals 0x%llx does not match expected_result = ",
191 i, vbc_result_di[i]);
192 printf("0x%llx\n\n", vbc_expected_result_di[i]);
193 #else
194 abort();
195 #endif
199 /* mtvsrqm */
200 num_elements = 1;
201 arg1 = 1;
203 for (i = 0; i<num_elements; i++)
204 vbc_expected_result_qi[i] = 0x0;
206 vbc_expected_result_qi[0] = 0xFFFFFFFFFFFFFFFFULL;
207 vbc_expected_result_qi[0] = (vbc_expected_result_qi[0] << 64)
208 | 0xFFFFFFFFFFFFFFFFULL;
210 vbc_result_qi = vec_genqm(arg1);
212 for (i = 0; i<num_elements; i++) {
213 if (vbc_result_qi[i] != vbc_expected_result_qi[i]) {
214 #if DEBUG
215 printf("ERROR: vec_genqm(%d) ", arg1);
216 printf("element %d equals 0x%llx does not match expected_result = ",
217 i, vbc_result_qi[i]);
218 printf("0x%llx\n\n", vbc_expected_result_qi[i]);
219 #else
220 abort();
221 #endif
225 return 0;