1 /* { dg-do run } */
2 /* { dg-options "-O2" } */
3 
4 extern int memcmp (const void *, const void *, __SIZE_TYPE__);
5 
x(void * pdst,const void * psrc,unsigned int pn)6 void *x (void *pdst, const void *psrc, unsigned int pn)
7 {
8   register void *return_dst = pdst;
9   register unsigned char *dst = pdst;
10   register unsigned const char *src = psrc;
11   register int n __asm__ ("ebx") = pn;
12 
13   if (src < dst && dst < src + n)
14     {
15       src += n;
16       dst += n;
17       while (n--)
18         *--dst = *--src;
19       return return_dst;
20     }
21 
22   while (n >= 16) n--;
23 
24   return return_dst;
25 }
26 extern void abort ();
27 extern void exit (int);
28 char xx[30] = "abc";
main(void)29 int main (void)
30 {
31   char yy[30] = "aab";
32 
33   if (x (xx + 1, xx, 2) != xx + 1 || memcmp (xx, yy, sizeof (yy)) != 0)
34     abort ();
35   exit (0);
36 }
37