1 /* { dg-do compile { target { powerpc*-*-* } } } */
2 /* { dg-skip-if "" { powerpc*-*-darwin* } } */
3 /* { dg-require-effective-target powerpc_p8vector_ok } */
4 /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
5 /* { dg-options "-mcpu=power8 -O2" } */
6
7 float
load_store_sf(unsigned long num,const float * from_ptr,float * to_ptr,const unsigned long * in_mask_ptr,const unsigned long * out_mask_ptr)8 load_store_sf (unsigned long num,
9 const float *from_ptr,
10 float *to_ptr,
11 const unsigned long *in_mask_ptr,
12 const unsigned long *out_mask_ptr)
13 {
14 float value00 = 0.0f;
15 float value01 = 0.0f;
16 float value02 = 0.0f;
17 float value03 = 0.0f;
18 float value04 = 0.0f;
19 float value05 = 0.0f;
20 float value06 = 0.0f;
21 float value07 = 0.0f;
22 float value08 = 0.0f;
23 float value09 = 0.0f;
24 float value10 = 0.0f;
25 float value11 = 0.0f;
26 float value12 = 0.0f;
27 float value13 = 0.0f;
28 float value14 = 0.0f;
29 float value15 = 0.0f;
30 float value16 = 0.0f;
31 float value17 = 0.0f;
32 float value18 = 0.0f;
33 float value19 = 0.0f;
34 float value20 = 0.0f;
35 float value21 = 0.0f;
36 float value22 = 0.0f;
37 float value23 = 0.0f;
38 float value24 = 0.0f;
39 float value25 = 0.0f;
40 float value26 = 0.0f;
41 float value27 = 0.0f;
42 float value28 = 0.0f;
43 float value29 = 0.0f;
44 float value30 = 0.0f;
45 float value31 = 0.0f;
46 float value32 = 0.0f;
47 float value33 = 0.0f;
48 float value34 = 0.0f;
49 float value35 = 0.0f;
50 float value36 = 0.0f;
51 float value37 = 0.0f;
52 float value38 = 0.0f;
53 float value39 = 0.0f;
54 unsigned long in_mask, in_mask2;
55 unsigned long out_mask, out_mask2;
56 unsigned long i;
57
58 for (i = 0; i < num; i++)
59 {
60 in_mask = *in_mask_ptr++;
61 in_mask2 = *in_mask_ptr++;
62 if ((in_mask & (1L << 0)) != 0L)
63 value00 = *from_ptr++;
64
65 if ((in_mask & (1L << 1)) != 0L)
66 value01 = *from_ptr++;
67
68 if ((in_mask & (1L << 2)) != 0L)
69 value02 = *from_ptr++;
70
71 if ((in_mask & (1L << 3)) != 0L)
72 value03 = *from_ptr++;
73
74 if ((in_mask & (1L << 4)) != 0L)
75 value04 = *from_ptr++;
76
77 if ((in_mask & (1L << 5)) != 0L)
78 value05 = *from_ptr++;
79
80 if ((in_mask & (1L << 6)) != 0L)
81 value06 = *from_ptr++;
82
83 if ((in_mask & (1L << 7)) != 0L)
84 value07 = *from_ptr++;
85
86 if ((in_mask & (1L << 8)) != 0L)
87 value08 = *from_ptr++;
88
89 if ((in_mask & (1L << 9)) != 0L)
90 value09 = *from_ptr++;
91
92 if ((in_mask & (1L << 10)) != 0L)
93 value10 = *from_ptr++;
94
95 if ((in_mask & (1L << 11)) != 0L)
96 value11 = *from_ptr++;
97
98 if ((in_mask & (1L << 12)) != 0L)
99 value12 = *from_ptr++;
100
101 if ((in_mask & (1L << 13)) != 0L)
102 value13 = *from_ptr++;
103
104 if ((in_mask & (1L << 14)) != 0L)
105 value14 = *from_ptr++;
106
107 if ((in_mask & (1L << 15)) != 0L)
108 value15 = *from_ptr++;
109
110 if ((in_mask & (1L << 16)) != 0L)
111 value16 = *from_ptr++;
112
113 if ((in_mask & (1L << 17)) != 0L)
114 value17 = *from_ptr++;
115
116 if ((in_mask & (1L << 18)) != 0L)
117 value18 = *from_ptr++;
118
119 if ((in_mask & (1L << 19)) != 0L)
120 value19 = *from_ptr++;
121
122 if ((in_mask2 & (1L << 0)) != 0L)
123 value20 = *from_ptr++;
124
125 if ((in_mask2 & (1L << 1)) != 0L)
126 value21 = *from_ptr++;
127
128 if ((in_mask2 & (1L << 2)) != 0L)
129 value22 = *from_ptr++;
130
131 if ((in_mask2 & (1L << 3)) != 0L)
132 value23 = *from_ptr++;
133
134 if ((in_mask2 & (1L << 4)) != 0L)
135 value24 = *from_ptr++;
136
137 if ((in_mask2 & (1L << 5)) != 0L)
138 value25 = *from_ptr++;
139
140 if ((in_mask2 & (1L << 6)) != 0L)
141 value26 = *from_ptr++;
142
143 if ((in_mask2 & (1L << 7)) != 0L)
144 value27 = *from_ptr++;
145
146 if ((in_mask2 & (1L << 8)) != 0L)
147 value28 = *from_ptr++;
148
149 if ((in_mask2 & (1L << 9)) != 0L)
150 value29 = *from_ptr++;
151
152 if ((in_mask2 & (1L << 10)) != 0L)
153 value30 = *from_ptr++;
154
155 if ((in_mask2 & (1L << 11)) != 0L)
156 value31 = *from_ptr++;
157
158 if ((in_mask2 & (1L << 12)) != 0L)
159 value32 = *from_ptr++;
160
161 if ((in_mask2 & (1L << 13)) != 0L)
162 value33 = *from_ptr++;
163
164 if ((in_mask2 & (1L << 14)) != 0L)
165 value34 = *from_ptr++;
166
167 if ((in_mask2 & (1L << 15)) != 0L)
168 value35 = *from_ptr++;
169
170 if ((in_mask2 & (1L << 16)) != 0L)
171 value36 = *from_ptr++;
172
173 if ((in_mask2 & (1L << 17)) != 0L)
174 value37 = *from_ptr++;
175
176 if ((in_mask2 & (1L << 18)) != 0L)
177 value38 = *from_ptr++;
178
179 if ((in_mask2 & (1L << 19)) != 0L)
180 value39 = *from_ptr++;
181
182 out_mask = *out_mask_ptr++;
183 out_mask2 = *out_mask_ptr++;
184 if ((out_mask & (1L << 0)) != 0L)
185 *to_ptr++ = value00;
186
187 if ((out_mask & (1L << 1)) != 0L)
188 *to_ptr++ = value01;
189
190 if ((out_mask & (1L << 2)) != 0L)
191 *to_ptr++ = value02;
192
193 if ((out_mask & (1L << 3)) != 0L)
194 *to_ptr++ = value03;
195
196 if ((out_mask & (1L << 4)) != 0L)
197 *to_ptr++ = value04;
198
199 if ((out_mask & (1L << 5)) != 0L)
200 *to_ptr++ = value05;
201
202 if ((out_mask & (1L << 6)) != 0L)
203 *to_ptr++ = value06;
204
205 if ((out_mask & (1L << 7)) != 0L)
206 *to_ptr++ = value07;
207
208 if ((out_mask & (1L << 8)) != 0L)
209 *to_ptr++ = value08;
210
211 if ((out_mask & (1L << 9)) != 0L)
212 *to_ptr++ = value09;
213
214 if ((out_mask & (1L << 10)) != 0L)
215 *to_ptr++ = value10;
216
217 if ((out_mask & (1L << 11)) != 0L)
218 *to_ptr++ = value11;
219
220 if ((out_mask & (1L << 12)) != 0L)
221 *to_ptr++ = value12;
222
223 if ((out_mask & (1L << 13)) != 0L)
224 *to_ptr++ = value13;
225
226 if ((out_mask & (1L << 14)) != 0L)
227 *to_ptr++ = value14;
228
229 if ((out_mask & (1L << 15)) != 0L)
230 *to_ptr++ = value15;
231
232 if ((out_mask & (1L << 16)) != 0L)
233 *to_ptr++ = value16;
234
235 if ((out_mask & (1L << 17)) != 0L)
236 *to_ptr++ = value17;
237
238 if ((out_mask & (1L << 18)) != 0L)
239 *to_ptr++ = value18;
240
241 if ((out_mask & (1L << 19)) != 0L)
242 *to_ptr++ = value19;
243
244 if ((out_mask2 & (1L << 0)) != 0L)
245 *to_ptr++ = value20;
246
247 if ((out_mask2 & (1L << 1)) != 0L)
248 *to_ptr++ = value21;
249
250 if ((out_mask2 & (1L << 2)) != 0L)
251 *to_ptr++ = value22;
252
253 if ((out_mask2 & (1L << 3)) != 0L)
254 *to_ptr++ = value23;
255
256 if ((out_mask2 & (1L << 4)) != 0L)
257 *to_ptr++ = value24;
258
259 if ((out_mask2 & (1L << 5)) != 0L)
260 *to_ptr++ = value25;
261
262 if ((out_mask2 & (1L << 6)) != 0L)
263 *to_ptr++ = value26;
264
265 if ((out_mask2 & (1L << 7)) != 0L)
266 *to_ptr++ = value27;
267
268 if ((out_mask2 & (1L << 8)) != 0L)
269 *to_ptr++ = value28;
270
271 if ((out_mask2 & (1L << 9)) != 0L)
272 *to_ptr++ = value29;
273
274 if ((out_mask2 & (1L << 10)) != 0L)
275 *to_ptr++ = value30;
276
277 if ((out_mask2 & (1L << 11)) != 0L)
278 *to_ptr++ = value31;
279
280 if ((out_mask2 & (1L << 12)) != 0L)
281 *to_ptr++ = value32;
282
283 if ((out_mask2 & (1L << 13)) != 0L)
284 *to_ptr++ = value33;
285
286 if ((out_mask2 & (1L << 14)) != 0L)
287 *to_ptr++ = value34;
288
289 if ((out_mask2 & (1L << 15)) != 0L)
290 *to_ptr++ = value35;
291
292 if ((out_mask2 & (1L << 16)) != 0L)
293 *to_ptr++ = value36;
294
295 if ((out_mask2 & (1L << 17)) != 0L)
296 *to_ptr++ = value37;
297
298 if ((out_mask2 & (1L << 18)) != 0L)
299 *to_ptr++ = value38;
300
301 if ((out_mask2 & (1L << 19)) != 0L)
302 *to_ptr++ = value39;
303 }
304
305 return ( value00 + value01 + value02 + value03 + value04
306 + value05 + value06 + value07 + value08 + value09
307 + value10 + value11 + value12 + value13 + value14
308 + value15 + value16 + value17 + value18 + value19
309 + value20 + value21 + value22 + value23 + value24
310 + value25 + value26 + value27 + value28 + value29
311 + value30 + value31 + value32 + value33 + value34
312 + value35 + value36 + value37 + value38 + value39);
313 }
314
315 double
load_store_df(unsigned long num,const double * from_ptr,double * to_ptr,const unsigned long * in_mask_ptr,const unsigned long * out_mask_ptr)316 load_store_df (unsigned long num,
317 const double *from_ptr,
318 double *to_ptr,
319 const unsigned long *in_mask_ptr,
320 const unsigned long *out_mask_ptr)
321 {
322 double value00 = 0.0;
323 double value01 = 0.0;
324 double value02 = 0.0;
325 double value03 = 0.0;
326 double value04 = 0.0;
327 double value05 = 0.0;
328 double value06 = 0.0;
329 double value07 = 0.0;
330 double value08 = 0.0;
331 double value09 = 0.0;
332 double value10 = 0.0;
333 double value11 = 0.0;
334 double value12 = 0.0;
335 double value13 = 0.0;
336 double value14 = 0.0;
337 double value15 = 0.0;
338 double value16 = 0.0;
339 double value17 = 0.0;
340 double value18 = 0.0;
341 double value19 = 0.0;
342 double value20 = 0.0;
343 double value21 = 0.0;
344 double value22 = 0.0;
345 double value23 = 0.0;
346 double value24 = 0.0;
347 double value25 = 0.0;
348 double value26 = 0.0;
349 double value27 = 0.0;
350 double value28 = 0.0;
351 double value29 = 0.0;
352 double value30 = 0.0;
353 double value31 = 0.0;
354 double value32 = 0.0;
355 double value33 = 0.0;
356 double value34 = 0.0;
357 double value35 = 0.0;
358 double value36 = 0.0;
359 double value37 = 0.0;
360 double value38 = 0.0;
361 double value39 = 0.0;
362 unsigned long in_mask, in_mask2;
363 unsigned long out_mask, out_mask2;
364 unsigned long i;
365
366 for (i = 0; i < num; i++)
367 {
368 in_mask = *in_mask_ptr++;
369 in_mask2 = *in_mask_ptr++;
370 if ((in_mask & (1L << 0)) != 0L)
371 value00 = *from_ptr++;
372
373 if ((in_mask & (1L << 1)) != 0L)
374 value01 = *from_ptr++;
375
376 if ((in_mask & (1L << 2)) != 0L)
377 value02 = *from_ptr++;
378
379 if ((in_mask & (1L << 3)) != 0L)
380 value03 = *from_ptr++;
381
382 if ((in_mask & (1L << 4)) != 0L)
383 value04 = *from_ptr++;
384
385 if ((in_mask & (1L << 5)) != 0L)
386 value05 = *from_ptr++;
387
388 if ((in_mask & (1L << 6)) != 0L)
389 value06 = *from_ptr++;
390
391 if ((in_mask & (1L << 7)) != 0L)
392 value07 = *from_ptr++;
393
394 if ((in_mask & (1L << 8)) != 0L)
395 value08 = *from_ptr++;
396
397 if ((in_mask & (1L << 9)) != 0L)
398 value09 = *from_ptr++;
399
400 if ((in_mask & (1L << 10)) != 0L)
401 value10 = *from_ptr++;
402
403 if ((in_mask & (1L << 11)) != 0L)
404 value11 = *from_ptr++;
405
406 if ((in_mask & (1L << 12)) != 0L)
407 value12 = *from_ptr++;
408
409 if ((in_mask & (1L << 13)) != 0L)
410 value13 = *from_ptr++;
411
412 if ((in_mask & (1L << 14)) != 0L)
413 value14 = *from_ptr++;
414
415 if ((in_mask & (1L << 15)) != 0L)
416 value15 = *from_ptr++;
417
418 if ((in_mask & (1L << 16)) != 0L)
419 value16 = *from_ptr++;
420
421 if ((in_mask & (1L << 17)) != 0L)
422 value17 = *from_ptr++;
423
424 if ((in_mask & (1L << 18)) != 0L)
425 value18 = *from_ptr++;
426
427 if ((in_mask & (1L << 19)) != 0L)
428 value19 = *from_ptr++;
429
430 if ((in_mask2 & (1L << 0)) != 0L)
431 value20 = *from_ptr++;
432
433 if ((in_mask2 & (1L << 1)) != 0L)
434 value21 = *from_ptr++;
435
436 if ((in_mask2 & (1L << 2)) != 0L)
437 value22 = *from_ptr++;
438
439 if ((in_mask2 & (1L << 3)) != 0L)
440 value23 = *from_ptr++;
441
442 if ((in_mask2 & (1L << 4)) != 0L)
443 value24 = *from_ptr++;
444
445 if ((in_mask2 & (1L << 5)) != 0L)
446 value25 = *from_ptr++;
447
448 if ((in_mask2 & (1L << 6)) != 0L)
449 value26 = *from_ptr++;
450
451 if ((in_mask2 & (1L << 7)) != 0L)
452 value27 = *from_ptr++;
453
454 if ((in_mask2 & (1L << 8)) != 0L)
455 value28 = *from_ptr++;
456
457 if ((in_mask2 & (1L << 9)) != 0L)
458 value29 = *from_ptr++;
459
460 if ((in_mask2 & (1L << 10)) != 0L)
461 value30 = *from_ptr++;
462
463 if ((in_mask2 & (1L << 11)) != 0L)
464 value31 = *from_ptr++;
465
466 if ((in_mask2 & (1L << 12)) != 0L)
467 value32 = *from_ptr++;
468
469 if ((in_mask2 & (1L << 13)) != 0L)
470 value33 = *from_ptr++;
471
472 if ((in_mask2 & (1L << 14)) != 0L)
473 value34 = *from_ptr++;
474
475 if ((in_mask2 & (1L << 15)) != 0L)
476 value35 = *from_ptr++;
477
478 if ((in_mask2 & (1L << 16)) != 0L)
479 value36 = *from_ptr++;
480
481 if ((in_mask2 & (1L << 17)) != 0L)
482 value37 = *from_ptr++;
483
484 if ((in_mask2 & (1L << 18)) != 0L)
485 value38 = *from_ptr++;
486
487 if ((in_mask2 & (1L << 19)) != 0L)
488 value39 = *from_ptr++;
489
490 out_mask = *out_mask_ptr++;
491 out_mask2 = *out_mask_ptr++;
492 if ((out_mask & (1L << 0)) != 0L)
493 *to_ptr++ = value00;
494
495 if ((out_mask & (1L << 1)) != 0L)
496 *to_ptr++ = value01;
497
498 if ((out_mask & (1L << 2)) != 0L)
499 *to_ptr++ = value02;
500
501 if ((out_mask & (1L << 3)) != 0L)
502 *to_ptr++ = value03;
503
504 if ((out_mask & (1L << 4)) != 0L)
505 *to_ptr++ = value04;
506
507 if ((out_mask & (1L << 5)) != 0L)
508 *to_ptr++ = value05;
509
510 if ((out_mask & (1L << 6)) != 0L)
511 *to_ptr++ = value06;
512
513 if ((out_mask & (1L << 7)) != 0L)
514 *to_ptr++ = value07;
515
516 if ((out_mask & (1L << 8)) != 0L)
517 *to_ptr++ = value08;
518
519 if ((out_mask & (1L << 9)) != 0L)
520 *to_ptr++ = value09;
521
522 if ((out_mask & (1L << 10)) != 0L)
523 *to_ptr++ = value10;
524
525 if ((out_mask & (1L << 11)) != 0L)
526 *to_ptr++ = value11;
527
528 if ((out_mask & (1L << 12)) != 0L)
529 *to_ptr++ = value12;
530
531 if ((out_mask & (1L << 13)) != 0L)
532 *to_ptr++ = value13;
533
534 if ((out_mask & (1L << 14)) != 0L)
535 *to_ptr++ = value14;
536
537 if ((out_mask & (1L << 15)) != 0L)
538 *to_ptr++ = value15;
539
540 if ((out_mask & (1L << 16)) != 0L)
541 *to_ptr++ = value16;
542
543 if ((out_mask & (1L << 17)) != 0L)
544 *to_ptr++ = value17;
545
546 if ((out_mask & (1L << 18)) != 0L)
547 *to_ptr++ = value18;
548
549 if ((out_mask & (1L << 19)) != 0L)
550 *to_ptr++ = value19;
551
552 if ((out_mask2 & (1L << 0)) != 0L)
553 *to_ptr++ = value20;
554
555 if ((out_mask2 & (1L << 1)) != 0L)
556 *to_ptr++ = value21;
557
558 if ((out_mask2 & (1L << 2)) != 0L)
559 *to_ptr++ = value22;
560
561 if ((out_mask2 & (1L << 3)) != 0L)
562 *to_ptr++ = value23;
563
564 if ((out_mask2 & (1L << 4)) != 0L)
565 *to_ptr++ = value24;
566
567 if ((out_mask2 & (1L << 5)) != 0L)
568 *to_ptr++ = value25;
569
570 if ((out_mask2 & (1L << 6)) != 0L)
571 *to_ptr++ = value26;
572
573 if ((out_mask2 & (1L << 7)) != 0L)
574 *to_ptr++ = value27;
575
576 if ((out_mask2 & (1L << 8)) != 0L)
577 *to_ptr++ = value28;
578
579 if ((out_mask2 & (1L << 9)) != 0L)
580 *to_ptr++ = value29;
581
582 if ((out_mask2 & (1L << 10)) != 0L)
583 *to_ptr++ = value30;
584
585 if ((out_mask2 & (1L << 11)) != 0L)
586 *to_ptr++ = value31;
587
588 if ((out_mask2 & (1L << 12)) != 0L)
589 *to_ptr++ = value32;
590
591 if ((out_mask2 & (1L << 13)) != 0L)
592 *to_ptr++ = value33;
593
594 if ((out_mask2 & (1L << 14)) != 0L)
595 *to_ptr++ = value34;
596
597 if ((out_mask2 & (1L << 15)) != 0L)
598 *to_ptr++ = value35;
599
600 if ((out_mask2 & (1L << 16)) != 0L)
601 *to_ptr++ = value36;
602
603 if ((out_mask2 & (1L << 17)) != 0L)
604 *to_ptr++ = value37;
605
606 if ((out_mask2 & (1L << 18)) != 0L)
607 *to_ptr++ = value38;
608
609 if ((out_mask2 & (1L << 19)) != 0L)
610 *to_ptr++ = value39;
611 }
612
613 return ( value00 + value01 + value02 + value03 + value04
614 + value05 + value06 + value07 + value08 + value09
615 + value10 + value11 + value12 + value13 + value14
616 + value15 + value16 + value17 + value18 + value19
617 + value20 + value21 + value22 + value23 + value24
618 + value25 + value26 + value27 + value28 + value29
619 + value30 + value31 + value32 + value33 + value34
620 + value35 + value36 + value37 + value38 + value39);
621 }
622
623 /* { dg-final { scan-assembler "lxsspx" } } */
624 /* { dg-final { scan-assembler "lxsdx" } } */
625 /* { dg-final { scan-assembler "stxsspx" } } */
626 /* { dg-final { scan-assembler "stxsdx" } } */
627 /* { dg-final { scan-assembler "xsaddsp" } } */
628 /* { dg-final { scan-assembler "xsadddp" } } */
629