1/* { dg-do compile } */
2/* { dg-require-effective-target ilp32 } */
3/* { dg-options "-O2 -march=k6" } */
4
5static inline void *
6baz (void *s, unsigned long c, unsigned int count)
7{
8  int d0, d1;
9  __asm__ __volatile__ (""
10			: "=&c" (d0), "=&D" (d1)
11			:"a" (c), "q" (count), "0" (count / 4), "1" ((long) s)
12			:"memory");
13  return s;
14}
15
16struct A
17{
18  unsigned long *a;
19};
20
21inline static void *
22bar (struct A *x, int y)
23{
24  char *ptr;
25
26  ptr = (void *) x->a[y >> 12];
27  ptr += y % (1UL << 12);
28  return (void *) ptr;
29}
30
31int
32foo (struct A *x, unsigned int *y, int z, int u)
33{
34  int a, b, c, d, e;
35
36  z += *y;
37  c = z + u;
38  a = (z >> 12) + 1;
39  do
40    {
41      b = (a << 12);
42      d = b - z;
43      e = c - z;
44      if (e < d)
45	d = e;
46      baz (bar (x, z), 0, d);
47      z = b;
48      a++;
49    }
50  while (z < c);
51  return 0;
52}
53