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