| /* { dg-do run } */ |
| /* { dg-require-effective-target fpic } */ |
| /* { dg-options "-O2 -fPIC" } */ |
| |
| void (*pfn)(void); |
| |
| struct s |
| { |
| void** q; |
| int h; |
| int t; |
| int s; |
| }; |
| |
| |
| void* f (struct s *, struct s *) __attribute__ ((noinline, regparm(1))); |
| |
| void* |
| __attribute__ ((regparm(1))) |
| f (struct s *p, struct s *p2) |
| { |
| void *gp, *gp1; |
| int t, h, s, t2, h2, c, i; |
| |
| if (p2->h == p2->t) |
| return 0; |
| |
| (*pfn) (); |
| |
| h = p->h; |
| t = p->t; |
| s = p->s; |
| |
| h2 = p2->h; |
| t2 = p2->t; |
| |
| gp = p2->q[h2++]; |
| |
| c = (t2 - h2) / 2; |
| for (i = 0; i != c; i++) |
| { |
| if (t == h || (h == 0 && t == s - 1)) |
| break; |
| gp1 = p2->q[h2++]; |
| p->q[t++] = gp1; |
| if (t == s) |
| t = 0; |
| } |
| |
| p2->h = h2; |
| return gp; |
| } |
| |
| static void gn () { } |
| |
| int |
| main() |
| { |
| struct s s1, s2; |
| void *q[10]; |
| |
| pfn = gn; |
| |
| s1.q = q; |
| s1.h = 0; |
| s1.t = 2; |
| s1.s = 4; |
| |
| s2.q = q; |
| s2.h = 0; |
| s2.t = 4; |
| s2.s = 2; |
| |
| f (&s1, &s2); |
| |
| return 0; |
| } |