1/* Duff's device is legal C; test to make sure the compiler 2 doesn't complain about it. 3 4 Jason Thorpe <thorpej@wasabisystems.com> 5 Derived from Tom Duff's original usenet message about the device. */ 6 7/* { dg-do run } */ 8/* { dg-options "-O2" } */ 9 10extern void abort (void); 11extern void exit (int); 12 13typedef __SIZE_TYPE__ size_t; 14extern int memcmp (const void *, const void *, size_t); 15 16void 17duffcpy (char *dst, const char *src, unsigned long size) 18{ 19 unsigned long n = (size + 7) / 8; 20 21 switch (size % 8) 22 { 23 case 0: do { *dst++ = *src++; 24 case 7: *dst++ = *src++; 25 case 6: *dst++ = *src++; 26 case 5: *dst++ = *src++; 27 case 4: *dst++ = *src++; 28 case 3: *dst++ = *src++; 29 case 2: *dst++ = *src++; 30 case 1: *dst++ = *src++; 31 } while (--n > 0); 32 } 33} 34 35const char testpat[] = "The quick brown fox jumped over the lazy dog."; 36 37int 38main() 39{ 40 char buf[64]; 41 42 duffcpy (buf, testpat, sizeof (testpat)); 43 if (memcmp (buf, testpat, sizeof (testpat)) != 0) 44 abort (); 45 46 exit (0); 47} 48