1 /* { dg-do compile { target { powerpc*-*-* } } } */
2 /* { dg-skip-if "" { powerpc*-*-darwin* } } */
3 /* { dg-require-effective-target powerpc_p8vector_ok } */
4 /* { dg-options "-mdejagnu-cpu=power8 -O2" } */
5 
6 /* Make sure that STXSSPX is generated for float scalars in Altivec registers
7    on power7 instead of moving the value to a FPR register and doing a X-FORM
8    store.  */
9 
10 #ifndef TYPE
11 #define TYPE float
12 #endif
13 
14 #ifndef TYPE_IN
15 #define TYPE_IN TYPE
16 #endif
17 
18 #ifndef TYPE_OUT
19 #define TYPE_OUT TYPE
20 #endif
21 
22 #ifndef ITYPE
23 #define ITYPE __INT64_TYPE__
24 #endif
25 
26 #ifdef DO_CALL
27 extern ITYPE get_bits (ITYPE);
28 
29 #else
30 #define get_bits(X) (X)
31 #endif
32 
test(ITYPE * bits,ITYPE n,TYPE one,TYPE_IN * p,TYPE_OUT * q)33 void test (ITYPE *bits, ITYPE n, TYPE one, TYPE_IN *p, TYPE_OUT *q)
34 {
35   TYPE x_00 = p[ 0];
36   TYPE x_01 = p[ 1];
37   TYPE x_02 = p[ 2];
38   TYPE x_03 = p[ 3];
39   TYPE x_04 = p[ 4];
40   TYPE x_05 = p[ 5];
41   TYPE x_06 = p[ 6];
42   TYPE x_07 = p[ 7];
43   TYPE x_08 = p[ 8];
44   TYPE x_09 = p[ 9];
45 
46   TYPE x_10 = p[10];
47   TYPE x_11 = p[11];
48   TYPE x_12 = p[12];
49   TYPE x_13 = p[13];
50   TYPE x_14 = p[14];
51   TYPE x_15 = p[15];
52   TYPE x_16 = p[16];
53   TYPE x_17 = p[17];
54   TYPE x_18 = p[18];
55   TYPE x_19 = p[19];
56 
57   TYPE x_20 = p[20];
58   TYPE x_21 = p[21];
59   TYPE x_22 = p[22];
60   TYPE x_23 = p[23];
61   TYPE x_24 = p[24];
62   TYPE x_25 = p[25];
63   TYPE x_26 = p[26];
64   TYPE x_27 = p[27];
65   TYPE x_28 = p[28];
66   TYPE x_29 = p[29];
67 
68   TYPE x_30 = p[30];
69   TYPE x_31 = p[31];
70   TYPE x_32 = p[32];
71   TYPE x_33 = p[33];
72   TYPE x_34 = p[34];
73   TYPE x_35 = p[35];
74   TYPE x_36 = p[36];
75   TYPE x_37 = p[37];
76   TYPE x_38 = p[38];
77   TYPE x_39 = p[39];
78 
79   TYPE x_40 = p[40];
80   TYPE x_41 = p[41];
81   TYPE x_42 = p[42];
82   TYPE x_43 = p[43];
83   TYPE x_44 = p[44];
84   TYPE x_45 = p[45];
85   TYPE x_46 = p[46];
86   TYPE x_47 = p[47];
87   TYPE x_48 = p[48];
88   TYPE x_49 = p[49];
89 
90   ITYPE i;
91 
92   for (i = 0; i < n; i++)
93     {
94       ITYPE bit = get_bits (bits[i]);
95 
96       if ((bit & ((ITYPE)1) << 	0) != 0) x_00 += one;
97       if ((bit & ((ITYPE)1) << 	1) != 0) x_01 += one;
98       if ((bit & ((ITYPE)1) << 	2) != 0) x_02 += one;
99       if ((bit & ((ITYPE)1) << 	3) != 0) x_03 += one;
100       if ((bit & ((ITYPE)1) << 	4) != 0) x_04 += one;
101       if ((bit & ((ITYPE)1) << 	5) != 0) x_05 += one;
102       if ((bit & ((ITYPE)1) << 	6) != 0) x_06 += one;
103       if ((bit & ((ITYPE)1) << 	7) != 0) x_07 += one;
104       if ((bit & ((ITYPE)1) << 	8) != 0) x_08 += one;
105       if ((bit & ((ITYPE)1) << 	9) != 0) x_09 += one;
106 
107       if ((bit & ((ITYPE)1) << 10) != 0) x_10 += one;
108       if ((bit & ((ITYPE)1) << 11) != 0) x_11 += one;
109       if ((bit & ((ITYPE)1) << 12) != 0) x_12 += one;
110       if ((bit & ((ITYPE)1) << 13) != 0) x_13 += one;
111       if ((bit & ((ITYPE)1) << 14) != 0) x_14 += one;
112       if ((bit & ((ITYPE)1) << 15) != 0) x_15 += one;
113       if ((bit & ((ITYPE)1) << 16) != 0) x_16 += one;
114       if ((bit & ((ITYPE)1) << 17) != 0) x_17 += one;
115       if ((bit & ((ITYPE)1) << 18) != 0) x_18 += one;
116       if ((bit & ((ITYPE)1) << 19) != 0) x_19 += one;
117 
118       if ((bit & ((ITYPE)1) << 20) != 0) x_20 += one;
119       if ((bit & ((ITYPE)1) << 21) != 0) x_21 += one;
120       if ((bit & ((ITYPE)1) << 22) != 0) x_22 += one;
121       if ((bit & ((ITYPE)1) << 23) != 0) x_23 += one;
122       if ((bit & ((ITYPE)1) << 24) != 0) x_24 += one;
123       if ((bit & ((ITYPE)1) << 25) != 0) x_25 += one;
124       if ((bit & ((ITYPE)1) << 26) != 0) x_26 += one;
125       if ((bit & ((ITYPE)1) << 27) != 0) x_27 += one;
126       if ((bit & ((ITYPE)1) << 28) != 0) x_28 += one;
127       if ((bit & ((ITYPE)1) << 29) != 0) x_29 += one;
128 
129       if ((bit & ((ITYPE)1) << 30) != 0) x_30 += one;
130       if ((bit & ((ITYPE)1) << 31) != 0) x_31 += one;
131       if ((bit & ((ITYPE)1) << 32) != 0) x_32 += one;
132       if ((bit & ((ITYPE)1) << 33) != 0) x_33 += one;
133       if ((bit & ((ITYPE)1) << 34) != 0) x_34 += one;
134       if ((bit & ((ITYPE)1) << 35) != 0) x_35 += one;
135       if ((bit & ((ITYPE)1) << 36) != 0) x_36 += one;
136       if ((bit & ((ITYPE)1) << 37) != 0) x_37 += one;
137       if ((bit & ((ITYPE)1) << 38) != 0) x_38 += one;
138       if ((bit & ((ITYPE)1) << 39) != 0) x_39 += one;
139 
140       if ((bit & ((ITYPE)1) << 40) != 0) x_40 += one;
141       if ((bit & ((ITYPE)1) << 41) != 0) x_41 += one;
142       if ((bit & ((ITYPE)1) << 42) != 0) x_42 += one;
143       if ((bit & ((ITYPE)1) << 43) != 0) x_43 += one;
144       if ((bit & ((ITYPE)1) << 44) != 0) x_44 += one;
145       if ((bit & ((ITYPE)1) << 45) != 0) x_45 += one;
146       if ((bit & ((ITYPE)1) << 46) != 0) x_46 += one;
147       if ((bit & ((ITYPE)1) << 47) != 0) x_47 += one;
148       if ((bit & ((ITYPE)1) << 48) != 0) x_48 += one;
149       if ((bit & ((ITYPE)1) << 49) != 0) x_49 += one;
150     }
151 
152   q[ 0] = x_00;
153   q[ 1] = x_01;
154   q[ 2] = x_02;
155   q[ 3] = x_03;
156   q[ 4] = x_04;
157   q[ 5] = x_05;
158   q[ 6] = x_06;
159   q[ 7] = x_07;
160   q[ 8] = x_08;
161   q[ 9] = x_09;
162 
163   q[10] = x_10;
164   q[11] = x_11;
165   q[12] = x_12;
166   q[13] = x_13;
167   q[14] = x_14;
168   q[15] = x_15;
169   q[16] = x_16;
170   q[17] = x_17;
171   q[18] = x_18;
172   q[19] = x_19;
173 
174   q[20] = x_20;
175   q[21] = x_21;
176   q[22] = x_22;
177   q[23] = x_23;
178   q[24] = x_24;
179   q[25] = x_25;
180   q[26] = x_26;
181   q[27] = x_27;
182   q[28] = x_28;
183   q[29] = x_29;
184 
185   q[30] = x_30;
186   q[31] = x_31;
187   q[32] = x_32;
188   q[33] = x_33;
189   q[34] = x_34;
190   q[35] = x_35;
191   q[36] = x_36;
192   q[37] = x_37;
193   q[38] = x_38;
194   q[39] = x_39;
195 
196   q[40] = x_40;
197   q[41] = x_41;
198   q[42] = x_42;
199   q[43] = x_43;
200   q[44] = x_44;
201   q[45] = x_45;
202   q[46] = x_46;
203   q[47] = x_47;
204   q[48] = x_48;
205   q[49] = x_49;
206 }
207 
208 /* { dg-final { scan-assembler     {\mxsaddsp\M} } } */
209 /* { dg-final { scan-assembler     {\mstxsspx\M} } } */
210 /* { dg-final { scan-assembler-not {\mmfvsrd\M}  } } */
211 /* { dg-final { scan-assembler-not {\mmfvsrwz\M} } } */
212