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