1/* PR target/41175 */
2/* { dg-do run } */
3/* { dg-options "-Os" } */
4
5#define X2(n) X1(n##0) X1(n##1)
6#define X4(n) X2(n##0) X2(n##1)
7#define X8(n) X4(n##0) X4(n##1)
8
9#ifndef __SPE__
10#define FLOAT_REG_CONSTRAINT "f"
11#else
12#define FLOAT_REG_CONSTRAINT "r"
13#endif
14
15volatile int ll;
16
17__attribute__((noinline)) void
18foo (void)
19{
20  asm volatile ("" : : : "memory");
21}
22
23__attribute__((noinline)) void
24bar (char *p)
25{
26  asm volatile ("" : : "r" (p) : "memory");
27}
28
29__attribute__((noinline)) void
30f1 (void)
31{
32  int mem;
33#undef X1
34#define X1(n) int gpr##n = 0;
35  X8(a) X8(b) X8(c)
36#undef X1
37#define X1(n) "+r" (gpr##n),
38  asm volatile ("" : X8(a) "=m" (mem) : : "memory");
39  asm volatile ("" : X8(b) "=m" (mem) : : "memory");
40  asm volatile ("" : X8(c) "=m" (mem) : : "memory");
41  foo ();
42#undef X1
43#define X1(n) "r" (gpr##n),
44  asm volatile ("" : : X8(a) "m" (mem) : "memory");
45  asm volatile ("" : : X8(b) "m" (mem) : "memory");
46  asm volatile ("" : : X8(c) "m" (mem) : "memory");
47}
48
49__attribute__((noinline)) void
50f2 (void)
51{
52  int mem;
53#undef X1
54#define X1(n) int gpr##n = 0;
55  X8(a) X8(b) X8(c)
56#undef X1
57#define X1(n) "+r" (gpr##n),
58  asm volatile ("" : X8(a) "=m" (mem) : : "memory");
59  asm volatile ("" : X8(b) "=m" (mem) : : "memory");
60  asm volatile ("" : X8(c) "=m" (mem) : : "memory");
61  char *pp = __builtin_alloca (ll);
62  bar (pp);
63#undef X1
64#define X1(n) "r" (gpr##n),
65  asm volatile ("" : : X8(a) "m" (mem) : "memory");
66  asm volatile ("" : : X8(b) "m" (mem) : "memory");
67  asm volatile ("" : : X8(c) "m" (mem) : "memory");
68}
69
70__attribute__((noinline)) void
71f3 (void)
72{
73  int mem;
74#undef X1
75#define X1(n) int gpr##n = 0;
76  X8(a) X8(b) X8(c)
77#undef X1
78#define X1(n) "+r" (gpr##n),
79  asm volatile ("" : X8(a) "=m" (mem) : : "memory");
80  asm volatile ("" : X8(b) "=m" (mem) : : "memory");
81  asm volatile ("" : X8(c) "=m" (mem) : : "memory");
82#undef X1
83#define X1(n) "r" (gpr##n),
84  asm volatile ("" : : X8(a) "m" (mem) : "memory");
85  asm volatile ("" : : X8(b) "m" (mem) : "memory");
86  asm volatile ("" : : X8(c) "m" (mem) : "memory");
87}
88
89#ifndef __NO_FPRS__
90__attribute__((noinline)) void
91f4 (void)
92{
93  int mem;
94#undef X1
95#define X1(n) int gpr##n = 0;
96  X8(a) X8(b) X8(c)
97#undef X1
98#define X1(n) double fpr##n = 0.0;
99  X4(d)
100#undef X1
101#define X1(n) "+r" (gpr##n),
102  asm volatile ("" : X8(a) "=m" (mem) : : "memory");
103  asm volatile ("" : X8(b) "=m" (mem) : : "memory");
104  asm volatile ("" : X8(c) "=m" (mem) : : "memory");
105#undef X1
106#define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
107  asm volatile ("" : X4(d) "=m" (mem) : : "memory");
108  foo ();
109#undef X1
110#define X1(n) "r" (gpr##n),
111  asm volatile ("" : : X8(a) "m" (mem) : "memory");
112  asm volatile ("" : : X8(b) "m" (mem) : "memory");
113  asm volatile ("" : : X8(c) "m" (mem) : "memory");
114#undef X1
115#define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
116  asm volatile ("" : : X4(d) "m" (mem) : "memory");
117}
118
119__attribute__((noinline)) void
120f5 (void)
121{
122  int mem;
123#undef X1
124#define X1(n) int gpr##n = 0;
125  X8(a) X8(b) X8(c)
126#undef X1
127#define X1(n) double fpr##n = 0.0;
128  X4(d)
129#undef X1
130#define X1(n) "+r" (gpr##n),
131  asm volatile ("" : X8(a) "=m" (mem) : : "memory");
132  asm volatile ("" : X8(b) "=m" (mem) : : "memory");
133  asm volatile ("" : X8(c) "=m" (mem) : : "memory");
134#undef X1
135#define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
136  asm volatile ("" : X4(d) "=m" (mem) : : "memory");
137  char *pp = __builtin_alloca (ll);
138  bar (pp);
139#undef X1
140#define X1(n) "r" (gpr##n),
141  asm volatile ("" : : X8(a) "m" (mem) : "memory");
142  asm volatile ("" : : X8(b) "m" (mem) : "memory");
143  asm volatile ("" : : X8(c) "m" (mem) : "memory");
144#undef X1
145#define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
146  asm volatile ("" : : X4(d) "m" (mem) : "memory");
147}
148
149__attribute__((noinline)) void
150f6 (void)
151{
152  int mem;
153#undef X1
154#define X1(n) int gpr##n = 0;
155  X8(a) X8(b) X8(c)
156#undef X1
157#define X1(n) double fpr##n = 0.0;
158  X4(d)
159#undef X1
160#define X1(n) "+r" (gpr##n),
161  asm volatile ("" : X8(a) "=m" (mem) : : "memory");
162  asm volatile ("" : X8(b) "=m" (mem) : : "memory");
163  asm volatile ("" : X8(c) "=m" (mem) : : "memory");
164#undef X1
165#define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
166  asm volatile ("" : X4(d) "=m" (mem) : : "memory");
167#undef X1
168#define X1(n) "r" (gpr##n),
169  asm volatile ("" : : X8(a) "m" (mem) : "memory");
170  asm volatile ("" : : X8(b) "m" (mem) : "memory");
171  asm volatile ("" : : X8(c) "m" (mem) : "memory");
172#undef X1
173#define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
174  asm volatile ("" : : X4(d) "m" (mem) : "memory");
175}
176
177__attribute__((noinline)) void
178f7 (void)
179{
180  int mem;
181#undef X1
182#define X1(n) int gpr##n = 0;
183  X8(a) X8(b) X8(c)
184#undef X1
185#define X1(n) double fpr##n = 0.0;
186  X2(d)
187#undef X1
188#define X1(n) "+r" (gpr##n),
189  asm volatile ("" : X8(a) "=m" (mem) : : "memory");
190  asm volatile ("" : X8(b) "=m" (mem) : : "memory");
191  asm volatile ("" : X8(c) "=m" (mem) : : "memory");
192#undef X1
193#define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
194  asm volatile ("" : X2(d) "=m" (mem) : : "memory");
195  foo ();
196#undef X1
197#define X1(n) "r" (gpr##n),
198  asm volatile ("" : : X8(a) "m" (mem) : "memory");
199  asm volatile ("" : : X8(b) "m" (mem) : "memory");
200  asm volatile ("" : : X8(c) "m" (mem) : "memory");
201#undef X1
202#define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
203  asm volatile ("" : : X2(d) "m" (mem) : "memory");
204}
205
206__attribute__((noinline)) void
207f8 (void)
208{
209  int mem;
210#undef X1
211#define X1(n) int gpr##n = 0;
212  X8(a) X8(b) X8(c)
213#undef X1
214#define X1(n) double fpr##n = 0.0;
215  X2(d)
216#undef X1
217#define X1(n) "+r" (gpr##n),
218  asm volatile ("" : X8(a) "=m" (mem) : : "memory");
219  asm volatile ("" : X8(b) "=m" (mem) : : "memory");
220  asm volatile ("" : X8(c) "=m" (mem) : : "memory");
221#undef X1
222#define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
223  asm volatile ("" : X2(d) "=m" (mem) : : "memory");
224  char *pp = __builtin_alloca (ll);
225  bar (pp);
226#undef X1
227#define X1(n) "r" (gpr##n),
228  asm volatile ("" : : X8(a) "m" (mem) : "memory");
229  asm volatile ("" : : X8(b) "m" (mem) : "memory");
230  asm volatile ("" : : X8(c) "m" (mem) : "memory");
231#undef X1
232#define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
233  asm volatile ("" : : X2(d) "m" (mem) : "memory");
234}
235
236__attribute__((noinline)) void
237f9 (void)
238{
239  int mem;
240#undef X1
241#define X1(n) int gpr##n = 0;
242  X8(a) X8(b) X8(c)
243#undef X1
244#define X1(n) double fpr##n = 0.0;
245  X2(d)
246#undef X1
247#define X1(n) "+r" (gpr##n),
248  asm volatile ("" : X8(a) "=m" (mem) : : "memory");
249  asm volatile ("" : X8(b) "=m" (mem) : : "memory");
250  asm volatile ("" : X8(c) "=m" (mem) : : "memory");
251#undef X1
252#define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
253  asm volatile ("" : X2(d) "=m" (mem) : : "memory");
254#undef X1
255#define X1(n) "r" (gpr##n),
256  asm volatile ("" : : X8(a) "m" (mem) : "memory");
257  asm volatile ("" : : X8(b) "m" (mem) : "memory");
258  asm volatile ("" : : X8(c) "m" (mem) : "memory");
259#undef X1
260#define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
261  asm volatile ("" : : X2(d) "m" (mem) : "memory");
262}
263
264__attribute__((noinline)) void
265f10 (void)
266{
267  int mem;
268#undef X1
269#define X1(n) int gpr##n = 0;
270  X8(a) X8(b) X4(c)
271#undef X1
272#define X1(n) double fpr##n = 0.0;
273  X1(d)
274#undef X1
275#define X1(n) "+r" (gpr##n),
276  asm volatile ("" : X8(a) "=m" (mem) : : "memory");
277  asm volatile ("" : X8(b) "=m" (mem) : : "memory");
278  asm volatile ("" : X4(c) "=m" (mem) : : "memory");
279#undef X1
280#define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
281  asm volatile ("" : X1(d) "=m" (mem) : : "memory");
282  foo ();
283#undef X1
284#define X1(n) "r" (gpr##n),
285  asm volatile ("" : : X8(a) "m" (mem) : "memory");
286  asm volatile ("" : : X8(b) "m" (mem) : "memory");
287  asm volatile ("" : : X4(c) "m" (mem) : "memory");
288#undef X1
289#define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
290  asm volatile ("" : : X1(d) "m" (mem) : "memory");
291}
292
293__attribute__((noinline)) void
294f11 (void)
295{
296  int mem;
297#undef X1
298#define X1(n) int gpr##n = 0;
299  X8(a) X8(b) X4(c)
300#undef X1
301#define X1(n) double fpr##n = 0.0;
302  X1(d)
303#undef X1
304#define X1(n) "+r" (gpr##n),
305  asm volatile ("" : X8(a) "=m" (mem) : : "memory");
306  asm volatile ("" : X8(b) "=m" (mem) : : "memory");
307  asm volatile ("" : X4(c) "=m" (mem) : : "memory");
308#undef X1
309#define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
310  asm volatile ("" : X1(d) "=m" (mem) : : "memory");
311  char *pp = __builtin_alloca (ll);
312  bar (pp);
313#undef X1
314#define X1(n) "r" (gpr##n),
315  asm volatile ("" : : X8(a) "m" (mem) : "memory");
316  asm volatile ("" : : X8(b) "m" (mem) : "memory");
317  asm volatile ("" : : X4(c) "m" (mem) : "memory");
318#undef X1
319#define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
320  asm volatile ("" : : X1(d) "m" (mem) : "memory");
321}
322
323__attribute__((noinline)) void
324f12 (void)
325{
326  int mem;
327#undef X1
328#define X1(n) int gpr##n = 0;
329  X8(a) X8(b) X4(c)
330#undef X1
331#define X1(n) double fpr##n = 0.0;
332  X1(d)
333#undef X1
334#define X1(n) "+r" (gpr##n),
335  asm volatile ("" : X8(a) "=m" (mem) : : "memory");
336  asm volatile ("" : X8(b) "=m" (mem) : : "memory");
337  asm volatile ("" : X4(c) "=m" (mem) : : "memory");
338#undef X1
339#define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
340  asm volatile ("" : X1(d) "=m" (mem) : : "memory");
341#undef X1
342#define X1(n) "r" (gpr##n),
343  asm volatile ("" : : X8(a) "m" (mem) : "memory");
344  asm volatile ("" : : X8(b) "m" (mem) : "memory");
345  asm volatile ("" : : X4(c) "m" (mem) : "memory");
346#undef X1
347#define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
348  asm volatile ("" : : X1(d) "m" (mem) : "memory");
349}
350
351__attribute__((noinline)) void
352f13 (void)
353{
354  int mem;
355#undef X1
356#define X1(n) int gpr##n = 0;
357  X8(a) X8(b) X2(c)
358#undef X1
359#define X1(n) double fpr##n = 0.0;
360  X8(d)
361#undef X1
362#define X1(n) "+r" (gpr##n),
363  asm volatile ("" : X8(a) "=m" (mem) : : "memory");
364  asm volatile ("" : X8(b) "=m" (mem) : : "memory");
365  asm volatile ("" : X2(c) "=m" (mem) : : "memory");
366#undef X1
367#define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
368  asm volatile ("" : X8(d) "=m" (mem) : : "memory");
369  foo ();
370#undef X1
371#define X1(n) "r" (gpr##n),
372  asm volatile ("" : : X8(a) "m" (mem) : "memory");
373  asm volatile ("" : : X8(b) "m" (mem) : "memory");
374  asm volatile ("" : : X2(c) "m" (mem) : "memory");
375#undef X1
376#define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
377  asm volatile ("" : : X8(d) "m" (mem) : "memory");
378}
379
380__attribute__((noinline)) void
381f14 (void)
382{
383  int mem;
384#undef X1
385#define X1(n) int gpr##n = 0;
386  X8(a) X8(b) X2(c)
387#undef X1
388#define X1(n) double fpr##n = 0.0;
389  X8(d)
390#undef X1
391#define X1(n) "+r" (gpr##n),
392  asm volatile ("" : X8(a) "=m" (mem) : : "memory");
393  asm volatile ("" : X8(b) "=m" (mem) : : "memory");
394  asm volatile ("" : X2(c) "=m" (mem) : : "memory");
395#undef X1
396#define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
397  asm volatile ("" : X8(d) "=m" (mem) : : "memory");
398  char *pp = __builtin_alloca (ll);
399  bar (pp);
400#undef X1
401#define X1(n) "r" (gpr##n),
402  asm volatile ("" : : X8(a) "m" (mem) : "memory");
403  asm volatile ("" : : X8(b) "m" (mem) : "memory");
404  asm volatile ("" : : X2(c) "m" (mem) : "memory");
405#undef X1
406#define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
407  asm volatile ("" : : X8(d) "m" (mem) : "memory");
408}
409
410__attribute__((noinline)) void
411f15 (void)
412{
413  int mem;
414#undef X1
415#define X1(n) int gpr##n = 0;
416  X8(a) X8(b) X2(c)
417#undef X1
418#define X1(n) double fpr##n = 0.0;
419  X8(d)
420#undef X1
421#define X1(n) "+r" (gpr##n),
422  asm volatile ("" : X8(a) "=m" (mem) : : "memory");
423  asm volatile ("" : X8(b) "=m" (mem) : : "memory");
424  asm volatile ("" : X2(c) "=m" (mem) : : "memory");
425#undef X1
426#define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
427  asm volatile ("" : X8(d) "=m" (mem) : : "memory");
428#undef X1
429#define X1(n) "r" (gpr##n),
430  asm volatile ("" : : X8(a) "m" (mem) : "memory");
431  asm volatile ("" : : X8(b) "m" (mem) : "memory");
432  asm volatile ("" : : X2(c) "m" (mem) : "memory");
433#undef X1
434#define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
435  asm volatile ("" : : X8(d) "m" (mem) : "memory");
436}
437#endif
438
439int
440main ()
441{
442  ll = 60;
443  f1 ();
444  f2 ();
445  f3 ();
446#ifndef __NO_FPRS__
447  f4 ();
448  f5 ();
449  f6 ();
450  f7 ();
451  f8 ();
452  f9 ();
453  f10 ();
454  f11 ();
455  f12 ();
456  f13 ();
457  f14 ();
458  f15 ();
459#endif
460  return 0;
461}
462